効率的なコンパイル処理を行うことでパフォーマンスが向上します。プログラムのパフォーマンスを向上させるには、プログラムを分析する前に、まずコンパイル自体を効率的に行うことが大切です。アプリケーションの分析結果に基づいて、インテル® Fortran コンパイラの最適化とコマンドライン・オプションのうち、どれを使用するとアプリケーションのランタイム・パフォーマンスが改善するかを判断することができます。
効率的なコンパイル手法は、プログラム開発の初期および後期の段階で使用できます。
プログラム開発の初期の段階では、最適化を最小限に抑えて増分コンパイルを行うことができます。次に例を示します。
ifort -c -g -O0 sub2.f90 (sub2 のオブジェクト・ファイルを生成)
ifort -c -g -O0 sub3.f90 (sub3 のオブジェクト・ファイルを生成)
ifort -o main -g -O0 main.f90 sub2.o sub3.o
これらのコマンドは -O0 を使用して、コンパイラのデフォルトの最適化オプション (-O2 など) をすべてオフにします。-g オプションを使用すると、プログラムに含まれるすべてのルーチンのオブジェクト・コードにシンボリック・デバッグ情報と行番号を生成し、これをソースレベルのデバッグに使用することができます。3 番目のコマンドで生成される main ファイルにも、シンボリック・デバッグ情報が含まれています。
プログラム開発の後期の段階では、一度に複数のソースファイルを指定して、少なくとも -O2 (デフォルト設定) 以上の最適化レベルを使用することをお勧めします。例えば次のコマンドは、デフォルトの最適化レベルである -O2 を使用して 3 つのソースファイルを一緒にコンパイルします:
ifort -o main main.f90 sub2.f90 sub3.f90
複数のソースファイルをコンパイルすることで、コンパイラが最適化の対象候補となるコードをより多く検証することができ、その結果次のことが可能になります:
より多くのプロシージャのインライン化
より完全なデータフロー解析
リンク中に解決される外部参照数の削減
非常に大きなプログラムの開発では、すべてのソースファイルを一緒にコンパイルすることが実用的ではない場合があります。その場合、各ソースファイルを別々にコンパイルするのではなく、複数の ifort コマンドを使用して関連のあるルーチンを含むソースファイルを一緒にコンパイルすると効率的です。
次の表に、ランタイムのパフォーマンスを直接改善できるオプションをアルファベット順に示します。これらオプションの大半は結果の精度に影響を与えませんが、一部のオプションではランタイムのパフォーマンスを向上させる一方、数値結果が変わる可能性があります。インテル Fortran コンパイラでは、コマンドライン・オプションを使ってオフに設定しない限り、一部の最適化オプションがデフォルトで実行されます。それ以外の最適化オプションは、コマンド・オプションを使用して有効または無効にできます。
オプション |
説明 |
変数と配列のメモリ・レイアウトを分析し、再整理します。 | |
-ax{K|W|N|B|P}
|
アプリケーションのパフォーマンスを特定のプロセッサ用に最適化します。-ax のどれを選択しても、アプリケーションは対象のプロセッサのあらゆる機能を使用するように最適化され、生成されたバイナリファイルはすべての IA-32 プロセッサ上で実行できます。 |
ランタイムのパフォーマンス用の最適化オプション一式を有効にします。 | |
好ましいコードサイズとコードの局所性に最適化します。「-On オプションによる最適化の設定」を参照してください。 | |
速度について最適化します。パフォーマンス関連のオプションを設定します。-On オプションによる最適化の設定。 | |
ループ変換の最適化をアクティブにします。-On オプションによる最適化の設定。 | |
パラレライザが OpenMP* ディレクティブに基づいてマルチスレッド・コードを生成できるようにします。 | |
自動並列化を有効にして、並列で安全に実行できるループのマルチスレッド・コードを生成します。 | |
-qp |
プログラムのソースコードの効率性を高めると、ランタイムのパフォーマンスが向上する可能性が高いプログラムの個所を識別するためのプロファイル情報を要求します。適切なソースコードを修正してから、プログラムを再コンパイルして、ランタイムのパフォーマンスをテストしてください。 |
アプリケーションのパフォーマンスを特定のインテル® プロセッサ用に最適化します。「対象とするプロセッサの指定 (-tpp{n})」を参照してください。 | |
最適化レベルが -O3 に指定された場合、ループをアンロールする回数 (n) を指定します。-unroll オプションで n を省略すると、最適化プログラムがループのアンロール最大回数を判断します。 |
次の表に、ランタイムのパフォーマンス低下につながる可能性のあるオプションをアルファベット順に示します。浮動小数点例外処理や丸め処理が必要なアプリケーションでは、-fpen というダイナミック・オプションの使用が必要となることがあります。その他のアプリケーションは、互換性のため -assume dummy_aliases オプションあるいは -vms オプションが必要な場合があります。ランタイムのパフォーマンス低下につながるその他のオプションは、主にトラブルシューティングやデバッグの目的で使用されます。
次の表に、ランタイムのパフォーマンスを低下させる可能性のあるオプションを示します。
オプション |
説明 |
-assume dummy_aliases |
コンパイラはプロシージャへの仮引数が他の仮引数と、または参照結合、ホスト結合、または共通ブロックを使用して共有した変数とメモリ位置を共有していることを仮定します これらのプログラム・セマンティクスはパフォーマンスを低下させるので、-assume dummy_aliases は、このようなエイリアスに依存する、呼び出される側のサブプログラムにのみ指定してください。 仮エイリアスの使用は Fortran 77 および Fortran 95/90 の各標準に違反しますが、一部の古いプログラムで使用されています。 |
-check bounds |
実行時に配列境界をチェックするための追加コードを生成します。 |
-check overflow |
実行時に算術オーバーフローに対して整数計算をチェックするための追加コードを生成します。プログラムのデバッグが終了したら、このオプションを省略することで、実行ファイルのサイズを小さくして、ランタイムのパフォーマンスを若干向上させることができます。 |
-fpe 3 |
このオプションは、リソースを大量に使用する特定の種類の浮動小数点例外処理を有効にします。 |
オブジェクト・ファイルに追加のシンボルテーブル情報を生成します。このオプションを指定すると、デフォルトの最適化レベルが -O0 または -O0 (最適化なし) に下がります。
-g オプションは、最適化レベルが指定されていない場合にのみパフォーマンスを低下させます。最適化レベルが指定されていないと、-g が -O0 をオンに設定し、その結果コンパイルの速度が低下します。-g、-O2 が指定された場合、コードの実行速度は -g が指定されていない場合とほぼ同じです。 | |
最適化をオフにします。プログラム開発の初期段階や、デバッガを使用する際に指定します。 | |
ローカル変数が、前回の実行が終了した時点の値を維持するようにします。このオプションでは、レジスタではなくメモリで演算が行われ、結果の丸めが頻繁になるので、プログラムから出力される浮動小数点値の結果が変わる可能性があります。 | |
-vms |
特定の VMS に関連した実行時のデフォルト設定 (アライメントを含む) を制御します。-vms オプションを指定する場合、ランタイム・パフォーマンスを最適化するために -align records オプションの併用が必要になることがあります。 |