组件 |
选项 |
说明 |
CC, d |
-iropt-prof
|
在编译器的 profile 阶段使用 iropt(iropt 是全局优化器)。 |
cg |
-Qdepgraph-early_cross_call=1
|
启用交叉调用结构调度。此选项控制“早期的”调度器是否可以跨调用结构转移指令。早期调度器就是在寄存器分配之前运行的调度器。因为 SPARC 寄存器窗口,这有时可以派上用场。 |
cg |
-Qeps:do_spec_load=1
|
启用在增强的管道调度(Enhanced Pipeline Scheduling,EPS)期间推测性负载的生成。如果推测正确,推测性负载可以减少负载的等待时间;但是如果推测不正确(比如其他路径被占用,而且负载在缓存或 TLB 中没有命中),那么开销会因此增加数百倍。EPS 调度器需要一个非常好的机会推测正确,才能有效地降低 EPS 推测负载。 |
cg |
-Qeps:enabled=1
|
使用增强的管道调度(EPS)和选择性的调度算法进行指令调度。EPS 调度器将会改进一些应用程序的性能,但还有一些应用程序将运行得更为缓慢。 |
cg |
-Qeps:rp_filtering_margin=n
|
在任意指定点允许使用的活动变量的数量是大于物理寄存器数量的整数 n。把 n 设为一个很大的数字(比如 100)将会禁用 EPS 中的寄存器压力试探。 |
cg |
-Qeps:ws=n
|
将 EPS 窗口大小设为 n,也就是当尝试找到独立指令调度一个并行群时,它将要跨所有路径考虑的指令的数量。值越大,运行时间越短,但这样会增加编译时间。 |
cg |
-Qgsched-trace_late=1
|
启用(后期)跟踪调度器。这是编译器的一项新特性,版本之间可能稍有不同。它可能成为未来版本的默认特性。 |
cg |
-Qgsched-Tn
|
执行跟踪调度时,把跟踪构造的积极度设置为水平 n,这里的 n 是 4、5 或 6。n 的值越高,需要在跟踪中包含一个基本块的分支可能性越低。 |
cg |
-Qgsched-trace_spec_load=1
|
执行跟踪调度时,在跟踪中启用负载转换为非故障负载。 |
cg |
-Qicache-chbab=1
|
启用优化为在分支耗损之后减少分支。在某些计算机上,如果分支相互独立,指令获取器的操作效率会更高;例如,不让一个分支占据另一分支的延迟时间片。在代码中加入 no-ops 可以提高获取器的运行效率。-Qicache-chbab 当前不是默认打开的,因为它可能增加代码数量,从而降低 icache 的效率,而且用于添加 nops 的算法尚未证明对所有应用程序有益。 |
cg |
-Qinline_memcpy=n
|
使用复制的 n 个或更少字节对 memcpy 进行内联调用。如果存在使用较少字节对 memcpy 的大量调用,调用开销将会很可观。 |
cg |
-Qipa:valueprediction
|
使用配置文件反馈数据来预测沿着这些控制路径生成更快代码的值和尝试,即便是冒着沿着通向不同值的路径可能降低代码速度的风险。 |
cg |
-Qiselect-funcalign=n
|
在 n-byte 边界处的校准函数入口点。在某些计算机上,校准函数可能会提高指令获取器的效率。一般来说,这个选项会使 I-cache 的压缩变差。其默认设置可能随着计算机的不同而不同。 |
cg |
-Qiselect-sw_pf_tbl_th=n
|
把最频繁出现的测试分支/用例与开关分离,直到分支可能性比 1/n 小为止。这只在使用配置文件反馈时有效。 |
cg |
-Qlp[=n][-av=n] [-t=n][-fa=n] [-fl=n][-ip=n] [-it=n][-imb=n] [-pt=weak][-ol=n]
|
控制对使用控制流的循环的预取:
lp= n 用于打开(1)或关闭(0)模块(默认对于 f95 打开,而对于 C/C++ 关闭)
lp 在 Fortran 中等价于 -Qlp=1 ,用作设置下面列出的子选项的一种手段。在 C/C++ 中,则等价于 -Qlp=0 。然而,与选项 -xprefetch=auto 或 -xprefetch_level= [2|3]一起使用时,它又等价于 -Qlp=1 ,也用作设置下面列出的子选项的一种手段。-av= n 可以设定预取预测距离,单位为字节。其默认值为 256。-t= n 用于设置预取的尝试次数。如果未指定,设定了 -xprefetch_level=3 时 t=2 ;否则,其默认值为 t=1 。-fa= n 1= 强制用户设置覆盖内部计算的值。-fl= n 1= 强制对所有语言打开优化。-ip= n 为一级非直接内存访问打开 (1)预取。-it= n 指示编译器为外部循环中的每次非直接访问插入 n 额外的预取。-imb= n 指示编译器 (1) 在非直接访问链跨了多个基本块时插入非直接预取。-pt= weak 用于在一般循环预取中使用弱预取。-ol= n 为外部循环打开 (1) 预取。 |
cg |
-Qms_pipe+alldoall
|
指定所有循环都可以管道化,同时无需与循环执行依赖性挂钩。 |
cg |
-Qms_pipe+intdivusefp
|
对有符号的整数除法使用 fp 除。 |
cg |
-Qms_pipe+prefolim=n
|
设置预取前距离,前提是假定未完成预取的数量是 n。n 越大,前距离也越大。 |
cg |
-Qms_pipe-pref
|
在模数调度中禁用预取(用在软件流水线中)。 |
cg |
-Qms_pipe-pref_prolog
|
在模数调度循环的 prolog 中关闭预取。 |
cg |
-Qms_pipe-prefst
|
对管道程序中的存储器关闭预取。 |
cg |
-Qms_pipe-pref_prefstrong=0
|
在模数调度的循环中关闭强预取的使用。 |
cg |
-Qms_pipe+unoovf
|
针对管道程序,断言无符号整数计算不会溢出。 |
cg |
-Qpeep-Sh0
|
禁用 sethi 提升的最大活动基本寄存器算法。一个 sethi 就是一个构成大常量的 SPARC 指令,尤其是地址常量。Sethi 提升使用的算法可能会增加寄存器的压力。通常,此选项对性能有所帮助。 |
f90comp |
-O[3-5]
|
将 f95 前/中端的优化水平设定为特定的优化水平(只针对 fortran)。 |
f90comp |
-array_pad_rows,n
|
启用 n 维 f95 数组的填充(只针对 fortran)。 |
f90comp |
-hoist_expensive,-hoist_trivial
|
启用另外的循环不变代码移动,可提升循环外的操作。 |
iropt |
-Abcopy
|
提高编译器执行 memcpy/memset 转换的可能性。 |
iropt |
-Abopt |
启用所有分支的积极优化,比如掉转分支条件。这只在使用配置文件反馈时有用。 |
iropt |
-Adata_access
|
此选项用于打开对每个循环中访问的标量和数组区域的数据访问模式分析。分析信息可以为各种循环转换所用,比如用于确定这些转换的可能性的循环合并。
与常规的数据依赖性分析不同,这种分析一个循环中访问的详细数组部分,所以将会占用大量的编译时间。 |
iropt |
-Addint:ignore_parallel
|
忽略循环交换试探中的并行化因素。 |
iropt |
-Addint:sf=n
|
将循环交换的内存存储操作权重设置为 n。n 的值越大,存储对性能带来的影响就越大。在确定是否应该进行某些操作转换,比如循环交换时,这个标志给存储操作赋予了更大的权重。 |
iropt |
-Aheap
|
允许编译器识别与 malloc 类似的内存分配函数。如指定了 -xbuiltin ,此选项便已包含在内。 |
iropt |
-Ainline[:cp=n] [:cs=n][:inc=n] [:irs=n][:mi] [:rs=n][:recursion=n]
|
cp= n 最小化的调用点频率计数器,以便考虑一个用于内联的例程。cs= n 把内联被调用者的大小限制设定为 n。单元大体上对应于指令的数目。inc= n 允许内联程序增加程序的大小,最大为 n%。irs= n 允许例程增加,最大为 n。单元大体上对应于指令的数目。mi 执行最大化内联(不考虑代码的增加)。rs= n 内联程序只考虑比作为可能内联候选对象的 n 个伪指令小的例程。recursion= n 允许递归调用被内联,最多为 n 级。
|
iropt |
-Aivel:duplicate_loops
|
通过复制循环降低更多积极程度。 |
iropt |
-Aivsub3
|
增加置换循环归纳变量的可能性,从而排除循环中的一些无关代码。 |
iropt |
-Aloop_dist:ignore_parallel
|
忽略循环分布试探中的并行化因素。 |
iropt |
-Amemopt:arrayloc
|
在内存分配合并和数据布局程序转换中重建数组下标。转换使用相同数组,但是修改了引用数组的方式,从而使它们在全局上更为有效。 |
iropt |
-Apf:llist=n:noinnerllist
|
对链接列表数据结构进行推测预取:
llist= n 提前执行预取 n 次迭代。非内部列表不会尝试最内层循环。 |
iropt |
-Apf:pdl= n
|
允许通过最大为 n 级的非直接内存引用进行预取。 |
iropt |
-Arestrict_g
|
假定全局指针不存在别名(受限)。 |
iropt |
-Ashort_ldst[:ldld]
|
把多个短内存操作转换为一个长内存操作。ldld 把多个短内存加载转换为一个长的加载操作。 |
iropt |
-Atile:skewp[:bn]
|
执行循环偏移支持的循环平铺。循环偏移把一个非完全的可交换循环嵌套转换为一个完全的可交换循环嵌套。可选的 b n 用于把平铺块的大小设置为 n。 |
iropt |
-Aujam:inner=g
|
增加将小行程计数内部循环完全铺开的可能性。 |
iropt |
-Aunroll
|
启用外部循环的铺开。 |
iropt |
-crit
|
启用关键控制路径的优化。这是基于配置文件数据的,这些数据用于选择关键路径和创建超级块,这样在关键路径上可以完成更多优化和更好的调度,从而提高整体性能。 |
iropt |
-MR
|
当参数是数组,而且实际的数组维度和正式的数组维度不匹配时,不要把调用内联。 |
iropt |
-Man
|
启用对帧大小最大为 n 的例程的内联。 |
iropt |
-Mmn
|
把内联的最大代码增加设定为每个模块 n 个指令的 3 倍。n 的值越大,允许发生的内联就越多。 |
iropt |
-Mrn
|
把内联的最大代码增加设定为每个例程 n 个指令的 3 倍。n 的值越大,允许发生的内联就越多。 |
iropt |
-Msn
|
把递归内联的最大层次设定为深度为 n 。n 的值越大,允许发生的内联就越多。 |
iropt |
-Mtn
|
把符合内联条件的例程体的最大大小设定为 n 个指令的 3 倍。n 的值越大,允许进行内联的例程就越大。 |
iropt |
-Rscalarrep
|
禁用标量置换优化。一般说来,标量置换将会减少循环中的内存访问,从而提高循环的性能。但是它也会增加寄存器的压力(这可能导致寄存器溢出,也就是把寄存器中的内容保存到内存中,这项操作的开销十分巨大)。 |
iropt |
-Rloop_dist
|
不要执行循环分布转换。 |
iropt |
-reroll=1
|
启用循环 Reroll。 |
iropt |
-whole
|
进行完整的程序优化,允许编译器能够更好地执行过程间分析。 |
iropt |
-xrestrict
|
将正式指针参数视为受限制的指针(不会混淆)。 |
ld |
-M,/usr/lib/ld/map.bssalign
|
指示链接器使用 /usr/lib/ld/map 中的映射文件。这将为较大页面的堆映射提供正确的校准,从而使大页面的使用更加高效(Fortran) 。 |
ube |
-fsimple=3
|
允许优化器使用 x87 硬件指令进行正弦、余弦和平方根运算。精度和舍入效果由底层硬件的实现,而不是标准的 IEEE754 语义决定(x86)。 |
ube |
-xcallee[=yes|no]
|
假定被调用者保存寄存器被保存了(是的,这是默认的),不假定它们未被保存(x86)。 |
ube |
-sched_first_pass=1
|
在全局寄存器分配器之前启用指令调度阶段。 |
ube_ipa |
-inl_alt
|
启用更多积极的内联,尤其是在使用配置文件反馈时(x86)。 |