Fortran User's Guide

Compiler Usage Tips

The next sections suggest a number of ways to use the Sun Fortran compilers efficiently. A complete compiler options reference follows in the next chapter.

Determining Platform Hardware

Some compiler flags allow the user to tune code generation to a specific set of hardware platform options. The utility command fpversion displays the hardware platform specifications for the native processor:


demo% fpversion
 A SPARC-based CPU is available.
 CPU's clock rate appears to be approximately 356.2 MHz.
 Kernel says CPU's clock rate is 360.0 MHz.
 Kernel says main memory's clock rate is 120.0 MHz.

 Sun-4 floating-point controller version 0 found.
 An UltraSPARC chip is available.
 FPU's frequency appears to be approximately 369.5 MHz.

 Use "-xtarget=ultra2i -xcache=16/32/1:2048/64/1" code option.

 Hostid = 0x808Z2211.

It may take a number of seconds before fpversion responds while it dynamically calculates apparent hardware clock rates of the CPU and FPU. (The values printed depend on the load on the system at the moment fpversion is called.)

See fpversion(1) and the Numerical Computation Guide for details.

Simplifying Options

You can simplify complicated compiler commands by defining special shell aliases or using the $FFLAGS environment variable.

Using Aliases (C Shell)

Example: Define an alias for a command with frequently used options:


demo% alias f77fx "f77 -silent -fast -Xlist"

Example: Using the alias f77fx:


demo% f77fx any.f

The command f77fx is now the same as:

f77 -silent -fast -Xlist any.f

Using Environment Variables

You can specify options by setting the FFLAGS or OPTIONS variables.

Either FFLAGS or OPTIONS can be used explicitly in the command line. When you are using make files implicit compilation rules, FFLAGS is used automatically by the make program.

Example: Set FFLAGS: (C Shell)


  demo% setenv FFLAGS '-silent -fast -Xlist'

Example: Use FFLAGS explicitly:


  demo% f77 $FFLAGS any.f

When using make, if the FFLAGS variable is set as above and the makefile's compilation rules are implicit, that is, there is no explicit f77/f90 compile line, then invoking make will result in a compilation equivalent to:

f77 -silent -fast -Xlist files...

make is a very powerful program development tool that can easily be used with all Sun compilers. See the make(1) man page and the Program Development chapter in the Fortran Programming Guide.

Memory Size

A compilation may need to use a lot of memory. This will depend on the optimization level chosen and the size and complexity of the files being compiled. On SPARC platforms, if the optimizer runs out of memory, it tries to recover by retrying the current procedure at a lower level of optimization and resumes subsequent routines at the original level specified in the -On option on the command line.

A workstation should have at least 24 megabytes of memory; 32 megabytes are recommended. Memory usage depends on the size of each procedure, the level of optimization, the limits set for virtual memory, the size of the disk swap file, and various other parameters.

Compiling a single source file containing many routines could cause the compiler to run out of memory or swap space.

If the compiler runs out of memory, try reducing the level of optimization, or split multiple-routine source files into files with one routine per file, using fsplit(1).

Swap Space Limits

The SunOS command, swap -s, displays available swap space. See swap(1M).

Example: Use the swap command:


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

Increasing Swap Space

Use mkfile(1M) and swap(1M) to increase the size of the swap space on a workstation. You must become superuser to do this. mkfile creates a file of a specific size, and swap -a adds the file to the system swap space:


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

Control of Virtual Memory

Compiling very large routines (thousands of lines of code in a single procedure) at optimization level -O3 or higher may require an unreasonable amount of memory. In such cases, performance of the system may degrade. You can control this by limiting the amount of virtual memory available to a single process.

Each of these command lines causes the optimizer to try to recover at 16 Mbytes of data space.

This limit cannot be greater than the system's total available swap space and, in practice, must be small enough to permit normal use of the system while a large compilation is in progress.

Be sure that no compilation consumes more than half the space.

Example: With 32 Mbytes of swap space, use the following commands:

In a sh shell:


demo$ ulimit -d 1600

In a csh shell:


demo% limit datasize 16M

The best setting depends on the degree of optimization requested, and the amount of real memory and virtual memory available.

In 64-bit Solaris 7 environments, the soft limit for the size of an application data segment is 2 Gbytes. If your application needs to allocate more space, use the shell's limit or ulimit command to remove the limit. For csh use:


demo% limit datasize unlimited

or for sh, ksh:


demo$ ulimit -d unlimited

See the Solaris 7 64-bit Developer's Guide for more information.