本节说明了所有的 f95 编译器命令行选项标志,包括各种风险、限制、警告、交互作用、示例和其他详细信息。
除非另行指明,否则每个选项在 SPARC 和 x64/x86 平台上都有效。仅在 SPARC 平台上有效的选项标志标有 (SPARC)。仅在 x64/x86 平台上有效的选项标志标有 (x86)。
标有(已过时)的选项标志已过时,不应使用。在许多情况下,它们已经被其他应该使用的选项或标志取代。
(已过时)使用 tcov 按基本块进行文件配置,这是旧式用法。
这是 tcov 的基本块文件配置的旧式用法。有关新式文件配置的信息,请参见 -xprofile=tcov;有关更多详细信息,请参见 tcov(1) 手册页。
此值表示通用块和标准数值序列类型中数据元素的最大对齐(以字节为单位)。
标准数值序列类型 是包含 SEQUENCE 语句以及唯一的缺省组件数据类型(INTEGER、REAL、DOUBLEPRECISION 和 COMPLEX,不带 KIND= 或 * size)的派生类型。任何其他类型(如 REAL*8)将使类型成为非标准类型。
例如,-aligncommon=4 会将自然对齐方式为 4 字节或大于 4 字节的数据元素与 4 字节边界对齐。
该选项不影响自然对齐方式小于指定大小的数据。
如果不使用 -aligncommon,则编译器会将通用块和数值序列类型中的元素与(最多)4 字节边界对齐。
如果指定不带值的 -aligncommon,则缺省值为 1-所有的通用块和数值序列类型元素都与字节边界对齐(元素之间无填充)。
在未启用 64 位的平台上,-aligncommon=16 恢复为 -aligncommon=8。
如果在源代码中使用非标准 Fortran 95 扩展,则会发出警告消息。
在使用此选项编译具有替换入口点的子程序时,f95 将使用复制/恢复功能保留哑元和实际参数之间的关联。
提供此选项的目的是与传统的 Fortran 77 程序兼容。依赖此选项的代码是非标准的。
启用自动循环并行化。
查找相应的循环并使之并行化,以便在多个处理器上并行运行。分析循环以了解迭代间的数据依赖性并重构循环。如果未将优化级别指定为 -O3 或更高,则将它自动提升到 -O3。
在使用任何并行化选项(包括 -autopar)时,也要指定 -stackvar 选项。当使用 -autopar 时,-stackvar 选项可提供更好的性能,因为它可允许优化器为并行检测其他机会。有关如何为主线程栈和从线程栈设置大小的信息,请参见 -stackvar 选项描述。
如果程序已经包含对 libthread 线程库的显式调用,请避免使用 -autopar。请参见3.4.60 –mt中的注释。
-autopar 选项不适用于单处理器系统,而且已编译代码的运行速度通常会更慢。
要在多线程环境中运行已并行化的程序,必须在执行之前设置 PARALLEL(或 OMP_NUM_THREADS)环境变量。这会将程序可以创建的最大线程数通知给运行时系统。缺省值为 1。通常会将 PARALLEL 或 OMP_NUM_THREADS 变量设置为目标平台上可用的虚拟处理器数,该值可使用 Solaris psrinfo(1) 命令确定。
如果使用 -autopar 并在同一步骤中进行编译和链接,则会自动链接多线程库和线程安全的 Fortran 运行时库。如果使用 -autopar 并在不同的步骤中进行编译和链接,则还必须使用 -autopar 进行链接以确保链接相应的库。
—reduction 选项与 —autopar 一起使用也可能是很有用的。
有关并行化的更多信息,请参阅《Fortran 编程指南》。有关用户控制的显式并行化,则使用 OpenMP 指令和 —xopenmp 选项。
首选动态库链接或要求静态库链接。
在 -B 与 dynamic 或 static 之间不允许有空格。如果未指定 -B,则缺省值为 -Bdynamic。
另请注意:
如果指定 static,但是链接程序仅找到动态库,则不链接该库,同时发出警告“未找到库”。
如果指定 dynamic,但链接程序仅找到静态版本的库,则链接该库,并且不发出警告。
您可以在命令行上切换 -Bstatic 和 -Bdynamic。也就是说,通过在命令行上指定 -Bstatic 和 -Bdynamic 任意多次,可以静态链接一些库并动态链接一些库,如下所示:
f95 prog.f -Bdynamic -lwells -Bstatic -lsurface |
这些是加载器和链接程序选项。在不同的步骤中使用编译命令的 -Bx 选项进行编译和链接时,将要求在链接步骤中也使用该选项。
不能在命令行上同时指定 -Bdynamic 和 -dn,因为 -dn 禁用动态库的链接。
在 64 位 Solaris 环境中,许多系统库仅作为共享动态库提供,其中包括 libm.so 和 libc.so(不提供 libm.a 和 libc.a)。这意味着,在 64 位 Solaris 环境中,-Bstatic 和 -dn 可能会导致链接错误。在这些情况下,应用程序必须与动态库链接。
不推荐同时使用静态 Fortran 运行时系统库和动态 Fortran 运行时系统库,因为这会导致链接程序错误或无提示的数据损坏。始终保持同最新的共享动态 Fortran 运行时系统库的链接。
有关静态库和动态库的更多信息,请参见《Fortran 编程指南》。
如果数组下标超过所声明的大小,可能会导致意外结果(包括段故障)。-C 选项检查源代码中和执行过程中可能的数组下标违规。-C 还添加了对数组语法表达式中数组一致性的运行时检查。
指定 -C 可能会使可执行文件更大。
如果使用 -C 选项,则会将数组下标违规视为错误。如果在编译过程中检测到源代码中存在数组下标范围违规,则会将它视为编译错误。
如果只能在运行时确定数组下标违规,则编译器会将范围检查代码生成到可执行程序中。这可能导致执行时间增加。因此,应该在开发和调试程序时启用完全数组下标检查,然后重新编译最后产生的可执行程序,而不必进行下标检查。
仅编译;生成目标 .o 文件,但禁止链接。
针对每个源文件编译 .o 文件。如果仅编译一个源文件,则可以使用 -o 选项来指定所写入的 .o 文件的名称。
(已过时,SPARC)针对通用 SPARC 体系结构进行编译。
此选项是以下选项的宏:-xarch=v7 -xchip=old -xcache=64/32/1(与 -xtarget=ss2 等效)。
(已过时,SPARC)针对 SPARC V8 体系结构进行编译。
此选项是以下选项的宏:–xarch=v8-xchip=super -xcache=16/32/4:1024/32/1(与 -xtarget=ss1000 等效)。
允许为常量参数赋值。
允许子程序更改其为常量的哑元。提供此选项只是为了允许编译和执行传统代码而不出现运行时错误。
在不使用 -copyargs 的情况下,如果将常量参数传递给子例程,然后在子例程内尝试更改该常量,则运行将终止。
在使用 -copyargs 的情况下,如果将常量参数传递给子例程,然后在子例程内更改该常量,则运行不一定终止。
当然,除非使用 -copyargs 进行编译,否则终止的代码是不符合 Fortran 标准的。此外,这样的代码通常是不可预知的。
此选项仅适用于 .F、.F90、.F95 和 .F03 源文件。
–Dname=def 将 name 定义为具有值 def
–Dname 将 name 定义为 1
在命令行上,此选项将定义 name,就如同
#define name[=def]
已经出现在源文件中。如果未指定 =def,则名称 name 将定义为值 1。宏符号 name 将传递给预处理程序 fpp(或 cpp-请参见 -xpp 选项)以进行扩展。
预定义的宏符号具有两个前导下划线。Fortran 语法可能不支持这些宏的实际值-它们只应出现在 fpp 或 cpp 预处理程序指令中。(请注意两个前导下划线。)
产品版本是在 _ _SUNPRO_F90 和 _ _SUNPRO_F95 中预定义的(用十六进制表示)。例如,对于 Sun Studio 12 发行版,_ _SUNPRO_F95 为 0x830。
以下宏是在相应系统上预定义的:
_ _sparc、_ _unix、_ _sun、_ _SVR4、__i386、_ _SunOS_5_6、_ _SunOS_5_7、_ _SunOS_5_8、_ _SunOS_5_9 和 _ _SunOS_5_10
例如,值 _ _sparc 是在 SPARC 系统上定义的。
以下预定义值不带下划线,但是在以后的发行版中可能会删除这些值:sparc、unix 和 sun。
在 SPARC V9 系统上,还定义了 _ _sparcv9 宏。
在 64 位 x86 系统上,定义了宏 __amd64 和 __x86_64。
使用详细选项 (-v) 进行编译可查看由编译器创建的定义。
您可以在类似如下的预处理程序条件中使用这些值:
#ifdef _ _sparc
缺省情况下,f95 使用 fpp(1) 预处理程序。与 C 预处理程序 cpp(1) 一样,fpp 会扩展源代码宏并允许对代码进行条件编译。与 cpp 不同的是,fpp 能够识别 Fortran 语法,并作为首选的 Fortran 预处理程序。使用 -xpp=cpp 标志可以强制编译器明确使用 cpp 而非 fpp。
对齐 COMMON 块和标准数值序列类型,并生成速度更快的多字装入/存储。
此标志可更改 COMMON 块、数值序列类型和 EQUIVALENCE 类中的数据布局,并使编译器能够为该数据生成速度更快的多字装入/存储。
数据布局效果与 -f 标志的效果相同:COMMON 块和 EQUIVALENCE 类中的双精度和四精度数据在内存中根据其“自然”对齐方式(即,与 8 字节边界对齐)进行布局;如果在 64 位环境中使用 -m64 进行编译,则四精度数据与 16 字节边界对齐。缺省情况下,按 4 字节边界对齐 COMMON 块中的数据。还允许编译器采用自然对齐方式并生成速度更快的多字装入/存储以引用数据。
在 SPARC 处理器上,如果结合使用 -dalign 和 -xtypemap=real:64,double:64,integer:64,还会导致 64 位整数变量进行双字对齐。
-dalign 可能导致数据以非标准方式对齐,从而使 EQUIVALENCE 或 COMMON 中的变量出现问题,并可能在需要 -dalign 的情况下使程序变为不可移植。
-dalign 是一个宏,它等效于:
-xmemalign=8s -aligncommon=16(在 SPARC 平台上)
-aligncommon=8(在 32 位 x86 平台上)
-aligncommon=16(在 64 位 x86 平台上)。
如果使用 -dalign 编译某个子程序,请使用 -dalign 编译该程序的所有子程序。此选项包含在 -fast 选项中。
请注意,因为 -dalign 调用 -aligncommon,所以此选项还影响标准数值序列类型。请参见3.4.2 –aligncommon[ ={1|2|4| 8|16}]
强制与 8 字节边界对齐数据。
值为 yes 或 no。如果是 yes,所有变量将与 8 字节边界对齐。缺省值为 -dbl_align_all=no。
在 64 位环境中使用 -m64 进行编译时,此标志会使四精度数据与 16 字节边界对齐。
此标志不改变 COMMON 块或用户定义结构中的数据的布局。
与 -dalign 一起使用可以提高多字装入/存储的效率。
如果使用了此标志,则所有例程都必须使用此标志进行编译。
使用 -depend 或 -depend=yes 可启用依赖性分析。使用 -depend=no(编译器的缺省值)可禁用依赖性分析。
如果未指定优化级别,或者指定的级别低于 O3,则此选项会将优化级别提升到 O3。-depend 还包括在 -fast、-autopar 和 -parallel 中。另请注意,将优化级别指定为 -O3 或更高将自动增加 -depend。(请参见《Fortran 编程指南》。)
禁止动态库。请参见3.4.18 –d{ y|n}。
显示由 f95 命令行驱动程序生成的命令,但不进行编译。
此选项在调试时非常有用,它显示编译器为执行编译将调用的命令和子选项。
如果未指定,则缺省值为 -dy。
与 -Bx 不同,此选项适用于整个可执行文件,并且只需在命令行上出现一次。
–dy|–dn 是加载器和链接程序选项。如果使用这些选项在不同的步骤中编译和链接,则在链接步骤中需要相同选项。
在 64 位 Solaris 环境中,许多系统库不只是作为共享动态库提供,其中包括 libm.so 和 libc.so(不提供 libm.a 和 libc.a)。这意味着,-dn 和 -Bstatic 可能会导致在 64 位 Solaris 环境、32 位 x86 Solaris 平台以及所有 32 位 Solaris 平台(从 Solaris 10 发行版开始)中出现链接错误。这些情况下应用程序必须与动态库链接。
接受扩展长度的输入源代码行。
扩展的源代码行中最多可以包含 132 个字符。编译器在右侧用结尾空白一直填充到第 132 列。如果在使用 -e 进行编译时使用续行,则不跨行拆分字符常量;否则,可能会在常量中插入不必要的空白。
禁止由标记名称列出的警告消息。
禁止显示在标记名称的逗号分隔列表 taglist 中指定的警告消息。如果为 %all,则禁止所有警告,它与 -w 选项等效。如果为 %none,则不禁止任何警告。不具有参数的 —erroff 同 —erroff=%all 等效。
示例:
f95 -erroff=WDECL_LOCAL_NOTUSED ink.f
使用 -errtags 选项可查看与警告消息关联的标记名称。
与每个警告消息一起显示消息标记。
如果使用 -errtags=yes,编译器的内部错误标记名称将与警告消息一起显示。-errtags 本身与 -errtags=yes 等效。
缺省情况下不显示标记 (-errtags=no)。
demo% f95 -errtags ink.f ink.f: MAIN: "ink.f", line 11: Warning: local variable "i" never used (WDECL_LOCAL_NOTUSED) |
taglist 指定应视为错误的警告消息对应的标记名称的逗号分隔列表。如果使用 %all,则将所有警告视为错误。如果使用 %none,则不将任何警告视为错误。
另请参见 -errtags。
(已过时,SPARC)对 Sun 或 Cray 指令标记的循环进行显式并行化。
此选项会启用传统的 Sun 或 Cray 并行化指令。这些指令和并行化模型已过时,不再受支持。OpenMP API 是所支持的首选并行化模型。有关将 Sun/Cray 指令转换为 OpenMP 的详细信息,请参见 -xopenmp 选项以及《OpenMP API 用户指南》。
即使 DO 循环中存在数据依赖性(当循环并行运行时,这些依赖性将使循环生成错误结果),编译器也会生成并行代码。对于显式并行化,用户应该在用并行化指令标记循环之前,正确地分析循环以了解数据依赖性问题。
并行化仅适合于多处理器系统。
此选项启用 Sun 和/或 Cray 显式并行化指令。紧跟在并行化指令之后的 DO 循环将为这些并行化指令生成线程代码。
要启用 OpenMP 显式并行化指令,请不要使用 -explicitpar,而改用 -xopenmp。请参见3.4.155 –xopenmp[={ parallel|noopt|none}]。
对于已通过调用 libthread 库执行了自己的多线程处理的程序,不得使用 -explicitpar 进行编译。
要在多线程环境中运行已并行化的程序,必须在执行之前设置 PARALLEL(或 OMP_NUM_THREADS)环境变量。这会将程序可以创建的最大线程数通知给运行时系统。缺省值为 1。通常会将 PARALLEL 或 OMP_NUM_THREADS 变量设置为目标平台上可用的虚拟处理器数。(请参见psrinfo(1))。
如果使用 -explicitpar 并在同一步骤中编译和链接,则链接将自动包括多线程库和线程安全的 Fortran 运行时库。如果使用 -explicitpar 并在不同的步骤中编译和链接,则还必须使用 -explicitpar 进行链接。
为了提高性能,在使用任何并行化选项(包括 -explicitpar)时还要指定 -stackvar 选项。
使用 -mp 选项(3.4.59 –mp={%none|sun|cray})可选择已启用的并行化指令的风格。缺省情况下,-explicitpar 启用的是 Sun 指令。使用 -explicitpar -mp=cray 可启用 Cray 指令。
如果优化级别不是 -O3 或更高,则会自动将它提升到 -O3。
有关详细信息,请参见《Fortran 编程指南》中的“并行化”一章。
创建带有或不带尾随下划线的外部名称。
e 必须是 plain 或 underscores。缺省值为 underscores。
–ext_names=plain:不增加结尾下划线。
–ext_names=underscores:增加结尾下划线。
外部名称是子例程、函数、块数据子程序或标记通用块的名称。此选项既影响例程入口点的名称,又影响调用例程时使用的名称。使用此标志可允许 Fortran 95 例程调用其他编程语言例程(以及被后者调用)。
将 fpp 预处理程序应用于命令行上列出的 .F、.F90、.F95 和 .F03 源文件,并将处理结果写入一个同名文件,但将该文件的扩展名更改为 .f(或者是 .f95 或 .f03),不进行编译。
示例:
f95 -F source.F
将已处理的源文件写入 source.f
fpp 是 Fortran 的缺省预处理程序。通过指定 -xpp=cpp,可以改为选择 C 预处理程序 cpp。
-f 是一个传统的选项标志,它与 -aligncommon=16 等效。首选使用 -aligncommon。
缺省情况下,按 4 字节边界对齐 COMMON 块中的数据。-f 将 COMMON 块和 EQUIVALENCE 类中双精度和四精度数据的数据布局更改为在内存中根据“自然”对齐方式(即,与 8 字节边界对齐)放置;如果在 64 位 SPARC 环境中使用 -m64 进行编译,则四精度数据与 16 字节边界对齐。
-f 可能导致数据以非标准方式对齐,从而使 EQUIVALENCE 或 COMMON 中的变量出现问题,并可能在需要 -f 的情况下使程序变为不可移植。
使用 -f 编译程序的任何部分都要求使用 -f 编译该程序的所有子程序。
此选项本身并不允许编译器针对双精度和四精度数据生成速度更快的多字获取/存储指令。-dalign 选项执行此操作并调用 -f。相对于以前的 -f,请优先使用 -dalign。请参见3.4.13 –dalign。由于 -dalign 是 -fast 选项的一部分,因此 -f 也是它的一部分。
此选项标志用于将传统的 Fortran 77 源程序(包括那些具有 f77 编译器可接受的语言扩展的源程序)移植到 f95 Fortran 95 编译器。
list 是从下面可能的关键字中选择的逗号分隔列表:
关键字 |
含义 |
---|---|
%all |
启用所有 Fortran 77 兼容性功能。 |
%none |
禁用所有 Fortran 77 兼容性功能。 |
backslash |
在字符串中,将反斜线作为转义序列接受。 |
input |
允许 f77 接受的输入格式。 |
intrinsics |
将内函数的识别限制为仅识别 Fortran 77 内函数。 |
logical |
接受 Fortran 77 的逻辑变量使用,如: -将整数值赋予逻辑变量;-允许在逻辑条件语句中使用算术表达式,用 .NE.0 表示 .TRUE.;-允许关系运算符 .EQ. 和 .NE. 与逻辑操作数一起使用 |
misc |
允许多种 f77 Fortran 77 扩展。 |
output |
生成 f77 样式的格式化输出,包括列表式输出和 NAMELIST 输出。 |
subscript |
允许将非整数表达式作为数组下标。 |
tab |
启用 f77 样式的制表符格式,包括无限制的源代码行长度。对于长度小于 72 个字符的源代码行,将不增加空白填充。 |
对于所有关键字,通过在前面加上 no% 可禁用相应功能,如下所示:
-f77=%all,no%backslash
如果未指定 -f77,则缺省为 -f77=%none。使用不带列表的 -f77 与指定 -f77=%all 是等效的。
异常捕获与 -f77:
指定 -f77 并不会更改 Fortran 95 捕获模式(即 -ftrap=common)。在运算异常捕获方面,Fortran 95 与 Fortran 77 编译器的行为不同。Fortran 77 编译器允许在出现运算异常之后继续执行。使用 -f77 进行编译还会使程序在退出时调用 ieee_retrospective,以报告可能出现的任何运算异常。在命令行上,在 -f77 选项标志之后指定 -ftrap=%none 可以模拟原来的 Fortran 77 行为。
有关f77 兼容性以及从 Fortran 77 迁移到 Fortran 95 的完整信息,请参见4.12 混合语言。
有关如何处理可能导致错误结果的非标准编程症状,另请参见 -xalias 标志。
选择优化执行性能的选项。
该选项定义为其他选项的特殊选择集,它会随版本和编译器的不同而变化。另外,-fast 选择的某些选项并非在所有平台上都可用。使用 -dryrun 标志进行编译可查看 -fast 的扩展。
-fast 可为某些基准测试应用程序提供高性能。但是,对于您的应用程序,选项的特定选择可能是合适的,也可能是不合适的。使用 -fast 是编译应用程序以获得最佳性能的良好起点。但是,仍然可能需要进行其他调整。如果用 -fast 编译时程序不能正常运行,请仔细查看组成 -fast 的各个选项,只调用那些适用于您程序的选项,使程序正常运行。
另请注意,用 -fast 编译的程序对于一些数据集可能会表现出良好的性能和精确的结果,而对于另一些数据集则不然。对于那些依赖浮点运算的特殊属性的程序,请避免用 -fast 进行编译。
由于 -fast 选择的某些选项具有链接含义,因此,如果在不同的步骤中进行编译和链接,还请务必用 -fast 进行链接。
–fast 会选用以下选项:
-xtarget=native 硬件目标。如果打算在不同于编译计算机的目标计算机上运行程序,请在 -fast 之后加上代码生成器选项。例如:f95 -fast -xtarget=ultraT2 ...
-libmil 选项,用于系统提供的内联扩展模板。对于依赖异常处理的 C 函数,请在 -fast 之后加上 -nolibmil(如 -fast -nolibmil)。如果使用了 -libmil,则使用 errno 或 matherr(3m) 无法检测到异常。
-fsimple=2 选项,用于主动浮点优化。如果要求严格遵循 IEEE 754 标准,则 –fsimple=2 是不合适的。请参见3.4.39 –fsimple[ ={1|2|0}]。
-dalign 选项可为通用块中的双精度和四精度数据生成双字装入和存储。使用此选项可以在通用块中生成非标准的 Fortran 数据对齐。
-xvector=lib 使用向量参数将 DO 循环内的某些数学库调用变换为对向量化库等效例程的单个调用。(SPARC)
–fns 可选择非标准浮点运算异常处理和渐进下溢。请参见3.4.33 –fns[ ={yes| no}]。
选择 -fround=nearest,因为 —xvector 和 —xlibmopt 要求使用该选项。(Solaris)
-ftrap=common,用于捕获常见的浮点异常,在 Fortran95 中处于启用状态。
-nofstore 对强制表达式具有结果精度这一行为加以取消。(x86)
-xregs=frameptr 允许编译器将帧指针寄存器用作未分配的被调用方保存寄存器。在 -fast 之后指定 -xregs=no%frameptr,帧指针寄存器将不会作为通用寄存器使用。(x86)
可以对此列表进行增减,方法是在 -fast 选项之后加上其他选项,如下所示:
f95 -fast -fsimple=1 -xnolibmopt ...
它会覆盖 -fsimple=2 选项,并禁用由 -fast 选择的 -xlibmopt。
由于 -fast 会调用 -dalign、-fns 和 -fsimple=2,因此用 -fast 编译的程序会导致非标准浮点运算、非标准数据对齐以及非标准表达式求值顺序。对于大多数程序来说,这些选择可能是不合适的。
请注意,由 -fast 标志选择的一组选项会随各个编译器发行版而发生变化。使用 -dryrun 调用编译器可显示 -fast 扩展:
<sparc>%f95 -dryrun -fast |& grep ### ### command line files and options (expanded): ### -dryrun -xO5 -xarch=sparcvis2 -xcache=64/32/4:1024/64/4 -xchip=ultra3i -xdepend=yes -xpad=local -xvector=lib -dalign -fsimple=2 -fns=yes -ftrap=common -xlibmil -xlibmopt -fround=nearest |
指定固定格式的 Fortran 95 源输入文件。
无论采用哪个文件扩展名,命令行上的所有源文件都将被解释为固定格式文件。通常,f95 仅将 .f 文件解释为固定格式文件,而将 .f95 解释为自由格式文件。
与 -help 等效。
(SPARC) 启用自动生成浮点乘加指令。-fma=none 禁用生成这些指令。-fma=fused 允许编译器通过使用浮点乘加指令尝试查找机会来提高代码性能。缺省值为 -fma=none。
编译器生成乘加指令的最低要求为 -xarch=sparcfmaf,优化级别至少为 -xO2。如果已生成乘加指令来避免在不支持它们的平台上执行程序,编译器将标记二进制程序。
按非标准首选项初始化浮点硬件。
此选项是以下选项标志组合的宏:
–fns -ftrap=common
指定 -fnonstd 大致等效于 Fortran 主程序开始处的以下两个调用。
i=ieee_handler("set", "common", SIGFPE_ABORT) call nonstandard_arithmetic() |
nonstandard_arithmetic() 例程替代了早期发行版中已过时的 abrupt_underflow() 例程。
主程序必须使用此选项进行编译才能有效。
使用此选项初始化浮点硬件,以达到下列目的:
在出现浮点异常时终止(捕获)该异常。
如果下溢结果将提高速度,而不是生成 IEEE 标准所要求的次正规数,则将该结果刷新为零。
有关渐进下溢和次正规数的更多信息,请参见 -fns。
通过 -fnonstd 选项,可以针对浮点溢出、被零除和无效运算异常启用硬件陷阱。这些情况将转换为 SIGFPE 信号,而且如果程序没有 SIGFPE 处理程序,它将以转储内存而终止。
有关更多信息,请参见 ieee_handler(3m) 和 ieee_functions(3m) 手册页,以及《数值计算指南》和《Fortran 编程指南》。
缺省值为标准浮点模式 (–fns=no)。(请参见《Fortran 编程指南》的“浮点运算”一章。)
可选择使用 =yes 或 =no,这样便可以切换跟在某个其他宏标志(如 -fast)后面 的且包含于其中的 -fns 标志。不带值的 -fns 与 -fns=yes 等效。
此选项标志在程序开始执行时启用非标准浮点模式。在 SPARC 平台上,指定非标准浮点模式会禁用“渐进下溢”,从而导致将微小的结果刷新为零,而不是生成次正规数。此外,还会导致次正规操作数在无提示的情况下替换为零。在那些不支持硬件中的渐进下溢和次正规数的 SPARC 系统上,使用此选项将显著提高某些程序的性能。
下表中的 x 不会导致总下溢,当且仅当 |x| 处于所示范围之一时,x 才是一个次正规数:
表 3–8 低于正常的 REAL 和 DOUBLE
数据类型 |
范围 |
---|---|
REAL |
0.0 < |x| < 1.17549435e–38 |
DOUBLE PRECISION |
0.0 < |x| < 2.22507385072014e–308 |
有关次正规数的详细信息,请参见《数值计算指南》;有关此选项和类似选项的更多信息,请参见《Fortran 编程指南》的“浮点运算”一章。(一些算术家使用术语非正规数来代替次正规数。)
缺省情况下,对浮点首选项进行标准初始化:
在 x86 平台上,此选项仅对 Pentium III 和 Pentium 4 处理器(sse 或 sse2 指令集)启用。
在 x86 上,-fns 选择 SSE 刷新为零模式以及非正规数为零模式(如果可用的话)。此标志导致将次正规结果刷新为零。如果可用的话,此标志还导致将次正规操作数视为零。此标志对使用 SSE 或 SSE2 指令集的传统 x87 浮点运算没有影响。
主程序必须使用此选项进行编译才能有效。
检测格式化输入中的浮点溢出。
如果指定了 -fpover=yes ,则 I/O 库将检测格式化输入中的运行时浮点溢出并返回错误条件 (1031)。缺省情况下,不进行这样的溢出检测 (–fpover=no)。不带值的 -fpover 与 -fpover=yes 等效。同 —ftrap 组合使用可获得完整的诊断信息。
通过 fpp 预处理程序传递在 f95 命令行上列出的所有输入源文件,而不管文件扩展名为何。(通常,fpp 仅自动预处理扩展名为 .F、.F90 或 .F95 的文件。)另请参见 3.4.162 –xpp={ fpp|cpp}。
在 x86 上,将浮点精度模式设置为 single、double 或 extended。
如果值为 single 或 double,此标志会在程序启动时将舍入精度模式相应地设置为单精度或双精度。如果值为 extended,,或在缺省情况下且未指定 -fprecision 标志,则舍入精度模式将初始化为扩展精度。
此选项仅对 x86 系统且仅在编译主程序时使用才有效。
命令行上的所有源文件都将被解释为 f95 自由格式源文件,而不管文件扩展名为何。通常,f95 仅将 .f 文件解释为固定格式文件,而将 .f95 解释为自由格式文件。
设置启动时有效的 IEEE 舍入模式。
主程序必须使用此选项进行编译才能有效。
该选项将 IEEE 754 舍入模式设置为:
可以由编译器在对常量表达式求值时使用。
是在程序初始化过程中在运行时建立的。
如果值为 tozero、negative 或 positive,该选项在程序开始执行时将舍入方向相应地设置为舍入为零、舍入为负无穷大或舍入为正无穷大。如果未指定 -fround,则将 -fround=nearest 用作缺省值,舍入方向是舍入为最接近的值。其含义与 ieee_flags 函数相同。(请参见《Fortran 编程指南》的“浮点运算”一章。)
选择浮点优化首选项。
允许优化器作出有关浮点运算的简化假定。(请参见《Fortran 编程指南》的“浮点运算”一章。)
为了获得一致的结果,请使用同一 -fsimple 选项编译程序的所有单元。
缺省值为:
如果不使用 -fsimple 标志,则编译器缺省为 -fsimple=0
如果使用不带值的 -fsimple,则编译器使用 -fsimple=1
各种浮点简化级别如下:
不允许简化假定。保持严格的 IEEE 754 一致性。
允许适度的简化。产生的代码与 IEEE 754 不完全一致,但多数程序所产生的数值结果没有更改。
如果使用 -fsimple=1,优化器可以假定以下内容:
在进程初始化之后,IEEE 754 缺省舍入/捕获模式不发生改变。
可以删除不生成可见结果(潜在的浮点异常除外)的计算。
以无穷大或 NaN(“不是数”)为操作数的计算不需要将 NaN 传播到其结果;例如,x*0 可以由 0 替换。
如果使用 -fsimple=1,则不允许优化器进行完全优化,而不考虑舍入或异常。特别是,在运行时舍入模式包含常量的情况下,浮点计算不能由产生不同结果的计算替换。
除 —fsimple=1 外,还允许主动浮点优化。这会导致某些程序因表达式求值方式的变化而生成不同的数值结果。尤其是,使用 -fsimple=2 可能会违反如下 Fortran 标准规则:要求编译器用显式圆括号将子表达式括起来以控制表达式求值顺序。对于依赖此规则的程序,这会导致数值舍入差异。
例如,如果使用 -fsimple=2,编译器可能将 C-(A-B) 计算为 (C-A)+B,从而违反了有关显式圆括号的标准规则(如果生成的代码已更好地进行了优化)。编译器还可能将 x/y 的重复计算替换为 x*z,其中的 z=1/y 计算一次并暂时保存,以消除成本较高的除法运算。
对于依赖浮点运算的特定属性的程序,不得使用 -fsimple=2 进行编译。
即使使用 -fsimple=2,也仍然不允许优化器在程序中引入浮点异常,如果不在这样的程序中引入浮点异常,该程序将不生成任何异常。
–fast 会选择 -fsimple=2。
对于赋值语句,此选项将所有浮点表达式强制为目标变量的精度。这是缺省设置。但是,-fast 选项包括可用来禁用此选项的 -nofstore。-fast 后跟 -fstore 可以重新打开此选项。
t 是一个逗号分隔列表,它包含以下项中的一个或多个:
%all、%none、common、[no%]invalid、[no%]overflow、[no%]underflow、[no%]division、[no%]inexact。
-ftrap=common 是 -ftrap=invalid,overflow,underflow,division 的宏。
f95 的缺省值为 -ftrap=common。这与 C 和 C++ 编译器的缺省值不同,后者为 -ftrap=none。
设置在启动时有效的 IEEE 754 捕获模式,但不安装 SIGFPE 处理程序。可以使用 ieee_handler(3M) 或 fex_set_handling(3M) 启用陷阱并同时安装 SIGFPE 处理程序。如果指定多个值,则按从左到右顺序处理列表。按照定义,常见异常包括无效、被零除和溢出。
示例:-ftrap=%all,no%inexact 表示设置除 inexact 以外的所有陷阱。
-ftrap=t 的含义与 ieee_flags() 基本相同,不同之处是:
%all 打开所有捕获模式,并会导致捕获伪异常和预期异常。请改用 common。
%none 关闭所有捕获模式。
no% 前缀关闭该特定捕获模式。
主程序必须使用此选项进行编译才能有效。
有关详细信息,请参见《Fortran 编程指南》的“浮点运算”一章。
指示链接程序生成共享动态库。如果不使用 -G,则链接程序生成可执行文件。如果使用 -G,它将生成动态库。将 -o 与 -G 一起使用可以指定要写入的文件的名称。有关详细信息,请参见《Fortran 编程指南》的“库”一章。
生成其他符号表信息,以便使用 dbx(1) 调试实用程序进行调试,并使用性能分析器进行性能分析。
虽然在不指定 -g 的情况下也可以进行一些调试,但是 dbx 和 debugger 的完整功能只供那些使用 -g 编译的编译单元使用。
与 -g 一起指定的其他选项的某些功能可能是有限的。有关详细信息,请参见 dbx 文档。
要使用性能分析器的完整功能,请使用 -g 进行编译。尽管一些性能分析功能不要求使用 -g,但是您必须使用 -g 进行编译才能查看带注释的源代码、一些函数级信息和编译器注释性消息。(请参见 analyzer(1) 手册页和《Sun Studio 性能分析器》手册。)
使用 -g 生成的注释性消息说明编译器在编译程序时进行的优化和变换。通过 er_src(1) 命令,可以显示与源代码交错的消息。
请注意,仅当编译器实际执行了优化时,才会出现注释性消息。如果请求高优化级别(如使用 -xO4 或 -fast),则更有可能看到注释性消息。
此选项将被传递给链接程序。有关详细信息,请参见 Solaris《链接程序和库指南》以及《Fortran 编程指南》的“库”一章。
-hname 选项将名称 name 记录到共享动态库中,作为库的内部名称创建。-h 和 name 之间的空格是可选的(除非库名称是 elp,此时要求使用空格)。通常,name 必须与跟在 -o 后面的内容相同。如果不同时指定 -G,则使用此选项是无意义的。
如果不使用 -hname 选项,则在库文件中不记录内部名称。
如果库具有内部名称,则每当运行引用该库的可执行程序时,运行时链接程序将在其搜索的任何路径中搜索具有相同内部名称的库。在指定了内部名称的情况下,在运行时链接过程中搜索库更为灵活。此选项还可用于指定共享库的版本。
如果没有共享库的内部名称,则链接程序将改用共享库文件的特定路径。
显示编译器选项的摘要列表。
另请参见3.4.131 –xhelp={ readme|flags}。
在 INCLUDE 文件搜索路径的开始处插入目录路径 path。在 -I 和 path 之间不允许有空格。无效目录将被忽略,并且不显示警告消息。
include 文件搜索路径是在其中搜索 INCLUDE 文件(出现在预处理程序 #include 指令或 Fortran INCLUDE 语句中的文件名)的目录的列表。
示例:在 /usr/app/include 中搜索 INCLUDE 文件:
demo% f95 -I/usr/app/include growth.F |
在命令行上可以出现多个 -Ipath 选项。每个选项都添加到搜索路径列表的顶部(搜索的第一个路径)。
INCLUDE 或 #include 的相对路径的搜索顺序如下:
要调用预处理程序,您必须使用 .F、.F90、.F95 或 .F03 后缀来编译源文件。
使用 —xtypemap=integer:64 指定该编译器的 8 字节 INTEGER。
启用或禁用指定例程的内联。
请求优化器对出现在函数和子例程名称列表(用逗号分隔)中的用户编写例程进行内联。在例程名之前加上 no% 可禁用对该例程的内联。
内联是一种优化方法,编译器可以通过该方法有效地将子程序引用(如 CALL 或函数调用)替换为实际的子程序代码本身。内联通常为优化器提供更多生成高效代码的机会。
指定 %auto 可以在优化级别 -O4 或 -O5 上启用自动内联。如果使用 -inline 指定了显式内联,则这些优化级别的自动内联会正常关闭。
示例:对 xbar、zbar 和 vpoint 例程进行内联:
demo% f95 -O3 -inline=xbar,zbar,vpoint *.f |
下面是一些限制;不发出任何警告:
必须在 -O3 或更高级别进行优化。
例程的源代码必须位于所编译的文件中,除非还指定了 -xipo 或 –xcrossfile。
编译器确定实际内联是否有利和安全。
-inline 与 -O4 一起使用可禁用编译器通常执行的自动内联,除非还指定了 %auto。如果使用 -O4,则编译器通常会尝试对用户编写的所有适当的子例程和函数进行内联。-inline 与 -O4 一起使用可能会降低性能,因为优化器只能对列表中的那些例程进行内联。在这种情况下,请使用 %auto 子选项启用 -O4 和 -O5 级别的自动内联。
demo% f95 -O4 -inline=%auto,no%zpoint *.f |
在上例中,用户在禁止对编译器可能尝试的例程 zpoint() 进行任何可能的内联的同时,还启用了 -O4 级别的自动内联。
以全局方式为所有的格式化输入/输出运算设置 ROUND= 说明符。
如果使用 -iorounding=compatible,数据转换后的值是与两个最接近表示更接近的值,如果值正好在两者中间,则是离 0 远的值。
如果使用 -iorounding=processor-defined,则舍入模式是处理器的缺省模式。在未指定 -iorounding 时,这是缺省值。
(已过时)与 -pic 等效。
(已过时)与 -PIC 等效。
将 path 添加到要在其中搜索库的目录路径的列表中。
将 path 添加到目标库搜索目录列表的前面。-L 和 path 之间的空格是可选的。此选项将传递给链接程序。另请参见3.4.53 –lx。
在生成可执行文件时,ld(1) 在 path 中搜索归档库(.a 文件)和共享库(.so 文件)。ld 在搜索缺省目录之前搜索 path。(有关库搜索顺序的信息,请参见《Fortran 编程指南》的“库”一章。)有关 LD_LIBRARY_PATH 和 -Lpath 之间的相对顺序,请参见 ld(1)。
使用 -Lpath 指定 /usr/lib 或 /usr/ccs/lib 可能会阻止链接未绑定的 libm。缺省情况下,将搜索这些目录。
示例:使用 -Lpath 指定库搜索目录:
demo% f95 -L./dir1 -L./dir2 any.f |
将 -lx 传递给链接程序,以指定供 ld 在其中搜索未解析引用的其他库。ld 与对象库 libx 链接。如果共享库 libx.so 可用(且未指定 -Bstatic 或 -dn),则 ld 使用它,否则,ld 使用静态库 libx.a。如果它使用共享库,则将该名称生成到 a.out 中。在 -l 和 x 字符串之间不允许有空格。
示例:与库 libVZY 进行链接:
demo% f95 any.f -lVZY |
再次使用 -lx 以便与更多的库链接。
示例:与库 liby 和 libz 进行链接:
demo% f95 any.f -ly -lz |
有关库搜索路径和搜索顺序的信息,另请参见《Fortran 编程指南》的“库”一章。
某些 libm 库例程有内联模板。此选项会选择那些为当前使用的浮点选项和平台生成速度最快的可执行文件的内联模板。
有关更多信息,请参见 libm_single(3F) 和 libm_double(3F) 手册页。
显示哪些循环是使用 –autopar 选项并行化的以及哪些不是。
–loopinfo 显示有关标准错误的消息的列表:
demo% f95 -c -fast -autopar -loopinfo shalow.f ... "shalow.f", line 172: PARALLELIZED, and serial version generated "shalow.f", line 173: not parallelized, not profitable "shalow.f", line 181: PARALLELIZED, fused "shalow.f", line 182: not parallelized, not profitable ... ...etc |
指定 MODULE 目录、归档或文件。
在路径中查找当前编译中引用的 Fortran 95 模块。在当前目录之外的目录中搜索此路径。
path 可以指定目录、预编译模块文件的 .a 归档文件,或 .mod 预编译模块文件。编译器通过检查文件的内容来确定其类型。
要在其中搜索模块的 .a 归档文件必须在 -M 选项标志上显式指定。缺省情况下,编译器不搜索归档文件。
只搜索与出现在 USE 语句中的 MODULE 名称同名的 .mod 文件。例如,语句 USE ME 使编译器仅查找模块文件 me.mod。
搜索模块时,编译器为在其中写入模块文件的目录指定更高的优先级。这是由 -moddir 编译器选项或 MODDIR 环境变量控制的。如果上述两者都未指定,则缺省写入目录为当前目录。如果两者均已指定,则写入目录是 -moddir 标志指定的路径。
这意味着,如果只出现了 -M 标志,则先在当前目录中搜索模块,然后再在 -M 标志上列出的任何对象中进行搜索。要模拟以前发行版的行为,请使用:
-moddir=empty-dir -Mdir -M
其中 empty-dir 是空目录的路径。
-M 和路径之间可以有空格例如,-M /home/siri/PK15/Modules
在 Solaris 上,如果路径标识一个非归档文件或模块文件的常规文件,则编译器会将该选项传递给链接程序 ld,链接程序会将该选项作为链接程序映射文件。与 C 和 C++ 编译器类似,此功能作为公用选项提供。
有关 Fortran 95 中模块的更多信息,请参见4.9 模块文件。
使用 -m32 创建 32 位可执行文件和共享库。使用 -m64 创建 64 位可执行文件和共享库。
在所有 Solaris 平台以及未启用 64 位的 Linux 平台上缺省为 ILP32 内存模型(32 位 int、long 和指针数据类型)。在启用了 64 位的 Linux 平台上缺省为 LP64 内存模型(64 位 long 和指针数据类型)。-m64 仅允许在启用了 LP64 模型的平台上使用。
使用 -m32 编译的目标文件或库不能同使用 -m64 编译的目标文件或库链接。
当编译具有大量静态数据的应用程序时,可能还需要使用 -m64、-xmodel=medium。
请注意,部分 Linux 平台不支持中等模型。
注意,在以前的编译器发行版中,通过选择带有 -xarch 的指令集来实现内存模型 ILP32 或 LP64 。从 Sun Studio 12 编译器开始,不再存在这种情况。在大多数平台上,仅需向命令行添加 -m64 即可创建 64 位对象。
在 Solaris 上,缺省为 -m32。在支持 64 位程序的 Linux 系统上,缺省为 -m64 -xarch=sse2。
指定编译器将写入已编译的 .mod MODULE 文件的位置。
编译器会将它编译的 .mod MODULE 信息文件写入由 path 指定的目录。也可以使用 MODDIR 环境变量指定目录路径。如果同时使用这两种方法指定了目录路径,则此选项标志优先。
有关 Fortran 95 中模块的更多信息,请参见4.9 模块文件。
Sun 和 Cray 并行化指令已过时,请改用 OpenMP 并行化 API。《OpenMP API 用户指南》介绍了如何将应用程序迁移到 OpenMP。
如果未指定 -explicitpar,则缺省值为 -mp=%none。
如果指定了 -explicitpar,则缺省值为 -mp=sun。
-mp=sun | |
-mp=cray | |
-mp=%none |
忽略所有并行化指令。 |
还必须指定 -explicitpar(或 -parallel)以启用并行化。为了确保正确无误,还要指定 -stackvar:
-explicitpar -stackvar -mp=cray
要针对 OpenMP 并行化进行编译,请使用 -xopenmp 标志。请参见3.4.155 –xopenmp[={ parallel|noopt|none}]。
在同一编译单元中,Sun 指令和 Cray 指令不能同时处于活动状态。
本手册中的表 C–1 提供了 Sun 和 Cray 并行化指令摘要。有关详细信息,请参见《Fortran 编程指南》。
要求链接到线程安全库。
如果您进行自己的低级线程管理(例如,通过调用 libthread 库),则使用 -mt 进行编译可防止冲突。
如果混合使用 Fortran 与调用 libthread 库的多线程 C 代码,请使用 -mt。另请参见 Solaris《多线程编程指南》。
在使用 -autopar、-explicitpar 或 -parallel 选项时,会自动隐含 –mt。
请注意以下事项:
执行 I/O 的函数子程序本身不应该作为 I/O 语句的一部分被引用。在使用 -mt 时,这样的递归 I/O 可能会使程序出现死锁。
通常,不要使用 -autopar、-explicitpar 或 -parallel 编译自己的多线程代码。编译器生成的对线程库的调用可能与程序拥有的调用发生冲突,从而导致意外的结果。
在单处理器系统中,使用 -mt 选项可能会降低性能。
(已过时)优化主机系统的性能。
此选项与首选设置 -xtarget=native 等效。-fast 选项设置 -xtarget=native。
禁用由先前出现在命令行上的 -autopar 调用的自动并行化。
(SPARC) 取消先前出现在命令行上的任何 -depend。
禁用由先前出现在命令行上的 -explicitpar 调用的显式并行化。
编译器的缺省值为 -fstore。-fast 包括 -nofstore。
不自动与任何系统库或语言库链接;也就是说,不将任何缺省的 -lx 选项传递给 ld。正常行为是将系统库自动链接到可执行文件,而无需用户在命令行上指定它们。
使用 -nolib 选项,可以更轻松地静态链接其中的一个库。最终执行需要系统库和语言库。手动链接它们是您的责任。通过此选项,您可以完全控制与库的链接。
将 libm(静态)和 libc(动态)与 f95 链接:
demo% f95 -nolib any.f95 -Bstatic -lm -Bdynamic -lc |
-lx 选项的顺序是很重要的。请遵循示例所示的顺序。
取消命令行上的 -libmil。
在 -fast 选项之后使用此选项,可禁用 libm 数学例程的内联:
demo% f95 -fast -nolibmil … |
禁用命令行上的 -reduction。
此选项禁用 -reduction。
不会将运行时共享库搜索路径生成到可执行文件中。
编译器通常将一个路径生成到可执行文件中,从而告知运行时链接程序查找所需共享库的位置。该路径取决于具体的安装。-norunpath 选项阻止将该路径生成到可执行文件中。
如果已将库安装在一些非标准位置,而且您不希望在另一位置运行可执行文件时让加载器搜索这些路径,则此选项是很有用的。请与 -Rpaths 进行比较。
有关更多信息,请参见《Fortran 编程指南》的“库”一章。
n 可以是 1、2、3、4 或 5。在 -O 和 n 之间不允许有空格。
如果未指定 -O[n],则仅执行非常基本级别的优化,即限于局部公共子表达式消除和无用代码分析。与不使用优化相比,使用优化级别进行优化可以大大提高程序的性能。对于大多数程序,建议使用 -O(它设置 -O3)或 -fast(它设置 -O5)。
每个 -On 级别的优化都包括在低于它的级别上执行的优化。通常,编译程序时使用的优化级别越高,获得的运行时性能也越高。但是,优化级别越高,编译时间会越长,可执行文件也越大。
使用 -g 进行调试不会禁止 -On,但是 -On 在某些方面限制 -g;请参见 dbx 文档。
-O3 和 -O4 选项降低调试的效用,这样您无法从 dbx 显示变量,但仍可以使用 dbx where 命令获取符号回扫。
如果优化器内存不足,则它尝试在较低优化级别上再次进行,即继续在原始级别上对后续例程进行编译。
有关优化的详细信息,请参见《Fortran 编程指南》的“性能剖析”和“性能与优化”这两章。
此选项与 -O3 等效。
提供最少的语句级优化。
如果更高的级别会导致编译时间过长,或者超过了可用交换空间,请使用此选项。
启用基本块级别的优化。
通常,此级别产生的代码大小是最小的。(另请参见 -xspace。)
–O3 的使用应优先于 -O2,除非 -O3 导致编译时间过长、超过交换空间或生成过大的可执行文件。
在函数级别上增加循环解开和全局优化。自动添加 -depend。
通常,-O3 生成的可执行文件较大。
通常,-O4 生成的可执行文件较大(因为进行了内联)。
-g 选项禁止如上所述的 -O4 自动内联。–xcrossfile 会增大使用 -O4 进行内联的范围。
尝试主动优化。
仅适合于使用计算时间最大部分的一小段程序。-O5 的优化算法所用的编译时间较长,在应用于太大的源程序段时也可能降低性能。
如果使用配置文件反馈进行优化,则此级别上的优化更有可能提高性能。请参见 -xprofile=p。
指定要写入的可执行文件的名称。
-o 和 name 之间必须有一个空格。如果不使用此选项,则缺省为将可执行文件写入 a.out。在与 -c 一起使用时,-o 指定目标 .o 目标文件;在与 -G 一起使用时,它指定目标 .so 库文件。
编译 DO 循环以便至少执行它们一次。如果上限小于下限,则在标准 Fortran 中根本不执行 DO 循环;这一点与 Fortran 的某些传统实现是不同的。
(已过时)为使用 prof 配置程序进行文件配置而编译。
准备目标文件以进行文件配置,请参见 prof (1)。如果在不同的步骤中编译和链接,而且使用 -p 选项进行编译,请确保使用 -p 选项进行链接。-p 与 prof 一起使用主要是为了与旧系统兼容。使用 gprof 的 -pg 文件配置可能是一个更好的备用方案。有关详细信息,请参见《Fortran 编程指南》的“性能剖析”一章。
插入填充以便提高高速缓存的使用效率。
如果数组或字符变量是静态的局部数组或变量且未初始化,或者位于通用块中,则此选项在数组之间或字符变量之间插入填充。额外填充将数据定位以便更好地利用高速缓存。在任意一种情况下,数组或字符变量都不能是等效的。
如果 p 存在,则 p 必须为 %none,或者为 local 或 common 之一(或两者):
local |
在邻近的局部变量之间添加填充。 |
common |
在通用块中的变量之间增加填充。 |
%none |
不增加填充。(编译器缺省值。) |
如果同时指定了 local 和 common,则它们可以以任意顺序显示。
-pad 的缺省值:
缺省情况下编译器不进行填充。
如果指定了 -pad 但不带值,则它与 -pad=local,common 等效。
-pad[=p] 选项适用于满足以下条件的项:
项是数组或字符变量
项是静态本地的或处于通用块中
有关本地或静态变量的定义,请参见3.4.96 –stackvar。
程序必须符合以下限制:
数组或字符串都不是等效的
如果为了对引用通用块的某个文件进行编译而指定了 -pad=common,则在对引用该通用块的所有文件进行编译时也必须指定它。此选项更改通用块内变量的间距。如果一个程序单元是使用该选项编译的,而另一个程序单元不是用该选项编译的,则在应该引用通用块中的同一位置时,可能会引用不同的位置。
如果指定了 -pad=common,则不同程序单元中通用块变量的声明必须是相同的(变量名称除外)。在通用块中的变量之间插入的填充量取决于那些变量的声明。如果变量在不同程序单元中的大小或等级不同,即使是在同一文件内,变量的位置也可能不同。
如果指定了 -pad=common,则用警告消息标记那些涉及通用块变量的 EQUIVALENCE 声明,而且不填充该块。
如果指定了 -pad=common,请避免通用块中出现索引超出数组边界的情况。如果更改已填充通用块中邻近数据的位置,将导致过度索引 (overindexing) 以不可预知的方式失败。
使用 -pad 时,程序员应确保以一致的方式编译通用块。如果不同程序单元中的通用块没有一致地使用 -pad=common 进行编译,则会导致错误。如果同名的通用块在不同的程序单元中具有不同的长度,则将报告正在使用 -Xlist 进行编译。
(并行化,SPARC)使用以下选项进行并行化:-autopar、-explicitpar、-depend
此选项包括 -explicitpar,它可启用传统的 Sun 和 Cray 并行化指令。这些指令现已过时,不再受支持。OpenMP API 是 Sun Studio 编译器所支持的首选并行化模型。有关将传统 Sun/Cray 指令迁移到 OpenMP 的详细信息,请参见 Sun Studio《OpenMP API 用户指南》。
对编译器自动选择的循环以及用户所提供的指令显式指定的循环进行并行化。如果优化级别较低,则会将它自动提升到 -O3。另请参见3.4.23 –explicitpar。
为了提高性能,在使用任何并行化选项(包括 -autopar)时,还要指定 -stackvar 选项。
缺省情况下,Sun 风格的并行化指令处于启用状态。使用 -mp=cray 可选择 Cray 风格的并行化指令。(注:对于 OpenMP 并行化,请使用 -xopenmp,而不要使用 -parallel。)
如果执行自己的线程管理,请不要使用 -parallel。请参见3.4.60 –mt。
并行化选项(如 -parallel)用于生成将在多处理器系统上运行的可执行程序。在单处理器系统上,并行化通常会降低性能。
要在多线程环境中运行已并行化的程序,必须在执行之前设置 PARALLEL(或 OMP_NUM_THREADS)环境变量。这会将程序可以创建的最大线程数通知给运行时系统。缺省值为 1。通常会将 PARALLEL 或 OMP_NUM_THREADS 变量设置为目标平台上可用的虚拟处理器数。(请参见 psrinfo(1))
如果使用 -parallel 并在同一步骤中进行编译和链接,则链接会自动包括多线程库和线程安全的 Fortran 运行时库。如果使用 -parallel 并在不同的步骤中进行编译和链接,则还必须使用 -parallel 进行链接。
有关详细信息,请参见《Fortran 编程指南》的“并行化”一章。
为使用 gprof 配置程序进行文件配置而编译。
以 -p 的方式编译自配置代码,但调用一种运行时记录机制,该机制可保存更广泛的统计信息并在程序正常终止时生成 gmon.out 文件。通过运行 gprof 生成执行配置文件。有关详细信息,请参见 gprof(1) 手册页和《Fortran 编程指南》。
库选项必须跟在源文件和 .o 文件后面(–pg 库是静态的)。
如果指定了 -pg,则使用 -xprofile 进行编译并无优势。这两个功能中的任一功能不会准备或使用由另一个功能提供的数据。
使用 prof(1) 或 gprof(1)(在 64 位 Solaris 平台上)或者仅使用 gprof(在 32 位 Solaris 平台上)生成的配置文件中包括大致的用户 CPU 时间。这些时间来自主可执行文件中的例程以及共享库中例程(链接可执行文件时将共享库指定为链接程序参数)的 PC 示例数据(请参见 pcsample(2))。其他共享库(在进程启动后使用 dlopen(3DL) 打开的库)不进行文件配置。
在 32 位 Solaris 系统中,使用 prof(1) 生成的配置文件仅限于可执行文件中的例程。通过将可执行文件与 -pg 链接并使用 gprof(1),可以对 32 位共享库进行文件配置。
Solaris 10 软件不包括使用 -p 编译的系统库。因此,在 Solaris 10 平台上收集的配置文件不包含系统库例程的调用计数。
不应当使用编译器选项 -p、-pg 或 -xpg 来编译多线程程序,因为这些选项的运行时支持不是线程安全的。如果利用这些选项来编译使用多个线程的程序,则可能会在运行时产生无效结果或段故障。
如果在不同的步骤中进行编译和链接,并使用 -pg 进行编译,请确保使用 -pg 进行链接。
为共享库编译与位置无关的代码。
在 SPARC 上,–pic 与 -xcode=pic13 等效。有关与位置无关的代码的更多信息,请参见3.4.122 –xcode=keyword。
在 x86 上,生成与位置无关的代码。生成共享库时使用该选项编译源文件。对全局数据的每个引用都生成为全局偏移表中指针的非关联化。每个函数调用都通过过程链接表在 pc 相对地址模式中生成。
使用 32 位地址编译与位置无关的代码。
在 SPARC 上,–PIC 与 -xcode=pic32 等效。有关与位置无关的代码的更多信息,请参见3.4.122 –xcode=keyword。
在 x86 上,—PIC 与 —pic 等效。
将子选项列表 ls 传递到编译阶段 pr。
必须使用空格来分隔 Qoption、pr 和 ls。Q 可以是大写的,也可以是小写的。该列表是一个逗号分隔的子选项列表,其中不包含空格。每个子选项都必须适合于该程序阶段,而且可以以负号开头。
提供此选项主要是为了供支持人员调试编译器的内部。使用 LD_OPTIONS 环境变量可以将选项传递给链接程序。请参见《Fortran 编程指南》中有关链接和库的章节。
与 -p 等效。
将动态库搜索路径生成到可执行文件中。
如果使用此选项,则链接程序 ld(1) 将动态库搜索路径列表存储到可执行文件中。
ls 是一个用冒号分隔的库搜索路径目录列表。-R 和 ls 之间的空格是可选的。
此选项的多个实例并置在一起,各个列表由冒号分隔。
该列表由运行时链接程序 ld.so 在运行时使用。在运行时,将扫描所列出路径中的动态库以满足任何未解析的引用。
使用此选项,用户可以在不使用特殊路径选项查找所需动态库的情况下运行现有的可执行文件。
使用 -Rpaths 生成可执行文件,可将目录路径添加到缺省路径 /opt/SUNWspro/lib(始终最后搜索它)。
有关更多信息,请参见《Fortran 编程指南》的“库”一章以及 Solaris《链接程序和库指南》。
所有单精度 REAL 常量都将提升为 REAL*8 常量。双精度 (REAL*8) 常量保持不变。此选项仅适用于常数。要同时提升常量和变量,请参见3.4.179 –xtypemap= spec。
请小心使用此选项标志。当使用已提升为 REAL*8 常量的 REAL*4 常量调用需要 REAL*4 参数的子例程或函数时,此选项标志可能会导致接口问题。此选项标志还可能导致那些读取无格式数据文件的程序出现问题,这些文件是由无格式写入功能使用 I/O 列表上的 REAL*4 常量写入的。
识别循环中的约简操作。
在自动并行化期间分析循环以了解约简操作。约简操作可能存在舍入误差。
约简操作将数组元素累加为单个标量值。例如,对向量元素求和是典型的约简操作。虽然这些操作违反了可并行化标准,但是编译器可以识别它们,并在指定了 -reduction 时作为特殊情况对它们进行并行化。有关编译器可识别的约简操作的信息,请参见《Fortran 编程指南》的“并行化”一章。
此选项只能与自动并行化选项 -autopar 或 -parallel 一起使用。否则,它将被忽略。对于约简操作,不分析显式并行化的循环。
示例:使用约简操作自动进行并行化:
demo% f95 -parallel -reduction any.f |
编译并仅生成汇编代码。
编译指定的程序,并在后缀为 .s 的相应文件中保留汇编语言输出,而不创建 .o 文件。
此选项使可执行文件变得更小,并使逆向工程的实施更困难。但是,此选项禁止使用 dbx 或其他工具进行调试,而且覆盖 -g。
不能在编译器通过 fpp 或 cpp 预处理程序自动传递的源文件(即扩展名为 .F、.F90、.F95 或 .F03 的文件)上使用 -sb,也不能将 -sb 与 -F 选项一起使用。
(已过时)仅生成源代码浏览器表。
仅为源代码浏览器生成表信息。不汇编、链接或生成目标文件。
不能在编译器通过 fpp 或 cpp 预处理程序自动传递的源文件(即扩展名为 .F、.F90、.F95 或 .F03 的文件)上使用 -sbfast,也不能将 -sbfast 与 -F 选项一起使用。
(已过时)禁止编译器消息。
通常,f95 编译器在编译过程中不发出除错误诊断之外的消息。提供此选项标志是为了与传统的 f77 编译器兼容;除非与 -f77 兼容性标志一起使用,否则使用它是多余的。
尽可能在栈上分配局部变量。
此选项使编写递归代码和可重入代码更容易,并在并行化循环时为优化器提供更多自由。
建议将 -stackvar 与任何并行化选项一起使用。
局部变量是除哑元、COMMON 变量、从外部作用域继承的变量或可通过 USE 语句访问的模块变量之外的变量。
在 -stackvar 有效的情况下,局部变量是在栈上分配的,除非它们具有属性 SAVE 或 STATIC。请注意,显式初始化的变量是使用 SAVE 属性隐式声明的。缺省情况下,未显式初始化但其某些组件已初始化的结构变量,没有使用 SAVE 隐式声明。此外,与具有 SAVE 或 STATIC 属性的变量等效的变量,也隐式具有 SAVE 或 STATIC。
以静态方式分配的变量隐式初始化为零,除非程序为其显式指定了初始值。在栈上分配的变量并未隐式初始化(缺省情况下可进行初始化的结构变量的组件除外)。
使用 -stackvar 将大数组放在栈上可以使栈溢出,从而导致段故障。此时可能需要增加栈大小。
执行程序的初始线程有一个主栈,而多线程程序的每个帮助器线程都有自己的线程栈。
主栈的缺省大小约为 8 兆字节。线程栈在 32 位系统上缺省大小为 4 兆字节,在 64 位系统上缺省大小为 8 兆字节。limit 命令(不带参数)可显示当前的主栈大小。如果使用 -stackvar 时出现段故障,请尝试增加主栈和线程栈的大小。
示例:显示当前的主栈大小:
demo% limit cputime unlimited filesize unlimited datasize 523256 kbytes stacksize 8192 kbytes <––– coredumpsize unlimited descriptors 64 memorysize unlimited demo% |
demo% limit stacksize 65536 |
示例:将每个线程栈大小设置为 8 兆字节:
demo% setenv STACKSIZE 8192 |
通过为 STACKSIZE 环境变量指定值(单位为千字节),可以设置每个从线程使用的栈大小:
% setenv STACKSIZE 8192
将每个从线程的栈大小设置为 8 MB。
STACKSIZE 环境变量还接受带有 B(字节)、K(千字节)、M(兆字节)或 G(千兆字节)后缀的数值。缺省单位为千字节。
有关与并行化一起使用 -stackvar 的详细信息,请参见《Fortran 编程指南》的“并行化”一章。有关 limit 命令的详细信息,请参见 csh(1)。
使用 -xcheck=stkovf 进行编译,可启用栈溢出情况的运行时检查。请参见3.4.120 –xcheck=keyword。
缺省值为 -stop_status=no。
如果使用 -stop_status=yes,则 STOP 语句可以包含整型常量。在程序终止时,该值将传递到环境:
STOP 123
该值必须介于 0 和 255 之间。大于 255 的值将被截断并发出运行时消息。请注意,尽管将发出编译器警告消息,但是仍将接受
STOP "stop string"
并将状态值 0 返回到环境。
环境状态变量是 $status(对于 C shell csh)和 $?(对于 Bourne shell sh 和 Korn shell ksh)。
为临时文件定义目录。
将编译器所用临时文件的目录设置为 dir。在此选项字符串中不允许有空格。如果不使用此选项,则将这些文件放在 /tmp 目录中。
每个编译阶段所用时间。
识别源文件中的大写字母和小写字母。
不将大写字母视为与小写字母等效。缺省情况下,将大写字母视为小写字母(字符串常量中的字母除外)。如果使用此选项,编译器会将 Delta、DELTA 和 delta 视为不同的符号。此选项不会影响对内函数的调用。
可移植性以及将 Fortran 与其他语言混合使用可能要求使用 -U。请参见《Fortran 编程指南》中有关将程序移植到 Fortran 95 的一章。
取消预处理程序宏 name 的定义。
此选项仅适用于那些调用 fpp 或 cpp 预处理程序的源文件。它会删除同一命令行上由 -Dname 创建的预处理程序宏 name 的任何初始定义,包括由命令行驱动程序隐式放在此处的那些内容,而不管选项出现的顺序如何。它对源文件中的任何宏定义都没有影响。在命令行上可以出现多个 -Uname 标志。-U 和宏 name 之间不得有空格。
报告未声明的变量。
使所有变量的缺省类型都成为未声明的,而不是使用 Fortran 隐式确定类型,就好像 IMPLICIT NONE 出现在每个编译单元中一样。此选项警告存在未声明的变量,并且不覆盖任何 IMPLICIT 语句或显式 type 语句。
启用 DO 循环的解开(如果可能)。
n 是正整数。选项有:
n=1 禁止解开所有循环。
n>1 建议优化器尝试解开循环 n 次。
通常,解开循环可提高性能,但会增加可执行文件的大小。有关此编译器及其他编译器优化的更多信息,请参见《Fortran 编程指南》的“性能与优化”一章。另请参见2.3.1.3 UNROLL 指令。
指定隐式 USE 模块。
list 是模块名称或模块文件名称的逗号分隔列表。
使用 -use=module_name 进行编译,可将 USE module_name 语句添加到正编译的每个子程序或模块中。使用 -use=module_file_name 进行编译,可为包含在指定文件中的每个模块添加 USE module_name。
有关 Fortran 95 中模块的更多信息,请参见4.9 模块文件。
在与 Sun 服务工程师讨论问题时,此信息可能非常有用。
详细模式-显示每个编译过程的详细信息。
与 -V 一样,此选项在编译器执行时显示每个工作循环的名称,以及驱动程序使用的选项、宏标志扩展和环境变量的详细信息。
keywords 说明符必须是以下子选项之一或从中选择的子选项的逗号分隔列表。
blank_zero |
在内部文件上将格式化输入中的空格解释为零。 |
---|---|
debug |
将以字符 'D' 开头的行解释为正规 Fortran 语句,而不是像 VMS Fortran 中那样解释为注释。 |
rsize |
将无格式的记录大小解释为以字为单位,而不是解释为以字节为单位。 |
struct_align |
内存中 VAX 结构的布局组件,与 VMS Fortran 中一样,没有填充。注意:这会导致数据无法对齐,为避免此类错误,应与 —xmemalign 一同使用。 |
%all |
启用所有这些 VAX VMS 功能。 |
%none |
禁用所有这些 VAX VMS 功能。 |
通过在子选项前面加上 no%,可以单独选择或关闭该子选项。
示例:
-vax=debug,rsize,no%blank_zero
在编译器对那些用指令显式标记为并行化的循环进行分析时,它发出有关所检测到的某些数据依赖性的警告消息;但是仍将对循环进行并行化。
示例:冗余并行化警告:
demo% f95 -explicitpar -vpara any.f any.f: MAIN any: "any.f", line 11: Warning: the loop may have parallelization inhibiting reference |
请与 -xopenmp 和 OpenMP API 指令一起使用,或者与 -explicitpar 和 C$MIC DOALL 传统并行化指令一起使用。
由编译器发出的警告检测到下列情形:
OpenMP 数据共享属性子句使用不当。例如,将变量声明为共享,而在 OpenMP 并行区域中访问该变量会导致数据争用;或者将变量声明为私有,但在并行区域后面使用其在并行区域中的值。
C$MIC DOALL 对在不同循环迭代之间具有数据依赖性的循环进行并行化。
如果在处理所有并行化指令时没有出现任何问题,则不显示警告。
Sun Studio 编译器支持 OpenMP API 并行化模型。因此,C$MIC 并行化指令已过时。有关迁移到 OpenMP API 的信息,请参见《OpenMP API 用户指南》。
显示或禁止警告消息。
此选项显示或禁止大多数警告消息。但是,如果一个选项覆盖命令行上先前选项的全部或部分,您确实会收到一条警告消息。
-w0 仅显示错误消息。它等效于 -w。-w1 显示错误和警告。在不使用 -w 的情况下,这是缺省值。-w2 显示错误、警告和注意。-w3 显示错误、警告、注意和说明。-w4 显示错误、警告、注意、说明和注释。
示例:-w 仍然允许显示某些警告:
demo% f95 -w -parallel any.f f95: Warning: Optimizer level changed from 0 to 3 to support parallelized code demo% |
生成列表并进行全局程序检查 (global program checking, GPC)。
使用此选项可查找潜在的编程错误。它调用额外的编译过程,以便在全局程序中检查子程序调用参数、通用块和参数的一致性。此选项还生成带行号的源代码列表,包括交叉引用表。由 -Xlist 选项发出的错误消息是建议性警告,不会阻止程序的编译和链接。
请确保在使用 -Xlist 进行编译之前,更正源代码中的所有语法错误。如果运行有语法错误的源代码,可能会产生不可预知的报告。
示例:检查例程之间的一致性:
demo% f95 -Xlist fil.f |
上述示例将以下内容写入输出文件 fil.lst:
带行号的源代码列表(缺省)
有关例程间不一致性的错误消息(嵌入在列表中)
标识符的交叉引用表(缺省)
缺省情况下,将列表写入文件 name.lst,其中 name 采用命令行上列出的第一个源文件。
许多子选项为操作选择提供了更多灵活性。它们是由 -Xlist 主选项的后缀指定的,如下表所示:
表 3–9 –Xlist 子选项
选项 |
特性 |
---|---|
–Xlist |
显示错误、列表和交叉引用表 |
–Xlistc |
显示调用图和错误 |
–XlistE |
显示错误 |
–Xlisterr[nnn] |
禁止错误 nnn 消息 |
–Xlistf |
显示错误、列表和交叉引用,但不显示目标文件 |
–Xlisth |
如果检测到错误,则终止编译 |
–XlistI |
分析 #include 和 INCLUDE 文件以及源文件 |
–XlistL |
仅显示列表和错误 |
–Xlistln |
将页面长度设置为 n 行 |
-XlistMP |
检查 OpenMP 指令 (SPARC) |
–Xlisto name |
将报告文件输出到 name,而不是 file.lst |
–Xlists |
禁止来自交叉引用表的未引用名称 |
–Xlistvn |
将检查级别设置为 n(1、2、3 或 4)-缺省值为 2 |
–Xlistw[nnn] |
将输出行的宽度设置为 nnn 列-缺省值为 79 |
–Xlistwar[nnn] |
禁止警告 nnn 消息 |
–XlistX |
显示交叉引用表和错误 |
有关详细信息,请参见《Fortran 编程指南》的“程序分析和调试”一章。
与 -a 等效。
指定要由编译器假定的别名程度。
一些非标准编程方法会产生干扰编译器优化策略的情况。使用过度索引、指针以及将全局或非唯一变量作为子程序参数进行传递,会产生歧义别名情况,从而使代码无法按预期方式运行。
使用 -xalias 标志可将程序偏离 Fortran 标准的别名要求的程度通知给编译器。
此标志可能带有关键字列表,也可能不带关键字列表。keywords 列表由逗号分隔,各个关键字指示程序中存在的别名情况。
可以在每个关键字前面加上 no%,以指示不存在的别名类型。
别名关键字如下:
表 3–10 -xalias 选项关键字
指定不带列表的 -xalias 将为不违反 Fortran 别名规则的大多数程序提供最佳性能,不带列表的 -xalias 等效于:
no%dummy,no%craypointer,no%actual,no%overindex,no%ftnpointer
为了提高效率,在使用优化级别 -xO3 及更高级别进行编译时,应该使用 -xalias。
如果未指定 -xalias 标志,则编译器在缺省情况下假定程序符合 Fortran 95 标准(Cray 指针除外):
no%dummy,craypointer,no%actual,no%overindex,no%ftnpointer
有关各种别名情况的示例以及如何使用 -xalias 指定它们,请参见《Fortran 编程指南》的“移植”一章。
指定指令集体系结构 (instruction set architecture, ISA)。
-xarch 关键字 isa 接受的体系结构如表 3–11 所示:
表 3–11 –xarch ISA 关键字
平台 |
有效的 -xarch 关键字 |
SPARC |
generic、generic64、native、native64、sparc、sparcvis、sparcvis2、sparcfmaf、v9、v9a 和 v9b |
x86 |
generic、native、386、pentium_pro、sse、sse2、amd64、pentium_proa、ssea、sse2a、amd64a、sse3 |
请注意,尽管 -xarch 可以单独使用,但它是 –xtarget 选项扩展的一部分,并且可用于覆盖由特定 -xtarget 选项设置的 -xarch 值。例如:
% f95 -xtarget=ultra2 -xarch=sparcfmaf ...
会覆盖由 -xtarget=ultra2 设置的 -xarch。
通过只允许指定的指令集,此选项可将编译器生成的代码限定于指定指令集体系结构的指令。此选项不保证使用任何特定于目标的指令。
如果此选项与优化一起使用,则在指定的体系结构上,适当的选择可以为可执行文件提供良好性能。如果选择不当,则会导致二进制程序在预定的目标平台上无法执行。
请注意以下事项:
传统的 32 位 SPARC 指令集体系结构 V7 和 V8 指 —m32,并且无法与 —m64 组合。
可以链接使用 sparc 和 sparcvis 编译的目标二进制文件 (.o),并可同时执行它们,但只能在 sparcvis 兼容的平台上运行。
可以链接使用 sparc、sparcvis 和 sparcvis2 编译的目标二进制文件 (.o),并可同时执行它们,但只能在 sparcvis2 兼容的平台上运行。
对于任何特定选择,生成的可执行文件在早期体系结构中运行时都会慢得多。此外,虽然在多数指令集体系结构中都可以使用四精度(REAL*16 和 long double)浮点指令,但编译器不在它生成的代码中使用这些指令。
在 SPARC 平台上,未指定 -xarch 时的缺省值为 sparc;在 x86 平台上,则为 386。
表 3–12 提供了有关 SPARC 平台上每个 -xarch 关键字的详细信息。
表 3–12 SPARC 平台的 -xarch 值
-xarch= |
含义 (SPARC) |
---|---|
generic |
使用大多数处理器通用的指令集进行编译。 |
generic64 |
针对大多数的 64 位平台进行编译。 (仅适用于 Solaris)此选项与 -m64 -xarch=generic 等效,并与早先的发行版兼容。使用 -m64(而非 -xarch=generic64)指定 64 位编译 |
native |
为了在此系统上获得良好性能而进行编译。 编译器为运行它的当前系统处理器选择适当的设置。这是 -fast 选项的缺省值。 |
native64 |
为了在此系统上获得 64 位模式下的良好性能而进行编译。 (仅适用于 Solaris)此选项与 -m64 -xarch=native 等效,并与早先的发行版兼容。 |
sparc |
针对 SPARC–V9 ISA 进行编译。 针对 V9 ISA 进行编译,但不具备可视指令集 (Visual Instruction Set, VIS),也不具备特定于其他实现的 ISA 扩展。该选项在 V9 ISA 上使编译器生成高性能代码。 |
sparcvis |
针对具有 UltraSPARC 扩展的 SPARC–V9 ISA 进行编译。 针对 SPARC-V9 加可视指令集 (Visual Instruction Set, VIS) 版本 1.0 进行编译,并具有 UltraSPARC 扩展。该选项在 UltraSPARC 体系结构上使编译器生成高性能代码。 |
sparcvis2 |
针对具有 UltraSPARC-III 扩展的 SPARC-V9 ISA 进行编译。 此选项允许编译器在具有 UltraSPARC III 扩展的 UltraSPARC 体系结构以及可视化指令集 (VIS) 2.0 版上生成目标代码。 |
sparcfmaf |
针对 SPARC-V9 ISA 的 sparcfmaf 版本进行编译。 允许编译器使用 SPARC-V9 指令集,加 UltraSPARC 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 1.0)、UltraSPARC-III 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 2.0)以及面向浮点乘加的 SPARC64 VI 扩展中的指令。 注意,必须将 -xarch=sparcfmaf 与 -fma=fused 以及某些优化级别结合使用,来使编译器尝试寻找机会自动使用乘加指令。 |
v9 |
与 -m64 -xarch=sparc 等效。传统的 make 程序的描述文件和脚本(使用 -xarch=v9 来获取 64 位内存模型)仅需使用 -m64。 |
v9a |
与 -m64 -xarch=sparcvis 等效,并与早前的发行版兼容。 |
v9b |
与 -m64 -xarch=sparcvis2 等效,并与早期的发行版兼容。 |
表 3–13 详细介绍了 x86 平台上的每个 -xarch 关键字。在 x86 平台上,如果未指定 -xarch,则缺省值为 generic。
表 3–13 x86 平台的 -xarch 值
-xarch= |
含义 (x86) |
---|---|
generic |
为了在大多数 32 位 x86 平台上获得良好性能而进行编译。这是缺省值,与 -xarch=386 等效。 |
generic64 |
为了在大多数 64 位 x86 平台上获得良好性能而进行编译。它当前解释为 amd64。 |
native |
为了在此 x86 体系结构上获得良好性能而进行编译。使用最佳指令集以便在大多数 x86 处理器上获得良好性能。对于每个新发行版,“最佳”指令集的定义可能会有所调整(如果适用)。 |
native64 |
为了在此 64 位 x86 体系结构上获得良好性能而进行编译。 |
386 |
将指令集限制于 Intel 386/486 体系结构。 |
pentium_pro |
将指令集限制于 Pentium Pro 体系结构。 |
pentium_proa |
将 AMD 扩展(3DNow!、3DNow! 扩展和 MMX 扩展)添加到 32 位 Pentium Pro 体系结构中。 |
sse |
将 SSE 指令集添加到 pentium_pro 中。(参见下面的注释。) |
ssea |
将 AMD 扩展(3DNow!、3DNow! 扩展和 MMX 扩展)添加到 32 位 SSE 体系结构中。 |
sse2 |
将 SSE2 指令集添加到 pentium_pro 中。(参见下面的注释。) |
sse2a |
将 AMD 扩展(3DNow!、3DNow! 扩展和 MMX 扩展)添加到 32 位 SSE2 体系结构中。 |
sse3 |
向 SSE2 指令集中添加 SSE3 指令集。 |
amd64 |
与 -m64 -xarch=sse2 等效(仅适用于 Solaris)。传统的 make 程序的描述文件和脚本(使用 -xarch=amd64 获取 64 位内存模式)仅需使用 -m64。 |
amd64a |
与 —m64 —xarch=sse2a 等效(仅适用于 Solaris)。 |
当针对 x86 Solaris 平台进行编译时,有几项重要的注意事项。
如果在编译程序时将 -xarch 设置为 sse、sse2、sse2a 或 sse3,则编译的程序必须在支持这些功能和扩展的平台上运行。
从 Solaris 9 4/04 开始的操作系统发行版在 Pentium 4 兼容的平台上支持 SSE/SSE2。更早版本的 Solaris 操作系统不支持 SSE/SSE2。
如果在不同的步骤中进行编译和链接,请始终使用编译器和相同的 -xarch 设置进行链接,以确保链接正确的启动例程。
x86 上的运算结果可能与 SPARC 上的结果不同,这是由 x86 80 字节浮点寄存器造成的。为了最大限度减少这些差异,请使用 -fstore 选项或使用 -xarch=sse2 进行编译(如果硬件支持 SSE2)。
从 Sun Studio 11 和 Solaris 10 操作系统开始,会对使用这些专用的 -xarch 硬件标志编译和生成的程序二进制文件进行验证,看其是否在适当的平台上运行。
在 Solaris 10 以前的系统上,不进行任何验证,而是由用户负责确保使用这些标志生成的对象已部署在适当的硬件上。
如果在没有相应功能或指令集扩展的平台上运行使用这些 -xarch 选项编译的程序,则可能会导致段故障或不正确的结果,并且不显示任何显式警告消息。
此警告还会扩展到采用 .il 内联汇编语言函数或 __asm() 汇编程序代码(使用 SSE、SSE2、SSE2a 和 SSE3 指令和扩展)的程序。
设置参数以控制 ASSUME pragma。
使用此标志可控制编译器处理源代码中 ASSUME pragma 的方式。
ASSUME pragma 为程序员提供了一种断言特殊信息(编译器使用这些特殊信息实现较佳的优化)的方法。可以使用可能值限定这些断言。可能值为 0 或 1 的断言将被标记为“确定”,否则视为不确定。
也可以使用可能性或确定性来断言将要执行的 DO 循环的行程计数,或断言将要采取的分支。
有关 f95 编译器可识别的 ASSUME pragma 的说明,请参见2.3.1.9 ASSUME 指令。
-xassume_control 选项上的 keywords 可以是一个子选项关键字,也可以是关键字的逗号分隔列表。可以识别的关键字子选项如下:
optimize |
在 ASSUME pragma 上作出的断言会影响程序的优化。 |
check |
编译器生成用于检查标记为“确定”的所有断言是否正确的代码,并在断言被违反时发出运行时消息;如果没有同时指定 fatal,则程序继续运行。 |
fatal |
与 check 一起使用时,如果标记为“确定”的断言被违反,则程序将终止。 |
retrospective[:d] |
d 参数是可选的容差值,它必须是小于 1 的常量,而且必须是正实数。缺省值为 ".1"。retrospective 编译代码以确定所有断言的真假。那些超出容差值 d 的值将在程序终止时的输出中列出。 |
%none |
忽略所有的 ASSUME pragma。 |
编译器的缺省值是
-xassume_control=optimize
这意味着,编译器可识别 ASSUME pragma,而且后者将影响优化,但不进行检查。
如果指定不带参数的 -xassume_control,则隐含
-xassume_control=check,fatal
在这种情况下,编译器接受并检查所有确定的 ASSUME pragma,但是后者不影响优化。无效的断言将导致程序终止。
与 -autopar 等效。
(SPARC) 准备二进制文件以进行编译后优化。
binopt(1) 将启用已编译的二进制文件,供以后进行优化、变换和分析使用。在生成可执行文件或共享对象时可以使用此选项,但是它必须与 -O1 或更高优化级别一起使用才有效。
在使用此选项生成时,二进制文件的大小会有所增加,大约增加 5%。
如果在不同的步骤中进行编译和链接,则 -xbinopt 必须既出现在编译步骤中,也出现在链接步骤中。
如果应用程序的源代码并不都是使用 -xbinopt 编译的,则 -xbinopt 标志仍应当出现在用于生成程序二进制文件的最终链接步骤中,如下所示:
example% f95 -0 program -xbinopt=prepare a.o b.o c.f95 |
只有使用 -xbinopt 编译的代码才能用 binopt(1) 优化。
缺省值为 -xbinopt=off。
c 必须是以下值之一:
generic
native
s1/l1/a1[/t1]
s1/l1/a1[/t1]:s2/l2/a2[/t2]
s1/l1/a1[/t1]:s2/l2/a2[/t2]:s3/l3/a3[/t3]
si/li/ai/ti 的定义如下:
si 是 i 级数据高速缓存的大小(千字节);li 是 i 级数据高速缓存的行大小(字节);ai 是 i 级数据高速缓存的关联性;ti 是共享 i 级高速缓存的硬件线程数(可选)。
该选项指定了优化器可以使用的缓存属性,不保证使用每个特定的缓存属性。
尽管此选项可以单独使用,但它是 –xtarget 选项扩展的一部分;提供它是为了允许覆盖特定 -xtarget 选项所隐含的 -xcache 值。
表 3–14 –xcache 值
值 |
含义 |
---|---|
generic |
定义高速缓存属性,以便在大多数处理器上获得良好性能,而不使性能有较大幅度的降低。这是缺省设置。 |
native |
定义高速缓存属性,以便在此主机平台上获得良好性能。 |
s1/l1/a1[/t1} |
定义 1 级高速缓存属性。 |
s1/l1/a1[/t1}:s2/l2/a2[/t2} |
定义 1 级和 2 级高速缓存属性。 |
s1/l1/a1[/t1}:s2/l2/a2[/t2}:s3/l3/a3[/t3} |
定义 1 级、2 级和 3 级高速缓存属性 |
示例:-xcache=16/32/4:1024/32/1 指定了以下内容:
一个 1 级高速缓存具有以下属性:16K 字节、32 字节行大小、4 向关联性。
一个 2 级高速缓存具有以下属性:1024K 字节、32 字节行大小、直接映射关联性。
(SPARC/已过时)与 -cg89 等效。
(SPARC/已过时)与 -cg92 等效。
生成特殊的运行时检查和初始化。
keyword 必须是以下项之一:
栈溢出(尤其是在栈上分配大数组的多线程应用程序中)可能会在邻近线程栈中导致无提示的数据损坏。如果怀疑存在栈溢出,请使用 -xcheck=stkovf 编译所有例程。但请注意,使用此标志进行编译不保证将检测到所有栈溢出情况,因为它们可能出现在不是使用此标志编译的例程中。
尽管此选项可以单独使用,但它是 –xtarget 选项扩展的一部分;提供它是为了允许覆盖特定 -xtarget 选项所隐含的 -xchip 值。
下面是 -xchip=c 的一些作用:
指令调度
编译分支的方式
在语义等效的两个选择项之间进行选择
下面的两个表列出了有效的 -xchip 处理器名称值:
表 3–15 常用的 –xchip SPARC 处理器的名称
-xchip= |
为以下项目进行优化 |
---|---|
generic |
大多数 SPARC 处理器。(这是缺省情况。) |
native |
此主机平台。 |
sparc64vi |
SPARC64 VI 处理器。 |
ultra |
UltraSPARC 处理器。 |
ultra2 |
UltraSPARC II 处理器。 |
ultra2e |
UltraSPARC IIe 处理器。 |
ultra2i |
UltraSPARC IIi 处理器。 |
ultra3 |
UltraSPARC III 处理器。 |
ultra3cu |
UltraSPARC IIIcu 处理器。 |
ultra3i |
UltraSPARC IIIi 处理器。 |
ultra4 |
UltraSPARC IV 处理器。 |
ultra4plus |
UltraSPARC IV+ 处理器。 |
ultraT1 |
UltraSPARC T1 处理器。 |
ultraT2 |
UltraSPARC T2 处理器。 |
在 x86 平台上:-xchip 值为 pentium、pentium_pro、pentium3、pentium4、generic、opteron 和 native。
keyword 的值包括:
keyword |
特性 |
abs32 |
生成 32 位绝对地址。代码+数据+bss 的大小不应超过 2**32 字节。下面是 32 位平台上的缺省值。 |
abs44 |
生成 44 位绝对地址。代码+数据+bss 的大小不应超过 2**44 字节。仅在 64 位平台上可用。 |
abs64 |
生成 64 位绝对地址。仅在 64 位平台上可用。 |
pic13 |
生成与位置无关的代码(小模型)。与 -pic 等效。在 32 位平台上,最多允许引用 2**11 个唯一外部符号;在 64 位平台上,最多允许引用 2**10 个。 |
pic32 |
生成与位置无关的代码(大模型)。与 -PIC 等效。在 32 位平台上,最多允许引用 2**30 个唯一外部符号;在 64 位平台上,最多允许引用 2**29 个。 |
如果不显式指定 -xcode=keyword,则缺省值是:
–xcode=abs32(在 32 位平台上)。–xcode=abs44(在 64 位平台上)。
在创建动态共享库以提高运行时性能时,可使用 -xcode=pic13 或 -xcode=pic32。
虽然动态可执行文件内的代码通常绑定到内存中的固定地址,但是可以将与位置无关的代码装入进程地址空间中的任意位置。
在使用与位置无关的代码时,将生成可重定位引用,作为通过全局偏移表的间接引用。在使用 -xcode=pic13 或 -xcode=pic32 进行编译时,由于不要求大量的重定位(这些重定位是与位置有关的代码所强制的),因此会使共享对象中的频繁访问项获益。
全局偏移表的大小不应超过 8Kb。
-xcode={pic13|pic32} 有两个名义性能成本:
使用 -xcode=pic13 或 -xcode=pic32 编译的例程在入口处执行几个额外的指令,以便将寄存器设置为指向用于访问共享库的全局变量或静态变量的全局偏移表。
每次访问全局变量或静态变量时,都会涉及到通过全局偏移表进行额外的间接内存引用。如果编译是使用 pic32 进行的,则每个全局和静态内存引用都有两个额外指令。
在考虑上述成本时,请记住:由于受到库代码共享的影响,使用 -xcode=pic13 或 -xcode=pic32 会大大减少系统内存需求。共享库中已使用 -xcode=pic13 或 -xcode=pic32 编译的每个代码页,都可以由使用该库的每个进程共享。如果共享库中的代码页包含非 pic(即绝对)内存引用,即使仅包含单个非 pic 内存引用,该页也将变为不可共享,而且每次执行使用该库的程序时都必须创建该页的副本。
确定是否已使用 -xcode=pic13 或 -xcode=pic32 编译 .o 文件的最简单方法是使用 nm 命令:
nm file.o | grep _GLOBAL_OFFSET_TABLE_
包含与位置无关的代码的 .o 文件将包含对 _GLOBAL_OFFSET_TABLE_ 的未解析外部引用(用字母 U 标记)。
要确定是使用 -xcode=pic13 还是 -xcode=pic32,请通过使用 elfdump -c(有关更多信息,请参见 elfdump(1) 手册页)来查看全局偏移表 (Global Offset Table, GOT) 的大小以及节标题 sh_name: .got。sh_size 值是 GOT 的大小。如果 GOT 小于 8,192 字节,请指定 -xcode=pic13,否则指定 -xcode=pic32。
通常,应根据以下准则来确定如何使用 -xcode:
如果要生成可执行文件,则不应该使用 -xcode=pic13 或 -xcode=pic32。
如果是生成仅用于链接到可执行文件的归档库,则不应该使用 -xcode=pic13 或 -xcode=pic32。
如果要生成共享库,请先使用 -xcode=pic13,一旦 GOT 大小超过 8,192 字节,则使用 -xcode=pic32。
如果要生成用于链接到共享库的归档库,则应该使用 -xcode=pic32。
在生成动态库时,建议使用 -xcode=pic13 或 pic32(或者 -pic 或 -PIC)选项进行编译。请参见《Solaris 联接程序和库指南》。
此选项提供了检测使用 TASK COMMON 及并行化的程序中的通用块不一致性的调试检查。(请参见《Fortran 编程指南》的“并行化”一章中有关 TASK COMMON 指令的讨论。)
缺省值为 -xcommonchk=no;即,用于检测通用块不一致性的运行时检查处于禁用状态,因为它会导致性能降低。请仅在程序开发和调试过程中使用 -xcommonchk=yes,而不应将其用于符合最终产品质量的程序。
使用 -xcommonchk=yes 进行编译会启用运行时检查。如果在一个源程序单元中声明为正规通用块的通用块出现在 TASK COMMON 指令上的某个其他位置,则程序将停止并显示一条错误消息,指出第一个此类不一致。不带值的 -xcommonchk 与 -xcommonchk=yes 等效。
示例:tc.f 中缺少 TASKCOMMON 指令
demo% cat tc.f common /x/y(1000) do 1 i=1,1000 1 y(i) = 1. call z(57.) end demo% cat tz.f subroutine z(c) common /x/h(1000) C$PAR TASKCOMMON X C$PAR DOALL do 1 i=1,1000 1 h(i) = c* h(i) return end demo% f95 -c -O4 -parallel -xcommonchk tc.f demo% f95 -c -O4 -parallel -xcommonchk tz.f demo% f95 -o tc -O4 -parallel -xcommonchk tc.o tz.o demo% tc ERROR(libmtsk): inconsistent declaration of threadprivate/taskcommon x_: not declared as threadprivate/taskcommon at line 1 of tc.f demo% |
通常,编译器的分析范围限定为命令行上的每个独立文件。例如,-O4 的自动内联处理仅限于同一源文件中定义和引用的子程序。
如果使用 -xcrossfile,编译器会分析命令行上命名的所有文件,就好像这些文件被连接到一个源文件中。
仅当与 -O4 或 -O5 一起使用时,–xcrossfile 才有效。
跨文件内联会创建可能但通常不存在的源文件相互依赖性。如果使用 -xcrossfile 编译的一组文件中的任何文件发生了更改,则必须重新编译所有文件,以确保正确地内联新代码。请参见3.4.48 –inline=[ %auto][[,][no%] f1,…[no%]fn]。
如果命令行上没有 -xcrossfile,则缺省值为 -xcrossfile=0,而且不执行跨文件优化。要启用跨文件优化,请指定 -xcrossfile(与 -xcrossfile=1 等效)。
编译中的任何 .s 汇编程序源文件不参与跨文件分析。此外,使用 -S 进行编译时,-xcrossfile 标志将被忽略。
Sun Studio 编译器会将调试器信息的格式从 "stabs" 格式迁移到 "dwarf" 格式。此发行版的缺省设置为 -xdebugformat=dwarf。
如果要维护读取调试信息的软件,您现在可以选择将工具从 stabs 格式转换为 dwarf 格式。
出于移植工具的目的,可以通过此选项来使用新的格式。除非您要维护读取调试器信息的软件,或者特定工具要求使用这些格式之一的调试器信息,否则不需要使用此选项。
-xdebugformat=stabs 生成使用 stabs 标准格式的调试信息。
-xdebugformat=dwarf 生成的调试信息采用 dwarf 标准格式。
如果未指定 -xdebugformat,编译器将假定 -xdebugformat=dwarf。指定此选项而不带参数是不正确的。
此选项影响使用 -g 选项记录的数据的格式。该信息的某些格式也可以使用此选项进行控制。因此,即使不使用 -g,-xdebugformat 仍会产生影响。
dbx 和性能分析软件可识别 stabs 和 dwarf 格式,因此使用此选项对其中任一工具的功能并无影响。
这是过渡性接口,因此会在发行版之间发生更改而不兼容,即使在发行版更新较少时也是如此。stabs 或 dwarf 格式的任何特定字段或值的详细资料也在不断改进。
使用 dwarfdump(1) 命令确定已编译目标文件或可执行文件中调试信息的格式。
与 -depend 等效。
与 -explicitpar 等效。
允许使用编译器、性能分析器和链接程序重组核心映像中的函数(子程序)。如果使用 -xF 选项编译,然后运行分析器,则可以生成映射文件,该文件可用于优化函数在内存中的排序(具体取决于一起使用这些函数的方式)。可以通过使用链接程序的 -Mmapfile 选项,来指示此后用于生成可执行文件的链接使用该映射。它将可执行文件中的每个函数都放置到单独的部分中。(f95 —Mpath 选项还将常规文件传递给链接程序,请参见 f95 —Mpath 选项的说明。)
仅当应用程序文本缺页时间占用了应用程序的大部分时间时,对内存中的子程序进行重组才有用。否则,重组不能提高应用程序的总体性能。有关分析器的详细信息,请参见 Program Performance Analysis Tools 手册。
支持 little-endian 和 big-endian 平台之间的文件共享。
该标志标识无格式 I/O 文件数据的字节顺序和字节对齐。options 必须指定下面的任一组合,但必须至少有一个规范:
littlemax_align:spec
bigmax_align:spec
native:spec
max_align 为目标平台声明最大字节对齐。允许的值有 1、2、4、8 和 16。此对齐适用于 Fortran VAX 结构和 Fortran 95 派生类型,它们使用依赖于平台的对齐以便与 C 语言结构保持兼容。
little 指定平台上的 "little-endian" 文件,其中最大字节对齐为 max_align。例如,little4 指定 32 位 x86 文件;而 little16 描述 64 位 x86 文件。
big 指定最大对齐为 max_align 的 "big-endian" 文件。例如,big8 描述 32 位 SPARC 文件,而 big16 描述 64 位 SPARC 文件。
native 指定字节顺序和对齐与编译处理器平台所用的字节顺序和对齐相同的“本机”文件。假定以下内容为“本机”:
平台 |
“本机”对应于: |
---|---|
32 位 SPARC |
big8 |
64 位 SPARC |
big16 |
32 位 x86 |
little4 |
64 位 x86 |
little16 |
spec 必须是包含以下内容的逗号分隔列表:
%all
unit
filename
%all 指所有文件和逻辑单元,但用 "SCRATCH" 打开的或在 -xfilebyteorder 标志中的其他位置显式命名的文件和逻辑单元除外。%all 只能出现一次。
unit 指程序打开的特定 Fortran 单元号。
filename 指程序打开的特定 Fortran 文件名。
-xfilebyteorder=little4:1,2,afile.in,big8:9,bfile.out,12 -xfilebyteorder=little8:%all,big16:20
此选项不适用于使用 STATUS="SCRATCH" 打开的文件。对这些文件执行的 I/O 操作始终依照本机处理器的字节顺序和字节对齐。
如果命令行中没有出现 -xfilebyteorder,则第一个缺省设置为 -xfilebyteorder=native:%all。
在此选项中只能声明一次文件名或单元号。
如果在命令行中出现了 -xfilebyteorder,则它必须至少带有 little、big 或 native 规范之一。
将此标志没有显式声明的文件假定为本机文件。例如,如果使用 -xfilebyteorder=little4:zork.out 进行编译,就会将 zork.out 声明为最大数据对齐为 4 字节的 little-endian 32 位 x86 文件。程序中的所有其他文件均是本机文件。
如果为文件指定的字节顺序与本机处理器相同,但指定了不同的对齐,即使没有进行字节交换,也会使用相应的填充。例如,如果针对 64 位 x86 平台使用 -m64 进行编译,并指定了 -xfilebyteorder=little4:filename,就会出现这种情况。
大端字节序和小端字节序平台之间共享的数据记录中的声明类型必须具有相同的大小。例如,使用 -xtypemap=integer:64,real:64,double:64 编译的 x86 可执行文件不能读取使用 -xtypemap=integer:64,real:64,double:128 编译的 SPARC 可执行文件生成的文件,因为二者的缺省双精度数据类型具有不同的大小。
请注意,在 x86 平台上不能使用包含 REAL*16 数据的无格式文件,这些平台不支持 REAL*16。
如果使用整个 UNION/MAP 数据对象对指定为非本机的文件执行 I/O 操作,则会导致运行时 I/O 错误。只能使用 MAP 的个别成员(而不能使用包含 UNION/MAP 的整个 VAX 记录)对非本机文件执行 I/O 操作。
将霍尔瑞斯常量视为实际参数列表中的字符串。
如果使用 -xhasc=yes,则当霍尔瑞斯常量在子例程或函数调用中作为实际参数出现时,编译器将霍尔瑞斯常量视为字符串。这是缺省值,并且符合 Fortran 标准。(编译器生成的实际调用列表包含每个字符串的隐藏字符串长度。)
如果使用 -xhasc=no,则霍尔瑞斯常量将被视为子程序调用中的无类型值,并且只将它们的地址放在实际参数列表中。(传递到子程序的实际调用列表中不会生成字符串长度。)
如果例程调用带有霍尔瑞斯常量的子程序,并且调用的子程序要求参数为 INTEGER(或除 CHARACTER 以外的任意类型),请使用 -xhasc=no 编译例程。
示例:
demo% cat hasc.f call z(4habcd, ’abcdefg’) end subroutine z(i, s) integer i character *(*) s print *, "string length = ", len(s) return end demo% f95 -o has0 hasc.f demo% has0 string length = 4 <-- 应为 7 demo% f95 -o has1 -xhasc=no hasc.f demo% has1 string length = 7 <-- 此时为 s 的正确长度 |
将 4habcd 传递到 z 是通过使用 -xhasc=no 进行编译来正确处理的。
提供此标记是为了帮助移植传统的 Fortran 77 程序。
显示此发行版的编译器的联机自述文件。
列出编译器选项标志。与 -help 等效。
启用 -xhwcprof 后,编译器将生成信息,该信息可帮助工具将已进行文件配置的装入指令和存储指令与它们所引用的数据类型和结构成员(结合使用 -g 生成的符号信息)相关联。 它将配置文件数据同目标文件的数据空间(而不是指令空间)相关联,并对行为进行洞察,而这仅从指令配置中是无法轻易获得的。
当可以使用 -xhwcprof 编译指定的目标文件集时,如果对应用程序中的所有目标文件应用该选项,则该选项最为有用。它能全面识别并关联分布在应用程序目标文件中的所有内存引用。
如果分别在单独的步骤中进行编译和链接,最好在链接时使用 -xhwcprof。
-xhwcprof=enable 或 -xhwcprof=disable 的实例将会覆盖同一命令行中 -xhwcprof 的所有以前的实例。
在缺省情况下,禁用 -xhwcprof。指定不带任何参数的 -xhwcprof 与 -xhwcprof=enable 等效。
-xhwcprof 要求打开优化,并将调试数据格式设置为 dwarf (-xdebugformat=dwarf),这是该发行版 Sun Studio 的缺省设置。
-xhwcprof 和 -g 的组合会增加编译器临时文件的存储需求,而且比单独指定 -xhwcprof 和 -g 所引起的增加总量还多。
下列命令可编译 example.f,并可为硬件计数器文件配置以及针对使用 DWARF 符号的数据类型和结构成员的符号分析指定支持:
f95 -c -O -xhwcprof -g example.f |
有关基于硬件计数器的文件配置的详细信息,请参见 Sun Studio 性能分析器手册。
(SPARC) 启用区间运算扩展并设置合适的浮点环境。
如果未指定此选项,则缺省值为 -xia=widestneed。
《Interval Arithmetic Programming Reference》中详细说明了区间运算的 Fortran 95 扩展。另请参见3.4.136 –xinterval[ ={widestneed|strict| no}]。
-xia 标志是一个宏,其扩展如下:
-xia 或 -xia=widestneed |
-xinterval=widestneed -ftrap=%none -fns=no -fsimple=0 |
-xia=strict |
-xinterval=strict -ftrap=%none -fns=no -fsimple=0 |
与 -inline 等效。
指定此选项编译您的程序并为其提供程序设备,以供线程分析器进行分析。
(有关线程分析器的详细信息,请参见 tha(1)。)
通过使用此选项进行编译,您可以随后使用性能分析器通过 collect -r races 运行已提供了程序设备的程序,来创建数据争用检测试验。可以单独运行已提供了程序设备的代码,但其运行速度将非常缓慢。
指定 -xinstrument=no%datarace 关闭该功能。这是缺省设置。
必须为 -xinstrument 指定一个参数。
如果分步进行编译和链接,则必须在编译和链接步骤中都指定 -xinstrument=datarace。
此选项定义了预处理程序令牌 __THA_NOTIFY。可以指定 #ifdef __THA_NOTIFY 保护对 libtha(3) 例程的调用。
此选项还设置 -g。
(SPARC) 启用区间运算扩展。
可选值可以是 no、widestneed 或 strict。如果未指定,则缺省值为 widestneed。
no |
未启用区间运算扩展。 |
将任何混合模式表达式中的所有非区间变量和文字提升为表达式中范围最广的区间数据类型。 |
|
禁止混合类型或混合长度区间表达式。所有区间类型和长度转换都必须是显式的。 |
《Fortran 95 Interval Arithmetic Programming Reference》中详细说明了区间运算的 Fortran 95 扩展。另请参见3.4.133 –xia[={widestneed|strict}]。
执行过程间的优化。
通过调用一次过程间分析来执行整个程序的优化。与 -xcrossfile 不同的是,-xipo 将在链接步骤中跨所有目标文件执行优化,并且不仅仅限于编译命令上的源文件。
在编译和链接大型多文件应用程序时,-xipo 特别有用。用该标志编译的对象目标文件具有在这些文件内编译的分析信息,这些信息实现了在源码和预编译的程序文件中的过程间分析。不过,分析和优化仅限于用 -xipo 编译的目标文件,而不扩展到库的目标文件。
-xipo=0 可禁用过程间分析,-xipo=1 可启用过程间分析。-xipo=2 可添加过程间别名分析以及内存分配和布局优化,以便改善高速缓存性能。缺省值为 -xipo=0,如果指定了不带值的 -xipo,则使用 -xipo=1。
使用 -xipo=2 进行编译时,未使用 -xipo=2 编译的函数或子例程(例如,库)不能调用已使用 -xipo=2 编译的函数或子例程。
例如,如果您干预 malloc() 函数并使用 -xipo=2 编译您自己的 malloc(),则引用与您的代码链接的任何库中的 malloc() 的所有函数也必须使用 -xipo=2 进行编译。由于这对于系统库不大可能,因此您自己的 malloc 不应该使用 -xipo=2 进行编译。
在不同的步骤中进行编译和链接时,必须在这两个步骤中都指定 -xipo 才有效。
在一个编译/链接步骤中使用 -xipo 的示例:
demo% f95 -xipo -xO4 -o prog part1.f part2.f part3.f |
优化器在三个源文件之间执行交叉文件内联。该操作是在最终的链接步骤中完成的,因此源文件的编译工作不必全在一个编译过程中完成,可以跨多个不同的编译过程,但每个编译过程都需要指定 -xipo。
在不同的编译/链接步骤中使用 -xipo 的示例:
demo% f95 -xipo -xO4 -c part1.f part2.f demo% f95 -xipo -xO4 -c part3.f demo% f95 -xipo -xO4 -o prog part1.o part2.o part3.o |
在编译步骤中创建的目标文件具有在文件内部编译的附加分析信息,这样就可以在链接步骤中执行跨文件优化。
即使使用 -xipo 进行编译,也存在库不参与跨文件过程间分析的限制,如下例所示:
demo% f95 -xipo -xO4 one.f two.f three.f demo% ar -r mylib.a one.o two.o three.o ... demo% f95 -xipo -xO4 -o myprog main.f four.f mylib.a |
在此例中,过程间优化将在 one.f、two.f 和 three.f 之间以及 main.f 和 four.f 之间执行,但不在 main.f 或 four.f 与 mylib.a 上的例程之间执行。(第一个编译可能生成有关未定义符号的警告,但仍可执行过程间优化,因为过程间优化是编译和链接的一个步骤。)
关于 -xipo 的其他重要信息:
至少需要优化级别 -xO4
与 -xcrossfile 冲突;如果一起使用,将导致编译错误
如果在构造中使用的目标文件对于并行运行的链接步骤通用,则使用并行生成工具构建采用 -xipo 编译的可执行文件会产生问题。每个链接步骤都应有自己的目标文件副本,并且该副本应在链接前进行优化。
未使用 -xipo 编译的对象可以与使用 -xipo 编译的对象自由链接。
由于执行跨文件优化时需要附加信息,因此 -xipo 选项会生成更大的目标文件。不过,该附加信息不会成为最终的二进制可执行文件的一部分。可执行程序大小的增加是由于执行额外的优化导致的。
在此发行版中,跨文件子程序内联是由 -xipo 执行的唯一过程间优化。
.s 汇编语言文件不参与过程间分析。
如果使用 -S 进行编译,则忽略 -xipo 标志。
何时不使用 -xipo 进行编译:
在链接步骤中使用目标文件集合时,编译器试图执行整个程序的分析和优化。对于该目标文件集合中定义的任何函数或子例程 foo(),编译器作出以下两个假定:
(1) 运行时,在该目标文件集合外部定义的其他例程将不显式调用 foo()
(2) 从该目标文件集合中的任何例程调用 foo() 时,将不会受到在该目标文件集合外部定义的不同版本的 foo() 的干预。
如果假定 (1) 对于给定的应用程序不成立,则不使用 -xipo=2 进行编译。如果假定 (2) 不成立,则既不使用 -xipo=1 也不使用 -xipo=2 进行编译。
例如,考虑使用您自己的源版本干预 malloc() 函数并使用 -xipo=2 进行编译。然后,任何库中引用与您的代码链接的 malloc() 的所有函数也必须使用 -xipo=2 进行编译,并且它们的目标文件将不需要参与链接步骤。由于这对于系统库不大可能,因此您自己的 malloc 不应该使用 -xipo=2 进行编译。
另举一例,假定您使用以下两个外部调用来生成共享库:两个不同的源文件中的 foo() 和 bar(),并且 bar() 调用其主体内的 foo()。如果有可能在运行时干预函数调用 foo(),则不要使用 -xipo=1 或 -xipo=2 编译 foo() 或 bar() 的任何一个源文件。否则,foo() 可以内联到 bar(),这会导致在使用 -xipo 编译时出现不正确的结果。
值必须是以下项之一:
none |
不执行归档文件的处理。编译器不会对使用 -xipo 编译和在链接时从归档库中提取的目标文件应用跨模块内联或其他跨模块优化。因此,必须在链接时同时指定 -xipo 和 -xipo_archive=readonly(或 -xipo_archive=writeback)。 |
readonly |
生成可执行文件之前,编译器使用通过 -xipo 编译的目标文件(驻留在归档库 (.a) 中)来优化传递到链接程序的目标文件。 选项 -xipo_archive=readonly 启用对在链接时指定的归档库中的目标文件的跨模块内联和过程间数据流分析。但是,它不启用对归档库代码的跨模块优化,除非代码已经通过跨模块内联插入到其他模块中。 要对归档库中的代码应用跨模块优化,需要使用 -xipo_archive=writeback。注意,这样做将修改从中提取代码的归档库的内容。 |
writeback |
生成可执行文件之前,编译器使用通过 -xipo 编译的目标文件(驻留在归档库 (.a) 中)来优化传递到链接程序的目标文件。库中包含的在编译期间优化的任何目标文件都会替换为其优化后的版本。 对于使用归档库通用集的并行链接,每个链接都应创建自己的归档库备份,从而在链接前进行优化。 |
如果未指定 -xipo_archive 的设置,编译器将假定 -xipo_archive=none。
使用多个处理器进行编译。
指定 -xjobs 选项可设置编译器完成其任务需创建的进程数。在多 CPU 计算机上,该选项可以缩短生成时间。在此发行版的 f95 编译器中,-xjobs 只能与 -xipo 选项一起使用。如果指定 -xjobs=n,过程间优化器就将 n 作为其在编译不同文件时可调用的最大代码生成器实例数。
通常,n 的安全值等于 1.5 乘以可用虚拟处理器数。由于上下文在产生的作业间切换的开销,使用等于可用虚拟处理器数量整数倍的值会降低性能。此外,如果使用很大的数值会耗尽系统资源(如交换空间)。
指定 -xjobs 时务必要指定值。否则会发出错误诊断并使编译终止。
在出现最合适的实例之前,-xjobs 的多个实例在命令行上会互相覆盖。
以下示例在有两个处理器的系统上进行的编译,速度比使用相同命令但没有 -xjobs 选项时进行的编译快。
example% f95 -xipo -xO4 -xjobs=3 t1.f t2.f t3.f |
识别对已知库的调用。
如果指定此选项,编译器会将对某些已知库的调用视为内函数,从而忽略用户提供的任何版本。这样,编译器就可以根据它具备的有关该库的专业知识来对库例程调用进行优化。
library_list 是当前应用于 blas、blas1、blas2、blas3 和内函数的关键字列表(用逗号分隔)。编译器能够识别对以下 BLAS1、BLAS2 和 BLAS3 库例程的调用,并且能够针对 Sun 性能库实现自由地进行正确优化。编译器将忽略这些库例程的用户提供版本,并链接到 Sun 性能库中的 BLAS 例程。
-xknown_lib= |
特性 |
---|---|
blas1 |
编译器能够识别对以下 BLAS1 库例程的调用: caxpy ccopy cdotc cdotu crotg cscal csrot csscal cswap dasum daxpy dcopy ddot drot drotg drotm drotmg dscal dsdot dswap dnrm2 dzasum dznrm2 icamax idamax isamax izamax sasum saxpy scasum scnrm2 scopy sdot sdsdot snrm2 srot srotg srotm srotmg sscal sswap zaxpy zcopy zdotc zdotu zdrot zdscal zrotg zscal zswap |
blas2 |
编译器能够识别对以下 BLAS2 库例程的调用: cgemv cgerc cgeru ctrmv ctrsv dgemv dger dsymv dsyr dsyr2 dtrmv dtrsv sgemv sger ssymv ssyr ssyr2 strmv strsv zgemv zgerc zgeru ztrmv ztrsv |
blas3 |
编译器能够识别对以下 BLAS2 库例程的调用: cgemm csymm csyr2k csyrk ctrmm ctrsm dgemm dsymm dsyr2k dsyrk dtrmm dtrsm sgemm ssymm ssyr2k ssyrk strmm strsm zgemm zsymm zsyr2k zsyrk ztrmm ztrsm |
blas |
选择所有 BLAS 例程。与 -xknown_lib=blas1,blas2,blas3 等效。 |
intrinsics |
编译器会忽略 Fortran 95 和 FORTRAN 77 内函数的任何显式 EXTERNAL 声明,因此将忽略用户提供的任何内例程。(有关内函数名称列表,请参见《Fortran 库参考》。) |
(SPARC) 准备与使用更早版本的 f77 编译的运行时库链接。
f95 -xlang=f77 表示与 f77compat 库进行链接,这是将 Fortran 95 目标文件与更早的 Fortran 77 目标文件相链接的简便方法。使用此标志进行编译,可确保正确的运行时环境。
如果将 f95 和 f77 已编译对象一起链接到一个可执行文件,请使用 f95 -xlang=f77。
使用 -xlang 进行编译时,请注意以下事项:
不要同时使用 -xnolib 和 -xlang 编译。
将 Fortran 目标文件和 C++ 混合使用时,请使用 C++ 编译器进行链接,并在 CC 命令行上指定 -xlang=f95。
将 C++ 对象与使用任何并行化选项编译的 Fortran 目标文件混合使用时,链接 CC 命令行还必须指定 -mt。
与 -libmil 等效。
使用为速度进行了优化的选定数学例程。此选项通常生成更快的代码。它可能生成稍有不同的结果;如果是这样,通常是最后一位不同。该库选项在命令行上的顺序并不重要。
例如:
f95 -o pgx -fast pgx.f -xlic_lib=sunperf |
与 -l 一样,此选项应位于命令行上的所有源文件和目标文件名称之后。
要与 Sun 性能库链接,必须使用此选项。(请参见《Sun Performance Library User's Guide》。)
(已过时) 编译器无提示地忽略。
后优化器在链接时对二进制目标代码执行一些高级性能优化。可以使用可选值来设置执行的优化级别,可选值必须为 0、1 或 2。
0 |
禁用后优化器。(这是缺省情况。) |
1 |
在链接时根据控制流分析执行优化,包括指令高速缓存着色和分支优化。 |
2 |
在链接时执行附加的数据流分析,包括无用代码删除和地址计算简化。 |
指定不带值的 -xlinkopt 标志即表示 -xlinkopt=1。
这些优化在链接时通过分析二进制目标代码来执行。虽然未重写目标文件,但生成的可执行代码可能与初始目标代码不同。
当与配置文件反馈一起用于编译整个程序时,此选项最有效。
如果在不同的步骤中进行编译,则 -xlinkopt 必须既出现在编译步骤中,也出现在链接步骤中。
demo% f95 -c -xlinkopt a.f95 b.f95 demo% f95 -o myprog -xlinkopt=2 a.o b.o |
注意,仅当链接编译器时才使用级别参数。在以上示例中,即使二进制目标文件是用缺省级别 1 编译的,使用的后优化级别也是 2。
不能将链接时后优化器与增量链接程序 ild 一起使用。-xlinkopt 标志会将缺省链接程序设置为 ld。如果使用 -xildon 标志显式启用增量链接程序,将禁用 -xlinkopt 选项(如果同时指定了二者)。
要使 -xlinkopt 选项有用,至少程序中的一些例程(但未必是全部例程)必须使用此选项编译。优化器仍可以对未使用 -xlinkopt 进行编译的二进制目标文件执行部分受限的优化。
-xlinkopt 选项将优化位于编译器命令行上的静态库中的代码,但会跳过位于命令行上的共享(动态)库中的代码且不对其进行优化。生成共享库(用 -G 编译)时,您也可以使用 -xlinkopt。
与运行时配置文件反馈一起使用时,链接时后优化器最有效。文件配置功能会展示代码中最常用和最不常用的部分,并指示优化器相应地进行处理。这对大型应用程序尤为重要,因为在链接时执行代码优化放置可降低指令高速缓存未命中数。通常,会按照以下方式进行编译:
demo% f95 -o progt -xO5 -xprofile=collect:prog file.f95 demo% progt demo% f95 -o prog -xO5 -xprofile=use:prog -xlinkopt file.95 |
有关使用配置文件反馈的详细信息,请参见 -xprofile 选项。
注意,使用该选项编译会略微延长链接的时间。目标文件的大小也会增加,但可执行文件的大小保持不变。如果使用 -xlinkopt 和 -g 标志进行编译,则会因包括调试信息而增加了可执行文件的大小。
与 -loopinfo 等效。
n 具有值 1 至 5,分别对应于优化级别 -O1 至 -O5。如果未指定,编译器将使用 5。
如果 C$PRAGMA SUN OPT=n 指令出现在源输入中,此选项将启用该指令。不使用此选项时,编译器将这些行视为注释。请参见2.3.1.5 OPT 指令。
如果此 pragma 与某个优化级别一起出现,而该优化级别高于 -xmaxopt 标志上的最高级别,则编译器将使用由 -xmaxopt 设置的级别。
(SPARC) 指定假定的最大内存对齐以及未对齐的数据访问的行为。
对于可在编译时确定对齐的内存访问,编译器会为数据对齐生成相应的装入/存储指令序列。
对于不能在编译时确定对齐的内存访问,编译器必须假定一个对齐以生成所需的装入/存储序列。
使用 -xmemalign 标志,用户可以指定因上述未确定情况编译器要假定的数据最大内存对齐。它还指定了在运行时发生未对齐内存访问时的错误行为。
指定的值包含两个部分:数值对齐值 <a>,以及字母行为标志 <b>。
对齐 <a> 的允许值有:
假定最多 1 字节对齐。
假定最多 2 字节对齐。
假定最多 4 字节对齐。
假定最多 8 字节对齐。
假定最多 16 字节对齐。
访问未对齐数据时错误行为 <b> 的允许值有:
解释访问并继续执行。
产生信号 SIGBUS。
在 64 位平台上,产生信号 SIGBUS 仅对齐少于或等于 4,否则将解释访问并继续执行。在其他平台上,f 与 i 等效。
如果在不指定 -xmemalign 的情况下进行编译,缺省值为:
针对 32 位平台的 8i
针对采用 C 和 C++ 的 64 位平台的 8s
针对采用 Fortran 的 64 位平台的 8f
对于所有平台,-xmemalign 不带值显示时的缺省值为 1i。
请注意,-xmemalign 本身并不强制进行任何特殊的数据对齐。使用 -dalign 或 -aligncommon 可强制进行数据对齐。
-dalign 选项是一个宏:
-dalign 是以下选项的宏:-xmemalign=8s -aligncommon=16
有关详细信息,请参见3.4.2 –aligncommon[ ={1|2|4| 8|16}]。
(x86) 在 Solaris x64 平台上为共享对象指定数据地址模型。
使用 -xmodel 选项,编译器可以为 Solaris x64 平台创建 64 位共享对象,并且只应为此类对象的编译而指定该选项。
仅当在启用了 64 位的 x86 平台 ("x64") 上指定了 -m64 时,此选项才有效。
此选项按小型模型生成代码,在该模型中,所执行代码的虚拟地址在链接时已知,且确定所有符号都位于 0 到 231 – 224 - 1 范围内的虚拟地址中。
按内核模型生成代码,在该模型中, 所有符号都定义在 264 - 231 到 264 - 224 范围内。
按中等模型生成代码,在该模型中, 不对数据段的符号引用范围进行假定。文本段的大小和地址的限制与小型代码模型的限制相同。使用 —m64 编译含有大量静态数据的应用程序时,可能需要 —xmodel=medium。
如果未指定 -xmodel,编译器将假定 -xmodel=small。如果指定没有参数的 -xmodel,将出现错误。
只要您确保所访问的对象位于相应的范围内,就没有必要使用该选项编译所有的例程。
与 -nolib 等效。
与 -nolibmil 等效。
不使用快速数学库。
与 -fast 一起使用可以覆盖对优化数学库的链接:
f95 -fast -xnolibmopt …
与 -On 等效。
启用通过 Fortran 95 OpenMP 版本 2.0 指令进行的显式并行化。
此标志接受以下可选关键字子选项:
启用对 OpenMP pragma 的识别,并相应地并行化程序。
-xopenmp=parallel 的最低优化级别是 -xO3。如有必要,编译器将优化级别从较低级别更改为 -xO3,并发出警告。
定义预处理程序标记 _OPENMP。
自动调用 -stackvar。
启用对 OpenMP pragma 的识别,并相应地并行化程序。
如果优化级别低于 -xO3,则编译器不提升它。如果将优化显式设置为低于 -xO3 的级别(如 -xO2 -xopenmp=noopt),则编译器将发出错误。如果没有使用 -xopenmp=noopt 指定优化级别,则会识别 OpenMP pragma,并相应地对程序进行并行处理,但不进行优化。
定义预处理程序标记 _OPENMP。
自动调用 -stackvar。
禁用对 OpenMP pragma 的识别,并且不更改优化级别。(这是编译器的缺省值。)
指定的无子选项关键字的 -xopenmp 与 -xopenmp=parallel 等效。请注意,此缺省值在以后的发行版中可能会有所变化。
要使用 dbx 调试 OpenMP 程序,请使用 -g -xopenmp=noopt 进行编译,以便能够在并行区域内设置断点并显示变量的内容。
《OpenMP API 用户指南》中对 OpenMP 指令进行了概述。
要在多线程环境中运行已并行化的程序,必须在执行之前设置 PARALLEL(或 OMP_NUM_THREADS)环境变量。这会将程序可以创建的最大线程数通知给运行时系统。缺省值为 1。通常会将 PARALLEL 或 OMP_NUM_THREADS 变量设置为目标平台上可用的虚拟处理器数。
要启用嵌套并行操作,必须将 OMP_NESTED 环境变量设置为 TRUE。缺省情况下,禁用嵌套并行操作。有关嵌套并行操作的详细信息,请参见 Sun Studio《OpenMP API 用户指南》。
OpenMP 要求预处理程序符号 _OPENMP 的定义中包含十进制值 YYYYMM,其中 YYYY 和 MM 是实现所支持的 OpenMP Fortran API 版本的年份和月份名称。对于当前 Sun Studio 发行版,该值是 200525(表示 OpenMP 2.5 版)。
如果是在不同的步骤中进行编译和链接,还要在链接步骤中指定 -xopenmp。在编译包含 OpenMP 指令的库时,这一点尤为重要。
与 -pad 等效。
在 SPARC 平台上,size 值必须是以下值之一:
8K、64K、512K、4M、32M、256M、2G、16G 或缺省值
在 x86 平台上,size 值必须是以下值之一:
4K、2M、4M 或缺省值
例如:-xpagesize=4M
并非所有这些页面大小在所有平台上都受支持,具体取决于体系结构和 Solaris 环境。指定的页面大小对于目标平台上的 Solaris 操作环境必须是有效的页面大小,其值由 getpagesizes(3C) 返回。如果不是,此请求在运行时将被忽略。Solaris 环境不保证能够支持页面大小请求。
您可以使用 pmap(1) 或 meminfo(2) 来确定运行的程序是否收到所请求的页面大小。
如果指定了 -xpagesize=default,该标志将被忽略;如果指定了不带 size 值的 -xpagesize,则与 -xpagesize=default 等效。
此选项是组合 -xpagesize_heap=size -xpagesize_stack=size 的宏。这两个选项接受的参数与 -xpagesize 接受的参数相同:8K、64K、512K、4M、32M、256M、2G、16G 和缺省值。可以通过指定 -xpagesize=size 来为二者设置相同的值,或分别为它们指定不同的值。
使用该标志进行编译,与使用等效选项将 LD_PRELOAD 环境变量设置为 mpss.so.1 或在启动程序之前使用等效选项运行 Solaris 9 命令 ppgsz(1) 具有相同的效果。有关详细信息,请参见 Solaris 9 手册页。
注意,该特性在 Solaris 7 和 8 环境中不可用。在 Solaris 7 和 8 环境上不链接使用该选项编译的程序。
size 值与所述的 -xpagesize 值相同。
该特性在 Solaris 7 和 8 环境中不可用。有关详细信息,请参见 -xpagesize。
size 值与所述的 -xpagesize 值相同。
该特性在 Solaris 7 和 8 环境中不可用。有关详细信息,请参见 -xpagesize。
与 -parallel 等效。
与 -pg 等效。
缺省值为 -xpp=fpp。
编译器使用 fpp(1) 来预处理 .F、.F95 或 .F03 源文件。此预处理程序适用于 Fortran。以前的版本使用标准 C 预处理程序 cpp。要选择 cpp,请指定 -xpp=cpp。
在支持预取的体系结构上启用预取指令。
有关 Fortran PREFETCH 指令的说明,请参见2.3.1.8 PREFETCH 指令。
a 必须是以下值之一:
启用预取指令的自动生成
禁用预取指令的自动生成
启用显式预取宏(仅限 SPARC)
禁用显式预取宏(仅限 SPARC)
(SPARC) 按指定的因子调整编译器的假定预取到装入的延迟和预取到存储的延迟。该因子必须是正浮点数或整数。
如果要在较大的 SPARC 多处理器上运行计算密集的代码,您会发现使用 -xprefetch=latx:factor 有很多优点。该选项指示代码生成器按照指定的因子调节在预取及其相关的装入或存储之间的缺省延迟时间。
预取延迟是从执行预取指令到所预取的数据在高速缓存中可用那一刻之间的硬件延迟。在确定发出预取指令到发出使用所预取数据的装入或存储指令之间的间隔时,编译器就采用预取延迟值。
在预取和装入之间采用的延迟可能与在预取和存储之间采用的延迟不同。
编译器可以在众多计算机与应用程序间调整预取机制,以获得最佳性能。这种调整并非总能达到最优。对于占用大量内存的应用程序,尤其是要在大型多处理器上运行的应用程序,可以通过增加预取延迟值来提高性能。要增加预取延迟值,请使用大于 1 的因子。介于 0.5 和 2.0 之间的值最有可能提供最高的性能。
对于数据集完全位于外部高速缓存中的应用程序,可以通过减小预取延迟值来提高性能。要减小此值,请使用小于 1 的因子。
要使用 -xprefetch=latx:factor 选项,请首先使用接近 1.0 的因子值并对应用程序运行性能测试。然后适当增加或减小该因子,并再次运行性能测试。继续调整因子并运行性能测试,直到获得最佳性能。以很小的增量逐渐增加或减小因子时,前几步中不会看到性能差异,之后会突然出现差异,然后再趋于稳定。
-xprefetch=yes 与 -xprefetch=auto,explicit 相同
-xprefetch=no 与 -xprefetch=no%auto,no%explicit 相同
使用 -xprefetch、-xprefetch=auto 和 -xprefetch=yes 时,编译器就可以将预取指令插入到其生成的代码中。该操作会提高支持预取的体系结构的性能。
如果未指定 -xprefetch,则假定为 -xprefetch=no%auto,explicit。
如果仅指定了 -xprefetch,则假定为 -xprefetch=auto,explicit。
除非使用不带任何参数或具有 auto 或 yes 参数的 -xprefetch 进行显式覆盖,否则使用缺省值 no%auto。例如,-xprefetch=explicit 与 -xprefetch=explicit,no%auto 相同。
除非使用参数 no%explicit 或 no 进行显式覆盖,否则使用缺省值 explicit。例如,-xprefetch=auto 与 -xprefetch=auto,explicit 相同。
如果使用 -xprefetch 或 -xprefetch=yes 等启用了自动预取,但未指定延迟因子,则假定 -xprefetch=latx:1.0。
如果使用 -xprefetch=explicit,编译器将能够识别以下指令:
$PRAGMA SUN_PREFETCH_READ_ONCE (name) |
$PRAGMA SUN_PREFETCH_READ_MANY (name) |
$PRAGMA SUN_PREFETCH_WRITE_ONCE (name) |
$PRAGMA SUN_PREFETCH_WRITE_MANY (name) |
-xchip 设置影响假定延迟的决定以及 latx:factor 设置的结果。
仅当在 SPARC 处理器上启用了自动预取 (auto) 时,latx:factor 子选项才有效。
显式预取只应在度量支持的特殊环境下使用。
因为编译器可以在众多计算机与应用程序间调整预取机制以获得最佳性能,所以当性能测试指示性能明显提高时,应当只使用 -xprefetch=latx:factor。假定的预取延迟在不同发行版本中是不同的。因此,无论何时切换到不同的发行版本,强烈建议重新测试延迟因子对性能的影响。
以生成直接内存访问预取的相同方式来生成由选项 -xprefetch_level={1|2|3} 指定的循环的间接预取。可添加前缀 no% 否定声明。
缺省值为 -xprefetch_auto_type=no%indirect_array_access。
要求 -xprefetch=auto 以及优化级别 -xO3 或更高级别。
诸如 -xdepend 之类的选项可以影响计算间接预取候选项的主动性,进而影响由于更好的内存别名歧义消除信息而发生的自动间接预取插入的主动性。
控制预取指令的自动生成。
在以下情况下编译时,此选项才有效:
-xprefetch=auto,
使用优化级别 3 或更高。
在支持预取的平台上。
如果未指定 -xprefetch_level,则 -xprefetch=auto 的缺省值为级别 2。
预取级别 2 生成的预取指令机会要多于级别 1 生成的预取指令机会。预取级别 3 生成的预取指令要多于级别 2 生成的预取指令。
在早期的 SPARC 或 x86 平台上,预取级别 2 和 3 可能不会生效。
通过为编译器提供运行时性能反馈,增强了使用高优化级别 (-xO5) 进行编译的效果。为了生成编译器执行最佳优化所需的配置文件反馈,您必须先使用 -xprofile=collect 进行编译,再对典型数据集运行可执行文件,然后在最高优化级别使用 -xprofile=use 重新编译。
优化器使用 -xprofile=use 收集并保存执行频率数据以备将来使用。编译器生成可测量语句执行频率的代码。
name 是所分析程序的名称。该名称是可选的。如果未指定 name,则假定 a.out 为可执行程序的名称。
在运行时,使用 -xprofile=collect:name 编译的程序在缺省情况下会创建子目录 name.profile 来保存运行时反馈信息。程序将其运行时配置文件数据写入该子目录中名为 feedback 的文件。如果多次运行程序,那么执行频率数据会累积在 feedback 文件中;也就是说,以前运行的输出不会丢失。
您可以设置环境变量 SUN_PROFDATA 和 SUN_PROFDATA_DIR,来控制使用 -xprofile=collect 编译的程序在其中写入其运行时配置文件数据的文件和目录。设置这些变量后,使用 -xprofile=collect 编译的程序会将其配置文件数据写入 $SUN_PROFDATA_DIR/$SUN_PROFDATA中。
这些环境变量同样控制由 tcov 写入的配置文件数据文件的路径和名称,如 tcov(1) 手册页中所述。
配置文件集合是“MT 安全的”。也就是说,对于通过使用 -mt 进行编译并直接调用多任务库来执行自身多任务处理的程序,如果对它进行文件配置将产生准确的结果。
当在不同的步骤中进行编译和链接时,如果 -xprofile=collect 出现在编译步骤中,那么在链接步骤中也必须指定它。
使用执行频率数据有策略地在优化级别 -xO5 进行优化。
与 collect:nm 一样,nm 是可选的,可用于指定程序的名称。
程序是使用以前生成并保存在配置文件数据文件中的执行频率数据优化的,此数据是先前执行用 -xprofile=collect 编译的程序时写入的。
源文件和其他编译器选项必须与用于编译的源文件和编译器选项完全一致,该编译创建了生成 feedback 文件的编译程序。如果使用 -xprofile=collect:nm 进行编译,则相同的程序名称 nm 必须出现在以下优化编译中:-xprofile=use:nm。
有关加速收集阶段和使用阶段之间的编译的说明,另请参见 -xprofile_ircache。
有关控制编译器在哪里查找配置文件数据文件的说明,另请参见 -xprofile_pathmap。
使用“新”样式的 tcov 的基本块覆盖分析。优化级别必须是 -O2 或更高级别。
代码指令与 -a 选项的代码指令类似,但不再为每个源文件生成 .d 文件。相反,会生成一个文件,并且该文件的名称是根据最终的可执行文件命名的。例如,如果 stuff 是可执行文件,则 stuff.profile/tcovd 是数据文件。
运行 tcov 时,您必须将 -x 选项传递给它,以便它使用新式数据。否则,tcov 使用原来的 .d 文件(如果有;这是数据的缺省值),并产生不可预测的输出。
与 -a 选项不同,TCOVDIR 环境变量在编译时不起作用。但是,在程序运行时会使用它的值来确定在哪里创建配置文件子目录。
有关详细信息,请参见 tcov(1) 手册页、《Fortran 编程指南》的“性能剖析”一章以及 Program Performance Analysis Tools 手册。
如果因 -O4 或 -inline 而存在子程序的内联处理,则 tcov 生成的报告可能不可靠。不会记录对已经内联的例程的调用的覆盖。
(SPARC) 保存并重用收集阶段和使用配置文件阶段之间的编译数据。
在使用阶段,与 -xprofile=collect|use 一起使用会重用收集阶段保存的编译数据,从而可以减少编译时间。
如果指定,path 将覆盖高速缓存文件的保存位置。缺省情况下,这些文件会与目标文件保存在同一目录下。当收集阶段和使用阶段出现在两个不同的位置时,指定路径便十分有用。
典型的命令序列可能是:
demo% f95 -xO5 -xprofile=collect -xprofile_ircache t1.c t2.c demo% a.out 收集反馈数据 demo% f95 -xO5 -xprofile=use -xprofile_ircache t1.c t2.c |
对于大程序,通过用这种方式保存中间数据,可以显著缩短使用阶段的编译时间。但这将以显著增加所用的磁盘空间为代价。
请将 -xprofile_pathmap 选项与 -xprofile=use 选项一起使用。
如果编译器找不到用-xprofile=use 编译的目标文件的配置文件数据,请使用 -xprofile_pathmap,并且:
当前使用 -xprofile=use 进行编译所用的目录,不是先前使用 -xprofile=collect 编译时使用的目录。
目标文件会共享配置文件中的公共基名,但可以根据它们在不同目录中的位置互相区分。
collect-prefix 是目录树的 UNIX 路径名的前缀,该目录树中的目标文件是使用 -xprofile=collect 编译的。
use-prefix 是目录树的 UNIX 路径名的前缀,该目录树中的目标文件是使用 -xprofile=use 编译的。
如果指定了 -xprofile_pathmap 的多个实例,编译器将按照这些实例的出现顺序对其进行处理。将 -xprofile_pathmap 实例指定的每个 use-prefix 与目标文件路径名进行比较,直至找到匹配的 use-prefix 或发现最后一个指定的 use-prefix 与目标文件路径名也不匹配。
允许不带 RECURSIVE 属性的例程以递归方式调用它们自己。
通常,只有使用 RECURSIVE 属性定义的子程序才能以递归方式调用它们自己。
使用 -xrecursive 进行编译使得子程序可以调用它们自己,即使它们没有使用 RECURSIVE 属性进行定义也是如此。但是,与定义了 RECURSIVE 的子例程不同,缺省情况下,使用此标志不会导致在栈上分配局部变量。要使局部变量在子程序的每个递归调用中具有不同的值,还应该使用 -stackvar 进行编译以便将局部变量放在栈上。
间接递归(例程 A 调用例程 B,而例程 B 又调用例程 A)可在高于 -xO2 的优化级别上生成不一致的结果。使用 -xrecursive 标志进行编译,可以保证使用间接递归的正确性,即使优化级别更高也是如此。
使用 -xrecursive 进行编译会导致性能下降。
与 -reduction 等效。
r 是一个逗号分隔列表,它包含以下一项或多项:
[no%]appl 和 [no%]float。
其中 % 已显示,它是一个必需的字符。
示例:-xregs=appl,no%float
为子选项加上前缀 no% 可禁用该功能。
(SPARC) 允许编译器将应用寄存器用作临时寄存器来生成代码。在 32 位处理器上具有 g2、g3 和 g4 寄存器,在 64 位处理器上则具有 g2、g3 寄存器。
(仅限 SPARC)允许编译器将浮点寄存器用作整数值的临时寄存器。此选项不会影响编译器为浮点值使用浮点寄存器。
不使用浮点寄存器。使用此选项时,源程序不能包含任何浮点代码。
(仅限 x86)允许编译器将帧指针寄存器(在 32 位 x86 处理器上为 %ebp,在 64 位 x86 处理器上为 %rbp)用作未分配的被调用方保存寄存器,以提高程序性能。如果还使用 -xpg 或 -p 进行编译,则会忽略 -xregs=frameptr。
在 SPARC 平台上缺省值为 -xregs=appl,float,在 x86 上缺省值为 -xregs=appl,float,no%frameptr。
对于与应用程序链接的共享库,强烈建议您使用 -xregs=no%appl,float 来编译用于这些库的代码。至少共享库应该显式说明它如何使用应用程序寄存器,以便与这些库链接的应用程序知道如何处理该问题。
例如,在某种全局意义上使用寄存器(例如,使用寄存器指向一些关键数据结构)的应用程序,需要确切地知道其代码未使用 -xregs=no%appl 编译的某个库如何使用应用程序寄存器,以便安全地与该库链接。
允许 dbx 在没有目标 (.o) 文件的情况下进行调试。
如果使用 -xs,则所有调试信息将复制到可执行文件中。如果将可执行文件移至另一个目录,则可以使用 dbx 并忽略目标 (.o) 文件。如果不能保留 .o 文件,请使用该选项。
如果不使用 -xs,在移动可执行文件的情况下,您必须同时移动源文件和目标 (.o) 文件,或者使用 dbx pathmap 或 use 命令设置路径。
(SPARC) 允许编译器假定未发生违反内存保护的情况。
使用此选项可允许编译器假定未发生基于内存的陷阱。此选项允许在 SPARC V9 平台上使用推测装入指令。
仅当与优化级别 -O5 一起使用时此选项才有效。
由于在发生诸如地址未对齐或段违规的故障时,无故障装入不会导致陷阱,因此您应该只对不会发生此类故障的程序使用该选项。因为只有很少的程序会导致基于内存的陷阱,所以您可以安全地将该选项用于大多数程序。对于显式依赖基于内存的陷阱来处理异常情况的程序,请勿使用该选项。
(已过时)与 -sb 等效。
(已过时)与 -sbfast 等效。
示例:如果增加代码大小,则不会解开循环或并行化循环。
为指令集和优化指定目标平台。
t 必须是以下值之一:native、native64、generic、generic64 和 platform–name。
-xtarget 选项允许简便快捷地指定发生在实际平台上的 -xarch、-xchip 和 -xcache 组合。-xtarget 的唯一含义在其扩展中。
通过为编译器提供目标计算机硬件的精确描述,某些程序的性能可得到提高。当程序性能很重要时,目标硬件的正确指定是非常重要的。在较新的 SPARC 处理器上运行时,尤其是这样。不过,对大多数程序和较旧的 SPARC 处理器来讲,性能的提高微不足道,因此指定 generic 就足够了。
-xtarget 值的实际扩展可能会因发行版的不同而异。通过使用 -dryrun 标志,您始终可以确定编译器将使用的扩展:
demo% f95 -dryrun -xtarget=ultra4plus ### command line files and options (expanded): ### -dryrun -xarch=sparcvis -xcache=64/32/4/1:2048/64/4/2:32768/64/4/2 -xchip=ultra4plus |
注意,针对特定名称平台的 —xtarget 扩展不得与同一平台上的 —xtarget=native 相同。
优化主机平台(32 位)的性能。
扩展至 —m32 —xarch=native —xchip=native —xcache=native
已过时。改用 —xtarget=native —m64。
为大多数 32 位平台获得最佳性能。
这是缺省值并可扩展至:-m32 -xarch=generic -xchip=generic -xcache=generic
已过时。改用 -xtarget=generic -m64。
获取以下列出的指定平台的最佳性能。
下表列出了编译器接受的常用系统平台的名称。
表 3–16 常用的 -xtarget 系统平台的扩展
-xtarget= platform-name |
-xarch |
-xchip |
-xcache |
---|---|---|---|
ultra |
sparcvis |
ultra |
16/32/1:512/64/1 |
ultra1/140 |
sparcvis |
ultra |
16/32/1:512/64/1 |
ultra1/170 |
sparcvis |
ultra |
16/32/1:512/64/1 |
ultra1/200 |
sparcvis |
ultra |
16/32/1:512/64/1 |
ultra2 |
sparcvis |
ultra2 |
16/32/1:512/64/1 |
ultra2/1170 |
sparcvis |
ultra |
16/32/1:512/64/1 |
ultra2/1200 |
sparcvis |
ultra |
16/32/1:1024/64/1 |
ultra2/1300 |
sparcvis |
ultra2 |
16/32/1:2048/64/1 |
ultra2/2170 |
sparcvis |
ultra |
16/32/1:512/64/1 |
ultra2/2200 |
sparcvis |
ultra |
16/32/1:1024/64/1 |
ultra2/2300 |
sparcvis |
ultra2 |
16/32/1:2048/64/1 |
ultra2e |
sparcvis |
ultra2e |
16/32/1:256/64/4 |
ultra2i |
sparcvis |
ultra2i |
16/32/1:512/64/1 |
ultra3 |
sparcvis |
ultra3 |
64/32/4:8192/512/1 |
ultra3cu |
sparcvis |
ultra3cu |
64/32/4:8192/512/2 |
ultra3i |
sparcvis |
ultra3i |
64/32/4:1024/64/4 |
ultra4 |
sparcvis |
ultra4 |
64/32/4:8192/128/2 |
ultra4plus |
sparcvis |
ultra4plus |
64/32/4/1:2048/64/4/2:32768/64/4/2 |
ultraT1 |
sparc |
ultraT1 |
8/16/4/4:3072/64/12/32 |
ultraT2 |
sparcvis2 |
ultraT2 |
8/16/4:4096/64/16 |
-m64 标志表示针对启用了 64 位的平台上的 64 位 Solaris OS 进行编译。如果指定了 -xtarget,则 -m64 必须出现在 -xtarget 标志之后,如下所示:
-xtarget=ultra2 ... -m64 |
否则,将使用缺省的 32 位内存模型。
对于 x86 系统,有效的 -xtarget 平台名称如下:
generic、native、pentium、pentium_pro、pentium3、pentium4 和 opteron。
-m64 标志表示针对启用了 64 位的 x86 平台上的 64 位 Solaris OS 进行编译。例如,使用 -xtarget=opteron 进行编译是不必要的或不够的。如果指定了 -xtarget,则 -m64 选项必须出现在 -xtarget 标志之后,如下所示:
-xtarget=opteron -m64 |
否则,编译将为 32 位 x86。
与 -time 等效。
指定缺省数据映射。
此选项提供了一种为缺省数据类型指定字节大小的灵活方法。此选项适用于缺省大小的变量和常量。
规范字符串 spec 可以包含以下任何或全部项(采用逗号分隔列表形式):
real:sizedouble:sizeinteger:size
每个平台上允许的组合包括:
real:32
real:64
double:64
double:128
integer:16
integer:32
integer:64
例如:
–xtypemap=real:64,double:64,integer:64
可同时将缺省的 REAL 和 DOUBLE 映射到 8 字节。
此选项适用于使用缺省规范(不带显式字节大小)声明的所有变量,例如 REAL XYZ(生成 64 位 XYZ)。此外,所有的单精度 REAL 常量将被提升为 REAL*8 常量。
请注意,INTEGER 和 LOGICAL 的处理方式相同,并且 COMPLEX 映射为两个 REAL。此外,将按 DOUBLE 的映射方式来处理 DOUBLE COMPLEX。
与 -unroll=n 等效。
启用对向量库函数调用的自动生成。
在使用 -xvector 进行编译时,此选项要求使用缺省舍入模式 -fround=nearest 进行编译。
使用 -xvector=lib,编译器可以将循环内的数学库调用变换为对等效向量数学例程的单个调用(如果能够进行此类变换的话)。此类转换可提高那些循环计数较大的循环的性能。-xvector=no%lib 将禁用此功能。
-xvector=simd 使得编译器可以使用本机 x86 SSE SIMD 指令来提高某些循环的性能。仅当目标体系结构支持 SIMD 指令时,编译器才可接受此开关。例如,必须指定 -xarch=sse2 -m64 或 -xarch=generic64。还必须指定 -xO3 或更高的优化级别,以及 -xdepend 和 -xvector=simd。-xvector=no%simd 将禁用此功能。
如果您同时指定了 -xvector=simd 和 -fsimple=2,则可以获得比单独指定 -xvector=simd 更好的性能。但是,浮点结果可能会稍有不同,因为 -fsimple=2 允许对浮点运算重新排序。
缺省值为 -xvector=%none。如果您指定了 -xvector,但是未提供子选项,则编译器假定 -xvector=lib。
在装入步骤中,编译器会包含 libmvec 库。如果您在编译时指定了 -xvector=lib,则还必须在链接时指定它。
此选项会覆盖以前的实例,因此,-xvector=%none 会覆盖以前指定的 -xvector=lib。
在不重定位的情况下仅生成纯库。
-ztext 的一般用途是验证所生成的库是否为纯文本;指令都是与位置无关的代码。因此,它通常与 -G 和 -pic 一起使用。
使用 -ztext 时,如果 ld 在 text 段中找到了不完整的重定位,则不会生成库。如果它在 data 段中找到了不完整的重定位,则通常会生成库;数据段是可写入的。
不使用 -ztext 时,ld 会生成库,与有无重定位无关。
如果您不知道目标文件是否是使用 -pic 生成的,则一种典型用法是利用源文件和目标文件生成库。
示例:利用源文件和目标文件生成库:
demo% f95 -G -pic -ztext -o MyLib -hMyLib a.f b.f x.o y.o |
另一种用法是确认代码是否与位置无关:不带 -pic 进行编译,但确认是否为纯文本。
示例:确认是否为纯文本-即使不带 -pic 进行编辑:
demo% f95 -G -ztext -o MyLib -hMyLib a.f b.f x.o y.o |
如果使用 -ztext 进行编译,并且 ld 不生成库,则可以在不使用 -ztext 的情况下重新编译,此时 ld 将生成库。使用 -ztext 生成失败意味着无法对库的一个或多个组件共享,不过,也许能共享某些其他组件。此时就产生了性能问题,这最好由您-程序员来解决。