Fortran コンパイラを効果的に利用するための方法をいくつか紹介します。すべてのコンパイラオプションのリファレンスは、次の章に示します。
コンパイラフラグの中には、特定のハードウェアプラットフォームのオプションセットに合わせてコードを生成できるものもあります。コンパイラの -dryrun オプションを使用して、ネイティブプロセッサを特定できます。
<sparc>%f95 -dryrun -xtarget=native ### command line files and options (expanded): ### -dryrun -xarch=sparcvis2 -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 |
FFLAGS または OPTIONS 変数を設定して、オプションを指定することができます。
コマンド行で FFLAGS または OPTIONS のいずれかを明示的に指定できます。make の暗黙のコンパイル規則を使用している場合は、make プログラムによって FFLAGS が自動的に使用されます。
demo% setenv FFLAGS ’-fast -Xlist’ |
例: FFLAGS を明示的に使用します。
demo% f95 $FFLAGS any.f |
make を使用するときに、FFLAGS 変数が前述のように設定されており、メイクファイルの「暗黙」のコンパイル規則が適用される場合 (すなわち「明示的」なコンパイラコマンド行がない場合) に make を実行すると、次のコンパイルを実行した場合と同じ意味になります。
f95 -fast -Xlist files…
make は Sun のすべてのコンパイラで使用できる強力なプログラム開発ツールです。make(1) マニュアルページおよび『Fortran プログラミングガイド』の第 3 章「プログラム開発」の章を参照してください。
make が仮定するデフォルトの暗黙的規則では、.f95 および .mod (モジュールファイル) という拡張子付きのファイルを認識できません。詳細は、『Fortran プログラミングガイド』および Fortran の README ファイルを参照してください。
コンパイル処理は大量のメモリーを使用することがあります。必要なメモリーのサイズは、選択した最適化レベル、およびコンパイルするファイルのサイズや複雑さに依存します。最適化でメモリーが不足した場合、その時点の手続きを低いレベルで最適化し直し、後続のルーチンはコマンド行の -On オプションで指定されていた本来のレベルで最適化を再開します。
コンパイラを実行するプロセッサには最低 64M バイトのメモリーが実装されている必要があります。256M バイトが推奨メモリーです。また、十分なスワップ領域が割り当てられる必要もあります。最低 200M バイトで、300M バイトが推奨値です。
メモリーの使用量は、手続きのサイズ、最適化レベル、仮想メモリーの制限、ディスクのスワップファイルのサイズ、その他さまざまな要素によって異なります。
多数のルーチンを含む単一のソースファイルをコンパイルすると、メモリーやスワップ領域が不足することがあります。
コンパイラのメモリーが不足する場合は、最適化レベルを下げてください。または fsplit(1) を使用して、複数のルーチンが含まれているソースファイルを、1 ルーチンが 1 ファイルに対応するようにいくつかのファイルに分割してください。
Solaris オペレーティングシステムのコマンドである 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 |
ワークステーションのスワップ領域を増やすには、mkfile(1M) と swap(1M) コマンドを使用します。この操作は、スーパーユーザーだけが実行できます。mkfile によって特定サイズのファイルを作成し、swap -a によってそのファイルをシステムのスワップ領域に追加します。
demo# mkfile -v 90m /home/swapfile /home/swapfile 94317840 bytes demo# /usr/sbin/swap -a /home/swapfile |
最適化レベル -O3 以上のレベルで大規模なルーチン (1 つの手続きが数千行ものコードで構成されるルーチン) をコンパイルすると、メモリーがさらに必要になる場合があり、コンパイル時間のパフォーマンスが低下することもあります。これを制御するには、1 つのプロセスで使用できる仮想メモリーの量を制限します。
sh シェルでは、ulimit コマンドを使用します。sh(1) を参照してください。
demo$ ulimit -d 16000 |
csh シェルでは、limit コマンドを使用します。csh(1) を参照してください。
例: 仮想メモリーを 16M バイトに制限します。
demo% limit datasize 16M |
いずれの場合も、オプティマイザは 16M バイトのデータ領域で最適化を再実行します。
この制限はマシンで利用可能なスワップ領域の総量を超えることはできないので、実際は、大規模なコンパイルの進行中であってもマシンを普通に使用できる程度の小さい値を指定してください。コンパイル処理でスワップ領域の半分以上が使用されることのないように注意してください。
例: 32M バイトのスワップ領域のあるマシンでは、次のコマンドを使用します。
sh シェルの場合:
demo$ ulimit -d 1600 |
csh の場合
demo% limit datasize 16M |
最適な設定は、最適化のレベルや、利用可能な実メモリーと仮想メモリーの量によって異なります。
64 ビットの Solaris 環境では、アプリケーションデータセグメントのサイズに対する弱い制限値は 2G バイトです。データ領域の追加割り当てが必要な場合は、シェルの limit または ulimit コマンドを使用して制限を解除します。
csh の場合:
demo% limit datasize unlimited |
sh、ksh の場合:
demo$ ulimit -d unlimited |
詳細は、『Solaris 64 ビット開発ガイド』を参照してください。