SunMicrosystems,Inc.
www.
sun.
com请将有关本文档的意见和建议提交至:http://www.
sun.
com/hwdocs/feedbackFortran用户指南SunStudio10文件号码819-1605-102005年1月,修订版A请回收版权所有2005SunMicrosystems,Inc.
,4150NetworkCircle,SantaClara,California95054,U.
S.
A.
保留所有权利.
其使用应遵守许可证条款.
美国政府权利-商业软件.
政府用户应遵循SunMicrosystems,Inc.
的标准许可协议,以及FAR(FederalAcquisitionRegulations,即"联邦政府采购法规")的适用条款及其补充条款.
本发行可包含第三方开发的材料.
本产品的某些部分可能是从BerkeleyBSD系统衍生出来的,并获得了加利福尼亚大学的许可.
UNIX是X/OpenCompany,Ltd.
在美国和其他国家/地区独家许可的注册商标.
Sun、SunMicrosystems、Sun徽标、Java和JavaHelp是SunMicrosystems,Inc.
在美国和其他国家/地区的商标或注册商标.
所有SPARC商标的使用均已获得许可,它们是SPARCInternational,Inc.
在美国和其他国家/地区的商标或注册商标.
标有SPARC商标的产品均基于由SunMicrosystems,Inc.
开发的体系结构.
本产品受美国出口控制法制约,并应遵守其他国家/地区的进出口法律.
严禁将本产品直接或间接地用于核设施、导弹、生化武器或海上核设施,也不能直接或间接地出口给核设施、导弹、生化武器或海上核设施的最终用户.
严禁出口或转口到美国禁运的国家/地区以及美国禁止出口清单中所包含的实体,包括但不限于被禁止的个人以及特别指定的国家/地区的公民.
本文档按"原样"提供,对于所有明示或默示的条件、陈述和担保,包括对适销性、适用性或非侵权性的默示保证,均不承担任何责任,除非此免责声明的适用范围在法律上无效.
iii目录开始之前xvii印刷约定xviiShell提示符xviii支持的平台xix访问SunStudio软件和手册页xix访问编译器和工具文档xxi访问相关的Solaris文档xxiii开发人员资源xxiii与Sun技术支持联系xxivSun欢迎您提出意见和建议xxiv1.
简介1–11.
1符合标准1–11.
2Fortran95编译器的功能1–21.
3其他Fortran公用程序1–21.
4调试公用程序1–31.
5Sun性能库1–31.
6区间运算1–31.
7手册页1–41.
8自述文件1–5ivFortran用户指南2005年1月1.
9命令行帮助1–62.
使用Fortran952–12.
1快速入门2–12.
2调用编译器2–22.
2.
1编译和链接序列2–32.
2.
2命令行文件命名约定2–32.
2.
3源文件2–42.
2.
4源文件预处理程序2–42.
2.
5分别编译和链接2–52.
2.
6一致编译和链接2–52.
2.
7无法识别的命令行参数2–62.
2.
8Fortran95模块2–62.
3指令2–72.
3.
1通用指令2–72.
3.
2并行化指令2–132.
4库接口和system.
inc2–152.
5编译器用法提示2–152.
5.
1确定硬件平台(SPARC)2–162.
5.
2使用环境变量2–162.
5.
3内存大小2–173.
Fortran编译器选项3–13.
1命令语法3–13.
2选项语法3–23.
3选项摘要3–33.
3.
1常用选项3–73.
3.
2宏标志3–83.
3.
3向后兼容性和传统选项3–9目录v3.
3.
4已废弃的选项标志3–93.
4选项参考3–10-a3–10-aligncommon[={1|2|4|8|16}]3–10-ansi3–11-arg=local3–11-autopar3–11-B{static|dynamic}3–11-C3–12-c3–12-cg893–13-cg923–13-copyargs3–13-Dname[=def]3–13-dalign3–14-dbl_align_all[={yes|no}]3–15-depend[={yes|no}]3–15-dn3–15-dryrun3–15-d{y|n}3–15-e3–16-erroff[={%all|%none|taglist}]3–16-errtags[={yes|no}]3–16-errwarn[={%all|%none|taglist}]3–17-explicitpar3–17-ext_names=e3–18-F3–18-f3–18viFortran用户指南2005年1月-f77[=list]3–19-fast3–20-fixed3–21-flags3–22-fnonstd3–22-fns[={yes|no}]3–22-fpover[={yes|no}]3–23-fpp3–23-fprecision={single|double|extended}3–23-free3–24-fround={nearest|tozero|negative|positive}3–24-fsimple[={1|2|0}]3–24-fstore3–25-ftrap=t3–25-G3–26-g3–26-hname3–27-help3–27-Ipath3–27-inline=[%auto][[,][no%]f1,_[no%]fn]3–28-iorounding[={compatible|processor-defined}]3–29-KPIC3–29-KPIC3–29-Lpath3–29-lx3–29-libmil3–30-loopinfo3–30-Mpath3–31目录vii-moddir=path3–32-mp={%none|sun|cray}3–32-mt3–32-native3–33-noautopar3–33-nodepend3–33-noexplicitpar3–33-nofstore3–33-nolib3–33-nolibmil3–34-noreduction3–34-norunpath3–34-O[n]3–34-O3–35-O13–35-O23–35-O33–35-O43–35-O53–35-oname3–36-onetrip3–36-openmp[={parallel|noopt|none}]3–36-PIC3–37-p3–37-pad[=p]3–37-parallel3–38-pg3–39-pic3–39viiiFortran用户指南2005年1月-Qoptionprls3–39-qp3–39-Rls3–39-r8const3–40-reduction3–40-S3–40-s3–41-sb3–41-sbfast3–41-silent3–41-stackvar3–41-stop_status[={yes|no}]3–42-temp=dir3–43-time3–43-U3–43-Uname3–43-u3–43-unroll=n3–44-use=list3–44-V3–44-v3–44-vax=keywords3–44-vpara3–45-w[n]3–45-Xlist[x]3–46-x3863–47-x4863–47-xa3–47目录ix-xalias[=keywords]3–48-xarch=isa3–49-xassume_control[=keywords]3–53-xautopar3–54-xcache=c3–54-xcg893–55-xcg923–55-xcheck=keyword3–56-xchip=c3–56-xcode=keyword3–58-xcommonchk[={yes|no}]3–59-xcrossfile[={1|0}]3–60-xdebugformat={stabs|dwarf}3–61-xdepend3–61-xexplicitpar3–61-xF3–61-xfilebyteorder=options3–62-xhasc[={yes|no}]3–63-xhelp={readme|flags}3–64-xia[={widestneed|strict}]3–64-xild{off|on}3–64-xinline=list3–65-xinterval[={widestneed|strict|no}]3–65-xipo[={0|1|2}]3–65-xipo_archive[={none|readonly|writeback}]3–67-xjobs=n3–67-xknown_lib=library_list3–68-xlang=f773–69xFortran用户指南2005年1月-xlibmil3–70-xlibmopt3–70-xlic_lib=sunperf3–70-xlicinfo3–70-xlinkopt[={1|2|0}]3–70-xloopinfo3–71-xmaxopt[=n]3–71-xmemalign[=]3–72-xnolib3–73-xnolibmil3–73-xnolibmopt3–73-xOn3–73-xopenmp3–73-xpad3–73-xpagesize=size3–73-xpagesize_heap=size3–74-xpagesize_stack=size3–74-xparallel3–74-xpg3–74-xpp={fpp|cpp}3–74-xprefetch[=a[,a]]3–75-xprefetch_auto_type=[no%]indirect_array_access3–77-xprefetch_level={1|2|3}3–77-xprofile={collect[:name]|use[:name]|tcov}3–77-xprofile_ircache[=path]3–79-xprofile_pathmap=collect_prefix:use_prefix3–79-xrecursive3–80-xreduction3–80目录xi-xregs=r3–80-xs3–81-xsafe=mem3–81-xsb3–81-xsbfast3–81-xspace3–81-xtarget=t3–81-xtime3–84-xtypemap=spec3–84-xunroll=n3–85-xvector[={yes|no}]3–85-ztext3–854.
Fortran95功能和差异4–14.
1源语言功能4–14.
1.
1续行限制4–14.
1.
2固定格式源代码行4–14.
1.
3采用的源代码格式4–24.
1.
4限制和缺省值4–34.
2数据类型4–34.
2.
1布尔类型4–34.
2.
2数值数据类型的缩写大小表示法4–64.
2.
3数据类型的大小和对齐4–74.
3Cray指针4–84.
3.
1语法4–84.
3.
2Cray指针的用途4–94.
3.
3声明Cray指针和Fortran95指针4–94.
3.
4Cray指针的功能4–94.
3.
5Cray指针的限制4–10xiiFortran用户指南2005年1月4.
3.
6Cray指针对象的限制4–104.
3.
7Cray指针的用法4–104.
4STRUCTURE和UNION(VAXFortran)4–114.
5无符号整数4–124.
5.
1算术表达式4–124.
5.
2关系表达式4–134.
5.
3控制构造4–134.
5.
4输入/输出构造4–134.
5.
5内部函数4–134.
6Fortran2003功能4–144.
6.
1与C函数之间的互操作性4–144.
6.
2IEEE浮点异常处理4–144.
6.
3命令行参数内函数4–144.
6.
4PROTECTED属性4–154.
6.
5Fortran2003异步I/O4–154.
6.
6扩展的ALLOCATABLE属性4–154.
6.
7VALUE属性4–154.
6.
8Fortran2003流I/O4–164.
6.
9Fortran2003格式化I/O功能4–164.
7其他的I/O扩展4–174.
7.
1I/O错误处理例程4–174.
7.
2变量格式表达式4–174.
7.
3NAMELIST输入格式4–184.
7.
4二进制未格式化I/O4–184.
7.
5各种I/O扩展4–184.
8指令4–194.
8.
1特殊f95指令行的格式4–194.
8.
2FIXED和FREE指令4–20目录xiii4.
8.
3并行指令4–214.
9模块文件4–214.
9.
1搜索模块4–224.
9.
2-use=list选项标记4–224.
9.
3fdumpmod命令4–234.
10内部函数4–234.
11向前兼容性4–244.
12混合语言4–245.
FORTRAN77兼容性:迁移到Fortran955–15.
1兼容的f77功能5–15.
2不兼容问题5–55.
3与f77编译的例程链接5–75.
3.
1Fortran95内部函数5–75.
4有关迁移到f95编译器的附加说明5–8A.
运行时错误消息A–1A.
1操作系统错误消息A–1A.
2f95运行时I/O错误消息A–2B.
功能版本历史B–1B.
1SunStudio10Fortran发行版本:B–1B.
2SunStudio9Fortran发行版本:B–2B.
3SunStudio8Fortran发行版本:B–4B.
4SunONEStudio7编译器集合(ForteDeveloper7)版本:B–6C.
传统-xtarget平台扩展C–1D.
Fortran指令摘要D–1D.
1通用Fortran指令D–1D.
2特殊的Fortran95指令D–3xivFortran用户指南2005年1月D.
3Fortran95OpenMP指令D–3D.
4Sun并行化指令D–4D.
5Cray并行化指令D–5索引索引–1xv表表1-1感兴趣的自述文件5表2-1由Fortran95编译器识别的文件名后缀3表2-2通用Fortran指令摘要8表3-1选项语法2表3-2选项的印刷表示法2表3-3按功能分组的编译器选项3表3-4常用选项7表3-5宏选项标志8表3-6向后兼容性选项9表3-7已废弃的f95选项9表3-8低于正常的REAL和DOUBLE23表3-9-Xlist子选项47表3-10-xalias选项关键字48表3-11-xarchISA关键字49表3-12SPARC平台上最常用的-xarch选项50表3-13SPARC平台的-xarch值51表3-14x86平台的-xarch值53表3-15–xcache值55表3-16常用-xchipSPARC处理器的名称57表3-17不常用的-xchipSPARC处理器的名称57xviFortran用户指南2005年1月表3-18常用的-xtarget系统平台的扩展82表4-1F95源代码格式命令行选项2表4-2数值数据类型的大小表示法6表4-3缺省的数据大小和对齐(以字节为单位)7表4-4非标准的内部函数23表A-1f95运行时I/O消息2表C-1传统-xtarget扩展1表D-1通用Fortran指令摘要1表D-2特殊的Fortran95指令3表D-3Sun风格并行化指令摘要4表D-4Cray并行化指令摘要5xvii开始之前《Fortran用户指南》描述了SunStudioFortran95编译器f95的环境和命令行选项.
本指南适用于已经具备Fortran语言应用知识并要了解如何有效地使用Fortran编译器的科学家、工程师和程序员.
通常,还假定他们熟悉Solaris操作系统或UNIX.
有关输入/输出、程序开发、库、程序分析和调试、数值准确性、移植、性能、优化、并行化和互操作性的基础信息,另请参阅随附的《Fortran编程指南》.
印刷约定表P-1印刷约定字样含义示例AaBbCc123命令、文件和目录的名称;计算机屏幕输出编辑您的.
login文件.
使用ls-a列出所有文件.
%Youhavemail.
AaBbCc123输入的内容,以便与计算机屏幕输出相区别%suPassword:AaBbCc123书名、新词或术语以及要强调的词请阅读《用户指南》的第6章.
这些称作类选项.
您必须是超级用户才能执行此操作.
AaBbCc123命令行变量;用实际名称或值替换要删除文件,请键入rmfilename.
xviiiFortran用户指南2005年1月符号表示有效的空格.
FORTRAN77标准使用较旧的约定,以大写字母来拼写名称"FORTRAN".
当前的约定是使用小写字母:"Fortran95"出现的联机手册页参考带有主题名称和章节号.
例如,库例程GETENV的参考显示为getenv(3F),这意味着访问此手册页的man命令为:man-s3FgetenvShell提示符36.
001表P-2代码约定代码符号含义表示法代码示例[]括号包含可选参数.
O[n]-O4,-O{}大括号包含所需选项的选项集合.
d{y|n}-dy|分隔变量的"|"或"-"符号,只能选择其一.
B{dynamic|static}-Bstatic:与逗号一样,冒号有时可用于分隔参数.
Rdir[:dir]-R/local/libs:/U/a.
.
.
省略号表示一系列省略.
xinline=f1[,.
.
.
fn]-xinline=alpha,dosShell提示符Cshellmachine-name%Cshell超级用户machine-name#Bourneshell和Kornshell$Bourneshell和Kornshell的超级用户#开始之前xix支持的平台此SunStudio发行版本支持使用如下SPARC和x86系列处理器架构的系统:UltraSPARC、SPARC64、AMD64、Pentium和XeonEM64T.
可从以下位置获得硬件兼容性列表,在列表中可以查看您正在使用的Solaris操作系统版本所支持的系统:http://www.
sun.
com/bigadmin/hcl.
这些文档中给出了平台类型间所有实现的区别.
在本文档中,术语"x86"指采用兼容AMD64或IntelXeon/Pentium产品系列处理器的64位和32位系统.
有关受支持的系统,请参阅硬件兼容性列表.
访问SunStudio软件和手册页编译器和工具以及它们的手册页并没有安装到标准的/usr/bin/和/usr/share/man目录中.
要访问编译器和工具,必须正确设置PATH环境变量(请参阅第xix页"访问编译器和工具").
要访问手册页,必须正确设置MANPATH环境变量(请参阅第xx页"访问手册页").
关于PATH变量的更多信息,请参阅csh(1)、sh(1)和ksh(1)手册页.
关于MANPATH变量的更多信息,请参阅man(1)手册页.
关于设置PATH变量和MANPATH变量以访问此发行版本的更多信息,请参阅安装指南或询问系统管理员.
注–本节中的信息假设SunStudio编译器和工具安装在/opt目录中.
如果软件没有安装在/opt目录中,请向系统管理员获取系统中的等效路径.
访问编译器和工具使用下列步骤来决定是否需要更改PATH变量以访问编译器和工具.
决定是否需要设置PATH环境变量1.
通过在命令提示符后输入下列内容以显示PATH变量的当前值.
%echo$PATHxxFortran用户指南2005年1月2.
查看输出中是否有包含/opt/SUNWspro/bin/的路径字符串.
如果找到该路径,您的PATH变量不需设置就可以访问编译器和工具.
如果没有找到该路径,按照下一步中的指示来设置PATH环境变量.
设置PATH环境变量以访问编译器和工具1.
如果使用的是Cshell,请编辑起始.
cshrc文件.
如果使用的是Bourneshell或Kornshell,请编辑起始.
profile文件.
2.
将下列内容添加到PATH环境变量.
如果已安装ForteDeveloper软件、SunONEStudio软件或SunStudio软件的其他发行版本,则将以下路径添加到这些安装的路径之前.
/opt/SUNWspro/bin访问手册页使用下列步骤来决定是否需要更改MANPATH变量以访问手册页.
决定是否需要设置MANPATH环境变量1.
通过在命令提示符后输入下列内容以请求dbx手册页.
2.
如果有输出的话,请查看输出.
如果dbx(1)手册页无法找到或者显示的手册页不是用于安装软件的当前版本,请按照下一步中的指示来设置MANPATH环境变量.
设置MANPATH环境变量以访问手册页1.
如果使用的是Cshell,请编辑起始.
cshrc文件.
如果使用的是Bourneshell或Kornshell,请编辑起始.
profile文件.
2.
将下列内容添加到MANPATH环境变量.
/opt/SUNWspro/man%mandbx开始之前xxi访问集成开发环境SunStudio集成开发环境(IDE)提供了创建、编辑、生成、调试和分析C、C++或Fortran应用程序性能的模块.
启动IDE的命令是sunstudio.
有关该命令的详细信息,请参阅sunstudio(1)手册页.
IDE是否能够正确操作取决于能找到核心平台的IDE.
sunstudio命令会在以下两个位置中查找核心平台:该命令首先查找缺省安装目录/opt/netbeans/3.
5V.
如果该命令在缺省目录中未找到核心平台,则其假设包含IDE的目录和包含核心平台的目录都安装在同一位置.
例如,如果包含IDE的目录的路径是/foo/SUNWspro,则该命令将在/foo/netbeans/3.
5V中查找核心平台.
如果核心平台未安装在sunstudio命令查找它的任一位置上,则客户端系统上的每个用户必须将环境变量SPRO_NETBEANS_HOME设置为安装核心平台的位置(/installation_directory/netbeans/3.
5V).
IDE的每个用户还必须将/installation_directory/SUNWspro/bin添加到其他任何ForteDeveloper软件、SunONEStudio软件或SunStudio软件发行版本路径前面的$PATH中.
路径/installation_directory/netbeans/3.
5V/bin不可添加到用户的$PATH中.
访问编译器和工具文档您可以访问下列位置的文档:可以在随软件一起安装的文档索引file:/opt/SUNWspro/docs/index.
html中(位于本地系统或网络上)获取文档.
如果软件没有安装在/opt目录中,请询问系统管理员以获取系统中的等效路径.
大多数的手册都可以从docs.
sun.
comsmWeb站点上获得.
下列书目只能从您所安装的软件中找到:《标准C++库类参考》《标准C++库用户指南》《Tools.
h++类库参考》《Tools.
h++用户指南》发行说明可以从docs.
sun.
comWeb站点获得.
在IDE中通过"帮助"菜单或窗口和对话框上的"帮助"按钮可以访问IDE所有组件的联机帮助.
xxiiFortran用户指南2005年1月您可以通过因特网在docs.
sun.
comWeb站点(http://docs.
sun.
com)上阅读、打印和购买SunMicrosystems的各种手册.
如果找不到手册,请参阅和软件一起安装在本地系统或网络中的文档索引.
注–Sun对本文档中提到的第三方Web站点的可用性不承担任何责任.
对于此类站点或资源中的(或通过它们获得的)任何内容、广告、产品或其他材料,Sun并不表示认可,也不承担任何责任.
对于因使用或依靠此类站点或资源中的(或通过它们获得的)任何内容、产品或服务而造成的或连带产生的实际或名义损坏或损失,Sun概不负责,也不承担任何责任.
使用易读格式的文档该文档以易读格式提供,以方便残障用户使用辅助技术进行阅读.
您还可以按照下表所描述的信息找到文档的易读版本.
如果软件没有安装在/opt目录下,请向系统管理员获取系统中的等效路径.
文档类型易读版本的格式和位置手册(第三方手册除外)HTML,位于http://docs.
sun.
com第三方手册:《标准C++库类参考》《标准C++库用户指南》《Tools.
h++类库参考》《Tools.
h++用户指南》HTML,位于安装的软件中的文档索引file:/opt/SUNWspro/docs/index.
html自述文件和手册页HTML,位于安装的软件中的文档索引file:/opt/SUNWspro/docs/index.
html联机帮助通过IDE中的"帮助"菜单可以使用HTML发行说明HTML,位于http://docs.
sun.
com开始之前xxiii相关编译器和工具文档下表描述的相关文档可以在file:/opt/SUNWspro/docs/index.
html和http://docs.
sun.
com上获得.
如果软件没有安装在/opt目录下,请向系统管理员获取系统中的等效路径.
访问相关的Solaris文档下表描述了可从docs.
sun.
comWeb站点上获得的相关文档.
开发人员资源访问http://developers.
sun.
com/prodtech/cc以查找以下经常更新的资源:关于编程技术和最佳方法的文章短小编程提示的知识库编译器和工具组件的文档以及与软件同时安装的文档的更正文档标题描述Fortran编程指南描述如何在Solaris环境中编写有效的Fortran程序;输入/输出、库、性能、调试和并行化.
Fortran库参考详细说明Fortran库和内部例程OpenMPAPI用户指南OpenMP多处理API摘要,并提供有关实现的详细信息.
数值计算指南描述关于浮点计算数值精确性的问题.
文档集合文档标题描述Solaris参考手册集合请参阅手册页部分的标题.
提供Solaris操作环境的有关信息.
Solaris软件开发人员集合链接程序和库指南描述了Solaris链接编辑器和运行时链接程序的操作.
Solaris软件开发人员集合多线程编程指南涵盖POSIX和Solaris线程API、使用同步对象进行程序设计、编译多线程程序和多线程程序的查找工具.
xxivFortran用户指南2005年1月支持等级信息用户论坛可下载代码示例新技术预览您可以在http://developers.
sun.
com上找到对开发人员有用的其他资源.
与Sun技术支持联系如果您有关于本产品的技术问题而本文档未予以解答,请访问:http://www.
sun.
com/service/contactingSun欢迎您提出意见和建议Sun致力于提高文档质量,并欢迎您提出宝贵的意见和建议.
请将您的意见和建议通过以下URL提交给Sun:http://www.
sun.
com/hwdocs/feedback请在电子邮件的主题行中注明文档的文件号码(819-1605-10).
当您提供意见和建议时,可能需要在表单中提供文档英文版本的标题和文件号码.
本文档英文版本的文件号码和标题是:819-0492-10,FortranUser'sGuide.
1-1第1章简介本书与随附的《Fortran编程指南》中介绍的SunStudioFortran95编译器f95可在SPARC平台、UltraSPARC平台以及x86平台上的Solaris操作系统中使用.
此编译器符合发布的Fortran语言标准,并提供很多扩展的功能,其中包括多处理器并行化、高级的优化代码编译以及混合的C/Fortran语言支持.
f95编译器还提供接受大多数传统Fortran77源代码的Fortran77兼容性模式.
不再存在独立的Fortran77编译器.
有关FORTRAN77兼容性和迁移问题的信息,请参阅第5章.
1.
1符合标准f95从设计上与ANSIX3.
198-1992、ISO/IEC1539:1991和ISO/IEC1539:1997标准文档兼容.
浮点运算基于IEEE标准754-1985和国际标准IEC60559:1989.
f95提供了对以下SPARC和x86系列处理器体系结构优化开发功能的支持:Solaris平台上的UltraSPARC、SPARC64、AMD64、Pentium和XeonEM64T.
在本文档中,"标准"是指与上面列出的标准版本相一致.
"非标准"或"扩展"是指超出这些标准版本的功能.
负责标准的一方可能会不时地修订这些标准.
可能会修订或替代这些编译器遵循的适用标准的版本,因而导致SunFortran编译器将来版本中的功能与先前版本不兼容.
1-2Fortran用户指南2005年1月1.
2Fortran95编译器的功能SunStudioFortran95编译器提供下列功能和扩展:在例程中对参数、公共区等进行全局程序一致性检查.
优化多处理器系统的自动和显式循环并行化.
VAX/VMSFortran扩展,其中包括:结构、记录、联合和映射递归OpenMP并行化指令.
Cray风格的并行化指令,其中包括TASKCOMMON.
全局、窥孔和潜在的并行化优化可产生高性能的应用程序.
基准测试表明优化的应用程序的运行速度比未优化的代码快得多.
Solaris系统上相同的调用惯例允许将使用C或C++编写的例程与Fortran程序结合起来.
在UltraSPARC平台上支持64位的Solaris环境.
使用%VAL按值进行调用.
Fortran77和Fortran95程序和对象二进制文件之间的兼容性.
区间运算编程.
某些"Fortran2003"功能,其中包括流I/O.
有关在每个软件版本的编译器中已添加的新功能和扩展功能的详细信息,请参阅附录B.
1.
3其他Fortran公用程序以下公用程序可为使用Fortran进行软件程序开发提供帮助.
SunStudio性能分析器——单线程和多线程应用程序深层性能分析工具.
请参阅analyzer(1).
asa——此Solaris公用程序是一个Fortran输出过滤器,用于打印在第一列中包含Fortran回车控制符的文件.
可使用asa将按照Fortran回车控制惯例设置格式的文件转换为按照UNIX行打印机惯例设置格式的文件.
请参阅asa(1).
fdumpmod——此公用程序用于显示文件或归档中包含的模块的名称.
请参阅fdumpmod(1).
fpp——一个Fortran源代码预处理程序.
请参阅fpp(1).
第1章简介1-3fsplit——此公用程序将一个包含几个例程的Fortran文件分成几个文件,每个文件包含一个例程.
可使用fsplit处理FORTRAN77或Fortran95源文件.
请参阅fsplit(1).
1.
4调试公用程序可以使用以下调试公用程序:-Xlist——一个用于检查例程中参数、COMMON块等一致性的编译器选项.
dbx——提供可靠且功能丰富的运行时和静态调试器,并且包含一个性能数据收集器.
1.
5Sun性能库SunPerformanceLibrary是一个用于计算线性代数和傅立叶变换的优化子例程和函数库.
它基于一般通过Netlib(www.
netlib.
org)提供的标准库LAPACK、BLAS1、BLAS2、BLAS3、FFTPACK、VFFTPACK和LINPACK.
与标准库版本相比,Sun性能库中的每个子程序执行相同的操作并且具有相同的接口,但通常这些子程序的速度要快得多且准确得多,这些子程序可以用于多处理环境中.
详细信息,请参阅performance_library自述文件和《Sun性能库用户指南》.
(性能库例程的手册页位于第3P节.
)1.
6区间运算Fortran95编译器提供编译器标记-xia和-xinterval以启用新的语言扩展,并生成相应的代码以实现区间运算计算.
(只有SPARC/UltraSPARC平台支持区间运算功能.
)详细信息,请参阅《Fortran95区间运算编程指南》.
1-4Fortran用户指南2005年1月1.
7手册页联机手册(man)页提供了关于命令、函数、例行程序以及收集这些信息的文档.
要访问SunStudio手册页,请参阅"前言"部分对MANPATH环境变量进行正确设置.
可以通过运行以下命令来显示手册页:在整个Fortran文档中,出现的手册页参考带有主题名称和手册章节号:可使用manf95访问f95(1).
例如,可在man命令中使用-s选项来访问用ieee_flags(3M)指示的其他章节:Fortran库例程是在手册页第3F节中介绍的.
下面列出了Fortran用户感兴趣的man页:demo%mantopicdemo%man-s3Mieee_flagsf95(1)Fortran95命令行选项analyzer(1)性能分析器asa(1)Fortran回车控制打印输出后处理器dbx(1)命令行交互调试器fpp(1)Fortran源代码预处理器cpp(1)C源代码预处理器fdumpmod(1)显示模块(.
mod)文件的内容.
fsplit(1)预处理器将Fortran源例程分成单个文件ieee_flags(3M)检查、设置或清除浮点异常位ieee_handler(3M)处理浮点异常matherr(3M)数学库错误处理例程ild(1)目标文件的增量链接编辑器ld(1)目标文件的链接编辑器第1章简介1-51.
8自述文件READMEs目录包含描述以下内容的文件:新增功能、软件不兼容性、错误以及手册印刷后发现的信息.
此目录的位置取决于安装软件的位置.
路径为:/opt/SUNWspro/READMEs/.
可使用-xhelp=readme命令行选项方便地查看每个编译器的自述文件.
例如,命令:直接显示fortran_95自述文件.
表1-1感兴趣的自述文件自述文件描述.
.
.
fortran_95此版本Fortran95编译器f95的新增功能和修改的功能、已知限制和文档勘误表.
fpp_readmefpp功能概述interval_arithmeticf95中的区间运算功能概述math_libraries可用的优化和专用数学库.
profiling_tools使用性能配置工具prof、gprof和tcov.
runtime_libraries可依照最终用户许可协议的条款重新分发的库和可执行文件.
performance_librarySun性能库概述%f95-xhelp=readme1-6Fortran用户指南2005年1月1.
9命令行帮助可通过调用编译器的-help选项来查看f95命令行选项的简短描述(如下所示):%f95-help=flagsItemswithin[]areoptional.
Itemswithinarevariableparameters.
Bar|indicateschoiceofliteralvalues.
-someoption[={yes|no}]implies-someoptionisequivalentto-someoption=yes-aCollectdatafortcovbasicblockprofiling-aligncommon[=]Aligncommonblockelementstothespecifiedboundaryrequirement;={1|2|4|8|16}-ansiReportnon-ANSIextensions.
-autoparEnableautomaticloopparallelization-BdynamicAllowdynamiclinking-BstaticRequirestaticlinking-CEnableruntimesubscriptrangechecking-cCompileonly;produce.
ofilesbutsuppresslinking.
.
.
etc.
2-1第2章使用Fortran95本章介绍如何使用Fortran95编译器.
所有编译器的主要用途都是将使用过程语言(如Fortran)编写的程序转换为可由目标计算机硬件执行的数据文件.
在此过程中,编译器还可能会自动调用系统链接程序来生成可执行文件.
Fortran95编译器还可以用于:生成并行的可执行文件以用于多处理器(-openmp).
跨源文件和子例程分析程序一致性并生成报告(-Xlist).
将源文件转换为:可重定位的二进制(.
o)文件,可随后将其链接到可执行文件或静态库(.
a)文件.
动态共享库(.
so)文件(-G).
将文件链接到可执行文件.
在启用运行时调试的情况下编译可执行文件(-g).
使用运行时语句或过程级文件配置进行编译(-pg).
检查源代码是否符合ANSI标准(-ansi).
2.
1快速入门本节简要介绍如何使用Fortran95编译器来编译和运行Fortran程序.
下一章将详细介绍命令行选项.
运行Fortran应用程序的基本步骤包括:使用编辑器创建带有文件名后缀.
f、.
for、.
f90、.
f95、.
F、.
F90或.
F95的Fortran源文件;调用编译器来生成可执行文件;最后通过键入文件名来启动并执行该程序:2-2Fortran用户指南2005年1月示例:此程序在屏幕上显示一条消息:在本示例中,f95编译源文件greetings.
f,并在缺省情况下将可执行程序链接到文件a.
out.
要启动该程序,请在命令提示符下键入可执行文件的名称a.
out.
习惯上,UNIX编译器将可执行输出写入到名为a.
out的缺省文件中.
每次编译都写入到同一个文件是比较笨拙的方法.
再者,如果该文件已存在,那么在下次运行编译器时它将会被覆盖.
因此,请使用-o编译器选项来显式地指定可执行输出文件的名称:在前面的示例中,-o选项告知编译器将可执行代码写入到文件greetings中.
(按照惯例,通常给可执行文件指定与主源文件相同的名称,但可执行文件没有扩展名.
)或者,可在每次编译后通过mv命令来重命名缺省的a.
out文件.
无论使用哪种方法,都要在shell提示符下键入可执行文件的名称来运行程序.
本章的后面几节将讨论f95命令使用的惯例、编译器源文件行指令以及有关使用这些编译器的其他问题.
下一章将详细介绍命令行语法和所有选项.
2.
2调用编译器在shell提示符下调用编译器有一个简单的命令,其语法是:f95[options]files.
.
.
其中,files是一个或多个以.
f、.
F、.
f90、.
f95、.
F90、.
F95或.
for结尾的Fortran源文件名称;options是一个或多个编译器选项标记.
(以.
f90或.
f95扩展名结尾的文件是只能由f95编译器识别的"自由格式"Fortran95源文件.
)demo%catgreetings.
fPROGRAMGREETINGSPRINT*,'RealprogrammerswriteFortran!
'ENDdemo%f95greetings.
fdemo%a.
outRealprogrammerswriteFortran!
demo%demo%f95–ogreetingsgreetings.
fdemo%greetingsRealprogrammerswriteFortran!
demo%第2章使用Fortran952-3在下面的示例中,我们在启用运行时调试的情况下,使用f95来编译两个源文件以生成名为growth的可执行文件:注–可以使用f95或f90命令来调用Fortran95编译器.
新增功能:该编译器还接受扩展名为.
f03或.
F03的源文件.
这些文件将被视为等价于.
f95和.
F95,并且可以作为表示源文件包含Fortran2003扩展名的一种方式.
第2-3页的第2.
2.
2节"命令行文件命名约定"描述了该编译器接受的各种源文件的扩展名.
2.
2.
1编译和链接序列在上一示例中,编译器自动生成加载器目标文件growth.
o和fft.
o,然后调用系统链接程序以创建可执行程序文件growth.
在编译后,目标文件growth.
o和fft.
o将保留.
此惯例允许您方便地重新链接和重新编译文件.
如果编译失败,您将收到每个错误的对应消息.
对于出现错误的源文件,不会生成任何.
o文件,也不会生成任何可执行程序文件.
2.
2.
2命令行文件命名约定在命令行上出现的文件名后附加的后缀扩展名决定了编译器处理文件的方式.
如果文件没有扩展名,或者其后缀扩展名不是以下列出的某个扩展名,那么这些文件将被传递给链接程序.
demo%f95-g-ogrowthgrowth.
ffft.
f95表2-1由Fortran95编译器识别的文件名后缀后缀语言操作.
fFortran77或Fortran95固定格式编译Fortran源文件,将目标文件放在当前目录中;目标文件的缺省名称是源文件的名称,但具有.
o后缀.
.
f95.
f90Fortran95自由格式执行与.
f相同的操作.
.
f03Fortran2003自由格式执行与.
f相同的操作.
2-4Fortran用户指南2005年1月第4章中介绍了Fortran95自由格式.
2.
2.
3源文件Fortran编译器可从命令行接受多个源文件.
单个源文件(也称为编译单元)可以包含任意数量的过程(主程序、子例程、函数、块数据、模块等).
可以将应用程序配置为每个文件一个源代码过程,或者将协同工作的过程集中到单个文件中.
《Fortran编程指南》描述了这些配置的优缺点.
2.
2.
4源文件预处理程序f95支持两种源文件预处理程序:fpp和cpp.
编译器可以在编译之前调用这两种源文件预处理程序中的某个来扩展源代码"宏"和符号定义.
在缺省情况下,编译器将使用fpp;-xpp=cpp选项将缺省设置由fpp更改为cpp.
(另请参阅有关-Dname选项的讨论.
).
forFortran77或Fortran95执行与.
f相同的操作.
.
FFortran77或Fortran95固定格式在编译前,将Fortran(或C)预处理程序应用于Fortran77源文件.
.
F95.
F90Fortran95自由格式在Fortran编译Fortran95自由格式源文件前,将Fortran(或C)预处理程序应用于该文件.
.
F03Fortran2003自由格式与.
F95相同.
s汇编程序使用汇编程序汇编源文件.
.
S汇编程序在对汇编程序源文件进行汇编之前,将C预处理程序应用于该文件.
.
il内联扩展处理内联扩展的模板文件.
编译器将使用模板来扩展选定例程的内联调用.
(模板文件是特殊的汇编程序文件;请参阅"inline(1)手册页".
).
o目标文件将目标文件传递到链接程序.
.
a、.
so、.
so.
n库将库名称传递给链接程序.
.
a文件是静态库,.
so和.
so.
n文件是动态库.
表2-1由Fortran95编译器识别的文件名后缀(续)后缀语言操作第2章使用Fortran952-5fpp是Fortran特有的源文件预处理程序.
详细信息,请参阅"fpp(1)手册页"和"fpp自述文件".
在缺省情况下,系统会对具有.
F、.
F90、.
F95或.
F03扩展名的文件调用该预处理程序.
fpp的源代码可从Netlib网站下载:http://www.
netlib.
org/fortran/有关标准UnixC语言预处理程序的详细信息,请参阅cpp(1).
对于Fortran源文件,建议使用fpp而不是cpp.
2.
2.
5分别编译和链接您可以用分别的步骤编译和链接.
-c选项编译源文件并生成.
o目标文件,但不会创建可执行文件.
如果不使用-c选项,则编译器将调用链接程序.
如果通过这种方式将编译和链接步骤分开,那么就不必只为了修复一个文件而重新执行完整的编译(如以下示例所示):使用单独的步骤来编译一个文件,并将其与其他文件链接在一起:确保链接步骤列出了生成完整程序所需的全部目标文件.
如果在此步骤中缺少任何目标文件,则链接将会失败,并出现未定义的外部引用错误(缺少例程).
2.
2.
6一致编译和链接每当分步完成编译和链接时,确保编译和链接选项的一致选择是至关重要的.
在使用选项编译程序的任何部分时,必须使用相同的选项进行链接.
另外,许多选项要求使用该选项编译所有源文件,包括链接步骤.
第3章中的选项描述指明了此类选项.
示例:用–fast编译sbr.
f,编译C例程,然后进行分步链接:demo%f95-cfile1.
f(创建新的目标文件)demo%f95-oprgrmfile1.
ofile2.
ofile3.
o(创建可执行文件)demo%f95-c-fastsbr.
fdemo%cc-c-fastsimm.
cdemo%f95-fastsbr.
osimm.
o链接步骤;将-fast传递给链接程序2-6Fortran用户指南2005年1月2.
2.
7无法识别的命令行参数编译器无法识别的命令行参数将被解释为可能是链接程序选项、对象程序文件名或库名称.
基本区别是:无法识别的选项(带有-)生成警告.
无法识别的非选项(无-)不生成警告.
但是,这些非选项将被传递给链接程序,如果链接程序无法识别它们,那么将生成链接程序错误消息.
例如:请注意在第一个示例中,f95无法识别-bit,该选项将被传递给链接程序(ld),后者试图对其进行解释.
因为单字母ld选项可以串联起来,所以链接程序会将-bit视为-b-i-t,而这些都是合法的ld选项!
这可能是(也可能不是)用户所希望的结果.
在第二个示例中,用户想键入f95选项-fast,但却忽略了开头短线.
编译器再次将参数传递给链接程序,而后者将其解释为一个文件名.
这些示例表明在编写编译器命令行时应极其小心!
2.
2.
8Fortran95模块f95自动为在源文件中遇到的每个MODULE声明创建模块信息文件,并搜索USE语句引用的模块.
对于遇到的每个模块(MODULEmodule_name),编译器都在当前目录中生成相应的文件module_name.
mod.
例如,f95为文件mysrc.
f95中出现的MODULElist单元生成模块信息文件list.
mod.
有关如何设置编写和搜索模块信息文件时的缺省路径的信息,请参阅-Mpath和-moddirdirlist选项标记.
有关隐式调用所有编译单元中的MODULE声明的信息,另请参阅-use编译器选项.
可使用fdumpmod(1)命令显示有关.
mod模块信息文件内容的信息.
有关详细信息,请参阅第4-21页的第4.
9节"模块文件".
demo%f95-bitmove.
f1,则优化器可以解开循环n次.
如果实际解开了任何循环,那么可执行文件会变大.
详细信息,请参阅《Fortran编程指南》中有关性能和优化的章节.
示例-解开循环两次:2.
3.
1.
4WEAK指令WEAK指令定义一个符号,其优先级比以前定义的相同符号要低.
此pragma主要用在源文件中以创建库.
如果链接程序无法解析弱符号,它并不生成错误消息.
WEAK(name1)将name1定义为弱符号.
如果链接程序没有找到name1的定义,它并不生成错误消息.
WEAK(name1=name2)将name1定义为弱符号以及name2的别名.
如果程序调用name1,但没有对其进行定义,那么链接程序将使用库中的定义.
但是,如果程序定义了自己的name1版本,那么将采用程序的定义,而不是使用库中name1的弱全局定义.
如果程序直接调用name2,则将使用库中的定义;重复的name2定义将导致错误.
详细信息,请参阅《Solaris链接程序和库指南》.
2.
3.
1.
5OPT指令OPT指令要求您在C$PRAGMA后面指定SUN.
C$PRAGMASUNUNROLL=2C$PRAGMAWEAK(name1[=name2])第2章使用Fortran952-11OPT指令设置子程序的优化级别,它将覆盖编译命令行中指定的级别.
该指令必须紧挨在目标子程序前面出现,并且仅应用于该子程序.
例如:在使用指定-O4的f95命令编译以上内容时,该指令将覆盖此级别,并以-O2级别编译子例程.
除非该例程后面另有一个指令,否则下一个子程序将以-O4级别编译.
您还必须使用-xmaxopt[=n]选项来编译例程以识别该指令.
此编译器选项为PRAGMAOPT指令指定最大的优化值:如果PRAGMAOPT指定的优化级别大于-xmaxopt级别,则使用-xmaxopt级别.
2.
3.
1.
6NOMEMDEP指令NOMEMDEP指令要求您在C$PRAGMA后面指定SUN.
此指令必须紧挨在DO循环前面出现.
它向优化器断言,在循环的迭代中没有基于内存的依存关系来禁止并行化.
要求使用-parallel或-explicitpar选项.
2.
3.
1.
7PIPELOOP=n指令PIPELOOP=n指令要求您在C$PRAGMA后面指定SUN.
此指令必须紧挨在DO循环前面出现.
n是正整型常数或零,它向优化器断言循环迭代之间是否存在依存关系.
值零表示循环中没有迭代间的(即循环带有的)依存关系,优化器可以对循环执行任意管线处理.
正值n意味着,循环的第I次迭代与第(I-n)次迭代之间存在依存关系,每次最多只能对n个迭代进行管线处理.
有关优化的详细信息,请参阅《Fortran编程指南》.
C$PRAGMASUNOPT=2SUBROUTINEsmart(a,b,c,d,e).
.
.
etcC我们知道在使用值K时,C迭代间不能存在依存关系(例如,K>N)C$PRAGMASUNPIPELOOP=0DOI=1,NA(I)=A(I+K)+D(I)B(I)=B(I)+A(I)ENDDO2-12Fortran用户指南2005年1月2.
3.
1.
8PREFETCH指令-xprefetch选项标记第75页"-xprefetch[=a[,a]]"允许使用一组PREFETCH指令,这些指令建议编译器为指定的数据元素生成预取指令.
预取指令仅在UltraSPARC平台上可用.
有关预取指令的进一步信息,请参阅《C用户指南》或《SPARC体系结构手册,版本9》.
2.
3.
1.
9ASSUME指令ASSUME指令向编译器提供有关程序中某些点上的条件的提示.
这些断言可以帮助编译器指导其优化策略.
程序员也可以在执行过程中使用这些指令检查程序的有效性.
ASSUME有两种格式.
"点断言"ASSUME的语法是:而"范围断言"ASSUME的语法是:请使用点断言格式声明编译器可在程序中的该点采用的条件.
而使用范围断言格式声明适用于闭合的语句范围的条件.
范围断言中的BEGIN和END对必须正确嵌套.
必需的expression是一个布尔表达式,该表达式可在程序中的该点计算出来,并且其中不包含用户定义的运算符或函数调用(下面列出的除外).
可选的probability值是一个介于0.
0和1.
0之间的实数或者整数0或1,它给出表达式为真的可能性.
probability的值为0.
0(或0)意味着永远不会为真;值为1.
0(或1)则意味着始终为真.
如果没有指定,则认为表达式很有可能为真,但并不必然为真.
probability并不恰好为0或1的断言是非必然断言.
类似地,probability恰好为0或1的断言是必然断言.
C$PRAGMASPARC_PREFETCH_READ_ONCE(name)C$PRAGMASPARC_PREFETCH_READ_MANY(name)C$PRAGMASPARC_PREFETCH_WRITE_ONCE(name)C$PRAGMASPARC_PREFETCH_WRITE_MANY(name)C$PRAGMAASSUME(expression[,probability])C$PRAGMABEGINASSUME[expression[,probability)语句块C$PRAGMAENDASSUME第2章使用Fortran952-13例如,如果程序员知道DO循环的长度始终大于10,000,则给编译器提供该提示可使之生成更好的代码.
通常,以下循环在使用ASSUMEpragma时比不使用时运行得要快.
有两个内部函数专用于ASSUME指令的表达式子句.
(注意,它们的名称前面有两个下划线.
)在将来的版本中,特殊内部函数的列表可能会扩展.
与-xassume_control编译器选项结合使用.
(请参阅第53页"-xassume_control[=keywords]")例如,在使用-xassume_control=check进行编译时,如果出现行程数小于10,000的情况,则上述示例将生成一条警告.
如果使用-xassume_control=retrospective进行编译,那么在程序终止时,将会生成一个摘要报告,指出所有断言是真还是假.
有关-xassume_control的详细信息,请参阅"f95手册页".
另一个示例:如果使用-xassume_control=check编译上述示例,则在由于行程数为零或负数而没有执行循环时,将会发出一条运行时警告.
2.
3.
2并行化指令并行化指令显式地请求编译器尝试并行处理该指令后面的DO循环或代码区域.
其语法与一般指令不同.
只有在使用-openmp、-parallel或-explicitpar编译选项时,才能识别并行化指令.
有关Fortran并行化的详细信息,请参阅《OpenMPAPI用户指南》和《Fortran编程指南》.
C$PRAGMABEGINASSUME(__tripcount().
GE.
10000,1)!
!
abigloopdoi=j,na(i)=a(j)+1enddoC$PRAGMAENDASSUME__branchexp()用于紧挨在包含布尔控制表达式的分支转移语句前面的点断言.
它产生与控制分支转移语句的布尔表达式相同的结果.
__tripcount()得出紧跟在指令后面的或指令所包含的循环的行程数.
在用于点断言时,指令后面的语句必须位于DO的第一行.
在用于范围断言时,它应用于最外层的闭合循环.
C$PRAGMAASSUME(__tripcount.
GT.
0,1)doi=n0,nx2-14Fortran用户指南2005年1月Fortran编译器支持OpenMP共享内存并行化模型以及传统的Sun和Cray指令.
目前,编译器的并行化功能在x86平台上不可用.
2.
3.
2.
1OpenMP并行化指令Fortran95编译器将OpenMPFortran共享内存多处理API识别为首选的并行编程模型.
该API是由OpenMP体系结构审查委员会(http://www.
openmp.
org)指定的.
要启用OpenMP指令,您必须使用命令行选项-openmp进行编译.
(请参阅第36页"-openmp[={parallel|noopt|none}]".
)有关f95接受的OpenMP指令的详细信息,请参阅《OpenMPAPI用户指南》.
2.
3.
2.
2传统的Sun/Cray并行化指令Sun风格的并行化指令是-parallel和-explicitpar的缺省设置.
Sun指令具有指令标记$PAR.
Cray风格的并行化指令具有标记MIC$(这些指令是用-mp=cray编译器选项启用的).
在Sun和Cray风格中,类似指令的解释是不同的.
详细信息,请参阅《Fortran编程指南》中有关并行化方面的章节.
有关将传统的Sun/Cray并行化指令转换为OpenMP指令的指导原则,另请参阅《OpenMPAPI用户指南》.
Sun/Cray并行化指令使用以下语法:第一个字符必须在第一列中.
第一个字符可以是以下任一字符:c、C、*或!
.
后4个字符可以是大写或小写的$PAR(Sun风格)或MIC$(Cray风格),字符之间没有空格.
然后是指令关键字和限定符,它们之间用空格分隔.
显式的并行化指令关键字有:TASKCOMMON、DOALL、DOSERIAL和DOSERIAL*每个并行化指令都具有自己的一组可选限定符(放在关键字后面).
示例:使用共享变量指定一个循环:C$PARDOALLSHARED(yvalue)Sun风格CMIC$DOALLSHARED(yvalue)Cray风格第2章使用Fortran952-152.
4库接口和system.
incFortran95编译器提供一个包含文件system.
inc,它为大多数非内在库例程定义了接口.
请声明此包含文件以确保所调用函数及其参数的类型得到正确的设置,尤其是在使用-xtypemap更改了缺省数据类型时.
例如,以下命令可能会产生一个算术异常,原因是没有显式地设定函数getpid()的类型:getpid()例程返回一个整数值,但如果没有为该函数声明显式的类型,则编译器认为它返回一个实数值.
此值被进一步转换为整数,很有可能会导致浮点错误.
要纠正这种错误,您应该显式地设定所调用的getuid()及类似函数的类型:您可以使用-Xlist(全局程序检查)选项诊断此类问题.
Fortran95包含文件"system.
inc"为这些例程提供显式的接口定义.
通过在调用Fortran库中的例程的程序单元中包含system.
inc,可以自动定义接口,并帮助编译器诊断类型不匹配的问题.
(详细信息,请参阅《Fortran库参考》.
)2.
5编译器用法提示后面几节向您建议了一些高效地使用Fortran95编译器的方法.
下一章中给出了完整的编译器选项参考.
integer(4)mypidmypid=getpid()print*,mypidinteger(4)mypid,getpidmypid=getpid()print*,mypidinclude'system.
inc'integer(4)mypidmypid=getpid()print*,mypid2-16Fortran用户指南2005年1月2.
5.
1确定硬件平台(SPARC)某些编译器标记允许用户使用一组特定的硬件平台选项来优化代码生成.
公用程序命令fpversion显示本机处理器的SPARC硬件平台规范:打印的值取决于调用fpversion时的系统负载.
详细信息,请参阅fpversion(1)和《数值计算指南》.
fpversion在x86平台上不可用.
2.
5.
2使用环境变量可通过设置FFLAGS或OPTIONS变量来指定选项.
可以在命令行中显式地使用FFLAGS或OPTIONS.
在使用make的隐式编译规则时,make程序会自动使用FFLAGS.
示例:设置FFLAGS:(CShell)示例:显式地使用FFLAGS:在使用make时,如果按上述方式设置了FFLAGS变量并且makefile的编译规则是隐式的(即没有显式的编译器命令行),则调用make将导致相当于以下内容的编译:f95-fast-Xlistfiles.
.
.
demo%fpversion基于SPARC的CPU可用.
内核显示CPU时钟速率是750.
0MHz.
内核显示内存时钟速率是150.
0MHz.
找到Sun-4浮点控制器版本0.
UltraSPARC芯片可用.
使用"-xtarget=ultra3"代码生成选项.
Hostid=hardware_host_id.
demo%setenvFFLAGS'-fast-Xlist'demo%f95$FFLAGSany.
f第2章使用Fortran952-17make是一个功能很强的程序开发工具,可以方便地将其用于所有的Sun编译器.
请参阅"make(1)手册页"和《Fortran编程指南》中的"程序开发"一章.
注–make使用的缺省隐式规则可能无法识别具有.
f95和.
mod(Fortran95模块文件)扩展名的文件.
详细信息,请参阅《Fortran编程指南》和"Fortran95自述文件".
2.
5.
3内存大小编译可能需要使用大量内存.
这取决于选定的优化级别和待编译文件的大小和复杂性.
在SPARC平台上,如果优化器内存不足,它将尝试通过在较低的优化级别中重试当前的过程来进行恢复,并以命令行上-On选项中指定的原始级别继续后续的例程.
运行编译器的处理器应该至少具有64MB的内存;建议使用256MB的内存.
此外还应该分配足够的交换空间.
最低为200MB;建议为300MB.
内存使用取决于每个过程的大小、优化级别、为虚拟内存设置的限制、磁盘交换文件的大小以及各种其他参数.
在编译包含多个例程的单个源文件时,可能出现编译器内存或交换空间不足的情况.
如果编译器内存不足,请尝试降低优化级别,或者使用fsplit(1)将多例程的源文件分成多个文件,使每个文件包含一个例程.
2.
5.
3.
1交换空间限制命令swap-s显示可用的交换空间.
请参阅swap(1M).
示例:使用swap命令:确定实际的真实内存:demo%swap-stotal:40236kbytesallocated+7280kreserved=47516kused,1058708kavailabledemo%/usr/sbin/dmesg|grepmemmem=655360K(0x28000000)availmem=6024765442-18Fortran用户指南2005年1月2.
5.
3.
2增加交换空间使用mkfile(1M)和swap(1M)来增加工作站上交换空间的大小.
要执行此操作,您必须成为超级用户.
mkfile创建一个特定大小的文件,而swap-a将该文件添加到系统交换空间中:2.
5.
3.
3虚拟内存的控制以-O3或更高的优化级别编译很大的例程时,可能需要额外的内存,这可能会降低编译时的性能.
您可以通过限制单个进程的可用虚拟内存量来控制这种情况.
在shshell中,请使用ulimit命令.
请参阅sh(1).
示例:将虚拟内存限定在16MB以内:在cshshell中,请使用limit命令.
请参阅csh(1).
示例:将虚拟内存限定在16MB以内:这些命令行中的每一个都将导致优化器尝试在数据空间为16MB的情况下进行恢复.
此限制不能大于总的系统可用交换空间,并且实际上在进行较大的编译时,此限制必须很小以保证还能够正常地使用系统.
请确保没有任何编译占用一半以上的空间.
示例:在使用32MB的交换空间时,请使用以下命令:在shshell中:在cshshell中:最佳设置取决于所请求的优化等级和可用真实内存和虚拟内存的数量.
demo#mkfile-v90m/home/swapfile/home/swapfile94317840bytesdemo#/usr/sbin/swap-a/home/swapfiledemo$ulimit-d16000demo%limitdatasize16Mdemo$ulimit-d1600demo%limitdatasize16M第2章使用Fortran952-19在64位Solaris环境中,应用程序数据段大小的软限制为2GB.
如果应用程序需要分配更多的空间,请使用shell的limit或ulimit命令删除该限制.
对于csh,请使用:对于sh或ksh,请使用:详细信息,请参阅《Solaris64-bitDeveloper'sGuide》.
demo%limitdatasizeunlimiteddemo$ulimit-dunlimited2-20Fortran用户指南2005年1月3-1第3章Fortran编译器选项本章详细说明f95编译器的命令行选项.
从第3-1页第3.
1节的"命令语法"开始是对用于编译器选项标志的语法的描述.
从第3-3页第3.
3节的"选项摘要"开始是按功能排列的选项的摘要.
从第3-10页第3.
4节的"选项参考"开始是详细说明每个编译器选项标志的完整参考.
3.
1命令语法编译器命令行的通用语法如下:方括号内的项指示可选参数.
方括号不是命令的一部分.
options是前面带有短划线(–)的选项关键字列表.
一些关键字选项将列表中的下一项作为参数.
list_of_files是由空格隔开的源文件名、目标文件名或库文件名的列表.
此外,有一些选项(例如,-B、-l和-L)必须出现在源文件列表之后,而且这些选项可能包括其他文件列表.
f95[options]list_of_filesadditional_options3-2Fortran用户指南2005年1月3.
2选项语法典型的编译器选项格式如下:在说明各个选项时使用以下印刷约定:括号、管道符和省略号是在选项描述中使用的元字符,它们不是选项本身的一部分.
选项的一些常规准则如下:-lx是用于与库libx.
a链接的选项.
将-lx放在文件名列表之后以确保搜索顺序库,始终是较为安全之举.
通常,编译器选项是从左向右处理的,允许选择性地覆盖宏选项(包括其他选项的选项).
此规则不适用于链接程序选项.
但是,当某些选项(例如-I、-L和-R)在同一命令行上重复出现时,这些选项将累加值,而不是覆盖前面的值.
在可选选项列表(例如-xhasc[={yes|no}])中,所列的第一个选项是如果显示在命令行的选项标志不带值时假定的值.
例如,-xhasc等价于-xhasc=yes.
表3-1选项语法语法格式示例-flag-g-flagvalue-Dnostep-flag=value-xunroll=4-flagvalue-ooutfile表3-2选项的印刷表示法表示法含义示例:文本/实例[]方括号包含的参数是可选的.
-O[n]-O4,-O{}花括号(大括号)包含必需选项的一组选择.
-d{y|n}-dy|"|"(或"-")符号用来隔开参数,您只能选择其中的一个参数.
-B{dynamic|static}-Bstatic:与逗号一样,冒号有时可用于分隔参数.
-Rdir[:dir]-R/local/libs:/U/a…省略号表示一系列省略.
-xinline=f1[,…fn]-xinline=alpha,dos第3章Fortran编译器选项3-3源文件、对象文件和库按它们在命令行上出现的顺序编译并链接.
3.
3选项摘要在本节中,按功能对编译器选项进行分组,以便于参考.
有关详细信息,请参阅以下几节中指明的页.
请注意,并非所有选项在SPARC和x86平台上都可用.
有关可用性的说明,请查看详细的参考部分.
下表按功能汇总了f95编译器选项.
该表不包括已废弃的和传统的选项标志.
某些标志用于多个目的,因此出现多次.
表3-3按功能分组的编译器选项功能选项标志编译模式:仅编译;不生成可执行文件-c显示由驱动程序生成的命令,但不进行编译-dryrun支持Fortran77扩展和兼容性-f77为编写已编译的.
mod模块文件指定路径-moddir=path指定要编写的目标文件、库文件或可执行文件的名称-ofilename进行编译并只生成汇编代码-S将符号表与可执行文件分离-s禁止编译器消息(错误消息除外)-silent定义临时文件所在目录的路径-temp=path显示每个编译阶段占用的时间-time显示编译器的版本号及其阶段-V冗余消息-v指定非标准别名情况-xalias=list使用多个处理器进行编译-xjobs=n已编译代码:对于外部名称,增加/删除尾随下划线-ext_names=x内联指定的用户函数-inline=list与编译位置无关的代码-KPIC/-kpic3-4Fortran用户指南2005年1月内联某些数学库例程-libmilSTOP将整数状态值返回给shell-stop_status[=yn]指定代码地址空间-xcode=x启用UltraSPARC预取指令-xprefetch[=x]指定可选寄存器的使用-xregs=x指定缺省数据映射-xtypemap=x数据对齐:指定对齐COMMON块中的数据-aligncommon[=n]强制对齐COMMON块数据以允许双字获取/存储-dalign强制所有数据按8字节边界对齐-dbl_align_all按8字节边界对齐COMMON块数据-f指定内存对齐和行为-xmemalign[=ab]调试:启用运行时下标范围检查-C为使用dbx调试而进行编译-g为使用源浏览器浏览而进行编译-sb、-sbfast标志未声明变量的使用-u检查C$PRAGMAASSUME断言-xassume_control=check检查在运行时栈是否溢出-xcheck=stkovf启用运行时任务普通检查-xcommonchk为性能分析器进行编译-xF生成交叉引用列表-Xlistx在没有目标文件的情况下启用调试-xs诊断:标志非标准扩展名的使用-ansi禁止特定错误消息-erroff=list与错误消息一起显示错误标记名称-errtags显示编译器选项的摘要-flags、-help显示编译器的版本号及其阶段-V冗余消息-v表3-3按功能分组的编译器选项(续)功能选项标志第3章Fortran编译器选项3-5冗余的并行化消息-vpara显示/禁止警告消息-wn显示编译器自述文件-xhelp=readme许可:显示许可证服务器信息-xlicinfo链接和库:允许/要求动态/静态库-Bx只允许动态/静态库链接-dy、-dn生成动态(共享对象)库-G为动态库指定名称-hname将目录增加到库搜索路径-Lpath与库libname.
a或libname.
so链接-lname将运行时库搜索路径生成到可执行文件中-Rpath禁用递增链接程序ild-xildoff与优化的数学库链接-xlibmopt与Sun性能库链接-xlic_lib=sunperf链接编辑器选项-zx在不重定位的情况下生成纯库-ztext数字和浮点:使用非标准浮点首选项-fnonstd选择SPARC非标准浮点-fns启用输入过程中的运行时浮点溢出-fpover选择IEEE浮点舍入模式-fpround=r选择浮点优化级别-fsimple=n选择浮点捕获模式-ftrap=t指定用于格式化输入/输出的舍入方法-iorounding=mode将单精度常数提升为双精度常量-r8const启用区间运算并设置相应的浮点环境(包括-xinterval)-xia[=e]启用区间运算扩展-xinterval[=e]表3-3按功能分组的编译器选项(续)功能选项标志3-6Fortran用户指南2005年1月优化与性能:分析循环以了解数据相关性-depend使用所选的选项进行优化-fast指定优化级别-On填充数据布局以便高效使用高速缓存-pad[=p]在内存栈上分配局部变量-stackvar启用循环解开-unroll[=m]启用跨源文件的优化-xcrossfile[=n]调用过程间优化传递-xipo[=n]为#pragmaOPT设置最高优化级别-xmaxopt[=n]启用/调整编译器生成的预取指令-xprefetch=list控制预取指令的自动生成-xprefetch_level=n启用性能文件配置数据的生成或使用-xprofile=p断言不会出现基于内存的陷阱-xsafe=mem不执行增加代码大小的优化-xspace自动生成对向量库函数的调用-xvector[=yn]并行化:启用DO循环的自动并行化-autopar启用由指令显式标记的循环的并行化-explicitpar显示循环的并行化信息-loopinfo指定Cray风格的并行化指令-mp=CRAY为手动编码的多线程编程进行编译-mt接受OpenMPAPI指令并设置相应的环境-openmp[=keyword]使用-autopar-explicitpar-depend组合对循环进行并行化-parallel识别具有自动并行化的循环中的约简操作-reduction冗余的并行化消息-vpara源代码:定义预处理程序符号-Dname[=val]未定义预处理程序符号-Uname接受扩展(132个字符)源行-e表3-3按功能分组的编译器选项(续)功能选项标志第3章Fortran编译器选项3-73.
3.
1常用选项编译器具有许多可以供可选命令行参数选择的功能.
下面的简要列表列出了一些常用选项,供您一睹为快.
将预处理程序应用于.
F和/或.
F90及.
F95文件,但不进行编译-F接受Fortran95固定格式输入-fixed使用fpp预处理程序预处理所有源文件-fpp接受Fortran95自由格式输入-free将目录添加到包含文件搜索路径-Ipath将目录添加到模块搜索路径-Mpath区分大小写-U在实际参数中将霍尔瑞斯常数视为字符-xhasc={yes|no}选择要使用的预处理程序(cpp或fpp)-xpp[={fpp|cpp}]允许递归子程序调用-xrecursive目标平台:为优化器指定目标平台指令集-xarch=a为优化器指定目标高速缓存属性-xcache=a为优化器指定目标处理器-xchip=a为优化器指定目标平台-xtarget=a表3-4常用选项操作选项调试——为确保参数、公共块等的一致性在例程之间进行的全局程序检查.
-Xlist调试——生成用于启用dbx和调试的其他符号表信息.
-g性能——调用优化器以生成运行速度更快的程序.
-O[n]性能——使用一组预先确定的选项,为本机平台产生高效的编译时和运行时.
-fast动态(-Bdynamic)或静态(-Bstatic)库绑定.
-Bx表3-3按功能分组的编译器选项(续)功能选项标志3-8Fortran用户指南2005年1月3.
3.
2宏标志某些选项标志是扩展为由其他标志组成的特定集合的宏.
提供这些选项标志的目的是,便于指定通常一起使用以选择某项功能的多个选项.
命令行上跟在宏标志后面的设置将覆盖宏扩展.
例如,要使用-fast,但优化级别是-O3,则在命令行上-O3必须跟在-fast后面.
仅编译——禁止链接,为每个源文件生成一个.
o文件.
-c输出文件——将可执行输出文件命名为nm,而不是a.
out.
-onm源代码——编译固定格式的Fortran源代码.
-fixed表3-5宏选项标志选项标志扩展-dalign-xmemalign=8s-aligncommon=16-f-aligncommon=16-fast-xO5-libmil-fsimple=2-dalign-xlibmopt-depend-fns-ftrap=common-pad=local-xvector=yes-xprefetch=yes(SPARC)-xprefetch_level=2(SPARC)-nofstore(x86)-fnonstd-fns-ftrap=common-parallel-autopar-explicitpar-depend-xia=widestneed-xinterval=widestneed-ftrap=%none-fns=no-fsimple=0-xia=strict-xinterval=strict-ftrap=%none-fns=no-fsimple=0-xtarget-xarch=a-xcache=b-xchip=c表3-4常用选项(续)操作选项第3章Fortran编译器选项3-93.
3.
3向后兼容性和传统选项提供以下选项的目的是与早期编译器发行版本和某些Fortran传统功能向后兼容.
建议在生成可移植的Fortran95程序时不要使用这些选项标志.
3.
3.
4已废弃的选项标志下面的选项被认为是已废弃的,不应使用它们.
在编译器的以后发行版本中可能会删除这些选项.
表3-6向后兼容性选项操作选项允许为常量参数赋值.
-copyargs在调用参数列表中将霍尔瑞斯常数视为字符或无类型.
-xhasc[={yes|no}]支持Fortran77扩展和惯例-f77非标准运算——允许非标准运算.
-fnonstd为主机系统优化性能.
-nativeDO循环——使用单行程DO循环.
-onetrip允许存在传统的别名情况-xalias=keywords表3-7已废弃的f95选项选项标志等效于-a-xprofile=tcov-cg89-xtarget=ss2-cg92-xtarget=ss1000-native-xtarget=native-noqueue许可证排队.
不再需要.
-p文件配置.
使用-pg或性能分析器-pic-xcode=pic13-PIC-xcode=pic32-sb不再需要.
-sbfast不再需要.
-silent不再需要.
3-10Fortran用户指南2005年1月3.
4选项参考本节说明了所有的f95编译器命令行选项标志,包括各种风险、限制、警告、交互作用、示例和其他详细信息.
除非特别指定,否则每个选项在SPARC和x86平台上都有效.
仅在SPARC平台上有效的选项标志标有(SPARC).
仅在x86平台上有效的选项标志标有(x86).
标有(Obsolete)的选项标志已废弃,不能再使用.
在许多情况下,它们已经被应该使用的选项或标志取代.
-a(已废弃)使用tcov按基本块进行文件配置,这是旧式用法.
这是tcov的基本块文件配置的旧式用法.
有关文件配置的新式用法,请参阅-xprofile=tcov;有关更多详细信息,请参阅tcov(1)手册页.
另请参阅手册《程序性能分析工具》.
-aligncommon[={1|2|4|8|16}]指定通用块和标准数值序列类型中的数据对齐量.
此值表示通用块和标准数值序列类型中数据元素的最大数据对齐量(以字节为单位).
注–标准数值序列类型是包含SEQUENCE语句以及唯一的缺省组件数据类型(INTEGER、REAL、DOUBLEPRECISION、COMPLEX,不带KIND=或*size)的派生类型.
任何其他类型(例如REAL*8)将使类型成为非标准类型.
例如,-aligncommon=4将按4字节边界对齐自然对齐等于或大于4字节的数据元素.
此选项不影响自然对齐小于指定大小的数据.
如果不使用-aligncommon,则编译器按(最大)4字节边界对齐通用块和数值序列类型中的元素.
在没有缺省值为1的情况下指定-aligncommonó所有按字节边界对齐的通用块和数值序列类型元素(元素之间无填充).
在未启用64位的平台(除v9、v9a或v9b之外的平台)上,-aligncommon=16回复为-aligncommon=8.
第3章Fortran编译器选项3-11-ansi标识许多非标准扩展.
如果在源代码中使用非标准Fortran95扩展,则发出警告消息.
-arg=local通过ENTRY语句保留实际参数.
在使用此选项编译具有替换入口点的子程序时,f95使用复制/恢复保留伪参数和实际参数之间的关联.
提供此选项的目的是与传统的Fortran77程序兼容.
依赖此选项的代码是非标准的.
-autopar启用自动循环并行化.
查找和并行化相应的循环,以便在多个处理器上并行运行.
分析循环以了解迭代间的数据相关性并重构循环.
如果未将优化级别指定为-O3或更高,则将它自动提升到-O3.
在使用任何并行化选项(包括-autopar)时,也要指定-stackvar选项.
如果程序已经包含对libthread线程库的显式调用,请避免使用-autopar.
请参阅第3-32页"-mt"中的注意事项.
-autopar选项不适合于单处理器系统,而且已编译的代码通常会运行更慢.
要在多线程环境中运行已并行化的程序,必须在执行之前设置PARALLEL(或OMP_NUM_THREADS)环境变量.
这通知运行时系统程序可以创建的最大线程数.
缺省值为1.
一般会将PARALLEL或OMP_NUM_THREADS变量设置为目标平台上可用的处理器数.
如果使用-autopar并在同一步骤中进行编译和链接,则将自动链接多线程库和线程安全的Fortran运行时库.
如果使用-autopar并在单独步骤中进行编译和链接,则还必须使用-autopar进行链接以确保链接了相应的库.
-reduction选项与-autopar一起使用也可能是很有用的.
其他并行化选项是-parallel和-explicitpar.
有关并行化的详细信息,请参阅《Fortran编程指南》.
-B{static|dynamic}首选动态库链接或要求静态库链接.
在-B与dynamic或static之间不允许有空格.
如果未指定-B,则缺省值为-Bdynamic.
-Bdynamic:首选动态链接(试图找到共享库).
3-12Fortran用户指南2005年1月-Bstatic:要求静态链接(无共享库).
另请注意:如果指定static,但是链接程序仅找到动态库,则不链接库,并发出警告"未找到库".
如果指定dynamic,但链接程序仅找到静态版本,则链接该库,并且不发出警告.
您可以在命令行上切换-Bstatic和-Bdynamic.
也就是说,通过在命令行上指定-Bstatic和-Bdynamic任意多次,可以静态链接一些库和动态链接一些库,如下所示:这些是加载器和链接程序选项.
使用编译命令上的-Bx在单独步骤中编译和链接时,需亦在链接步骤中使用它.
您不能在命令行上同时指定-Bdynamic和-dn,因为-dn禁用动态库的链接.
在64位Solaris环境中,许多系统库仅作为共享动态库提供.
其中包括libm.
so和libc.
so(而不提供libm.
a和libc.
a).
这意味着,在64位Solaris环境中,-Bstatic和-dn可能导致链接错误.
这些情况下应用程序必须与动态库链接.
有关静态库和动态库的详细信息,请参阅《Fortran编程指南》.
-C检查数组引用以查找超出范围的下标并在运行时检查一致性.
引用的下标超过数组声明大小可能导致意外结果(包括段故障).
-C选项检查源代码中和执行过程中可能的数组下标违规.
-C还在运行时检查数组语法表达式中的数组一致性.
指定-D可能使可执行文件更大.
如果使用-C选项,则将数组下标违规视为错误.
如果在编译过程中检测到源代码中存在数组下标违规,则将它视为编译错误.
如果只能在运行时确定数组下标违规,则编译器将范围检查代码生成到可执行程序中.
这可能导致执行时间增加.
因此,应该在开发和调试程序时启用完全数组下标检查,然后重新编译成品可执行程序,而无须进行下标检查.
-c仅编译;产生对象.
o文件,但禁止链接.
为每个源文件编译.
o文件.
如果仅编译单个源文件,则可以使用-o选项指定写入的.
o文件的名称.
f95prog.
f-Bdynamic-lwells-Bstatic-lsurface第3章Fortran编译器选项3-13-cg89(已废弃,SPARC)为通用SPARC体系结构进行编译.
此选项是以下选项的宏:-xarch=v7-xchip=old-xcache=64/32/1,它等效于-xtarget=ss2.
-cg92(已废弃,SPARC)为SPARCV8体系结构进行编译.
此选项是以下选项的宏:-xarch=v8-xchip=super-xcache=16/32/4:1024/32/1,它等价于-xtarget=ss1000.
-copyargs允许为常量参数赋值.
允许子程序更改其为常量的伪参数.
提供此选项只是为了允许编译和执行传统的代码而不发出运行时错误.
在不使用-copyargs的情况下,如果将常量参数传递给子例程,然后在子例程内尝试更改该常量,则运行将终止.
在使用-copyargs的情况下,如果将常量参数传递给子例程,然后在子例程内更改该常量,则运行不一定终止.
当然,除非使用-copyargs进行编译,否则终止的代码是不符合Fortran标准的.
此外,这样的代码通常是不可预知的.
-Dname[=def]为预处理程序定义符号name.
此选项仅适用于.
F、.
F90、.
F95和.
F03源文件.
–Dname=def将name定义为具有值def-Dname将name定义为1在命令行上,此选项将这样定义name:就好像#definename[=def]已经出现在源文件中.
如果未指定=def,则将名称name定义为值1.
将宏符号name传递给预处理程序fpp(或cpp-请参阅-xpp选项)以进行扩展.
预定义的宏符号具有两个前导下划线.
Fortran语法可能不支持这些宏的实际值——它们仅出现在fpp或cpp预处理程序指令中.
(请注意两个前导下划线.
)3-14Fortran用户指南2005年1月产品版本是在__SUNPRO_F90和__SUNPRO_F95中预定义的(用十六进制表示).
例如,对于SunStudio10发行版本,__SUNPRO_F95是0x810.
以下宏是在相应系统上预定义的:__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.
在SPARCV9系统上,还定义了__sparcv9宏.
在64位x86系统上,定义了宏__amd64和__x86_64.
使用冗余选项(-v)进行编译以查看编译器创建的定义.
您可以在类似如下的预处理程序条件中使用这些值:#ifdef__sparc缺省情况下,f95使用fpp(1)预处理程序.
与C预处理程序cpp(1)一样,fpp扩展源代码宏并启用代码的条件编译.
与cpp不同,fpp理解Fortran语法,并且作为首选的Fortran预处理程序.
使用-xpp=cpp标志可以将编译器强制为明确使用cpp,而不是使用fpp.
-dalign对齐COMMON块和标准数值序列类型,并生成速度更快的多字装入/存储.
此标志更改COMMON块中的数据布局、数值序列类型和EQUIVALENCE类,并使编译器能够为该数据生成速度更快的多字装入/存储.
数据布局效果与-f标志的效果相同:COMMON块和EQUIVALENCE类中的双精度和四精度数据在内存中是根据其"自然"对齐(按8字节边界;使用-xarch=v9或v9a为64位环境编译时,四精度数据按16字节边界对齐)布局的.
缺省情况下,按4字节边界对齐COMMON块中的数据.
还允许编译器假定自然对齐并生成速度更快的多字装入/存储以引用数据.
注–-dalign可能导致数据的非标准对齐,这样就可能导致EQUIVALENCE或COMMON中的变量出现问题,并可能在需要–dalign的情况下使程序变为不可移植.
-dalign是一个宏,它等效于:-xmemalign=8s-aligncommon=16(在SPARC平台上)-aligncommon=8(在32位x86平台上)-aligncommon=16(在64位x86平台上)第3章Fortran编译器选项3-15如果使用-dalign编译一个子程序,请使用-dalign编译该程序的所有子程序.
此选项包括在-fast选项中.
请注意,因为-dalign调用-aligncommon,所以此选项还影响标准数值序列类型.
请参阅第3-10页"-aligncommon[={1|2|4|8|16}]"-dbl_align_all[={yes|no}]强制按8字节边界对齐数据值可以是yes或no.
如果是yes,将按8字节边界对齐所有变量.
缺省值是-dbl_align_all=no.
使用-xarch=v9或v9a为64位环境进行编译时,此标志将按16字节边界对齐四精度数据.
此标志不改变COMMON块或用户定义结构中的数据的布局.
与-dalign一起使用可以提高多字装入/存储的效率.
如果使用了此标志,则所有例程都必须使用此标志进行编译.
-depend[={yes|no}]分析循环以了解数据相关性并重构循环.
使用-depend或-depend=yes可启用相关性分析.
使用-depend=no(编译器的缺省值)可禁用相关性分析.
如果未指定优化级别,或者指定的级别低于O3,则此选项将优化级别提升到O3.
-depend还包括在-fast、-autopar和-parallel中.
另请注意,将优化级别指定为-O3或更高将自动增加-depend.
(请参阅《Fortran编程指南》.
)-dn禁止动态库.
请参阅第3-15页"-d{y|n}".
-dryrun显示由f95命令行驱动程序生成的命令,但不进行编译.
此选项在调试时是很有用的,它显示编译器为执行编译将调用的命令和子选项.
-d{y|n}允许或禁止对整个可执行文件使用动态库.
-dy:允许使用动态/共享库.
-dn:不允许使用动态/共享库.
3-16Fortran用户指南2005年1月如果未指定,则缺省值是-dy.
与-Bx不同,此选项适用于整个可执行文件,并且只需在命令行上出现一次.
-dy|-dn是加载器和链接程序选项.
如果使用这些选项在单独步骤中编译和链接,则在链接步骤中需要同一选项.
在64位Solaris环境中,许多系统库不仅仅作为共享动态库.
其中包括libm.
so和libc.
so(而不提供libm.
a和libc.
a).
这意味着,-dn和-Bstatic可能导致在64位Solaris环境、32位x86Solaris平台以及所有32位Solaris平台(从Solaris10发行版本开始)上出现链接错误.
这些情况下应用程序必须与动态库链接.
-e接受扩展长度的输入源代码行.
扩展的源代码行的长度最大可以是132个字符.
编译器在右侧用结尾空白一直填充到第132列.
如果在使用-e进行编译时使用续行,则不跨行拆分字符常量;否则,可能会在常量中插入不必要的空白.
-erroff[={%all|%none|taglist}]禁止由标记名称列出的警告消息.
禁止显示在标记名称的逗号分隔列表taglist中指定的警告消息.
如果%all,则禁止所有警告,它等价于-w选项.
如果%none,则不禁止警告.
示例:f95-erroff=WDECL_LOCAL_NOTUSEDink.
f使用-errtags选项可以查看与警告消息关联的标记名称.
-errtags[={yes|no}]与每个警告消息一起显示消息标记.
如果使用-errtags=yes,编译器的内部错误标记名称将与警告消息一起显示.
缺省情况下不显示标记(-errtags=no).
单独使用-errtags时表示-errtags=yes.
demo%f95-errtagsink.
fink.
f:MAIN:"ink.
f",line11:Warning:localvariable"i"neverused(WDECL_LOCAL_NOTUSED)1建议优化器尝试解开循环n次.
通常,循环解开可提高性能,但将增加可执行文件的大小.
有关此编译器和其他编译器优化的详细信息,请参阅《Fortran编程指南》中的"性能与优化"一章.
另请参阅第2-10页第2.
3.
1.
3节的"UNROLL指令".
-use=list指定隐式USE模块.
list是一个模块名称或模块文件名称的逗号分隔列表.
使用-use=module_name进行编译可将USEmodule_name语句增加到正编译的每个子程序或模块.
使用-use=module_file_name进行编译可为包含在指定文件中的每个模块增加USEmodule_name.
有关Fortran95中模块的详细信息,请参阅第4-21页第4.
9节的"模块文件".
-V显示每个编译器传递的名称和版本.
此选项在编译器执行时打印每个传递的名称和版本.
在与Sun服务工程师讨论问题时,此信息可能很有用.
-v冗余模式——显示每个编译器传递的详细信息.
与-V一样,此选项在编译器执行时显示每个传递的名称,以及驱动程序使用的选项、宏标志扩展和环境变量的详细信息.
-vax=keywords指定启用VAXVMSFortran扩展的选择.
第3章Fortran编译器选项3-45keywords说明符必须是以下子选项之一或从中选择的子选项的逗号分隔列表.
通过在子选项前面加上no%,可以单独选择或关闭该子选项.
示例:-vax=debug,rsize,no%blank_zero-vpara显示冗余并行化消息.
在编译器分析用指令显式标记为并行化的循环时,它发出有关所检测到的某些数据相关性的警告消息;但是仍将对循环进行并行化.
示例:冗余并行化警告:-w[n]显示或禁止警告消息.
此选项显示或禁止大多数警告消息.
但是,如果一个选项覆盖命令行上前面选项的全部或部分,您确实会收到一个警告.
n可以是0、1、2、3或4.
blank_zero在内部文件上将格式化输入中的空格解释为零.
debug将以字符"D"开头的行解释为正规Fortran语句,而不是像VMSFortran中那样解释为注释.
rsize将无格式的记录大小解释为以字为单位,而不是解释为以字节为单位.
struct_align内存中VAX结构的布局组件,与VMSFortran中一样,没有填充.
注:这可能导致数据无法对齐.
%all启用所有这些VAXVMS功能.
%none禁用所有这些VAXVMS功能.
demo%f95-explicitpar-vparaany.
fany.
f:MAINany:"any.
f",line11:Warning:theloopmayhaveparallelizationinhibitingreference3-46Fortran用户指南2005年1月-w0仅显示错误消息.
它等价于-w.
-w1显示错误和警告.
在不使用-w的情况下,这是缺省值.
-w2显示错误、警告和注意.
-w3显示错误、警告、注意和说明.
-w4显示错误、警告、注意、说明和注释.
示例:衱仍然允许显示某些警告:-Xlist[x]生成列表并进行全局程序检查(GPC).
使用此选项可查找潜在的编程错误.
它调用额外的编译器传递,在全局程序中检查子程序调用参数、通用块和参数的一致性.
此选项还生成带行号的源代码列表,包括交叉引用表.
由Xlist选项发出的错误消息是建议性警告,不会阻止程序的编译和链接.
注–确保在使用-Xlist进行编译之前,更正了源代码中的所有语法错误.
在具有语法错误的源代码上运行时,可能产生不可预知的报告.
示例:检查例程之间的一致性:上述示例将以下内容写入输出文件fil.
lst:带行号的源代码列表(缺省)有关例程间不一致性的错误消息(嵌入在列表中)标识符的交叉引用表(缺省)缺省情况下,将列表写入文件name.
lst,其中name取自命令行上列出的第一个源文件.
demo%f95-w-parallelany.
ff95:Warning:优化器级别已从0改为3以支持并行化代码demo%demo%f95-Xlistfil.
f第3章Fortran编译器选项3-47许多子选项为操作选择提供了进一步的灵活性.
它们是由-Xlist主选项的后缀指定的,如下表所示有关详细信息,请参阅《Fortran编程指南》的"程序分析和调试"一章.
-x386(x86)等效于-xtarget=386.
-x486(x86)等效于-xtarget=486.
-xa等效于-a.
表3-9-Xlist子选项选项特性-Xlist显示错误、列表和交叉引用表-Xlistc显示调用图和错误-XlistE显示错误-Xlisterr[nnn]禁止错误nnn消息-Xlistf显示错误、列表和交叉引用,但不显示目标文件-Xlisth如果检测到错误,则终止编译-XlistI分析#include和INCLUDE文件以及源文件-XlistL仅显示列表和错误-Xlistln将页面长度设置为n行-XlistMP检查OpenMP指令(SPARC)-Xlistoname将报告文件输出到name,而不是file.
lst-Xlists禁止来自交叉引用表的未引用名称-Xlistvn将检查级别设置为n(1、2、3或4)——缺省值是2-Xlistw[nnn]将输出行的宽度设置为nnn列——缺省值是79-Xlistwar[nnn]禁止警告nnn消息-XlistX显示交叉引用表和错误3-48Fortran用户指南2005年1月-xalias[=keywords]指定要由编译器假定的别名程度.
一些非标准编程方法会产生干扰编译器优化策略的情况.
使用"建立过多索引"、指针以及将全局或非唯一变量作为子程序参数进行传递会产生歧义别名的情况,使生成的代码无法按预期结果运行.
使用-xalias标志可通知编译器程序偏离Fortran标准的别名要求的程度.
此标志可能带有关键字列表,也可能不带关键字列表.
keywords列表由逗号分隔,各个关键字指示程序中存在的别名情况.
可以在每个关键字前面加上no%,以指示不存在的别名类型.
别名关键字如下:表3-10-xalias选项关键字关键字含义dummy子程序的伪(形式)参数可以互为别名,也可以作为全局变量的别名.
no%dummy(缺省值).
伪参数的使用遵循Fortran标准,它们不能互为别名,也不作为全局变量的别名.
craypointer(缺省值).
Cray指针可以指向任何全局变量或LOC()函数采用其地址的局部变量.
此外,两个Cray指针可能指向同一数据.
这是可以禁止某些优化的安全假定.
no%craypointerCray指针仅指向唯一内存地址,如从malloc()获得的地址.
此外,没有两个Cray指针是指向同一数据的.
此假定允许编译器优化Cray指针引用.
actual编译器将子程序的实际参数视为全局变量.
将参数传递给子程序可能会导致通过Cray指针命名别名.
no%actual(缺省值)传递参数不会导致进一步命名别名.
索引越界对COMMON块中元素的引用可能引用COMMON块或等价组中的任何元素.
将COMMON块或等价组中的任何元素作为实际参数传递给子程序,被调用的子程序就可以访问该COMMON块或等价组中的任何元素.
将序列派生类型的变量视为COMMON块,此类变量的元素可能作为该变量其他元素的别名.
可能违反了单个数组边界,但除上文所述外,假定引用的数组元素仍然在数组内.
没有考虑数组语法、WHERE和FORALL语句以便建立过多索引.
如果索引越界出现在这些构造中,应将它们改写为DO循环.
第3章Fortran编译器选项3-49指定不带列表的-xalias将为不违反Fortran别名规则的大多数程序提供最佳的性能,不带列表的-xalias等价于:no%dummy,no%craypointer,no%actual,no%overindex,no%ftnpointer为提高效率,在使用优化级别-xO3和更高级别进行编译时,应该使用-xalias.
如果未指定-xalias标志,则缺省情况下编译器假定程序符合Fortran95标准(Cray指针除外):no%dummy,craypointer,no%actual,no%overindex,no%ftnpointer有关各种别名情况的示例以及如何使用-xalias指定它们,请参阅《Fortran编程指南》中的"移植"一章.
-xarch=isa指定指令集架构(ISA).
-xarch关键字isa接受的架构如表3-11所示:请注意,虽然-xarch可以单独使用,但它是-xtarget选项扩展的一部分,并且可以用于覆盖由特定-xtarget选项设置的-xarch值.
例如:%f95-xtarget=ultra2-xarch=v8plusb.
.
.
覆盖由-xtarget=ultra2设置的-xarch=v8通过只允许指定的指令集,此选项使编译器生成的代码只包含指定指令集架构的指令.
该选项不保证使用任何目标-特定的指令.
如果此选项与优化一起使用,则适当的选择可以在指定的架构上为可执行文件提供良好性能.
由不适当的选择而产生的二进制程序在预定目标平台上是不可执行的.
no%overindex(缺省值)没有违反数组边界.
数组引用不引用其他变量.
ftnpointer对外部函数的调用可能使Fortran指针指向任何类型、种类或等级的目标变量.
no%ftnpointer(缺省值)Fortran指针遵循标准中的规则.
表3-11-xarchISA关键字平台有效的-xarch关键字SPARCgeneric、generic64、native、native64、v7、v8a、v8、v8plus、v8plusa、v8plusb、v9、v9a、v9bx86generic、native、386、pentium_pro、sse、sse2、amd64表3-10-xalias选项关键字(续)关键字含义3-50Fortran用户指南2005年1月表3-12汇总了SPARC平台上最常用的-xarch选项:另请注意:SPARC指令集架构V7、V8和V8a全部是二进制兼容的.
由v8plus和v8plusa编译的对象二进制文件(.
o)可以同时链接和执行,但必须在与SPARCV8plusa兼容的平台上运行.
由v8plus、v8plusa和v8plusb编译的对象二进制文件(.
o)可以同时链接和执行,但必须在与SPARCV8plusb兼容的平台上运行.
-xarch值v9、v9a和v9b只能在UltraSPARC64位Solaris环境中使用.
使用v9和v9a编译的对象二进制文件(.
o)可以进行链接并可一起执行,但是将只能在SPARCV9a兼容平台上运行.
使用v9、v9a和v9b编译的对象二进制文件(.
o)可以进行链接并可一起执行,但是将只能在SPARCV9b兼容平台上运行.
对于任何特定选择,生成的可执行文件在早期架构中可能运行更缓慢.
此外,虽然在多数指令集架构中都可以使用四精度(REAL*16和longdouble)浮点指令,但编译器不在它生成的代码中使用这些指令.
在SPARC平台上,未指定-xarch时的缺省值为v8plus;而在x86平台上则为386.
表3-12SPARC平台上最常用的-xarch选项-xarch=性能generic在所有支持的平台上运行都可以获得足够的性能v8plusa在UltraSPARC-II处理器上以32位模式运行可以获得最佳性能v8plusb在UltraSPARC-III处理器上以32位模式运行可以获得最佳性能不能在其他平台上执行v9a在UltraSPARC-II处理器上以64位模式运行可以获得最佳性能不能在其他平台上执行v9b在UltraSPARC-III处理器上以64位模式运行可以获得最佳性能不能在其他平台上执行第3章Fortran编译器选项3-51表3-13提供有关SPARC平台上每个-xarch关键字的详细信息.
表3-13SPARC平台的-xarch值-xarch=含义(SPARC)generic为了在大多数32位系统上获得良好性能而进行编译.
这是缺省行为.
该选项在多数处理器上使用高性能的最佳指令集,同时不降低处理器的主要性能.
对于每个新的发行版本,"最佳"指令集的定义可能会有所调整(如果适当),当前解释为v8plus.
generic64为了在大多数启用64位的系统上获得良好性能而进行编译.
此选项使用最佳指令集以便在大多数启用64位的处理器上获得良好性能,而不使其中任一处理器上的性能有较大幅度的降低.
对于每个新的发行版本,"最佳"指令集的定义可能会有所调整(如果适当),当前解释为v9.
native为了在此系统上获得良好性能而进行编译.
这是-fast选项的缺省值.
编译器为运行它的当前系统处理器选择适当的设置.
native64为了在此系统上获得64位模式下的良好性能而进行编译.
与native一样,编译器在运行它的当前系统处理器上为64位模式选择适当的设置.
v7编译用于SPARC-V7ISA.
在V7ISA上使编译器生成高性能代码.
这等价于在V8ISA上使用高性能的最佳指令,但不包括整数mul和div指令和fsmuld指令.
示例:SPARCstation1,SPARCstation2v8a为SPARC-V8ISA的V8a版本进行编译按照定义,V8a是指不包含fsmuld指令的V8ISA.
该选项在V8aISA上使编译器生成高性能代码.
示例:基于microSPARCI芯片架构的任何系统v8为SPARC-V8ISA进行编译.
使编译器能够生成用于在V8架构上获得良好性能的代码.
示例:SPARCstation10v8plus编译用于SPARC-V9ISA的V8plus版本.
根据定义,V8plus意味着V9ISA,但只限于由V8plusISA规范所定义的32位子集,而不包括可视化指令集(VIS)和特定实现的ISA扩展.
该选项在V8plusISA上使编译器生成高性能代码.
产生的对象代码是SPARC-V8+ELF32格式且只在SolarisUltraSPARC环境下执行(不能在V7或V8处理器上运行).
示例:基于UltraSPARC芯片架构的任何系统3-52Fortran用户指南2005年1月v8plusa编译用于SPARC-V9ISA的V8plusa版本.
根据定义,V8plusa意味着V8plus架构加可视化指令集(VIS)版本1.
0和UltraSPARC扩展.
该选项使编译器在UltraSPARC架构上生成高性能代码,但只限于V8plus规范定义的32位子集.
产生的对象代码是SPARC-V8+ELF32格式且只在SolarisUltraSPARC环境下执行(不能在V7或V8处理器上运行).
示例:基于UltraSPARC芯片架构的任何系统v8plusb为SPARC-V8plusISA的V8plusb版本(带有UltraSPARC-III扩展)进行编译.
使编译器能够生成用于带有可视指令集(VIS)2.
0版和UltraSPARC-III扩展的UltraSPARC架构的对象代码.
生成的对象代码是SPARC-V8+ELF32格式的,只能在SolarisUltraSPARC-III环境中执行.
如果使用此选项进行编译,则将使用用于在UltraSPARC-III架构上获得良好性能的最佳指令集.
v9为SPARC-V9ISA进行编译.
使编译器能够生成用于在V9SPARC架构上获得良好性能的代码.
产生的.
o对象文件是ELF64格式且只能与相同格式的其他SPARC-V9对象文件链接.
产生的可执行文件只能在UltraSPARC处理器上运行,该处理器运行具有64位内核的64位Solaris操作环境.
在启用64位的Solaris环境下编译时,只有-xarch=v9可用.
v9a编译用于具有UltraSPARC扩展的SPARC-V9ISA.
将可视化指令集(VIS)和UltraSPARC处理器的特定扩展增加到SPARC-V9ISA,并使编译器在V9SPARC架构上生成高性能代码.
产生的.
o对象文件是ELF64格式且只能与相同格式的其他SPARC-V9对象文件链接.
产生的可执行文件只能在UltraSPARC处理器上运行,该处理器运行具有64位内核的64位Solaris操作环境.
在启用64位的Solaris环境下编译时,只有-xarch=v9a可用.
v9b为带有UltraSPARC-III扩展的SPARC-V9ISA进行编译将UltraSPARC-III扩展和VIS2.
0版增加到SPARC-V9ISA的V9a版本.
如果使用此选项进行编译,则将使用用于在SolarisUltraSPARC-III环境中获得良好性能的最佳指令集.
产生的对象代码是SPARC-V9ELF64格式且只能与相同格式的其他SPARC-V9对象文件链接.
只能在运行启用64位且具有64位内核的Solaris操作环境的UltraSPARC-III处理器上运行生成的可执行文件.
在启用64位的Solaris环境下编译时,只有-xarch=v9b可用.
表3-13SPARC平台的-xarch值(续)-xarch=含义(SPARC)第3章Fortran编译器选项3-53表3-14x86平台上的每个-xarch关键字的详细信息.
在x86平台上,如果未指定-xarch,则缺省值为generic.
x86平台注意事项:为了在兼容SSE/SSE2Pentium4的Solarisx86平台上运行而使用-xarch={sse|sse2}编译的程序只能在启用SSE/SSE2的平台上运行.
在不支持SSE/SSE2的平台上运行此类程序会导致发生段故障或错误的结果,并且不会显示任何显式警告消息.
以后可能会提供应用于操作系统和编译器的修补程序,用于禁止在不支持SSE/SSE2的平台上执行SSE/SSE2编译的二进制文件.
从Solaris9/04开始的操作系统发行版在兼容Pentium4的平台上支持SSE/SSE2.
更早版本的Solaris操作系统不支持SSE/SSE2.
此警告还适用于使用利用SSE/SSE2指令的.
il内联汇编语言函数或__asm()汇编程序代码.
如果单独进行编译和链接,请始终使用编译器和-xarch={sse|sse2}进行链接,以确保链接正确的启动例程.
x86上的运算结果可能与SPARC上的结果不同,这是由x8680位浮点寄存器造成的.
要最大限度地减少这些差异,请使用-fstore选项,或者使用-xarch=sse2进行编译(如果硬件支持SSE2的话).
-xassume_control[=keywords]设置参数以控制ASSUME编译指示.
表3-14x86平台的-xarch值-xarch=含义(x86)generic为了在大多数32位x86平台上获得良好性能而进行编译.
这是缺省值,等价于-xarch=386.
generic64为了在大多数64位x86平台上获得良好性能而进行编译.
当前将其解释为amd64.
native为了在此x86体系结构上获得良好性能而进行编译.
为了在大多数x86处理器上获得良好性能使用最佳指令集.
如果需要,在新的发行版本中会调整"最佳"指令集的定义.
native64为了在此64位x86体系结构上获得良好性能而进行编译.
386将指令集限制于Intel386/486体系结构.
pentium_pro将指令集限制于PentiumPro体系结构.
sse将SSE指令集添加到pentium_pro.
(参阅下面的注释.
)sse2将SSE2指令集添加到pentium_pro.
(参阅下面的注释.
)amd64为AMD6464位x86指令集进行编译.
3-54Fortran用户指南2005年1月使用此标志可控制编译器处理源代码中ASSUME编译指示的方式.
ASSUME编译指示为程序员提供了一种断言特殊信息(编译器使用这些特殊信息可实现较佳的优化)的方法.
可以使用可能值限定这些断言.
将可能值为0或1的断言标记为"确定",否则视为不确定.
也可以使用可能或确定性断言将要执行的DO循环的行程计数,或断言将要采取的分支.
有关f95编译器识别的ASSUME编译指示的描述,请参阅第2-12页第2.
3.
1.
9节的"ASSUME指令".
-xassume_control选项上的keywords可以是单个子选项关键字,也可以是逗号分隔的关键字列表.
识别的关键字子选项如下:编译器的缺省值是-xassume_control=optimize这意味着,编译器识别ASSUME编译指示,而且后者将影响优化,但是不进行检查.
如果指定不带参数的-xassume_control,则隐含-xassume_control=check,fatal在这种情况下,编译器接受并检查所有确定的ASSUME编译指示,但是后者不影响优化.
无效的断言将导致程序终止.
-xautopar等效于–autopar.
-xcache=c为优化器定义高速缓存属性.
optimize在ASSUME编译指示上作出的断言影响程序的优化.
check编译器生成用于检查标记为"确定"的所有断言是否正确的代码,并在断言被违反时发出运行时消息;如果没有同时指定fatal,则程序继续运行.
fatal与check一起使用时,如果标记为"确定"的断言被违反,则程序将终止.
retrospective[:d]d参数是可选的容差值,它必须是小于1的正实常量.
缺省值是".
1".
retrospective编译代码以确定所有断言的真假.
容差值d之外的那些值在程序终止时的输出结果中列出.
%none忽略所有ASSUME编译指示.
第3章Fortran编译器选项3-55c必须是以下值之一:genericnatives1/l1/a1s1/l1/a1:s2/l2/a2s1/l1/a1:s2/l2/a2:s3/l3/a3si/li/ai的定义如下:si是i级数据高速缓存的大小(千字节)li是i级数据高速缓存的行大小(字节)ai是i级数据高速缓存的关联性该选项指定了优化器可以使用的缓存属性,不保证使用每个特定的缓存属性.
虽然此选项可以单独使用,但它是–xtarget选项扩展的一部分;提供它是为了允许覆盖特定的–xtarget选项所隐含的–xcache值.
示例:-xcache=16/32/4:1024/32/1指定了:一个1级高速缓存具有以下属性:16K字节、32字节行大小、4向结合性.
一个2级高速缓存具有以下属性:1024K字节、32字节行大小、直接映射结合性.
-xcg89(SPARC)等效于-cg89.
-xcg92(SPARC)等效于-cg92.
表3-15–xcache值值含义generic定义高速缓存属性,以便在大多数处理器上获得良好性能,而且不使性能有较大幅度的降低.
这是缺省设置.
native定义高速缓存属性,以便在此主机平台上获得良好性能.
s1/l1/a1定义1级高速缓存属性.
s1/l1/a1:s2/l2/a2定义1级和2级高速缓存属性.
s1/l1/a1:s2/l2/a2:s3/l3/a3定义1级、2级和3级高速缓存属性3-56Fortran用户指南2005年1月-xcheck=keyword生成特殊的运行时检查和初始化.
keyword必须是以下项之一:栈溢出(尤其是在栈上分配大数组的多线程应用程序中)可以在邻近线程栈中导致无提示的数据损坏.
如果怀疑存在栈溢出,请使用-xcheck=stkovf编译所有例程.
但是请注意,使用此标志进行编译不保证将检测到所有栈溢出情况,因为它们可能出现在不是使用此标志编译的例程中.
-xchip=c为优化器指定目标处理器.
此选项通过指定目标处理器来指定计时属性.
虽然此选项可以单独使用,但它是-xtarget选项扩展的一部分;提供它是为了允许覆盖特定的-xtarget选项所隐含的-xchip值.
-xchip=c的一些作用是:指令调度编译分支的方式在语义等价的两个选择项之间作出选择关键字特性stkovf打开用于检测子程序入口上是否有栈溢出的运行时检查.
如果检测到栈溢出,则将引发SIGSEGV段故障.
(仅适用于SPARC)no%stkovf禁用用于检测栈溢出的运行时检查.
(仅适用于SPARC)init_local执行局部变量的特殊初始化.
编译器将局部变量初始化为这样一个值:如果在赋予该值之前程序使用了它,则可能导致运算异常.
由ALLOCATE语句分配的内存也会以这种方式初始化.
不对模块变量、SAVE变量和COMMON块中的变量进行初始化.
no%init_local禁用局部变量初始化.
这是缺省设置.
%all打开所有这些运行时检查功能.
%none禁用所有这些运行时检查功能.
第3章Fortran编译器选项3-57下面的两个表列出有效的-xchip处理器名称值:下面是较旧且较不常用的-xchip处理器名称,在此处列出仅供参考:在x86平台上:-xchip值为386、486、pentium、pentium_pro、pentium3、pentium4、opteron、generic和native.
表3-16常用-xchipSPARC处理器的名称-xchip=为以下项目进行优化generic大多数SPARC处理器.
(这是缺省情况.
)native此主机平台.
ultraUltraSPARC处理器.
ultra2UltraSPARCII处理器.
ultra2eUltraSPARCIIe处理器.
ultra2iUltraSPARCIIi处理器.
ultra3UltraSPARCIII处理器.
ultra3cuUltraSPARCIIIcu处理器.
ultra4UltraSPARCIV处理器表3-17不常用的-xchipSPARC处理器的名称-xchip=为以下项目进行优化oldpre–SuperSPARC处理器.
superSuperSPARC处理器.
super2SuperSPARCII处理器.
microMicroSPARC处理器.
micro2MicroSPARCII处理器.
hyperHyperSPARC处理器.
hyper2HyperSPARCII处理器.
powerupWeitekPowerUp处理器.
3-58Fortran用户指南2005年1月-xcode=keyword(SPARC)指定SPARC平台上的代码地址空间.
keyword的值有:缺省值(如果不显式指定-xcode=keyword)是:-xcode=abs32在SPARCV8和V7平台上.
-xcode=abs44在UltraSPARCV9(-xarch=v9平台上)与位置无关的代码:在创建动态共享库以提高运行时性能时,可使用-xcode=pic13或-xcode=pic32.
尽管动态可执行文件内的代码通常绑定到内存中的固定地址,但是可以将与位置无关的代码装入进程地址空间中的任意位置.
在使用与位置无关的代码时,将生成可重定位引用,作为通过全局偏移表的间接引用.
在使用-xcode=pic13或-xcode=pic32进行编译时,由于不要求大量的重定位(这些重定位是与位置有关的代码所强制的),从而使共享对象中的频繁访问项获益.
全局偏移表的大小不应超过8Kb.
-xcode={pic13|pic32}有两个名义性能成本:使用-xcode=pic13或-xcode=pic32编译的例程在入口处执行几个额外指令,以便将寄存器设置为指向用于访问共享库的全局变量或静态变量的全局偏移表.
每次对全局变量或静态变量的访问都会涉及通过全局偏移表的额外间接内存引用.
如果编译是使用pic32进行的,则每个全局和静态内存引用都有两个额外指令.
关键字特性abs32生成32位绝对地址.
代码+数据+bss的大小不应超过2**32字节.
下面是32位平台上的缺省值:-xarch=generic,v7,v8,v8a,v8plus,v8plusaabs44生成44位绝对地址.
代码+数据+bss的大小不应超过2**44字节.
仅在64位平台上可用:-xarch=v9,v9aabs64生成64位绝对地址.
仅在64位平台上可用:-xarch=v9,v9apic13生成与位置无关的代码(小模型).
等价于-pic.
在32位平台上允许至多引用2**11个唯一外部符号;在64位平台上为2**10个.
pic32生成与位置无关的代码(大模型).
等价于-PIC.
在32位平台上允许至多引用2**30个唯一外部符号;在64位平台上为2**29个.
第3章Fortran编译器选项3-59在考虑上述成本时,请记住:由于受到库代码共享的影响,使用-xcode=pic13或-xcode=pic32可以大大减少系统内存需求.
共享库中已使用-xcode=pic13或-xcode=pic32编译的每个代码页都可以由使用该库的每个进程共享.
如果共享库中的代码页包含非pic(即绝对)内存引用,即使仅包含单个非pic内存引用,该页也将变为不可共享,而且每次执行使用该库的程序时都必须创建该页的副本.
确定是否已经使用-xcode=pic13或-xcode=pic32编译.
o文件的最简单方法是使用nm命令:nmfile.
o|grep_GLOBAL_OFFSET_TABLE_包含与位置无关的代码的.
o文件将包含对_GLOBAL_OFFSET_TABLE_非分辨的外部引用(用字母U标记).
要确定使用-xcode=pic13还是-xcode=pic32,请通过使用elfdump-c查看全局偏移表(GOT)的大小(有关详细信息,请参阅elfdump(1)手册页)以及段标题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)选项进行编译.
请参阅《SolarisLinkerandLibrariesGuide》.
-xcommonchk[={yes|no}]启用通用块不一致性的运行时检查.
此选项提供了检测使用TASKCOMMON及并行化的程序中的通用块不一致性的调试检查.
(请参阅《Fortran编程指南》的"并行化"一章中有关TASKCOMMON指令的讨论.
)缺省值是-xcommonchk=no;用于检测通用块不一致性的运行时检查已禁用,因为它会导致性能的降低.
应仅在程序开发和调试过程中使用-xcommonchk=yes,而不应将其用于符合最终产品质量的程序.
使用-xcommonchk=yes进行编译会启用运行时检查.
如果在一个源程序单元中声明为正规通用块的通用块出现在TASKCOMMON指令上的某个其他位置,则程序将停止并显示一条错误消息,指出第一个此类不一致.
不带值的-xcommonchk等效于-xcommonchk=yes.
3-60Fortran用户指南2005年1月示例:在tc.
f中缺少TASKCOMMON指令-xcrossfile[={1|0}]启用跨源文件的优化和内联处理.
通常,在命令行上编译器的分析范围限制到每个独立的文件.
例如,-O4的自动内联处理仅限于同一源文件中定义和引用的子程序.
编译器使用-xcrossfile可以分析在命令行上命名的所有文件,结果就好像这些文件被连接到单一的源文件中.
仅当与-O4或-O5一起使用时,-xcrossfile才有效.
交叉文件内联创建可能但通常不存在的的源文件相互依赖性.
如果文件集中任何使用-xcrossfile编译的文件发生了更改,则必须重新编译所有文件,以确保正确地内联新代码.
请参阅第3-28页"-inline=[%auto][[,][no%]f1,_[no%]fn]".
在命令行上不带-xcrossfile的缺省值为-xcrossfile=0,并且不执行交叉文件优化.
要启用交叉文件优化,请指定-xcrossfile(等效于-xcrossfile=1).
编译中的任何.
s汇编程序源文件不参与交叉文件分析.
同时,使用-S编译时-xcrossfile标记被忽略.
demo%cattc.
fcommon/x/y(1000)do1i=1,10001y(i)=1.
callz(57.
)enddemo%cattz.
fsubroutinez(c)common/x/h(1000)C$PARTASKCOMMONXC$PARDOALLdo1i=1,10001h(i)=c*h(i)returnenddemo%f95-c-O4-parallel-xcommonchktc.
fdemo%f95-c-O4-parallel-xcommonchktz.
fdemo%f95-otc-O4-parallel-xcommonchktc.
otz.
odemo%tcERROR(libmtsk):inconsistentdeclarationofthreadprivate/taskcommonx_:notdeclaredasthreadprivate/taskcommonatline1oftc.
fdemo%第3章Fortran编译器选项3-61-xdebugformat={stabs|dwarf}SunStudio编译器将把调试器信息的格式从"stabs"格式迁移为"dwarf"格式.
在新发行版本中,缺省设置为-xdebugformat=stabs.
如果要维护读取调试信息的软件,您可以使用此选项将工具从stabs格式转换为dwarf格式.
使用此选项可作为一种为移植工具而存取新格式的方法.
除非您要维护读取调试器信息的软件,或者特定工具要求使用这些格式之一的调试器信息,否则没有必要使用此选项.
-xdebugformat=stabs生成的调试信息采用stabs标准格式.
-xdebugformat=dwarf生成的调试信息采用dwarf标准格式.
如果您未指定-xdebugformat,则编译器假定-xdebugformat=stabs.
指定此选项而不带参数是一个错误.
此选项影响使用-g选项记录的数据的格式.
该信息的某些格式也可以使用此选项进行控制.
因此,即使不使用-g,-xdebugformat仍有影响.
dbx和性能分析软件可识别stabs和dwarf格式,因此使用此选项对任何工具的功能性并无影响.
这是过渡性接口,因此发行版本之间会发生更改而不兼容,即使在发行版本更新较少时也是如此.
stabs或dwarf格式的任何特定字段或值的详细资料也不断改进.
-xdepend等效于–depend.
-xexplicitpar等效于–explicitpar.
-xF允许性能分析器在函数级别重组.
允许使用编译器、性能分析器和链接程序重组核心图像中的函数(子程序).
如果使用-xF选项编译,然后运行分析器,则可以生成映射文件,用于优化函数在内存中的排序(具体取决于共同使用函数的方式).
可以通过使用链接程序-Mmapfile选项,指示此后用于生成可执行文件的链接使用该映射.
它将可执行文件中的每个函数放置到单独的部分中.
仅当应用程序文本缺页时间消耗了应用程序的大部分时间时,重组内存中的子程序才有用.
否则,重组不能提高应用程序的总体性能.
有关分析器的详细信息,请参阅《程序性能分析工具》手册.
3-62Fortran用户指南2005年1月-xfilebyteorder=options支持Little-endian和Big-endian平台之间的文件共享.
标志识别未格式化I/O文件数据的字节顺序和字节对齐.
options必须指定以下任何组合,但必须显示一个规范:littlemax_align:specbigmax_align:specnative:specmax_align声明目标平台最大字节对齐.
允许的值为1、2、4、8和16.
对齐适用于FortranVAX结构和Fortran95派生类型,它们使用依赖于平台的对齐以便与C语言结构保持兼容.
little指定平台上的"Little-endian"文件,其中最大字节对齐为max_align.
例如,little4指定32位x86文件;而little16表示64位x86文件.
big指定最大对齐为max_align的"Big-endian"文件.
例如,big8表示SPARCV8(32位)文件;而big16表示SPARCV9(64位)文件.
native指定字节顺序和对齐与编译处理器平台所用字节顺序和对齐相同的"本机"文件.
假定以下内容是"本机的":spec必须是包含以下内容的以逗号分隔的列表:%allunitfilename%all指所有文件和逻辑单元(以"SCRATCH"打开的或在-xfilebyteorder标志中其他位置显式命名的文件和逻辑单元除外).
%all只能出现一次.
unit指程序打开的特定Fortran单元号.
filename指程序打开的特定Fortran文件名.
平台"本机"对应于:32位SPARCV8big864位SPARCV9big1632位x86little464位x86(amd64)little16第3章Fortran编译器选项3-63示例:-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-endian32位x86文件.
程序中的所有其他文件均是本机文件.
如果为文件指定的字节顺序与本机处理器相同,但指定了不同的对齐,将会使用相应的填充,即使没有进行字节交换.
例如,如果使用-xarch=amd64为64位x86平台进行编译并指定了-xfilebyteorder=little4:filename,就会出现这种情况.
Big-endian和Little-endian平台之间共享的数据记录中的声明类型必须具有相同的大小.
例如,使用-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|no}]将霍尔瑞斯常量作为实际参数列表中的字符串.
如果-xhasc=yes,则霍尔瑞斯常量在子例程或函数调用上作为实际参数出现时,编译器将霍尔瑞斯常量视为字符串.
这是缺省设置,并且符合Fortran标准.
(编译器生成的实际调用列表包含每个字符串的隐藏字符串长度.
)如果-xhasc=no,霍尔瑞斯常量将被视为子程序调用中的无类型值,并且只将它们的地址放在实际参数列表中.
(传递到子程序的实际调用列表上不生成字符串长度.
)如果例程调用带有霍尔瑞斯常量的子程序,并且调用的子程序希望该参数为INTEGER(或除CHARACTER以外的任意类型),则将使用-xhasc=no编译例程.
3-64Fortran用户指南2005年1月示例:将4habcd传递到z是通过使用-xhasc=no进行编译来正确处理的.
提供此标记是为了帮助移植传统的Fortran77程序.
-xhelp={readme|flags}显示摘要帮助信息-xhelp=readme显示此发行版的编译器的联机自述文件.
-xhelp=flags列出编译器选项标记.
等价于-help.
-xia[={widestneed|strict}](SPARC)启用区间运算扩展并设置合适的浮点环境.
未指定时的缺省值为-xia=widestneed.
《区间运算编程指南》中详细说明了区间运算的Fortran95扩展.
另请参阅第3-65页"-xinterval[={widestneed|strict|no}]".
-xia标记是一个宏,其扩展如下:-xild{off|on}demo%cathasc.
fcallz(4habcd,'abcdefg')endsubroutinez(i,s)integericharacter*(*)sprint*,"stringlength=",len(s)returnenddemo%f95-ohas0hasc.
fdemo%has0stringlength=4](SPARC)指定最大的假定内存对齐和未对齐的数据访问行为.
对于可在编译时决定对齐的内存访问,编译器会为数据对齐生成适当的装入/存储指令序列.
对于不能在编译时决定对齐的内存访问,编译器必须假定一个对齐以生成所需的装入/存储序列.
xmemalign标志允许用户在这些未确定情况下指定编译器要假定的数据最大内存对齐.
它还指定在运行时发生未对齐内存存取时的错误行为.
指定的值包含两个部分:数值对齐值,以及字母行为标记.
对齐的允许的值为:1假定最多1字节对齐.
2假定最多2字节对齐.
4假定最多4字节对齐.
8假定最多8字节对齐.
16假定最多16字节对齐.
访问未对齐的数据的错误行为的允许值为:i解释访问并继续执行s产生信号SIGBUSf为小于或等于4的对齐产生信号SIGBUS不指定-xmemalign进行编译时的缺省值为:8i(对于-xarch=generic、v7、v8、v8a、v8plus、v8plusa)8s(对于-xarch=v9、v9a,带有C和C++)8f(对于-xarch=v9、v9a,带有Fortran)对于所有平台,-xmemalign不带值显示时的缺省值为1i.
请注意,-xmemalign本身并不强制发生任何特殊的数据对齐.
使用-dalign或-aligncommon可以强制数据对齐.
-dalign选项是一个宏:-dalign是一个宏,用于:-xmemalign=8s-aligncommon=16详细信息,请参阅第3-10页"-aligncommon[={1|2|4|8|16}]".
第3章Fortran编译器选项3-73-xnolib等效于-nolib.
-xnolibmil等效于-nolibmil.
-xnolibmopt不使用快速数学库.
与-fast一起使用时可以覆盖对优化数学库的链接:f95–fast–xnolibmopt…-xOn等效于-On.
-xopenmp(SPARC)等效于-openmp.
-xpad等效于-pad.
-xpagesize=size(SPARC)设置栈和堆的首选页面大小.
size值必须是以下项之一:8K64K512K4M32M256M2G16G或缺省值例如:-xpagesize=4M并非所有平台上都支持所有这些页面大小,具体取决于体系结构和Solaris环境.
指定的页面大小对于目标平台上的Solaris操作环境必须是有效的页面大小,其值由getpagesize(3C)返回.
如果不是,请求在运行时将被忽略.
Solaris环境不保证支持页面大小的请求.
您可以使用pmap(1)或meminfo(2)来确定运行的程序是否收到请求的页面大小.
如果指定-xpagesize=default,将忽略标记;如果指定的-xpagesize不带有size值,则等效于-xpagesize=default.
3-74Fortran用户指南2005年1月此选项是以下对象的宏-xpagesize_heap=size-xpagesize_stack=size这两个选项接受与-xpagesize参数相同的参数:8K、64K、512K、4M、32M、256M、2G、16G、缺省值.
您可以通过指定-xpagesize=size来为二者设置相同的值,或分别为它们指定不同的值.
使用该标记进行编译与使用等价的选项将LD_PRELOAD环境变量设置为mpss.
so.
1或在启动程序之前使用等价的选项运行Solaris9命令ppgsz(1)具有相同的效果.
详细信息请参阅Solaris9手册页.
注意,该特性在Solaris7和8环境中不可用.
在Solaris7和8环境上不链接使用该选项编译的程序.
-xpagesize_heap=size(SPARC)设置堆的首选页面大小.
size值必须是以下项之一:8K64K512K4M32M256M2G16G或缺省值例如:-xpagesize_heap=4M详细信息请参阅-xpagesize.
-xpagesize_stack=size(SPARC)设置堆栈的首选页面大小.
size值必须是以下项之一:8K64K512K4M32M256M2G16G或缺省值例如:-xpagesize_stack=4M详细信息请参阅-xpagesize.
-xparallel等效于–parallel.
-xpg等效于-pg.
-xpp={fpp|cpp}选择源文件预处理程序.
第3章Fortran编译器选项3-75缺省值为-xpp=fpp.
编译器使用fpp(1)来预处理.
F、.
F95或.
F03源文件.
此预处理程序适用于Fortran.
以前版本使用标准C预处理程序cpp.
要选择cpp,请指定-xpp=cpp.
-xprefetch[=a[,a]]在支持预取的那些体系结构上启用预取指令,如UltraSPARCII或UltraSPARCIII、Pentium3、Pentium4或AMDOpteron(-xarch=v8plus、v8plusa、v9plusb、v9、v9a、或v9b、sse、sse2、generic64或amd64)有关FortranPREFETCH指令的说明,请参阅第2-12页第2.
3.
1.
8节的"PREFETCH指令".
a必须是以下值之一:使用-xprefetch,-xprefetch=auto和-xprefetch=yes,编译器就可以将预取指令自由插入到它生成的代码中.
该操作会提高支持预取的架构的性能.
如果正在较大的多处理器上运行计算密集的代码,您会发现使用-xprefetch=latx:factor有很多优点.
该选项指示代码生成器按照指定的因子调节在预取及其相关的装入或存储之间的缺省延迟时间.
预取延迟是执行预取指令和预取数据在缓存中可用时间之间的硬件延迟.
编译器决定放置使用预取数据的预取指令和装入或存储指令的距离时,假定预取延迟值.
注–在预取和装入之间假定的延迟可能与在预取和存储之间假定的延迟不同.
编译器在多个机器和应用程序间调整预取机制以获得最佳性能.
这种调整并非总能达到最优.
对于内存密集的应用程序,尤其是要在较大的多处理器上运行的应用程序,您可以通过增加预取延迟值获得更高的性能.
要增加值,请使用大于1的因子.
在.
5和2.
0之间的值最有可能提供最高的性能.
a是含义auto启用预取指令的自动生成no%auto禁用预取指令的自动生成explicit启用显式预取宏no%explicit禁用显式预取宏latx:factor按照指定的因子调整编译器假定的预取到装入和预取到存储的延迟.
该因子必须是正浮点数或整数.
是-xprefetch=yes与-xprefetch=auto,explicit相同否-xprefetch=no与-xprefetch=no%auto,no%explicit相同3-76Fortran用户指南2005年1月对于具有完全位于外部缓存内的数据集的应用程序,您可以通过减小预取延迟值来获得更高的性能.
要减小此值,请使用小于1的因子.
要使用-xprefetch=latx:factor选项,请在开始时使用接近1.
0的因子值并对应用程序运行性能测试.
然后适当增加或减小该因子,并再次运行性能测试.
获得最优性能之前,可以不断调整因子并运行性能测试.
以很小的增量逐渐增加或减小因子时,前几步中不会看到性能差异,然后会突然出现差异,最后再趋于稳定.
缺省:如果未指定-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时,编译器将识别指令:$PRAGMASPARC_PREFETCH_READ_ONCE(name)$PRAGMASPARC_PREFETCH_READ_MANY(name)$PRAGMASPARC_PREFETCH_WRITE_ONCE(name)$PRAGMASPARC_PREFETCH_WRITE_MANY(name)-xchip设置影响假定延迟的决定以及latx:factor设置的结果.
只有自动预取启用时才可以使用latx:factor子选项.
也就是说,除非与auto一起使用,否则忽略latx:factor.
警告:显式预取只应在度量支持的特殊环境下使用.
因为编译器在多个机器和应用程序之间调节预取机制以获得最优性能,所以当性能测试指示性能明显提高时,应该仅使用-xprefetch=latx:factor.
假定的预取延迟在不同发行版本中是不同的.
因此,无论何时切换到不同的发行版本,强烈建议重新测试延迟因子对性能的影响.
第3章Fortran编译器选项3-77-xprefetch_auto_type=[no%]indirect_array_access生成间接预取,以间接访问数据数组.
[不要]以生成直接内存存取预取的相同方式生成由选项-xprefetch_level={1|2|3}指示的循环的间接预取.
前缀no%否定声明.
如果不指定-xprefetch_auto_type的设置,编译器将把它设置为-xprefetch_auto_type=no%indirect_array_access.
要求-xprefetch=auto以及优化级别-xO3或更高级别.
类似-xdepend的选项可以影响计算候选间接预取的主动性,进而影响由于更好的内存别名歧义消除信息而发生的自动间接预取插入的主动性.
-xprefetch_level={1|2|3}控制预取指令的自动生成.
在以下情况下编译时,此选项才有效:-xprefetch=auto,使用优化级别3或更高.
在支持预取的平台上(-xarch=v8plus、v8plusa、v8plusb、v9、v9a、v9b、generic64、native64).
未指定-xprefetch_level时的-xprefetch=auto的缺省值为级别2.
预取级别2生成预取指令大于级别1的其他机会.
预取级别3生成大于级别2的其他预取指令.
预取级别2和3仅在UltraSPARCIII平台(-xarch=v8plusb或v9b)或者x86Pentium4或AMDOpteron(-xarch=sse2或amd64)上有效–xprofile={collect[:name]|use[:name]|tcov}使用运行时分析数据收集或优化,或执行基本块覆盖分析.
为编译器提供运行时的性能反馈增强了使用高优化级别(-xO5)进行编译的效果.
为了生成编译器执行最佳优化所需的配置文件反馈,您必须使用-xprofile=collect编译,对典型数据集运行可执行文件,然后用最高的优化级别并使用-xprofile=use重新编译.
collect[:name]优化器使用-xprofile=use收集并保存执行频率数据以备将来使用.
编译器生成测量语句执行频率的代码.
name是被分析的程序的名称.
该名称是可选的.
如果未指定name,则假定a.
out为可执行程序的名称.
3-78Fortran用户指南2005年1月在运行时,使用-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编译并直接调用多任务库来执行自身多任务的程序将产生准确的结果.
在单独步骤中编译和链接时,链接步骤还必须指定-xprofile=collect(如果它显示在编译步骤中).
use[:nm]使用执行频率数据有策略地在优化级别-xO5进行优化.
与collect:nm一起使用时,nm是可选的,可用于指定程序的名称.
程序是使用以前生成并保存在配置文件数据文件中的执行频率数据优化的,此数据由先前执行用-xprofile=collect编译的程序写入.
源文件和其他编译器选项必须与用于编译的源文件和编译器选项完全一致,该编译创建了生成feedback文件的编译程序.
如果使用-xprofile=collect:nm进行编译,则相同的程序名称nm必须出现在优化编译:-xprofile=use:nm中.
有关加速收集和使用阶段之间的编译的说明,请参阅-xprofile_ircache.
有关控制编译器在哪里查找配置文件数据文件的说明,请参阅-xprofile_pathmap.
tcov使用"新"样式tcov的基本块覆盖分析.
优化级别必须是-O2或更高级别.
代码指令与-a选项的代码指令类似,但不再为每个源文件生成.
d文件.
相反却生成单一文件,并且该文件的名称是按照最后的可执行文件命名的.
例如,如果stuff是可执行文件,则stuff.
profile/tcovd是数据文件.
运行tcov时,您必须将-x选项传递给它,以使它使用新式样数据.
否则,tcov使用旧式.
d文件(如果有),这是数据的缺省值,并产生不可预测的输出.
与-a不同,TCOVDIR环境变量在编译时没有影响.
但是,在程序运行时会使用它的值来确定在哪里创建配置文件子目录.
有关详细信息,请参阅tcov(1)手册页、《Fortran编程指南》中的"性能分析"一章和《程序性能分析工具》手册.
第3章Fortran编译器选项3-79注–如果由于-O4或-inline存在子程序的内联处理,则tcov生成的报告可能不可靠.
不会记录对已经内联的例程的调用的覆盖.
-xprofile_ircache[=path](SPARC)保存并重用收集和使用配置文件阶段之间的编译数据.
在使用阶段,与-xprofile=collect|use一起使用会重用收集阶段保存的编译数据,从而可以减少编译时间.
如果指定,path将覆盖保存缓存文件的位置.
缺省情况下,这些文件会作为目标文件保存在同一目录下.
收集和使用阶段出现在两个不同的位置中时,指定路径才是有用的.
典型的命令序列可能是:编译大程序时,由于中间数据的保存,使得使用阶段的编译时间大大减少.
但这将以可能大大增加磁盘空间的占用为代价.
-xprofile_pathmap=collect_prefix:use_prefix(SPARC)设置配置文件数据文件的路径映射.
将-xprofile_pathmap选项与-xprofile=use选项一起使用.
如果编译器无法找到用-xprofile=use编译的目标文件的文件配置数据,请使用-xprofile_pathmap:您在使用-xprofile=use编译到某个目录,而该目录不是先前使用-xprofile=collect编译时使用的目录.
对象文件会共享文件配置中的公共基名,但却可以根据它们在不同目录中的位置互相区分.
collect-prefix是目录树的UNIX路径名的前缀,在该目录树中使用-xprofile=collect编译对象文件.
use-prefix是目录树的UNIX路径名的前缀,在该目录树中使用-xprofile=use编译对象文件.
如果指定了-xprofile_pathmap的多个实例,那么编译器将按照这些实例出现的顺序对其进行处理.
在标识了匹配的use-prefix或发现最后指定的use-prefix与对象文件路径名不匹配之前,每个由-xprofile_pathmap的实例指定的use-prefix都会与对象文件路径名进行比较.
demo%f95-xO5-xprofile=collect-xprofile_ircachet1.
ct2.
cdemo%a.
outcollectsfeedbackdatademo%f95-xO5-xprofile=use-xprofile_ircachet1.
ct2.
c3-80Fortran用户指南2005年1月-xrecursive允许不带RECURSIVE属性的例程以递归方式调用它们.
通常,只有使用RECURSIVE属性定义的子程序可以以递归方式调用它们.
使用-xrecursive编译可以允许子程序调用它们自身,即使它们没有使用RECURSIVE属性进行定义.
但是,与定义了RECURSIVE的子例程不同,使用此标记不会导致缺省情况下在堆栈上分配本地变量.
要使本地变量在每个子程序的递归调用中具有单独的值,还应该使用-stackvar进行编译以便将本地变量放在堆栈上.
间接递归(例程A调用例程B,而例程B又调用例程A)可以生成优化级别大于-xO2的不一致的结果.
使用-xrecursive标记进行编译可以保证使用间接递归的正确性,即使优化级别更高.
使用-xrecursive进行编译会导致性能下降.
-xreduction等效于-xreduction.
-xregs=r(SPARC)指定寄存器的用法.
r是一个逗号分隔列表,它包含以下一项或多项:[no%]appl、[no%]float.
其中%已显示,它是必须的字符.
示例:-xregs=appl,no%floatappl:允许编译器将应用程序寄存器作为临时寄存器使用.
在SPARC系统上,某些寄存器被描述为应用程序寄存器.
由于需要较少装入和存储指令,因此使用这些寄存器可提高性能.
但是,此类使用可能与某些用汇编代码编写的旧库程序冲突.
应用程序寄存器集合依赖于SPARC平台:-xarch=v8或v8a-注册%g2、%g3以及%g4-xarch=v8plus或v8plusa-注册%g2、%g3和%g4-xarch=v9或v9a-注册%g2和%g3no%appl:不使用appl寄存器.
float:允许编译器将浮点寄存器作为整数值的临时寄存器使用.
此选项不会影响编译器为浮点值使用浮点寄存器.
no%float:不使用浮点寄存器.
使用此选项时,源程序不能包含任何浮点代码.
编译器的缺省值是:-xregs=appl,float.
第3章Fortran编译器选项3-81-xs允许在用dbx调试时不包括对象(.
o)文件.
使用-xs时,所有调试信息都复制到可执行文件中.
如果将可执行文件移至另一个目录,则可以使用dbx并忽略对象(.
o)文件.
如果不能保存.
o文件,则请使用该选项.
不带-xs时,如果移动可执行文件,则必须同时移动源文件和对象(.
o)文件,或使用dbxpathmap或use命令来设置路径.
-xsafe=mem(SPARC)允许编译器假定不违反内存保护.
使用此选项可允许编译器假定未发生基于内存的陷阱.
该选项允许在SPARCV9平台上使用推测装入指令.
该选项只有与优化级别-O5以及以下体系结构(-xarch)之一一起使用时才有效:v8plus、v8plusa、v8plusb、v9、v9a或v9b警告–由于在发生诸如地址未对齐或段违规的故障时,非故障装入不会导致陷阱,因此您应该只对不会发生此类故障的程序使用该选项.
因为很少的程序会导致基于内存的自陷,所以您可以安全地将该选项用于大多数程序.
对于显式依赖基于内存的陷阱来处理异常情况的程序,请勿使用该选项.
-xsb(已废弃)等效于-sb.
-xsbfast(已废弃)等效于-sbfast.
-xspace不执行增加代码大小的优化.
示例:如果增加代码大小,则不会解开循环或并行化循环.
-xtarget=t为指令集和优化指定目标平台.
t必须是以下值之一:native、native64、generic、generic64、platform–name.
-xtarget选项是一个宏,它允许快捷、轻松的指定发生在真实平台上的-xarch、xchip和--xcache的组合.
-xtarget的唯一含义位于它的扩展中.
3-82Fortran用户指南2005年1月通过为编译器提供目标计算机硬件的精确描述,某些程序的性能可得到改善.
当程序性能很重要时,目标硬件的正确说明会是非常重要的.
在较新的SPARC处理器上运行时这一点尤其重要.
不过,对多数程序和较旧的SPARC处理器来讲,性能的获取是可以忽略的,而通用规范已经足够了.
native:优化主机平台的性能.
编译器生成为主机平台优化的代码.
它决定了运行编译器的计算机的可用架构、芯片和缓存属性.
native64:为本地64位环境编译.
为编译器所运行的计算机上的64位环境设置体系结构、芯片和高速缓存属性.
generic:获取通用架构、芯片和缓存的最佳性能.
编译器将-xtarget=generic扩展到:-xarch=generic-xchip=generic-xcache=generic这是缺省值.
generic64:为通用64位环境编译.
它扩展为-xarch=v9-xcache=generic-xchip=genericplatform-name:获取指定平台的最佳性能.
SPARC平台使用fpversion(1)命令在运行的系统上决定-xtarget=native的扩展.
请注意,在该平台上进行编译时,特定主机平台的-xtarget不能扩展到与-xtarget=native相同的-xarch、-xchip或-xcache设置上.
下表列出了编译器接受的常用系统平台的名称.
附录C列出了较旧和较不常用的系统平台的名称.
表3-18常用的-xtarget系统平台的扩展-xtarget=platform-name-xarch-xchip-xcachegenericgenericgenericgenericgeneric64v9genericgenericentr150v8plusaultra16/32/1:512/64/1entr2v8plusaultra16/32/1:512/64/1entr2/1170v8plusaultra16/32/1:512/64/1entr2/1200v8plusaultra16/32/1:512/64/1entr2/2170v8plusaultra16/32/1:512/64/1第3章Fortran编译器选项3-83-xarch=v9或-xarch=v9a标志表示UltraSPARCV9平台上的64位Solaris操作系统上的编译.
设置-xtarget=ultra或ultra2是不必要的或不够的.
如果指定了-xtarget,则-xarch=v9或v9a选项必须出现在-xtarget标志之后(如下所示):-xtarget=ultra2.
.
.
-xarch=v9否则,-xtarget设置将把-xarch还原为v8plusa.
X86平台对于x86系统有效的-xtarget平台名称如下:entr2/2200v8plusaultra16/32/1:512/64/1entr3000v8plusaultra16/32/1:512/64/1entr4000v8plusaultra16/32/1:512/64/1entr5000v8plusaultra16/32/1:512/64/1entr6000v8plusaultra16/32/1:512/64/1ultrav8plusaultra16/32/1:512/64/1ultra1/140v8plusaultra16/32/1:512/64/1ultra1/170v8plusaultra16/32/1:512/64/1ultra1/200v8plusaultra16/32/1:512/64/1ultra2v8plusaultra216/32/1:512/64/1ultra2/1170v8plusaultra16/32/1:512/64/1ultra2/1200v8plusaultra16/32/1:1024/64/1ultra2/1300v8plusaultra216/32/1:2048/64/1ultra2/2170v8plusaultra16/32/1:512/64/1ultra2/2200v8plusaultra16/32/1:1024/64/1ultra2/2300v8plusaultra216/32/1:2048/64/1ultra2ev8plusaultra2e16/32/1:256/64/4ultra2iv8plusaultra2i16/32/1:512/64/1ultra3v8plusaultra364/32/4:8192/512/1ultra3cuv8plusaultra3cu64/32/4:8192/512/2ultra3iv8plusaultra3i64/32/4:1024/64/4ultra4v8plusaultra464/32/4:8192/128/2表3-18常用的-xtarget系统平台的扩展(续)-xtarget=platform-name-xarch-xchip-xcache3-84Fortran用户指南2005年1月generic、native、386、486、pentium、pentium_pro、pentium3、pentium4和opteron.
-xarch=amd64标志表示64位x86AMDOpteron平台上的64位Solaris操作系统上的编译.
使用-xtarget=opteron进行编译是不必要的或不够的.
如果指定了-xtarget,则-xarch=amd64选项必须出现在-xtarget标志之后(如下所示):-xtarget=opteron-xarch=amd64否则,编译将还原为32位x86.
-xtime等效于-time.
-xtypemap=spec指定缺省数据映射.
此选项提供了灵活的方法,用于为缺省数据类型指定字节大小.
此选项应用于缺省大小的变量和常量.
规范字符串spec可能包含列表中(用逗号分隔)以下任何或所有项目:real:sizedouble:sizeinteger:size每个平台上允许的组合包括:real:32real:64double:64double:128integer:32integer:64例如:-xtypemap=real:64,double:64,integer:64将缺省的REAL和DOUBLE映射到8字节.
此选项应用于使用缺省规范(不带显式字节大小)声明的所有变量,如同REALXYZ(产生64位XYZ)中的变量.
同时,所有单精度REAL常数都将被提升为REAL*8常数.
请注意,INTEGER和LOGICAL处理的方式相同,并且COMPLEX映射为两个REAL.
同时,处理DOUBLECOMPLEX的方式如同映射DOUBLE的方式.
第3章Fortran编译器选项3-85-xunroll=n等效于-unroll=n.
-xvector[={yes|no}]启用对向量化库函数的自动调用.
使用-xvector=yes时,只要可能,就允许编译器将DO循环内的某些数学库调用变换为对等效向量化库例程的单个调用.
此类转换可提高那些循环计数较大的循环的性能.
编译器缺省设置为-xvector=no.
-xvector自身缺省指定为-xvector=yes.
此选项还触发-depend.
(遵循命令行上带有-nodepend的-xvector可以取消依赖性分析.
)如果-xvector显示,编译器将自动通知链接程序将libmvec和libc库包含在装入步骤中.
但是,要在单独的步骤中编译和链接,还需要在链接步骤上指定-xvector以正确地选择这些需要的库.
-ztext在不重定位的情况下仅生成纯库.
衵text的一般用途是验证生成的库是纯文本;指令全部是与位置无关的代码.
因此,它通常与-G和-pic一起使用.
使用-ztext时,如果ld在text段中找到了不完整的重定位,则不会生成库.
如果它在data段中找到了不完整的重定位,则通常会依然生成库;数据段是可写入的.
不带-ztext时,ld生成库、重定位或不生成.
如果您不知道目标文件是否是使用-pic生成的,则一种典型用法是使库同时来自于源文件和目标文件.
示例:使库同时来自于源文件和目标文件:另一种替代用法是询问代码是否已经与位置无关.
不带-pic进行编译,但询问是否为纯文本.
示例:询问它是否已经是纯文本——即使不带-pic:demo%f95-G-pic-ztext-oMyLib-hMyLiba.
fb.
fx.
oy.
odemo%f95-G-ztext-oMyLib-hMyLiba.
fb.
fx.
oy.
o3-86Fortran用户指南2005年1月如果使用-ztext编译,并且ld不生成库,则您可以不使用-ztext重新编译,此时ld将生成库.
使用-ztext生成失败意味着库的一个或多个组件无法共享;但是,某些其他组件可能可以共享.
这就产生了性能问题,最好由您——程序员来解决.
4-1第4章Fortran95功能和差异本附录介绍了标准Fortran95和Fortran95编译器f95之间的一些主要功能差异.
4.
1源语言功能Fortran95编译器提供Fortran95标准的以下源语言功能和扩展.
4.
1.
1续行限制f95允许99个续行(1个初始行和99个续行).
在固定格式中,标准Fortran95允许19个续行;在自由格式中,允许39个续行.
4.
1.
2固定格式源代码行在固定格式源代码中,行的长度可以超过72个字符,但忽略第73列以后的任何内容.
标准Fortran95只允许使用72个字符长的行.
4-2Fortran用户指南2005年1月f95中的制表符强制将行的其余部分填充到第72列.
如果制表符出现在延续到下一行的字符串内,这可能会导致出现意外结果:4.
1.
3采用的源代码格式f95采用的源代码格式取决于选项、指令和后缀.
具有.
f或.
F后缀的文件使用固定格式.
具有.
f90、.
f95、.
F90或.
F95后缀的文件使用自由格式.
如果使用-free或-fixed选项,则它覆盖文件名后缀.
如果使用!
DIR$FREE或!
DIR$FIXED指令,则它覆盖选项和文件名后缀.
4.
1.
3.
1混合格式允许混合使用某些源代码格式.
在相同的f95命令中,某些源文件可以是固定格式,而某些源文件是自由格式.
在相同的文件中,可通过使用!
DIR$FREE和!
DIR$FIXED指令将自由格式与固定格式混合使用.
源文件:^Iprint*,"Tabonnextline^I1thiscontinuationlinestartswithatab.
"^Iend运行代码:Tabonnextlinethiscontinuationlinestartswithatab.
表4-1F95源代码格式命令行选项选项操作-fixed将所有源文件解释为Fortran固定格式-free将所有源文件解释为Fortran自由格式第4章Fortran95功能和差异4-34.
1.
3.
2大小写在缺省情况下,SunFortran95不区分大小写.
这意味着,变量AbcDeF的处理方式与将其拼写为abcdef时相同.
要让编译器区别处理大写字母和小写字母,请使用-U选项进行编译.
4.
1.
4限制和缺省值单个Fortran95程序单元可定义最多65,535个派生类型和16,777,215个不重复的常量.
变量和其他对象的名称最多为127个字符长.
标准长度为31个.
4.
2数据类型本节介绍Fortran95数据类型的功能和扩展.
4.
2.
1布尔类型f95支持布尔类型的常量和表达式.
但是,没有布尔变量或数组,也没有布尔类型语句.
4.
2.
1.
1控制布尔类型的各种规则屏蔽——具有布尔结果的按位逻辑表达式;它的每个位是对相应操作数位进行一个或多个逻辑运算的结果.
用于二进制算术运算符和关系运算符:如果一个操作数是布尔型,则在执行运算时不进行转换.
如果两个操作数均是布尔型,则在执行运算时就当它们是整数一样.
用户指定的函数均不能生成布尔结果,但某些(非标准的)内部函数可以.
布尔和逻辑类型具有以下差异:变量、数组和函数可以是逻辑类型,但它们不能是布尔类型.
可以使用LOGICAL语句,但不能使用BOOLEAN语句.
逻辑型的变量、常量或表达式仅有两个值:.
TRUE.
或.
FALSE.
.
布尔型的变量、常量或表达式可以表示任意二进制值.
逻辑型实体在算术表达式、关系表达式或按位逻辑表达式中无效.
布尔型实体在所有3种表达式中都有效.
4-4Fortran用户指南2005年1月4.
2.
1.
2布尔常量的替代格式f95允许使用下列替代格式(没有二进制)的布尔常量(八进制、十六进制或霍尔瑞斯).
不能将变量声明为布尔型.
标准Fortran不允许使用这些格式.
八进制ddddddB,其中d是任意八进制数字可以使用字母B或b.
可以是1至11个八进制数字(0至7).
11个八进制数字表示完整的32位字,最左侧的数字可以是0、1、2或3.
每个八进制数字指定3位的值.
最后一个(最右侧的)数字指定最右侧3位(第29、第30和第31位)的内容.
如果位数不足11个,则该值右对齐,即它表示字最右侧的位:位n至31.
其他位均为0.
忽略空格.
在I/O格式规范中,字母B表示二进制数字;而在其他地方则表示八进制数字.
十六进制X'ddd'或X"ddd",其中,d是任意的十六进制数字.
可以是1至8个十六进制数字(0至9,A-F).
任何字母都可以是大写或小写字母(X、x、A-F、a-f).
数字必须用撇号或引号括起来.
忽略空格.
十六进制数字可以以+或-符号开头.
8个十六进制数字表示一个完整的32位字,等价的二进制数字对应于32位字中每个位的内容.
如果位数不足8个,则该值右对齐,即它表示字最右侧的位:位n至31.
其他位均为0.
第4章Fortran95功能和差异4-5霍尔瑞斯接受的霍尔瑞斯数据格式为:上面的".
.
.
"是一个字符串,而n是字符数.
霍尔瑞斯常量是布尔类型.
如果任何字符常量是按位逻辑表达式,则该表达式的计算结果为霍尔瑞斯型.
霍尔瑞斯常量可以包含1至4个字符.
示例:八进制和十六进制常量.
示例:赋值语句中的八进制和十六进制数.
在算术表达式中使用八进制或十六进制常量可产生未定义的结果,并且不会生成语法错误.
nH.
H".
.
.
"HnL.
L".
.
.
"LnR.
R".
.
.
"R布尔常量32位字的内部八进制数0B0000000000077740B00000077740X"ABE"00000005276X"-340"37777776300X'123'00000000443X'FFFFFFFFFFFFFFFF'37777777777i=1357Bj=X"28FF"k=X'-5A'4-6Fortran用户指南2005年1月4.
2.
1.
3布尔常量的替代上下文f95允许在非DATA语句中使用BOZ常量.
如果将它们赋值给实数变量,则不进行类型转换.
标准Fortran只允许在DATA语句中使用它们.
4.
2.
2数值数据类型的缩写大小表示法f95允许在声明语句、函数语句和IMPLICIT语句中使用以下非标准的类型声明格式.
第一列中的格式虽然获得了广泛使用,但它们是非标准的Fortran95格式.
第二列中的种类数字可能会随供应商而发生变化.
B'bbb'O'ooo'Z'zzz'B"bbb"O"ooo"Z"zzz"表4-2数值数据类型的大小表示法非标准声明符简短形式含义INTEGER*1INTEGER(KIND=1)INTEGER(1)有符号的单字节整数INTEGER*2INTEGER(KIND=2)INTEGER(2)有符号的双字节整数INTEGER*4INTEGER(KIND=4)INTEGER(4)有符号的4字节整数LOGICAL*1LOGICAL(KIND=1)LOGICAL(1)单字节逻辑值LOGICAL*2LOGICAL(KIND=2)LOGICAL(2)双字节逻辑值LOGICAL*4LOGICAL(KIND=4)LOGICAL(4)4字节逻辑值REAL*4REAL(KIND=4)REAL(4)IEEE单精度4字节浮点值REAL*8REAL(KIND=8)REAL(8)IEEE双精度8字节浮点值REAL*16REAL(KIND=16)REAL(16)IEEE四精度16字节浮点值COMPLEX*8COMPLEX(KIND=4)COMPLEX(4)单精度复数(每个部分4个字节)COMPLEX*16COMPLEX(KIND=8)COMPLEX(8)双精度复数(每个部分8个字节)COMPLEX*32COMPLEX(KIND=16)COMPLEX(16)四精度复数(每个部分16个字节)第4章Fortran95功能和差异4-74.
2.
3数据类型的大小和对齐存储和对齐始终以字节为单位.
可以划分为单字节的值按字节对齐.
类型的大小和对齐取决于各种编译器选项和平台以及变量的声明方式.
COMMON块中的缺省最大对齐位置是4字节边界.
可使用特殊选项进行编译以更改缺省的数据对齐和存储分配,如-aligncommon、-f、-dalign、-dbl_align_all、-xmemalign和-xtypemap.
本手册中的缺省描述假定这些选项无效.
《Fortran编程指南》的第11章提供了有关某种平台上数据类型和对齐方式特例的其他信息.
下表汇总了缺省的大小和对齐,并忽略类型和选项的其他方面.
请注意以下事项:表4-3缺省的数据大小和对齐(以字节为单位)Fortran95数据类型大小缺省对齐COMMON中的对齐BYTEXCHARACTERXCHARACTER*nX11n111111COMPLEXXCOMPLEX*8XDOUBLECOMPLEXXCOMPLEX*16XCOMPLEX*32X8816163244888/1644444DOUBLEPRECISIONXREALXREAL*4XREAL*8XREAL*16X84481684488/1644444INTEGERXINTEGER*2XINTEGER*4XINTEGER*8X424842484244LOGICALXLOGICAL*1XLOGICAL*2XLOGICAL*4XLOGICAL*8X4124841248412444-8Fortran用户指南2005年1月REAL*16和COMPLEX*32:正如表中的8/16所示,在64位环境(使用-xarch=v9或v9a进行编译)中,缺省对齐位置是16字节(而非8字节)边界.
数据类型"四倍精度"在x86平台上不可用.
数组和结构按照其元素或字段对齐.
数组对齐方式与数组元素相同.
结构对齐方式与具有最宽对齐边界的字段相同.
选项-f或-dalign强制在8字节边界上对齐所有8、16或32字节数据.
选项-dbl_align_all导致在8字节边界上对齐所有数据.
依赖于这些选项如何使用的程序可能无法进行移植.
4.
3Cray指针Cray指针是一个变量,其值是另一个实体(称为指针对象)的地址.
f95支持Cray指针;标准Fortran95不支持.
4.
3.
1语法CrayPOINTER语句使用以下格式:其中,pointer_name、pointee_name和array_spec如下所示:示例:声明指向两个指针对象的Cray指针.
POINTER(pointer_name,pointee_name[array_spec]),pointer_name指向相应pointee_name的指针.
pointer_name包含pointee_name的地址.
必须是:标量变量名(但不是派生类型)不能是:常量、结构名称、数组或函数pointee_name指向相应pointer_name的指针对象.
必须是:变量名、数组声明符或数组名称array_spec如果包含array_spec,则它必须是显形(常量或非常量边界)或假定大小.
POINTER(p,b),(q,c)第4章Fortran95功能和差异4-9以上示例声明Cray指针p及其指针对象b、Cray指针q及其指针对象c.
示例:声明指向数组的Cray指针.
以上示例声明Cray指针ix及其指针对象x;并将x声明为nm+1维数组.
4.
3.
2Cray指针的用途将变量与存储块中的特定位置动态关联起来后,可以使用指针访问用户管理的存储.
Cray指针允许访问绝对内存地址.
4.
3.
3声明Cray指针和Fortran95指针Cray指针声明如下:POINTER(pointer_name,pointee_name[array_spec])Fortran95指针声明如下:POINTERobject_name不能混用这两种类型的指针.
4.
3.
4Cray指针的功能无论何时引用指针对象,f95均使用当前的指针值作为指针对象的地址.
Cray指针类型语句声明指针和指针对象.
Cray指针为Cray指针类型.
在32位处理器中,Cray指针的值占用一个存储单元;在64位SPARCV9处理器中,Cray指针的值占用两个存储单元.
Cray指针可以出现在COMMON列表中,或者作为伪参数出现.
在定义Cray指针的值之前,Cray指针对象没有地址.
如果将数组命名为指针对象,则该数组称为指针对象数组.
其数组声明符可以出现在:单独的类型语句单独的DIMENSION语句POINTER(ix,x(n,0:m))4-10Fortran用户指南2005年1月指针语句本身如果数组声明符在子程序中,则维数赋值可以引用:COMMON块中的变量或作为伪参数的变量每个维的大小是在进入子程序时计算的,而不是在引用指针对象时计算的.
4.
3.
5Cray指针的限制pointee_name不能是类型为CHARACTER*(*)的变量.
如果pointee_name是数组声明符,则它必须是显形(常量或非常量边界)或假定大小.
不允许使用Cray指针数组.
Cray指针不能:是另一个Cray指针或Fortran指针指向的指针.
是结构的组件.
声明为任何其他数据类型.
Cray指针不能出现在:PARAMETER语句或包含PARAMETER属性的类型声明语句中.
DATA语句.
4.
3.
6Cray指针对象的限制Cray指针对象不能出现在SAVE、DATA、EQUIVALENCE、COMMON或PARAMETER语句中.
Cray指针对象不能是伪参数.
Cray指针对象不能是函数值.
Cray指针对象不能是结构或结构组件.
Cray指针对象不能是派生类型.
4.
3.
7Cray指针的用法可以将Cray指针赋值如下:设置为绝对地址示例:q=0赋值给整数变量、加或减表达式或从整数变量、加或减表达式中赋值第4章Fortran95功能和差异4-11示例:p=q+100Cray指针不是整数.
不能将它们赋值给实数变量.
LOC函数(非标准)可用于定义Cray指针.
示例:p=LOC(x)示例:按上述方式使用Cray指针.
有关以上示例的说明:word64引用绝对地址64的内容blk是占用内存前128个字的数组a是空白公共区中长度为1000的数组b在a的后面,其长度为nc在b的后面a、b和c与pool相关联word64与blk(17)相同,因为Cray指针是字节地址,并且blk的每个整数元素为4字节长4.
4STRUCTURE和UNION(VAXFortran)为了帮助从f77迁移程序,f95接受VAXFortranSTRUCTURE和UNION语句,它们是Fortran95中"派生类型"的前身.
有关语法的详细信息,请参阅《FORTRAN77语言参考》手册.
STRUCTURE中的字段声明可以是以下内容之一:子结构-另一个STRUCTURE声明或一个先前定义的记录.
UNION声明.
SUBROUTINEsub(n)COMMONpool(100000)INTEGERblk(128),word64REALa(1000),b(n),c(100000-n-1000)POINTER(pblk,blk),(ia,a),(ib,b),&(ic,c),(address,word64)DATAaddress/64/pblk=0ia=LOC(pool)ib=ia+4000ic=ib+n.
.
.
4-12Fortran用户指南2005年1月TYPE声明,它可以包含初始值.
具有SEQUENCE属性的派生类型.
(这是f95所特有的.
)与f77相同,不能将POINTER语句用作字段声明.
f95还允许:'.
'或'%'可用作结构字段非关联化符号:struct.
field或struct%field.
结构可以出现在格式化I/O语句中.
可以在PARAMETER语句中初始化结构;格式与派生类型初始化相同.
结构可以作为组件出现在派生类型中,但必须使用SEQUENCE属性声明派生类型.
4.
5无符号整数Fortran95编译器接受新的数据类型UNSIGNED作为该语言的扩展.
四种KIND参数值可以使用UNSIGNED:1、2、4和8,分别对应于1、2、4和8字节无符号整数.
无符号整数常量的形式是以大写或小写字母U结尾的数字串,后面可以跟一个下划线和种类参数.
下面的例子显示无符号整数常量的最大值:如果没有使用种类参数表达(12345U),则缺省值与缺省整数相同.
缺省值为U_4,但可以使用-xtypemap选项更改它,这将更改缺省无符号整数的种类类型.
可使用UNSIGNED类型说明符声明无符号整数变量或数组:4.
5.
1算术表达式二进制运算(如+-*/)不能混合使有符号操作数和无符号操作数.
即,如果将U声明为UNSIGNED并且N是有符号的INTEGER,则U*N是非法的.
255u_165535u_24294967295U_418446744073709551615U_8UNSIGNEDUUNSIGNED(KIND=2)::AUNSIGNED*8::B第4章Fortran95功能和差异4-13可使用UNSIGNED内部函数将二进制运算中的混合操作数组合起来,例如U*UNSIGNED(N).
例外情况是:一个操作数是无符号整数,而另一个操作数是具有正数或零值的有符号整数常量表达式,则该结果是无符号整数.
此类混合表达式的结果种类是操作数的最大种类.
有符号值的幂指数是有符号的值;而无符号值的幂指数是无符号的值.
无符号值的一元减法是无符号的值.
无符号操作数可以与实数、复数操作数任意混合使用.
(无符号操作数不能与区间操作数混合使用.
)4.
5.
2关系表达式可以使用内在关系运算来比较有符号和无符号整数操作数.
结果基于未修改的操作数值.
4.
5.
3控制构造CASE构造接受无符号整数作为条件表达式.
不允许将无符号整数作为DO循环控制变量,也不允许在算术IF控制表达式中使用它.
4.
5.
4输入/输出构造可以使用I、B、O和Z编辑描述符来读取和写入无符号整数.
还可以使用列表控制和名称列表I/O读取和写入它们.
使用列表控制或名称列表I/O的无符号整数的写入格式与用于有符号正整数的格式相同.
还可以使用未格式化I/O读取或写入无符号整数.
4.
5.
5内部函数允许在内部函数中使用无符号整数,但SIGN和ABS除外.
新的内部函数UNSIGNED与INT类似,但生成无符号类型的结果.
格式为UNSIGNED(v[,kind])另一个新的内部函数SELECTED_UNSIGNED_KIND(var)返回var的种类参数.
MIN和MAX函数不允许同时使用有符号整数和无符号整数操作数,除非至少有一个REAL类型的操作数.
4-14Fortran用户指南2005年1月无符号数组不能作为数组内部函数的参数出现.
4.
6Fortran2003功能在本版本的f95编译器中,引入了Fortran2003草案标准中提出的一些功能.
4.
6.
1与C函数之间的互操作性新的Fortran草案标准提供:一种引用C语言过程的方法(反过来说,一种指定可从C函数中引用Fortran子程序的方法)以及一种声明与外部C变量相链接的全局变量的方法ISO_C_BINDING模块提供了对命名常量的访问,这些命名常量是种类类型参数,它们代表了与C类型兼容的数据.
草案标准还引入了BIND(C)属性.
如果Fortran派生类型具有BIND属性,则它可以与C之间进行互操作.
此Fortran95编译器版本实现了草案标准第15章中描述的那些功能.
正如草案标准第4章中所述,Fortran还提供了用于定义与C类型对应的派生类型、枚举和类型别名的工具.
4.
6.
2IEEE浮点异常处理在Fortran语言中,新的内部模块IEEE_ARITHMETIC和IEEE_FEATURES提供了对异常和IEEE算法的支持.
对这些功能提供完整支持的是:USE,INTRINSIC::IEEE_ARITHMETICUSE,INTRINSIC::IEEE_FEATURES这些模块定义了一组派生类型、常量、舍入模式、查询函数、基本函数、种类函数、基本和非基本子例程.
详细信息,请参阅Fortran2000草案标准的第14章.
4.
6.
3命令行参数内函数Fortran2003标准草案为处理命令行参数和环境变量引入了三个新的内部命令行.
包括:GET_COMMAND(command、length、status)第4章Fortran95功能和差异4-15以命令返回调用该程序的整个命令行.
GET_COMMAND_ARGUMENT(number、value、length、status)以值返回命令行参数.
GET_ENVIRONMENT_VARIABLE(name、value、length、status、trim_name)返回一个环境变量的值.
4.
6.
4PROTECTED属性现在,Fortran95编译器接受Fortran2003的PROTECTED属性.
PROTECTED对模块实体的使用进行了限制.
具有PROTECTED属性的对象只能在声明这些对象的模块中定义.
4.
6.
5Fortran2003异步I/O编译器可识别I/O语句中的ASYNCHRONOUS说明符:ASYNCHRONOUS=['YES'|'NO']此语法是在Fortran2000草案标准第9章中提出的.
在与WAIT语句结合使用时,它允许程序员指定可能与计算重叠的I/O进程.
虽然编译器可以识别ASYNCHRONOUS='YES',但草案标准并不要求实际使用异步I/O.
在此版本的编译器中,I/O总是同步的.
4.
6.
6扩展的ALLOCATABLE属性Fortran95标准组织最近做出的决定扩展了允许使用ALLOCATABLE属性的数据实体.
以前,仅限本地存储的数组变量使用该属性.
现在,允许将它用于:结构的数组组件伪数组数组函数结果在可分配实体可能与存储关联的所有地方,仍然禁止使用可分配实体:COMMON块和EQUIVALENCE语句.
可分配数组组件可以出现在SEQUENCE类型中,但随后在COMMON和EQUIVALENCE中禁止此类型的对象.
4.
6.
7VALUE属性f95编译器可识别VALUE类型声明属性.
已提议将该属性写入Fortran2003标准.
4-16Fortran用户指南2005年1月如果使用此属性指定子程序伪输入参数,则表明"按值"传递实际参数.
以下示例说明将VALUE属性用于一个C主程序,该主程序将文字值作为参数来调用Fortran95子程序:4.
6.
8Fortran2003流I/O已提议将新的"流"I/O方案写入到Fortran2003草案标准中.
流I/O访问将数据文件作为连续的字节序列来处理,可由从1开始的正整数进行寻址.
可使用OPEN语句中的ACCESS='STREAM'说明符来声明流I/O文件.
字节地址文件定位需要在READ或WRITE语句中有POS=scalar_integer_expression说明符.
INQUIRE语句接受ACCESS='STREAM'、说明符STREAM=scalar_character_variable和POS=scalar_integer_variable.
4.
6.
9Fortran2003格式化I/O功能在f95中,已实现了3个新的Fortran2003格式化I/O说明符.
它们可能出现在OPEN、READ、WRITE、PRINT和INQUIRE语句中:DECIMAL=['POINT'|'COMMA']更改缺省的十进制编辑模式.
对于使用D、E、EN、ES、F和G编辑格式的浮点数,缺省使用句点来分隔整数和小数部分.
'COMMA'更改缺省设置以使用逗号而不是句点来打印,例如,123,456.
缺省设置为'POINT',它使用句点来打印,例如,123.
456.
ROUND=['PROCESSOR_DEFINED'|'COMPATIBLE']为格式化I/OD、E、EN、ES、F和G编辑设置缺省舍入模式.
在使用'COMPATIBLE'时,数据转换后的数值结果是两个最相近的表示中更接近的一个,如果值正好在两者中间,则选择离0远的值.
在使用'PROCESSOR_DEFINED'时,舍入模式取决于处理器的缺省模式,如果未指定ROUND,则为编译器缺省设置.
C代码:#includeintmain(intac,char*av[]){to_fortran(2);}Fortran代码:subroutineto_fortran(i)integer,value::iprint*,iend第4章Fortran95功能和差异4-17例如,WRITE(*,'(f11.
4)')0.
11115在缺省模式下打印0.
1111,而在'COMPATIBLE'模式下打印0.
1112.
IOMSG=character-variable将错误消息作为字符串在指定字符变量中返回.
这与标准输出中显示的错误消息相同.
用户应该分配足够大的字符缓冲区以保存最长的消息.
((CHARACTER*256应该足够了.
)在INQUIRE语句中使用时,这些说明符声明一个字符变量以返回当前值.
新的编辑描述符DP、DC、RP和RC将单个FORMAT语句中的缺省设置分别更改为小数点、小数逗号、处理器定义的舍入以及兼容的舍入.
例如:WRITE(*,'(I5,DC,F10.
3)')N,W在F10.
3输出项目中打印逗号而不是句点.
要了解如何在格式化I/O中更改浮点舍入模式,另请参阅-iorounding编译器命令行选项.
(第3-29页"-iorounding[={compatible|processor-defined}]".
)4.
7其他的I/O扩展本节介绍一些Fortran95输入/输出处理扩展,f95编译器接受这些扩展,但它们不是Fortran2003草案标准的一部分.
某些扩展是在Fortran77编译器f77中出现的I/O扩展,现在这些扩展已成为Fortran95编译器的一部分.
4.
7.
1I/O错误处理例程新函数使用户可以为逻辑单元上的带格式输入指定自己的错误处理程序.
当检测到格式错误时,运行时I/O库会调用特定的由用户提供的处理例程,同时将数据指向输入行中导致错误的字符.
处理例程可以提供一个新字符并允许I/O操作在检测到错误的点上使用新字符后继续;或者采用缺省的Fortran错误处理操作.
新例程SET_IO_ERR_HANDLER(3f)和GET_IO_ERR_HANDLER(3f)是模块子例程,并要求在调用它们的例程中使用USESUN_IO_HANDLERS.
要详细了解这些例程,请参阅手册页.
4.
7.
2变量格式表达式Fortran77允许使用尖括号包含的任意表达式来代替具有某种格式的任何整数常量:1FORMAT(.
.
.
.
.
.
)4-18Fortran用户指南2005年1月变量格式表达式不能作为nH.
.
.
编辑描述符中的n出现在ASSIGN语句引用的FORMAT语句中,或者并行区域内的FORMAT语句中.
这种功能是在f95中自动启用的,并且不要求使用-f77兼容性选项标记.
4.
7.
3NAMELIST输入格式输入中的组名称前面可以是$或&.
&是Fortran95标准接受的唯一格式,并且是NAMELIST输出所写入的内容.
接受$作为终止输入的符号,但以下情况除外:组中最后一个数据项是CHARACTER数据,此时将$作为输入数据处理.
允许NAMELIST输入从记录的第一列开始.
4.
7.
4二进制未格式化I/O使用FORM='BINARY'打开文件与使用FORM='UNFORMATTED'具有大致相同的效果,所不同的是文件中没有嵌入记录长度.
如果没有此数据,则无法知道一条记录的开始或结束位置.
因此,无法BACKSPACEFORM='BINARY'文件,这是因为不知道要退格到什么位置.
在对'BINARY'文件执行READ操作时,将按所需要读取尽可能多的数据来填充输入列表中的变量.
WRITE语句:以二进制的形式将数据写入到文件中,并按照输出列表中指定的数量传输字节.
READ语句:将数据读取到输入列表中的变量,并传输该列表所要求数量的字节.
因为文件中没有记录标记,所以不进行"记录结束"错误检测.
检测到的唯一错误是"文件结束"或异常系统错误.
INQUIRE语句:在使用FORM="BINARY"打开的文件中,INQUIRE返回:FORM="BINARY"ACCESS="SEQUENTIAL"DIRECT="NO"FORMATTED="NO"UNFORMATTED="YES"RECL=ANDNEXTREC=未定义BACKSPACE语句:不允许使用-返回一个错误.
ENDFILE语句:在当前位置照常截断文件.
REWIND语句:将文件照常重新定位到数据的开头.
4.
7.
5各种I/O扩展在不同单元上可能出现递归的I/O(这是因为f95I/O库为"MT-Warm").
第4章Fortran95功能和差异4-19RECL=2147483646(231-2)是顺序格式化、列表控制和名称列表输出中的缺省记录长度.
可以识别和实现ENCODE和DECODE,详细信息,请参阅《FORTRAN77语言参考手册》.
非前进式I/O是使用ADVANCE='NO'启用的(如下所示):write(*,'(a)',ADVANCE='NO')'n='read(*,*)n4.
8指令编译器指令指示编译器执行某些特殊的操作.
指令又称编译指示.
可以将编译器指令作为一个或多个文本行插入到源程序中.
每一行看起来就像注释一样,但具有其他的字符,可将它识别为不仅仅是此编译器的注释.
对于大多数其他编译器,将它处理为注释,因此具有一定的代码移植性.
Sun风格的并行化指令是f95-explicitpar的缺省设置.
要切换到Cray风格的指令,请使用-mp=cray编译器命令行标记.
OpenMP指令的显式并行化要求使用-openmp进行编译.
附录D提供了Fortran指令的完整摘要.
4.
8.
1特殊f95指令行的格式除了第2章中介绍的指令外,f95还可识别其自己的特殊指令.
这些指令使用以下语法:4.
8.
1.
1固定格式源代码将CDIR$或!
DIR$放在第1至第5列中.
指令在第7列及后面的列中列出.
忽略第72列后面的列.
初始指令行的第6列为空.
连续指令行的第6列非空.
!
DIR$d1,d2,4-20Fortran用户指南2005年1月4.
8.
1.
2自由格式源代码将后跟空格的!
DIR$放在行中的任意位置.
!
DIR$字符是行中的第一个非空字符(实际上是非空白).
指令在空格后面列出.
在初始指令行中,紧靠!
DIR$后面的位置中为空格、制表符或换行符.
在连续指令行中,紧靠!
DIR$后面的位置中为空格、制表符或换行符以外的字符.
因此,第1至第5列中的!
DIR$既用于自由格式源代码又用于固定格式源代码.
4.
8.
2FIXED和FREE指令这些指令指定指令行后面行的源代码格式.
4.
8.
2.
1范围它们适用于所在文件的其余部分,或者在遇到下一个FREE或FIXED指令之前的部分.
4.
8.
2.
2用法它们用于切换源文件中的源代码格式.
它们用于切换INCLUDE文件的源代码格式.
可将指令插入在INCLUDE文件的开头.
在处理INCLUDE文件后,源代码格式恢复为处理INCLUDE文件之前使用的格式.
4.
8.
2.
3限制FREE/FIXED指令:每个指令必须单独出现在编译器指令行中(没有续行).
每个指令可以出现在源代码中的任意位置.
其他指令必须出现在它们所影响的程序单元中.
示例:FREE指令.
!
DIR$FREEDOi=1,na(i)=b(i)*c(i)ENDDO第4章Fortran95功能和差异4-214.
8.
3并行指令并行化指令是一种特殊的注释,它指示编译器尝试并行处理下一个DO循环.
附录D和《Fortran编程指南》中有关并行化的章节中介绍了这些指令.
f95可识别Sun和Cray风格的并行化指令以及OpenMPFortranAPI指令.
《OpenMPAPI用户指南》中介绍了OpenMP并行化.
4.
9模块文件在编译包含Fortran95MODULE的文件时,就会为在源代码中遇到的每个MODULE生成模块接口文件(.
mod文件).
文件名是从MODULE的名称中派生的;将为MODULExyz创建文件xyz.
mod(全部小写).
编译还会为包含MODULE语句的源文件生成.
o模块实现目标文件.
可与模块实现目标文件以及所有其他目标文件链接在一起以创建可执行文件.
编译器在-moddir=dir标记或MODDIR环境变量指定的目录中创建模块接口文件和实现目标文件.
如果没有指定,则编译器在当前的工作目录中写入.
mod文件.
在编译USEmodulename语句时,编译器在当前工作目录中查找接口文件.
-Mpath选项用于给编译器指定其他的搜索路径.
必须在链接步骤的命令行中显式地列出模块实现目标文件.
通常,程序员为每个文件定义一个MODULE,并给MODULE和包含它的源文件指定相同的名称.
但是,这并不是必需的.
在本示例中,同时编译所有的文件.
模块源文件在主程序中使用它们之前就已出现.
编译创建以下文件:demo%catmod_one.
f90MODULEone.
.
.
ENDMODULEdemo%catmod_two.
f90MODULEtwo.
.
.
ENDMODULEdemo%catmain.
f90USEoneUSEtwo.
.
.
ENDdemo%f95-omainmod_one.
f90mod_two.
f90main.
f904-22Fortran用户指南2005年1月mainmain.
oone.
modmod_one.
otwo.
modmod_two.
o下一个示例单独编译每个单元,并将它们链接在一起.
在编译main.
f90时,编译器在当前的目录中搜索one.
mod和two.
mod.
编译在USE语句中引用这些模块的任何文件之前,必须先编译这些文件.
链接步骤要求模块实现目标文件mod_one.
o和mod_two.
o与所有其他目标文件一起出现以创建可执行文件.
4.
9.
1搜索模块在使用本版本的SunONEStudio7Fortran95编译器时,可以将.
mod文件存储在归档(.
a)文件中.
要在归档中搜索模块,必须在命令行的-Mpath标记中显式地指定它.
在缺省情况下,编译器并不搜索归档文件.
而是仅搜索与USE语句中出现的名称相同的.
mod文件.
例如,Fortran95语句USEmymod导致编译器缺省搜索模块文件mymod.
mod.
在搜索过程中,编译器为在其中写入模块文件的目录指定更高的优先级.
可以使用-moddir=dir选项标记和MODDIR环境变量对它进行控制.
这意味着,如果仅指定了-Mpath选项,则首先搜索当前目录,然后再搜索-M标记上列出的目录和文件.
4.
9.
2-use=list选项标记-use=list标记强制将一个或多个隐式的USE语句加入到每个使用该标记编译的子程序或模块子程序中.
通过使用该标记,在库或应用程序的某个功能要求使用某个模块或模块文件时,不必修改源程序.
使用-use=module_name进行编译与将USEmodule_name添加到编译的每个子程序或模块中具有相同的效果.
使用-use=module_file_name进行编译与为module_file_name文件中包含的每个模块添加USEmodule_name具有相同的效果.
demo%f95-cmod_one.
f90mod_two.
f90demo%f95-cmain.
f90demo%f95-omainmain.
omod_one.
omod_two.
o第4章Fortran95功能和差异4-234.
9.
3fdumpmod命令可使用fdumpmod(1)命令显示有关已编译模块信息文件的内容的信息.
fdumpmod命令将在单个.
mod文件、拼接.
mod文件形成的文件以及.
mod文件的.
a归档中显示有关模块的信息.
显示包含模块名称、版本号、目标体系结构以及指示模块兼容的编译选项的标记.
详细信息,请参阅fdumpmod(1)手册页.
4.
10内部函数f95支持某些特定的内在过程,它们是超出标准的扩展.
有关内部函数(包括Fortran95编译器可识别的Fortran77内部函数)更完整的讨论,请参阅《Fortran库参考》.
demo%fdumpmodx.
modgroup.
modx1.
0v8,i4,r4,d8,n16,a4x.
modgroup1.
0v8,i4,r4,d8,n16,a4group.
mod表4-4非标准的内部函数Name定义函数类型参数类型参数说明COT余切实型实型([X=]x)P,EDDIM正偏差双精度双精度([X=]x,[Y=]y)P,ELEADZ获取前导0的位数整型布尔、整型、实型或指针([I=]i)NP,IPOPCNT获取设置位的数量整型布尔、整型、实型或指针([I=]i)NP,IPOPPAR计算位总体奇偶性整型布尔、整型、实型或指针([X=]x)NP,I有关上表的说明:P名称可以作为参数传递.
NP名称不能作为参数传递.
E在运行时调用内部函数的外部代码.
If95为内在过程生成内联代码.
4-24Fortran用户指南2005年1月4.
11向前兼容性将来的f95版本在源代码上将与该版本兼容.
不能保证此f95版本生成的模块信息文件与未来的版本兼容.
4.
12混合语言在Solaris系统上,可以将使用C编写的例程与Fortran程序结合起来,因为这些语言具有相同的调用惯例.
有关C和Fortran例程如何进行交互操作的详细信息,请参阅《Fortran编程指南》中的"C-Fortran接口"一章.
5-1第5章FORTRAN77兼容性:迁移到Fortran95Fortran95编译器f95可编译大多数传统的FORTRAN77程序,其中包括利用f77编译器以前编译的非标准扩展的程序.
f95可直接接受很多的FORTRAN77功能.
其他功能要求在FORTRAN77兼容性模式(f95-f77)下进行编译.
本章介绍f95接受的FORTRAN77功能,并列出与f95不兼容的那些f77功能.
有关f77编译器接受的任何非标准FORTRAN77扩展的详细信息,请参阅位于以下网址的《FORTRAN77语言参考》手册:http://docs.
sun.
com/source/806-3594/index.
html.
有关f95编译器接受的其他Fortran95语言扩展的信息,请参阅第4章.
f95可编译符合标准的FORTRAN77程序.
为确保连续可移植性,利用非标准FORTRAN77功能的程序应该迁移到符合标准的Fortran95中.
在使用-ansi选项进行编译时,程序中所有非标准的用法都将被标记出来.
5.
1兼容的f77功能f95直接接受或在-f77兼容性模式下编译时接受FORTRAN77编译器f77的以下非标准功能:源代码格式续行可以在第一列中以'&'开头.
[-f77=misc]包含文件中的第一行可以是续行.
[-f77=misc]请使用f77制表符格式.
[-f77=tab]制表符格式可以将源代码行扩展到第72列以后.
[-f77=tab]如果字符串扩展到续行上,则f95制表符格式不会对这些字符串进行填充直至第72列.
[-f77]5-2Fortran用户指南2005年1月I/O:在Fortran95中,可以使用ACCESS='APPEND'打开文件.
列表控制的输出使用与f77编译器类似的格式.
[-f77=output]f95允许在直接存取文件中使用BACKSPACE,但不允许使用ENDFILE.
f95允许在格式编辑描述符中隐式地指定字段宽度.
例如,允许使用FORMAT(I).
f95可识别输出格式中的f77换码序列(例如,\n\t\').
[-f77=backslash]f95可识别OPEN语句中的FILEOPT=.
f95允许使用STATUS='KEEP'来关闭SCRATCH(临时)文件[-f77].
在程序退出时,不会删除临时文件.
在使用-f77进行编译时,也可以使用FILE=name来打开SCRATCH(临时)文件.
允许对内部文件使用直接I/O.
[-f77]f95识别FORTRAN77格式编辑描述符A、$和SU.
[-f77]FORM='PRINT'可以出现在OPEN语句中.
[-f77]f95可识别传统的FORTRAN输入/输出语句ACCEPT和TYPE.
可使用-f77=output进行编译以写出FORTRAN77风格的NAMELIST输出.
在仅指定ERR=(没有IOSTAT=或END=分支)的情况下,当检测到EOF时,READ将ERR=分支作为END=处理.
[-f77]在OPEN语句中,接受VMSFortranNAME='filename'.
[-f77]f95接受READ()或WRITE()后面的一个额外逗号.
[-f77]END=分支可以出现在具有REC=的直接存取READ中.
[-f77=input]允许使用格式编辑描述符Ew.
d.
e,并将其作为Ew.
d.
Ee处理.
[-f77]可以在输入语句的FORMAT中使用字符串.
[-f77=input]IOSTAT=说明符可以出现在ENCODE/DECODE语句中.
在ENCODE/DECODE语句中允许使用列表控制的I/O.
在I/O语句中用作逻辑单元时,星号(*)可用于表示STDIN和STDOUT.
数组可以出现在FMT=说明符中.
[-f77=misc]PRINT语句接受名称列表组名称.
[-f77=output]编译器接受FORMAT语句中多余的逗号.
在执行NAMELIST输入时,如果输入问号(),就会响应正在读取的名称列表组的名称.
[-f77=input]数据类型、声明和用法:在程序单元中,IMPLICIT语句可以放在单元中任何其他声明语句的后面.
f95接受IMPLICITUNDEFINED语句.
f95接受AUTOMATIC语句(FORTRAN77扩展).
f95接受STATIC语句,并且对其做与SAVE语句类似的处理.
第5章FORTRAN77兼容性:迁移到Fortran955-3f95接受VAXSTRUCTURE、UNION和MAP语句.
(请参阅第4-11页第4.
4节的"STRUCTURE和UNION(VAXFortran)")LOGICAL和INTEGER变量可以互换使用.
[-f77=logical]INTEGER变量可以出现在条件表达式中,如DOWHILE.
[-f77=logical]Cray指针可以出现在内部函数调用中.
f95可接受类型声明中使用斜杠的数据初始化.
例如:REALMHW/100.
101/,ICOMX/32.
223/f95允许将Cray字符指针赋值给非指针变量以及其他非字符的Cray指针.
f95允许相同的Cray指针指向不同类型大小的项目(例如,REAL*8和INTEGER*4).
在将Cray指针声明为POINTER的程序单元中,可以将其声明为INTEGER.
INTEGER声明将被忽略.
[-f77=misc]Cray指针可以用于除法和乘法运算.
[-f77=misc]ASSIGN语句中的变量可以是INTEGER*2类型.
[-f77=misc]交替RETURN语句中的表达式可以是非整数类型.
[-f77=misc]具有SAVE属性的变量可以等价于COMMON块的元素.
相同数组的初始化函数可以是不同的类型.
示例:REAL*8ARR(5)/12.
31,3,5.
D0,9/名称列表项目的类型声明可以放在NAMELIST语句后面.
f95接受BYTE数据类型.
f95允许将非整数用作数组下标.
[-f77=subscript]f95允许将关系运算符.
EQ.
和.
NE.
用于逻辑操作数.
[-f77=logical]f95可接受传统的f77VIRTUAL语句,并将它作为DIMENSION语句处理.
可以使用与f77编译器兼容的方式等价处理不同的数据结构.
[-f77=misc]与f77编译器类似,f95允许很多内部函数出现在PARAMETER语句的初始化表达式中.
f95允许将整数值赋值给CHARACTER*1变量.
[-f77=misc]BOZ常量可用作指数.
[-f77=misc]可以将BOZ常量赋值给字符变量.
例如:character*8chch="12345678"XBOZ常量可以用作内部函数调用的参数.
[-f77=misc]可以使用DATA语句中的整数值来初始化字符变量.
变量中的第一个字符将被设置为该整数值,而字符串的其余部分将填充空白(如果字符串多于一个字符的话).
可以将一个霍尔瑞斯字符的整数数组用作格式描述符.
[-f77].
如果常量折叠产生浮点异常,则在编译时不进行常量折叠.
[-f77=misc]5-4Fortran用户指南2005年1月在使用-f77=misc进行编译时,f95自动以f77编译器的方式,将赋值、数据和参数语句中的REAL常量提升为适当的种类(REAL*8或REAL*16).
[-f77=misc]在赋值GOTO中允许使用等价变量.
[-f77]可以将非常量字符表达式赋值给数值变量.
在使用-f77=misc进行编译时,允许在类型声明中将*kind放在变量名称后面.
[-f77=misc].
例如:REALY*4,X*8(21))INTEGERFUNCTIONFOO*8(J)字符子串可以作为隐含DO目标出现在DATA语句中.
[-f77=misc]例如:DATA(a(i:i),i=1,n)/n*í+í/括号内的整数表达式可以作为类型大小出现.
例如:PARAMETER(N=2)INTEGER*(N+2)K程序、子例程、函数和可执行语句:f95不要求PROGRAM语句具备name.
CALL语句可以将函数当作子例程进行调用.
[-f77]对函数不一定要定义其返回值.
[-f77]交替返回说明符(*label或&label)可以出现在实际参数列表中,也可以出现在不同位置上.
[-f77=misc]%VAL可以用于类型为COMPLEX的参数.
[-f77=misc]可以使用%REF和%LOC.
[-f77=misc]子例程可以递归调用其自身,而无需使用RECURSIVE关键字对自身进行声明.
[-f77=misc]但是,还应该使用-xrecursive标记对执行间接递归(例程A调用例程B,而例程B又调用例程A)的程序进行编译以使其正确工作.
即使当伪参数列表中没有交替返回列表时,也可以调用具有交替返回的子例程.
在使用-f77=misc进行编译时,可以使用类型不是INTEGER或REAL的参数来定义statement函数;实际参数将被转换为statement函数所定义的类型.
[-f77=misc]允许使用空实际参数.
例如:CALLFOO(I,,,J)在第一个I和最后一个J参数之间使用了两个空的参数.
f95将函数%LOC()调用作为LOC()调用处理.
[-f77=misc]允许在另一个运算符(如**或*)后面使用一元加法和一元减法.
即使当第一个参数为COMPLEX类型时,也允许CMPLX()内部函数使用第二个参数.
在这种情况下,使用第一个参数的实部.
[-f77=misc]允许CHAR()内部函数的参数超过255,并且只生成警告而不生成错误.
[-f77=misc]允许移位计数为负,并且只生成警告而不生成错误.
在当前目录以及-I选项中指定的目录中搜索INCLUDE文件.
[-f77=misc]第5章FORTRAN77兼容性:迁移到Fortran955-5允许进行连续的.
NOT.
运算,如.
NOT.
.
NOT.
.
NOT.
(I.
EQ.
J).
[-f77=misc]杂项f95通常不会将进度消息发送到标准输出.
而f77编译器则发送进度消息,并显示它所编译的例程的名称.
在使用-f77兼容性标记进行编译时,保留了这一惯例.
f77编译器编译的程序并不捕获算术异常,而是在退出时自动调用ieee_retrospective来报告在执行过程中可能发生的任何异常.
使用-f77标记进行的编译将模拟f77编译器的这种行为.
在缺省情况下,f95编译器捕获遇到的第一个算术异常,并且不调用ieee_retrospective.
在需要更高精度的上下文中,f77编译器处理REAL*4常量的方式就好像它具有更高的精度一样.
在使用-f77标记进行编译时,如果将REAL*4常量与双精度或四精度操作数一起使用,则f95编译器允许该常量分别具有双精度或四精度.
允许在循环中重新定义DO循环变量.
[-f77=misc]显示所编译的程序单元的名称.
[-f77=misc]允许在DIMENSION语句之后声明DIMENSION语句中使用的变量类型.
示例:SUBROUTINEFOO(ARR,G)DIMENSIONARR(G)INTEGERGRETURNEND有关非标准语言扩展的语法和语义的详细信息,请参阅位于以下网址的《FORTRAN77语言参考》:http://docs.
sun.
com/source/806-3594/index.
html.
5.
2不兼容问题下面列出了在使用此版本的f95编译和测试传统f77程序时出现的已知不兼容问题.
这些问题是由于f95中缺少相当的功能或者行为方式不同造成的.
这些项目是f77中支持的Fortran77非标准扩展,但在f95中不支持这些项目.
源代码格式在指定-f77选项时,如果名称长度超过6个字符,则会发出ANSI警告.
I/O:f95不允许对直接存取文件使用ENDFILE.
f95无法识别在直接存取I/O中指定记录编号时使用的'n格式:READ(2'13)X,Y,Zf95无法识别传统f77"R"格式编辑描述符.
f95不允许在CLOSE语句中使用DISP=说明符.
不允许在WRITE语句中使用位常量.
5-6Fortran用户指南2005年1月Fortran95NAMELIST不允许使用长度可变的数组和字符串.
使用RECL=1打开的直接存取文件不能用作"流"文件.
应使用FORMAT='STREAM'.
Fortran95将非法I/O说明符报告为错误.
而f77只发出警告.
数据类型、声明和用法:f95只允许7个数组下标;而f77允许20个.
f95不允许在PARAMETER语句中使用非常量.
不能在CHARACTER类型声明的初始化函数中使用整数值.
REAL()内部函数返回复数参数的实部,而不是将参数转换为REAL*4.
当参数为DOUBLECOMPLEX或COMPLEX*32时,这将导致不同的结果.
Fortran95不允许在数组声明之前在边界表达式中使用数组元素.
例如:程序、子例程、函数和语句:名称的最大长度为127个字符.
命令行选项:f95无法识别f77编译器选项-dbl-oldstruct-i2-i4,以及-vax的一些子选项.
f95不支持的f77库例程:POSIX库.
IOINIT()库例程.
磁带I/O例程topen、tclose、twrite、tread、trewin、tskipf、tstate.
start_iostats和end_iostats库例程.
f77_init()函数.
f95不允许通过使用相同名称定义用户自己的例程来绕过IEEE_RETROSPECTIVE子例程.
subroutines(i1,i2)integeri1(i2(1):10)dimensioni2(10).
.
.
错误:"I2"已经被用作函数,因此不得为其声明显式形状DIMENSION属性.
end第5章FORTRAN77兼容性:迁移到Fortran955-75.
3与f77编译的例程链接要混合使用f77和f95目标二进制文件,请使用带有-xlang=f77选项的f95编译进行链接.
即使主程序是f77程序,也使用f95执行链接步骤.
示例:编译使用f77目标文件的f95主程序.
f95程序中可以使用FORTRAN77库和内部函数,《Fortran库参考手册》中列出了这些库和内部函数.
示例:f95主程序调用FORTRAN77库中的例程.
请参阅dtime(3F).
5.
3.
1Fortran95内部函数Fortran95标准支持FORTRAN77中没有的内部函数.
《Fortran库参考》手册中介绍了完整的Fortran95内部函数集,其中包括非标准的内部函数.
如果在程序中将《Fortran库参考》中列出的任何内部函数名称用作函数名称,则必须添加EXTERNAL语句才能使f95使用您的例程而不是内在例程.
demo%catm.
f95CHARACTER*74::c='Thisisatest.
'CALLecho1(c)ENDdemo%f95-xlang=f77m.
f95sub77.
odemo%a.
outThisisatest.
demo%demo%cattdtime.
f95REALe,dtime,t(2)e=dtime(t)DOi=1,100000as=as+cos(sqrt(float(i)))ENDDOe=dtime(t)PRINT*,'elapsed:',e,',user:',t(1),',sys:',t(2)ENDdemo%f95tdtime.
f95demo%a.
outelapsed:0.
14,user:0.
14,sys:0.
0E+0demo%5-8Fortran用户指南2005年1月《Fortran库参考》还列出了以前版本的f77编译器能够识别的所有内部函数.
f95编译器也将这些名称识别为内部函数.
如果使用-f77=intrinsics进行编译,则会将编译器识别的内部函数限定在f77编译器已知的函数范围内,而忽略Fortran95内部函数.
5.
4有关迁移到f95编译器的附加说明floatingpoint.
h头文件替代f77_floatingpoint.
h,在源程序中应按如下方式使用它:#include"floatingpoint.
h"格式为f77/文件名的头文件引用应改为删除f77/目录路径.
某些利用了非标准别名设置技术(通过对数组进行重复索引或重叠Cray或Fortran指针)的程序可使用相应的-xalias标记进行编译.
请参阅第3-48页"-xalias[=keywords]".
《Fortran编程指南》中有关移植"过时软件"程序的章节用示例讨论了这一问题.
A-1附录A运行时错误消息本附录介绍Fortran95运行时I/O库和操作系统生成的错误消息.
A.
1操作系统错误消息操作系统错误消息包括系统调用失败、C库错误和shell诊断.
可在intro(2)中找到系统调用错误消息.
通过Fortran库进行的系统调用并不直接生成错误消息.
Fortran库中的以下系统例程将调用C库例程,而这些库例程生成错误消息:显示以下消息:integersystem,statusstatus=system("cpafilebfile")print*,"status=",statusendcp:cannotaccessafilestatus=512A-2Fortran用户指南2005年1月A.
2f95运行时I/O错误消息f95I/O库在运行时检测到错误的时候发出诊断信息.
以下是一个使用Fortran95编译和运行的示例:因为f95消息包含对原始源代码文件名和行号的引用,所以应用程序开发人员应该考虑在I/O语句中使用ERR=子句以软件方式捕获运行时I/O错误.
表A-1列出了f95发出的运行时I/O消息.
demo%catwf.
fWRITE(6)1ENDdemo%f95-owfwf.
fdemo%wf******FORTRAN运行时系统******错误1003:格式化单元上的未格式化I/O位置:在"wf.
f"的第一行中的WRITE语句单元:6文件:标准输出Abort表A-1f95运行时I/O消息错误消息1000格式错误1001非法单元编号1002未格式化单元上的格式化I/O1003格式化单元上的未格式化I/O1004顺序存取单元上的直接存取I/O1005直接存取单元上的顺序存取I/O1006设备不支持BACKSPACE1007偏离记录开始1008无法stat文件1009重复计数后没有*1010记录过长1011截断失败附录A运行时错误消息A-31012无法理解的列表输入1013可用空间不足1014单元未连接1015读取意外的字符1016非法逻辑输入字段1017"新"文件存在1018无法找到"旧"文件1019未知系统错误1020需要寻找能力1021非法参数1022负重复计数1023通道或设备非法操作1024可重入I/O1025不兼容的说明符处于打开状态1026名称列表非法输入1027FILEOPT参数中有错误1028不允许写入1029不允许读取1030输入时整数溢出1031输入时浮点溢出1032输入时浮点下溢1051缺省的输入单元已关闭1052缺省的输出单元已关闭1053来自未连接单元的直接存取READ1054来自未连接单元的直接存取WRITE1055无联系的内部单元1056对内部单元的空引用1057空内部文件1058未格式化单元上的列表控制I/O1059未格式化单元上的名称列表I/O表A-1f95运行时I/O消息(续)错误消息A-4Fortran用户指南2005年1月1060试图在内部文件的结束之后写入1061无联系的ADVANCE说明符1062ADVANCE说明符不是'YES'或'NO'1063前进式输入中存在EOR说明符1064前进式输入中存在SIZE说明符1065记录编号为负数或零1066记录不在文件中1067被破坏的格式1068无联系的输入变量1069I/O列表项多于数据编辑描述符1070在下标三元组中有零跨距1071在隐含DO循环中有零步长1072负的字段宽度1073零宽度字段1074输入时遇到了字符串编辑描述符1075输入时遇到了霍尔瑞斯编辑描述符1076在数字串中未发现数字1077在指数中未发现数字1078比例因子超出范围1079数字等于或超出基数1080在整数字段中有意外的字符1081在实数字段中有意外的字符1082在逻辑字段中有意外的字符1083在整数值中有意外的字符1084在实数值中有意外的字符1085在复数值中有意外的字符1086在逻辑值中有意外的字符1087在字符值中有意外的字符1088在NAMELIST组名前有意外的字符1089NAMELIST组名不匹配程序中的名称表A-1f95运行时I/O消息(续)错误消息附录A运行时错误消息A-51090在NAMELIST项中有意外的字符1091在NAMELIST项名中有不配对的括号1092变量不在NAMELIST组中1093NAMELIST对象名中的下标过多1094NAMELIST对象名中的下标不够1095NAMELIST对象名中有零跨距1096NAMELIST对象名中有空段下标1097NAMELIST对象名中的下标超出界限1098NAMELIST对象名中有空子串1099NAMELIST对象名中的子串超出范围1100NAMELIST对象名中有意外的组件名1111无联系的ACCESS说明符1112无联系的ACTION说明符1113无联系的BINARY说明符1114无联系的BLANK说明符1115无联系的DELIM说明符1116无联系的DIRECT说明符1117无联系的FILE说明符1118无联系的FMT说明符1119无联系的FORM说明符1120无联系的FORMATTED说明符1121无联系的NAME说明符1122无联系的PAD说明符1123无联系的POSITION说明符1124无联系的READ说明符1125无联系的READWRITE说明符1126无联系的SEQUENTIAL说明符1127无联系的STATUS说明符1128无联系的UNFORMATTED说明符1129无联系的WRITE说明符表A-1f95运行时I/O消息(续)错误消息A-6Fortran用户指南2005年1月1130零长度的文件名1131ACCESS说明符不是'SEQUENTIAL'或'DIRECT'1132ACTION说明符不是'READ'、'WRITE'或'READWRITE'1133BLANK说明符不是'ZERO'或'NULL'1134DELIM说明符不是'APOSTROPHE'、'QUOTE'或'NONE'1135意外的FORM说明符1136PAD说明符不是'YES'或'NO'1137POSITION说明符不是'APPEND'、'ASIS'或'REWIND'1138RECL说明符为零或负数1139直接存取文件未指定记录长度1140意外的STATUS说明符1141连接的单元指定了状态且不是'OLD'1142STATUS说明符不是'KEEP'或'DELETE'1143为临时文件指定了状态'KEEP'1144状态值不可能1145为临时文件指定了文件名1146正在试图打开正被读取或写入的单元1147正在试图关闭正被读取或写入的单元1148正在试图打开目录1149状态为'OLD'且文件为不存在的符号连接1150状态为'NEW'且文件为符号连接1151没有可用的临时文件名1152缺省单元的说明符ACCESS='STREAM'1153对缺省单元的流存取1161设备不支持REWIND1162BACKSPACE需要读取许可1163直接存取单元上的BACKSPACE1164二进制单元上的BACKSPACE1165退格时遇到了文件结束1166ENDFILE需要写入许可表A-1f95运行时I/O消息(续)错误消息附录A运行时错误消息A-71167直接存取单元上的ENDFILE1168对顺序或直接存取单元的流存取1169对未连接单元的流存取1170对流存取单元的直接存取1171POS说明符的值不正确1172无联系的ASYNCHRONOUS说明符1173无联系的DECIMAL说明符1174无联系的IOMSG说明符1175无联系的ROUND说明符1176无联系的STREAM说明符1177ASYNCHRONOUS说明符不是'YES'或'NO'1178ROUND说明符不是'UP'、'DOWN'、'ZERO'、'NEAREST'、'COMPATIBLE'或'PROCESSOR-DEFINED'1179DECIMAL说明符不是'POINT'或'COMMA'1180流存取单元的OPEN语句中不允许RECL说明符1181正在试图分配一个已分配的数组1182正在释放一个无联系的指针1183正在释放一个未分配的可分配数组1184正在通过指针来释放一个可分配数组1185正在释放一个未由ALLOCATE语句分配的对象1186正在释放一个对象的一部分1187正在释放的对象比分配的大1191未分配的数组被传递给数组内函数1192非法等级1193源大小较小1194数组大小为零1195形状中有负元素1196非法种类1197非整合的数组1213未连接单元上的不同步I/O1214同步单元上的不同步I/O表A-1f95运行时I/O消息(续)错误消息A-8Fortran用户指南2005年1月1215数据编辑描述符与I/O列表项类型不兼容1216当前I/O列表项不匹配任何数据编辑描述符2001无效的常数、结构或组件名2002未创建句柄2003字符参数太短2004数组参数太长或太短2005文件、记录或目录流结束2021锁定未初始化(OpenMP)2122使用锁定变量时死锁(OpenMP)2123未设锁定(OpenMP)表A-1f95运行时I/O消息(续)错误消息B-1附录B功能版本历史本附录列出了此版本和以前版本的Fortran95编译器中的新增功能和经修改的功能.
Fortran95编译器版本8.
1是随SunStudio10发布的一个组件.
B.
1SunStudio10Fortran发行版本:使用AMD-64处理器编译此版本引入了-xarch=amd64和-xtarget=opteron以编译在64位x86平台上运行的应用程序.
Big-endian和Little-endian平台之间的文件共享新的编译器标志-xfilebyteorder提供了跨平台的二进制I/O文件支持.
OpenMP在Solaris操作系统x86平台上可用对于此SunStudio发行版本,可以使用OpenMPAPI在Solarisx86平台以及SolarisSPARC平台上实现共享内存并行操作.
这两种平台现在都启用相同的功能.
不再支持OpenMP选项-openmp=stubsOpenMP"存根"库是为了方便用户而提供的.
要编译调用OpenMP库函数但忽略OpenMPpragma的OpenMP程序,请使用-openmp选项编译该程序,并使用libompstubs.
a库链接对象文件.
例如:%f95omp_ignore.
c-lompstubs不支持同时使用libompstubs.
a和OpenMP运行时库libmtsk.
so进行链接,这种链接方式可能会出现意外操作.
B-2Fortran用户指南2005年1月B.
2SunStudio9Fortran发行版本:在x86Solaris平台发行的Fortran95编译器:此发行版本的SunStudio使Fortran95编译器可在SolarisOSx86平台上使用.
用-xtarget值(generic、native、386、486、pentium、pentium_pro、pentium3或pentium4)进行编译,可以在Solarisx86平台上生成可执行文件.
x86平台上的缺省值为-xtarget=generic.
以下f95功能尚未在x86平台上实现,只能在SPARC平台上使用:区间运算(编译器选项-xia和-xinterval)四倍(128位)运算(例如REAL*16)IEEE内模块IEEE_EXCEPTIONS、IEEE_ARITHMETIC和IEEE_FEATURESsun_io_handler模块并行化选项(如-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.
提高了运行时性能:采用此发行版本后,大多数应用程序的运行时性能应有显著提高.
为获得最佳效果,请用较高的优化级别-xO4或-xO5进行编译.
在这些优化级别上,编译器现在可以内联包含的过程,以及那些带假定形式参数、可分配参数或指针参数的过程.
Fortran2003命令行内部函数:Fortran2003标准草案引入了三个新的内部函数,来处理命令行参数和环境变量.
这三个函数已在本发行版本的f95编译器中实现.
新增的内部函数包括:GET_COMMAND(command,length,status)以命令形式返回调用该程序的整个命令行.
GET_COMMAND_ARGUMENT(number,value,length,status)以值的形式返回命令行参数.
GET_ENVIRONMENT_VARIABLE(name,value,length,status,trim_name)返回环境变量的值.
新增和更改的命令行选项:以下f95命令行选项是此发行版本中新增的选项:请参阅第3章了解详细信息.
附录B功能版本历史B-3-xipo_archive={none|readonly|writeback}允许交叉文件优化包括归档库(.
a).
(仅适用于SPARC)-xprefetch_auto_type=[no%]indirect_array_access为间接访问的数组生成间接预取.
(仅适用于SPARC)-xprofile_pathmap=collect_prefix:use_prefix设置配置文件数据的路径映射.
如果分析的目录不是以前采用-xprofile=collect进行编译时使用的目录,请使用-xprofile_pathmap选项和-xprofile=use选项.
在此发行版本的f95中,以下命令行选项缺省值已更改.
-xprefetch的缺省值为-xprefetch=no%auto,explicit.
-xmemalign的缺省值为-xmemalign=8i;在使用其中一个-xarch=v9选项进行编译时,缺省值为-xmemalign=8f.
在使用其中一个-xarch=v9选项进行编译时,-xcode的缺省值为abs44.
要使用以前的编译器版本中使用的缺省值进行编译,请明确指定以下选项:要进行32位编译,请指定-xarch=v8-xmemalign=4s-xprefetch=no要进行64位编译,请指定-xcode=abs64-xprefetch=no缺省SPARC架构是V8PLUS:缺省SPARC架构不再是V7.
此版本的SunStudio9对-xarch=v7的支持有限.
新的缺省值为V8PLUS(UltraSPARC).
使用-xarch=v7编译将被视作使用-xarch=v8编译,因为Solaris8OS只支持-xarch=v8或更高版本.
要在SPARCV8系统(如SPARCStation10)上进行部署,请明确指定使用-xarch=v8编译.
提供的系统库将在SPARCV8架构上运行.
要在SPARCV7系统(如SPARCStation1)上进行部署,请明确指定使用-xarch=v7编译.
提供的系统库将使用SPARCV8指令集.
对于SunStudio9发行版,只有Solaris8OS支持SPARCV7架构.
如果遇到SPARCV8指令,该OS将在软件中解释该指令.
程序将会运行,但性能会下降.
OpenMP:增大了最大线程数:OMP_NUM_THREADS和多任务库的最大线程数量已从128增至256.
OpenMP:自动设置变量的作用域:在此版本的Fortran95编译器中,针对共享内存并行编程的OpenMPAPI实现能够设置并行区域中的变量作用域.
有关详情,请参阅《OpenMPAPI用户指南》.
(此版本只在SPARC平台上实现了OpenMP.
)B-4Fortran用户指南2005年1月B.
3SunStudio8Fortran发行版本:增强的-openmp选项:-openmp选项标记经过增强,便于调试OpenMP程序.
要使用dbx调试OpenMP应用程序,请使用以下编译选项:-openmp=noopt-g然后就可以使用dbx在并行区内设置断点,并显示变量的内容.
请参阅第3-36页"-openmp[={parallel|noopt|none}]".
多进程编译:带-xipo指定-xjobs=n,过程间优化器调用至多n个代码生成器实例来编译命令行所列的文件.
该选项可大大缩短在多CPU机器上生成较大应用程序所需的时间.
请参阅第3-67页"-xjobs=n".
使用PRAGMAASSUME作断言:ASSUMEpragma是本发行版本编译器的新特性.
该pragma提示编译器在编译过程中某些点上的条件程序员确信为真.
这有助于编译器更好地优化代码.
程序员也可以使用断言在程序运行时检查程序的合理性.
请参阅第2-12页"ASSUME指令"和第3-53页"-xassume_control[=keywords]".
更多Fortran2000功能:在此版本的Fortran95编译器中,已经实现了Fortran2000草案标准中的以下功能.
第4章中描述了这些功能.
异常和IEEE运算:新增的内部模块IEEE_ARITHMETIC和IEEE_FEATURES在Fortran语言中提供了对异常和IEEE运算的支持.
请参阅第4-14页第4.
6.
2节的"IEEE浮点异常处理".
与C之间的互操作性:新的Fortran草案标准提供了一种引用C语言过程的方法,以及一种指定Fortran子程序可从C函数引用的方法.
它还提供了一种声明与外部C变量链接的全局变量的方法.
请参阅第4-14页第4.
6.
1节的"与C函数之间的互操作性".
PROTECTED属性现在,Fortran95编译器接受Fortran2000的PROTECTED属性.
PROTECTED对模块实体的使用进行了限制.
具有PROTECTED属性的对象只能在声明这些对象的模块中定义.
第4-15页第4.
6.
4节的"PROTECTED属性".
ASYNCHRONOUSI/O说明符编译器可识别I/O语句中的ASYNCHRONOUS说明符:ASYNCHRONOUS=['YES'|'NO']附录B功能版本历史B-5此语法是在草案标准中提出的.
请参阅第4-15页第4.
6.
5节的"Fortran2003异步I/O".
与传统f77之间的兼容性更强:很多新增功能增强了Fortran95编译器与传统Fortran77编译器f77之间的兼容性.
其中包括变量格式表达式(VFE)、长标识符、-arg=local和-vax编译器选项.
请参阅第3章和第4章.
I/O错误处理程序:新函数使用户可以为逻辑单元上的带格式输入指定自己的错误处理程序.
传统农历新年将至,国人主机商DogYun(狗云)发来了虎年春节优惠活动,1月31日-2月6日活动期间使用优惠码新开动态云7折,经典云8折,新开独立服务器可立减100元/月;使用优惠码新开香港独立服务器优惠100元,并次月免费;活动期间单笔充值每满100元赠送10元,还可以参与幸运大转盘每日抽取5折码,流量,余额等奖品;商家限量推出一款年付特价套餐,共100台,每个用户限1台,香港VPS年付199元...
HostHatch在当地时间7月30日发布了一系列的促销套餐,涉及亚洲和欧美的多个地区机房,最低年付15美元起,一次买2年还能免费升级双倍资源。商家成立于2011年,提供基于KVM架构的VPS主机,数据中心包括中国香港、美国、英国、荷兰、印度、挪威、澳大利亚等国家的十几个地区机房。官方网站:https://hosthatch.com/NVMe VPS(香港/悉尼)1 CPU core (12.5%...
CloudCone发布了2021年的闪售活动,提供了几款年付VPS套餐,基于KVM架构,采用Intel® Xeon® Silver 4214 or Xeon® E5s CPU及SSD硬盘组RAID10,最低每年14.02美元起,支持PayPal或者支付宝付款。这是一家成立于2017年的国外VPS主机商,提供VPS和独立服务器租用,数据中心为美国洛杉矶MC机房。下面列出几款年付套餐配置信息。CPU:...