2004 年 5 月 26 日更新 |
Sun Studio 9:Fortran 95 自述文件 |
目录
A. 简介
本文档包含有关 Sun[tm] Studio9 Fortran 95 编译器 f95 的信息。本文档描述了此发行版本中引入的新功能和软件更正并列出了已知的问题、局限和不兼容性。本文档中的信息更新和扩展了软件手册中的信息。
产品文档
- 发行说明:可以通过 Sun Studio 9 网站 http://developers.sun.com/tools/cc/documentation/ss9_docs/release_notes.html 获得此发行说明。发行说明中的信息会更新和扩展所有自述文件中的信息。
- 编译器和工具文档:产品手册页、自述文件的 HTML 版本以及手册可以从/installation_directory/SUNWspro/docs/index.html 进行访问。Solaris 平台上的缺省安装目录是 /opt。如果没有在缺省 /opt 目录中安装 Sun Studio 9 软件,请询问系统管理员以了解系统中的实际安装路径。您可以从 index.html 页访问下列文档:
- Fortran 用户指南
- Fortran 编程指南
- OpenMP API 用户指南
- 数学库自述文件
- 数值计算指南
- 增量式链接编辑器自述文件
- Sun 性能库自述文件
- Sun 性能库参考手册
- Fortran 和 C 的 Sun 性能库用户指南
- IDE 文档:Sun Studio 9 IDE 所有组件的联机帮助可从 IDE 中的 [帮助] 菜单进行访问。
- 开发人员资源门户:有关技术文章、代码样例、文档和知识库的信息,请参见开发人员门户,网址:http://developers.sun.com/prodtech/cc。
注意—如果编译器集合软件还没有安装在缺省 /opt 目录,请询问系统管理员以了解系统中的等价路径。
B. 关于 Sun Studio 9 Fortran 95
本自述文件已用介绍此次发行的 8.0 版 f95 中的新功能和更改功能的信息更新。
8.0 版本的 Fortran 95 编译器 f95 作为 Sun Studio 9 的一个组件发行,可在 SPARC(R) 和 x86 平台上版本 8、9 和 10 的 Solaris[tm] 操作系统 (Solaris OS) 中使用。
随 Sun Studio 8 发行的上一版本的编译器是版本 7.1。
C. 新特性和更改的特性
本节描述了 Fortran 95 本发行版本的新增功能和更改的功能。编译器选项的详细信息请参见“Fortran 用户指南”和 f95(1) 手册页。
- Solaris OS x86 平台上的 f95
- 增强的运行时性能
- Fortran 2003 命令行内部参数
- 新增和更改的 f95 命令行选项
- 缺省 SPARC 体系结构是 v8plus
- OpenMP: 增加的最大线程数
- OpenMP: 自动的变量作用域
- Solaris OS x86 平台上的 f95
本发行版本的 Sun Studio 在 Solaris OS x86 平台上提供了 Fortran 95 编译器。采用 -xtarget 的值 generic、native、386、486、pentium、pentium_pro、pentium3 或 pentium4 进行编译,从而在 Solaris x86 平台上生成可执行文件。x86 平台上的缺省值为 -xtarget=generic在 x86 平台上尚未实现以下 f95 功能,这些功能仅在 SPARC 平台上可用:
- 区间运算(编译器选项 -xia 和 -xinterval)
- 四元(128 位)运算(例如,REAL*16)
- IEEE 内部模块 IEEE_EXCEPTIONS、IEEE_ARITHMETIC 和 IEEE_FEATURES
- sun_io_handler 模块
- P并行选项,比如 -autopar、-parallel、-explitipar 和 -openmp。
以下 f95 命令行选项只能在 x86 平台上使用,不能在 SPARC 平台上使用:
- -fprecision、-fstore、-nofstore
以下 f95 命令行选项只能在 SPARC 平台上使用,不能在 x86 平台上使用:
- -xcode、-xmemalign、-xprefetch、-xcheck、-xia、-xinterval、-xipo、-xjobs、-xlang、-xlinkopt、-xloopinfo、-xpagesize、-xprofile_ircache、-xreduction、-xvector、-depend、-openmp、-parallel、-autopar、-explicitpar、-vpara、-XlistMP
同时,在 x86 平台上 -fast 增加了 -nofstore
有关在 x86 平台上进行编译的详细信息
- -xtarget 在 x86 平台上的值和扩展
两个新的 -xtarget 平台值可供 x86 使用。
-xtarget=pentium3 扩展为 -xarch=sse -xchip=pentium3 -xcache=16/32/4:256/32/4
-xtarget=pentium4 扩展为 -xarch=sse2 -xchip=pentium4 -xcache=8/64/4:256/128/8- 新的 -xarch 和 -xchip 值分别为:
-xchip=pentium3 - 优化 Pentium 3 处理器
-xchip=pentium4 - 优化 Pentium 4 处理器
-xarch=sse - 将 SSE 指令集添加到 pentium_pro 指令集
-xarch=sse2 - 将 SSE2 指令集和 SSE 指令集添加到 pentium_pro 指令集
- 只有在 pentium3 或 pentium4 处理器上才能启用 -fns。如果 -xarch 不是 sse 或 sse2,则忽略 -fns=yes。否则,对于 SSE 和 SSE2 浮点指令,-fns=yes 意味着将把下溢清空为零 (FTZ),并将非标准操作数视为零 (DAZ)。-fns=yes 不影响传统的 x86 浮点指令。
- 特别注意
用 -xarch={sse | sse2} 编译以便在 Solaris x86 SSE/SSE2 Pentium 4 兼容平台上运行的程序必须只在启用 SSE/SSE2 平台上运行。在未启用 SSE/SSE2 的平台上运行这种程序可能会导致段故障或者不发出明确警告信息就产生错误结果。操作系统和编译器的补丁程序可防止 SSE/SSE2 编译的二进制程序在未启用 SSE/SSE2 的平台上执行,这些补丁程序可能会在晚些时候提供。
以 Solaris 9 update 6 开头的操作系统版本在 Pentium 4 兼容平台上启用 SSE/SSE2。Solaris OS 的早期版本未启用 SSE/SSE2。
该警告还扩展到利用 .il 联机汇编语言功能程序或利用 SSE/SSE2 指令的 __asm() 汇编程序代码。
如果您在各个独立的步骤中进行编译和链接,则要始终使用编译器并通过 -xarch={sse | sse2} 进行链接,以确保链接正确的启动例程。
x86 上的算术结果可能不同于 SPARC 上的结果,原因是 x86 80 字节浮点注册表。要将这些差异降到最小,请使用 -fstore 选项,或者如果硬件支持 SSE2,就要用 -xarch=sse2 进行编译。- 增强了运行时性能
采用本发行版本后,大多数应用程序的运行时性能将有显著提高。为获得最佳效果,请使用较高的优化级别 -xO4 或 -xO5 进行编译。在上述优化级别,编译器现在可以内联包含的过程,以及那些具有假定形参数、可分配参数或指针参数的过程。- Fortran 2003 命令行内部函数
Fortran 2003 草案标准引入了三个新的内部函数,以处理命令行参数和环境变量。这三个函数已在本发行版本的 f95 编译器中实现。新的内部函数为:
- GET_COMMAND(command, length, status)
在命令中返回调用程序的整个命令行。- GET_COMMAND_ARGUMENT(number, value, length, status)
在值中返回命令行参数。- GET_ENVIRONMENT_VARIABLE(name, value, length, status, trim_name)
返回环境变量的值。- f95 编译器中新增和更改的命令行选项
以下 f95 命令行选项是本发行版本中新增的选项。详细信息,请参见 f95(1) 手册页。
在本发行版本的 f95 中,以下命令行选项的缺省值已更改。
- -xipo_archive={ none | readonly | writeback }
允许 crossfile 优化包括归档库 (.a)。(仅用于 SPARC)-xipo_archive=none
不处理归档文件。-xipo_archive=readonly
编译器在生成可执行文件之前,采用归档库 (.a) 中已用 -xipo 编译的目标文件优化传递到链接器的目标文件。-xipo_archive=writeback
编译器在生成可执行文件之前,采用归档库 (.a) 中已用 -xipo 编译的目标文件优化传递到链接器的目标文件。归档库中所含的、在编译期间已优化的所有目标文件均由其优化版本替换。如果不指定 -xipo 的设置,编译器会将其设置为 -xipo_archive=none。
- -xprefetch_auto_type=[no%]indirect_array_access
为间接访问的数组生成间接预取。(仅用于 SPARC)[no%]indirect_array_access
采用和生成直接内存访问预取相同的方式,为选项 -xprefetch_level=[1|2|3] 指示的循环生成 [不生成] 间接预取。如果未指定 -xprefetch_auto_type 的设置,编译器将其设置为 -xprefetch_auto_type=[no%]indirect_array_access。
-xprefetch 选项仅可在 SPARC 平台上使用。
诸如 -xdepend、-xrestrict 和 -xalias_level 这样的选项可以影响用于确定预取侯选对象的激进度,从而将影响自动间接预取插入的激进度,因为它们有助于生成更准确的内存别名二义性信息。
- -xprofile_pathmap=collect_prefix:use_prefix
为配置文件数据文件设置路径映射。在分析的目录不是以前用 -xprofile=collect 编译时所用的目录时,将 -xprofile_pathmap 选项和 -xprofile=use 选项配合使用。
- -xprefetch 的缺省值为 -xprefetch=no%auto,explicit。
- -xmemalign 的缺省值为 -xmemalign=8i,当用一个 -xarch=v9 选项进行编译时,缺省值为 -xmemalign=8f。
- 当用一个 -xarch=v9 选项进行编译时,-xcode 的缺省值为 abs44。
要用在以前版本的编译器中使用的缺省值进行编译,请明确指定下列选项:
- -xarch=v8 -xmemalign=4s -xprefetch=no(对于 32 位编译)
- -xcode=abs64 -xprefetch=no(对于 64 位编译)
- 缺省 SPARC 体系结构是 8PLUS
缺省 SPARC 体系结构不再是 V7。在本发行版本的 Sun Studio 9 中对 -xarch=v7 的支持有限。新的缺省值为 V8PLUS (UltraSPARC)。采用 -xarch=v7 编译会被看作采用 -xarch=v8 编译,因为 Solaris 8 OS 只支持 -xarch=v8 或更高版本。要在 SPARC V8 系统(例如 SPARCStation 10)上进行部署,则明确用 -xarch=v8 编译。提供的系统库在 SPARC V8 体系结构上运行。
要在 SPARC V7 系统(例如 SPARCStation 1)上进行部署,则明确用 -xarch=v7 编译。提供的系统库使用 SPARC V8 指令集。对于 Sun Studio 9 发行版,只有 Solaris 8 OS 支持 SPARC V7 体系结构。遇到 SPARC V8 指令时,该 OS 解释软件中的指令。程序运行,但是性能将下降。
- OpenMP:最大线程数增加
OMP_NUM_THREADS 和多任务库的最大线程数都已从 128 增至 256。- OpenMP:自动设定变量的作用域
对于共享内存并行编程,本发行版本 Fortran 95 编译器的 OpenMP API 的实现,具有在并行区域内自动设定变量作用域之特性。详细信息,请参见<OpenMP API 用户指南>。(OpenMP 仅在 SPARC 平台的本发行版上实现。)有关其他 Sun Studio 8 组件的信息,参见《新增功能》手册。可以找到该手册,作为随软件一起安装的文档的一部分,网址是 file:/opt/SUNWspro/docs/index.html。另外,也可以在 Sun Studio 9 集合中找到《新增功能》手册,网址是 http://docs.sun.com
D. 软件更正
目前无信息。
E. 问题和解决办法
本节讨论了本发行版本中已知的软件问题及其可能的解决方法。
下面列出的这些问题很可能会在随后发布的补丁程序中得到修正。关于更新和补丁程序,请查看更新信息,网址为 http://http://developers.sun.com/prodtech/cc/support_index.html。
- 选项 -errwarn 不起作用
本版本中介绍的选项标志 -errwarn 不能正确实施,生成命令行错误。查找补丁程序以解决这个问题。 (5035157)- 意外的内联
变量表为空的 -xinline= 标志应完全关闭内联。但是,游侠功能仍可以进行内联。解决办法是明确使用 -xinline=%none。 (5032991)
- -xO4 上的段故障
当用 -xO4 编译的子程序的参数是常数时,错误的优化有时可能会引起错误的尝试,即写入该常数,从而导致段故障。解决办法是在更低的优化级别编译子程序。 (5040283)
F. 限制和不兼容
本节讨论系统或其他软件的限制和不兼容。
- -xlinkopt
使用 -xlinkopt 参数编译时不应该使用 -zcompreloc 链接器选项。 [4825600]
- 模块信息文件的格式 (.mod)
模块信息文件的格式 (.mod file) 在最新发行版本的编译器中做了更改。编译器能够成功处理以前发行版本的编译器生成的 .mod 文件,除了以下一种情况:
如果模块 OLD 是使用 f95 编译器的先前发行版本编译的,而模块 NEW 是用当前发行版本编译,会出现问题。为了避免这些问题,请用本发行版本的编译器重新编译旧的模块 OLD。
MODULE NEW
USE OLD
END MODULE
每个编译过的 .mod 文件都有一个与生成该文件的编译器相关联的版本号。由本版本编译器编译的模块文件的发行版本号为“版本 1.0”。可以使用 fdumpmod(1) 公用程序来判断编译过的 .mod 文件的发行版本号。请注意,f95 编译器以前的发行版本引入了不兼容性,而这一点又被本次发行的 8.0 版编译器所继承,如果您正在从 f95 以前的发行版本更新到 8.0 (Sun Studio 9) 版本,请注意这一点。请注意以下不兼容性:
- Interval 函数调用
间隔函数调用的接口 (ABI) 在 Forte Developer 7 发行版本中已更改,并且它与 Sun WorkShop 6 update 2 和更早的发行版本的 ABI 在二进制级不兼容。这意味着存在间隔函数的程序和库必须用当前版本的 f95 重新编译。特别是,由 C++ 调用的 Fortran 间隔函数和由 Fortran 调用的 C++ 间隔函数,必须使用 f95 和 CC 编译器重新编译。
- CHARACTER*1 按值调用接口
Fortran 95 版本 7.0 引入的与先前发行的一个不兼容,即在接口块中指定了 VALUE 属性的子程序调用中传递 CHARACTER*1 的方式。
对正确编写后由版本 7.0 和 8.0 f95 编译的 Fortran 95 程序而言区别是看不到的。只有在调用者和被调用程序使用不同的编译器版本编译,或者其中一个是用 C 编写时,该区别才会变成一个问题。
考虑下面的示例:
main.f:
interface
subroutine s(c1,c2)
character*1, value ::c1 ! c1 is call-by-value
character*2 ::c2
integer I
end subroutine
end interface
call s('A', 'BC')
end
sub.f:
subroutine s(c1,c2)
character*1, value ::c1
character*(*) ::c2
print *, 'You passed ',c1,' and ',c2
END如果使用先前发行版本的编译器编译 main.f,使用本版本编译 sub.f 后,程序会错误地产生:
You passed A and B现在编译器传递 CHARACTER *1 按值调用数据而不传递字符长度参数。在所有其他情况下,字符数据的传递中,编译器自动生成的隐藏长度参数作为调用的一部分被传递。(注意 Fortran 95 限制 CHARACTER 数据的按值调用,仅允许 CHARACTER*1。)
同样,C 程序调用或被 Fortran 95 程序调用时,如果期望 CHARACTER*1 按值调用数据,必须重写程序,不能再期望存在这些参数的长度参数。
- 与 Forte Developer 6 update 2 目标文件的二进制不兼容
版本 7.0 的 f95 修正了 -aligncommon 标志不能正确对齐派生类型和使用显式 KIND 键入的变量的问题。
例如,请看下面的程序:
若用 FD6u2 Fortran 95(版本 6.2)编译时使用了 -aligncommon 选项,将产生下列输出:
character*26 type
logical(1) ::l1 = .true.
real(16) ::r16 = 1
integer(2) ::i2 = 1
common /A/ l1,r16,i2
print *, '--------------------------------------------'
print *, ' Fortran 95 COMMON-block alignment in Bytes '
print *, '--------------------------------------------'
type = 'logical(1)'
print *, type, loc(l1)-loc(l1)
type = 'real(16)'
print *, type, loc(r16)-loc(l1)
type = 'integer(2)'
print *, type, loc(i2)-loc(l1)
end而原本是希望它产生下列输出(版本 8.0 和 7.0 f95 的编译器能产生):
--------------------------------------------
Fortran 95 COMMON-block alignment in Bytes
--------------------------------------------
logical(1) 0
real(16) 8
integer(2) 24
--------------------------------------------
Fortran 95 COMMON-block alignment in Bytes
--------------------------------------------
logical(1) 0
real(16) 1
integer(2) 17使用 -aligncommon 选项编译时,如果通用块中含有派生类型或由明确的种类数值显示的变量时,请不要将 FD6U2 目标文件与版本 8.0 或 7.0 编译器生成的目标相混合。
下列常见项目也需注意:
在 Solaris 操作系统 7 以上的 SPARC V9 平台上链接:
许多静态系统库,例如 libm.a 和 libc.a,在 SPARC V9 平台上的较近 Solaris OS 7版本中不可用。只提供了动态的共享库 libm.so 和 libc.so。这意味着在 SPARC V9 平台上使用 -Bstatic 和 -dn 编译器选项可能会引起链接错误。这些情况下应用程序必须使用动态库。
为了在动态连接系统库时与用户库的静态版本显示连接,请使用形式上 与下面的命令行相似的命令行:
  f95 -o prog prog.f -Bstatic -lxyz -labc -Bdynamic
这会与 libxyz.a 和 libabc.a 链接,但对所有其他库(包括系统库)会使用动态链接。
数组内部函数使用全局寄存器:
数组内部函数 ANY、ALL、COUNT、MAXVAL、MINVAL、SUM、PRODUCT、DOT_PRODUCT 和 MATMUL 针对 SPARC 平台架构进行了高度优化。因此,它们使用全局寄存器 %g2、%g3 和局部寄存器 %g4。
如果调用使用了上述的数组内部函数,用户代码不应该认为这些寄存器可用于暂时存储。当数组内部函数被调用时,这些寄存器中的数据会被覆盖。
归档库中的 F95 模块不包括在可执行文件中:
调试器 dbx 要求编译时用到的所有目标文件都包括到可执行文件中。通常,无需用户的额外工作,程序就能满足这一要求。但使用含有模块的归档会导致一个意外情况产生。如果程序使用了一个模块,但没有引用模块中的任何过程或变量,产生的目标文件不会包含对模块中定义符号的引用。只有目标文件中定义的符号被引用,链接器才会链接归档中的目标文件。如果不存在这样的引用,目标文件将不被包括在可执行文件中。当 Dbx 试图找到与使用模块相关的调试信息时,会给出一个警告。它将无法提供有关符号的信息,因为符号的调试信息丢失了。
使用 -u 链接器选项可避开这个问题。这个选项使用一个符号作为它的选项参数。它会将符号添加到未定义链接器符号集中,所以它必须得到解决。与模块相关的链接器符号通常是模块名称,名称的所有字母小写,后跟一个下划线。
例如,为了强迫目标文件包含来自归档的模块 MODULE_1,可指定链接器选项 -u module_1_。如果链接使用 f95 命令,请在命令行上使用 -Qoption ld -umodule_1_。
Fortran 95 派生类型和 SCCS:
因为 SCCS 使用百分号 (%) 为单字母 ID 关键词划定了界限,用单字母名称定义了结构组件的 Fortran 95 程序的用户在 SCCS 下维护源代码时,会看到意外的结果。
这不能说是编译器的一个错误,但的确是 Fortran 95 语言和 SCCS 源 代码控制系统间的冲突。
如果计划使用 SCCS 管理源代码,那么不为结构组件使用单字母名称就能避免这个问题,或者通过使用 SCCS 中能够忽略这些关键词的 get 选项 -k 取回文件,或者在 % 周围放置空格,例如 X % Y % Z。
G. 文档错误
目前无信息。
H. Fortran 95 必要的补丁程序
要了解本发行版本必要和可选的补丁程序,请参见发行说明。
I. 可发送库
如果可执行文件使用列在以下命名文件中的 Sun 动态库,那么许可证中就包 括了将库给重新分发客户的权利。
/opt/SUNWspro/READMEs/runtime.libraries
注意—如果未将软件安装到 /opt 目录中,请咨询系统管理员以获得系统上的实际安装路径。
您不能以任何形式重新分发或透漏对象模块的头文件、源代码、对象模型或静态库。
“使用许可证”出现在“最终用户对象代码许可证”中,可以在 CD-ROM 塑料包装盒背面看到。