Sun Studio 12 Update 1:Fortran 用户指南

2.5 编译器用法提示

下面几节提供了一些高效使用 Fortran 编译器的建议方法。下一章中给出了完整的编译器选项参考。

2.5.1 确定硬件平台

某些编译器标志允许用户使用一组特定的硬件平台选项来调节代码的生成。编译器的 -dryrun 选项可用来确定本机处理程序:


<sparc>%f95 -dryrun -xtarget=native
###     command line files and options (expanded):
### -dryrun -xarch=v8plusb -xcache=64/32/4:1024/64/4 -xchip=ultra3i

<x64>%f95 -dryrun -xtarget=native
###     command line files and options (expanded):
### -dryrun -xarch=sse2a -xcache=64/64/2:1024/64/16 -xchip=opteron

2.5.2 使用环境变量

可通过设置 FFLAGSOPTIONS 变量来指定选项。

可以在命令行中显式地使用 FFLAGSOPTIONS。在使用 make 的隐式编译规则时,make 程序会自动使用 FFLAGS

示例: 设置 FFLAGS: (C Shell)


demo% setenv FFLAGS ’-fast -Xlist’

示例: 显式地使用 FFLAGS


demo% f95 $FFLAGS any.f

在使用 make 时,如果按上述方式设置了 FFLAGS 变量,而且 makefile 的编译规则是隐式的(即没有显式的编译器命令行),则调用 make 的编译效果与以下命令相当:

f95 -fast -Xlist files

make 是一个功能非常强大的程序开发工具,可以方便地将其用于所有的 Sun 编译器。请参见 make(1) 手册页以及《Fortran 编程指南》中的“程序开发”一章。


注 –

make 使用的缺省隐式规则可能无法识别具有 .f95.mod(模块文件)扩展名的文件。有关详细信息,请参见《Fortran 编程指南》和 Fortran 自述文件。


2.5.3 内存大小

编译可能需要使用大量内存。这取决于选定的优化级别以及所编译文件的大小和复杂性。在 SPARC 平台上,如果优化器内存不足,它将尝试通过在较低的优化级别上重试当前过程来进行恢复,并以命令行上 -On 选项指定的原始级别继续执行后续例程。

运行编译器的处理器应该至少具有 64 兆字节内存;建议使用 256 兆字节内存。此外还应该分配足够的交换空间。最低为 200 MB;建议为 300 MB。

内存使用情况取决于每个过程的大小、优化级别、为虚拟内存设置的限制、磁盘交换文件的大小以及各种其他参数。

在编译包含多个例程的单个源文件时,可能会出现编译器内存或交换空间不足的情况。

如果编译器内存不足,请尝试降低优化级别,或者使用 fsplit(1) 将多例程的源文件分成多个文件,使每个文件包含一个例程。

2.5.3.1 交换空间限制

SunOSTM 操作系统命令 swap -s 显示可用的交换空间。请参见 swap(1M)。

示例: 使用 swap 命令:


demo% swap -s
total: 40236k bytes allocated + 7280k reserved = 47516k used, 1058708k available
To determine the actual real memory:

demo% /usr/sbin/dmesg | grep mem
mem = 655360K (0x28000000)
avail mem = 602476544

2.5.3.2 增加交换空间

使用 mkfile(1M) 和 swap(1M) 可增加工作站上交换空间的大小。您必须成为超级用户才能执行此操作。mkfile 创建一个特定大小的文件,而 swap -a 将该文件添加到系统交换空间中:


demo# mkfile -v 90m /home/swapfile
/home/swapfile 94317840 bytes
demo# /usr/sbin/swap -a  /home/swapfile

2.5.3.3 虚拟内存的控制

-O3 或更高的优化级别编译非常大的例程时,可能需要额外的内存,这可能会降低编译时性能。您可以通过限制单个进程的可用虚拟内存量来控制这种情况。

sh shell 中,请使用 ulimit 命令。请参见 sh(1)。

示例: 将虚拟内存限定为 16 MB:


demo$ ulimit -d 16000

csh shell 中,请使用 limit 命令。请参见 csh(1)。

示例: 将虚拟内存限定在 16 MB 以内:


demo% limit datasize 16M

这些命令行的每一个命令行都会使优化器在数据空间达到 16 MB 时尝试恢复。

此限制值不能大于系统的总可用交换空间,实际上,在进行较大的编译时,此限制值必须足够小才能保证正常地使用系统。请确保没有任何编译占用一半以上的空间。

示例: 对于 32M 的交换空间,请使用以下命令:

sh shell 中:


demo$ ulimit -d 1600

csh shell 中:


demo% limit datasize 16M

最佳设置取决于所请求的优化等级以及可用的实际内存量和虚拟内存量。

在 64 位 Solaris 环境中,应用程序数据段大小的软限制为 2 GB。如果应用程序需要分配更多的空间,请使用 shell 的 limitulimit 命令取消该限制。

对于 csh,请使用:


demo% limit datasize unlimited

对于 shksh,请使用:


demo$ ulimit -d unlimited

有关更多信息,请参见《Solaris(64 位)开发者指南》。