-xtarget
和
-xchip
标志均接受
ultra3
和
ultra3
变体,并且为 UltraSPARC-III 和 UltraSPARC-IV 处理器生成优化代码。当在最新的 UltraSPARC 平台上编译和运行应用程序时,请指定
-fast
标志,以便为该平台自动选择正确的编译器优化选项。
对于交叉编译(编译在非最新的 UltraSPARC 平台上进行,但生成专用于在 UltraSPARC-III 处理器上运行的二进制代码),使用下列标志:
-fast -xtarget=ultra3
使用
-m64
编译可生成 64 位代码。
有关最新 UltraSPARC 处理器的
-xtarget
标志列表,请参见《
Fortran 用户指南
》。
在 UltraSPARC-III 和 UltraSPARC-IV 平台上进行性能剖析(使用
-xprofile=collect:
和
-xprofile=use:
)效果尤为突出,这是因为它允许编译器识别经常执行的程序部分并进行最佳的本地化优化。
64 位 x86 平台支持
Sun Studio Fortran 编译器支持 Solaris 和 Linux x86 平台的 32 位和 64 位代码编译。
-xtarget=pentium3
标志将展开为:
-xarch=sse
-xchip=pentium3 -xcache=16/32/4:256/32/4
.
对于 Pentium 4 系统,
-xtarget=pentium4
将展开为:
-xarch=sse2 -xchip=pentium4 -xcache=8/64/4:256/128/8.
新的
-m64
选项用来指定对 64 位 x64 指令集的编译。
新的
-xtarget
选项、
-xtarget=opteron
为 32 位 AMD 编译指定了
-xarch
、
-xchip
和
-xcache
设置。
要生成 64 位代码,必须在命令行中
-fast
和
-xtarget
的后面指定
-m64
。
-xtarget
选项并不自动生成 64 位代码。
-fast
选项也会产生 32 位代码,因为它也是一个定义
-xtarget
值的宏。所有当前
-xtarget
值(
-xtarget=native64
和
-xtarget=generic64
除外)将产生 32 位代码,因此必须在
-fast
或
-xtarget
之后(右侧)指定
-xarch=m64
以编译 64 位代码,如下所示:
% f95 -fast -m64
或
% f95 -xtarget=opteron -m64
如果指定了
-xarch=amd64
,编译器会立即预定义
__amd64
和
__x86_64
。
在《
Fortran 用户指南
》中,可以找到有关 32 位和 64 位 x86 平台上的编译和性能的其他信息。
循环嵌套深层调用的子程序可能会被调用数千次。即使每次调用花在每个例程上的时间很少,但累加效果却可能会很大。另外,由于编译器在调用期间不能对寄存器状态作出假设,所以子程序调用会抑制包含这些调用的循环的优化。
子程序调用的自动内联(使用
-inline=
x,y,..z
或
-O4
)是一种让编译器用子程序本身替换实际调用的方法(即将子程序
拉到
循环中)。要内联的例程的子程序源代码必须与调用例程存在于相同的文件中。
还有其他几种消除子程序调用的方法:
使用语句函数。如果正在调用的外部函数是一个简单的数学函数,可以将该函数改写为语句函数或语句函数集。语句函数采用内联编译,可以进行优化。
2. common aa(100),bb(100)
Function x inlined from source file do.f into the code for the following line
Loop below pipelined with steady-state cycle count = 3 before unrolling
Loop below unrolled 5 times
Loop below has 2 loads, 1 stores, 0 prefetches, 1 FPadds, 1 FPmuls, and 0 FPdivs per iteration
3. call x(aa,bb,100)
4. end
5. subroutine x(a,b,n)
6. real a(n), b(n)
7. v = 5.
8. w = 10.
Loop below pipelined with steady-state cycle count = 3 before unrolling
Loop below unrolled 5 times
Loop below has 2 loads, 1 stores, 0 prefetches, 1 FPadds, 1 FPmuls, and 0 FPdivs per iteration
9. do 1 i=1,n
10. 1 a(i) = a(i)+v*b(i)
11. return
12. end
注释消息详细说明编译器所采取的优化操作。在例中可以看到:编译器内联了子例程调用并将循环展开了 5 次。仔细查看该信息可能会为进一步使用优化策略提供线索。
有关编译器注释和反汇编代码的详细信息,参见 Sun Studio《
性能分析器
》手册。