適切なオプションと複数のソース・ファイルのコンパイル

プログラム開発の初期段階 (ビジュアル開発環境の「Debug」構成など) では,最適化を最小限に抑えてコンパイルを行うことができます。次に例を示します。

	DF /compile_only /optimize:1 sub2.f90
	DF /compile_only /optimize:1  sub3.f90
	DF /exe:main.exe /debug /optimize:0 main.f90  sub2.obj  sub3.obj

プログラム開発の最終段階 (「Release」構成など) では,次の点に注意してください。

複数のソース・ファイルをコンパイルすることで,コンパイラはより多くのコードを最適化の対象として検査することができ,次の結果が生じます。

すべてのソース・ファイルをまとめてコンパイルすることができない場合 (きわめて大きなプログラムなど) でも,ソース・ファイルを個別にコンパイルするのではなく,複数の DF コマンドを使って,互いに関連するソース・ファイルをまとめてコンパイルすることを検討してください。

/compile_only オプションを使ってリンクを禁止するときには,/object:file オプションも使って,複数のソース・ファイルが 1 つのオブジェクト・ファイルにコンパイルされ,より多くの最適化が行われるようにします。

Visual Fortran は,適切な DF コマンド行オプションを指定しないか,「Fortran」タブの「Optimization」カテゴリで対応するビジュアル開発環境オプション (「コンパイラ・オプションのカテゴリ」を参照) を指定しない限り,いくつかの最適化を自動的に実行します。DF コマンド・オプションか,ビジュアル開発環境の「Project Settings」ダイアログボックスの「Fortran」タブを使うと,その他の最適化を有効/無効にすることができます。

次表は,ia32 システムと ia64 システムの両方で,実行時性能を直接向上させることができる DF オプションを示しています。これらのオプションの大部分は結果の精度には影響を与えませんが,実行時性能を向上させると同時に,一部の数値の結果を変えてしまうオプションもあります。

実行時性能に関連するオプション

オプション名 説明 関連情報
/alignment:keyword 共通ブロック,構造型データ,および Compaq Fortran 記録構造体中のデータ項目間で,データ項目を自然に配置するために充填バイトが追加されるかどうかを制御します。 データの位置合わせの注意事項
/architecture:keyword 特定のチップ用のコードを生成するように要求します。ia32 システムに関しては,一部の ia32 チップは特定の種類のアプリケーション性能を向上させる新しい命令を使用しますが,これらの命令は古い ia32 チップではサポートされていません。 /architecture
/fast 次の性能関連のオプションを設定します。
/alignment:(dcommons,records,sequence)
/architecture:host
/assume:noaccuracy_sensitive
/math_library:fast (/check:[no]power の基本設定を変更) /tune:host
各オプションの説明を参照
/assume:noaccuracy
_sensitive
コンパイラが,論理代数学上の同一性規則に基づいてコードの順序を変更し,特定の最適化を行って性能が向上するようにします。中間結果の丸めの方法のために,数値結果は基本設定 (accuracy_sensitive) といくぶん異なることがあります。この数値結果の違いは,ほとんどのプログラムで許容可能なほど小さいものです。 演算順序の変更による最適化
/assume:buffered_io 基本設定では,個々の記録が書き出されるたびに書き出される (フラッシュされる) 記録を,バッファに蓄積して,1 つの単位として書き出すようにします。バッファリング付きの書き出しにより,通常は,より大きなデータ・ブロックがディスクに書き出され,書き出しの回数が減るために,ディスク I/O の効率が向上します。 記録バッファとディスク I/O を効率的に使用する
/inline:all 正しいコードが生成されるという前提で,インライン展開が可能なすべての呼び出しをインライン展開します。一部の再帰ルーチンは,無限ループを避けるためにインライン展開されません。 手続のインライン展開の制御
/inline:speed プログラムの大きさが大幅に増えることと引き換えに,実行時性能を向上させるような手続のインライン展開を行います。 手続のインライン展開の制御
/inline:size プログラムの大きさを大幅に増やすことなく,実行時性能を向上させるような手続のインライン展開を行います。この形式のインライン展開は,最適化レベル optimize:4 または /optimize:5 で行われます。 手続のインライン展開の制御
/math_library:fast ia32 システムでは,性能を向上させるために,数学ライブラリーに対する引数を検証しないように要求します。 /math_library
/optimize:level 最適化レベルを,したがって実行される最適化形式を制御します。基本最適化レベルは /optimize:4 ですが,/debug を指定した場合,基本最適化レベルが /optimize:0 (最適化なし) に変更されます。/optimize:5 を使うと,ループ変換の最適化と (ia64 システムでは) ソフトウェア・パイプライン最適化が有効になります。 最適化レベル:/optimize:num オプション
/pipeline (ia64 のみ) ia64 システムでソフトウェア・パイプライン最適化を有効にします (/optimize:5 のサブセット)。 /[no]pipeline (ia64 のみ)
/transform_loops いくつかのループ変換の最適化を有効にします (/optimize:5 のサブセット)。 /[no]transform_loops
/tune:keyword プログラムを実行するプロセッサー (チップ) アーキテクチャーを指定し,オプティマイザが最も効率的なコードを作成するために必要な命令チューニング最適化に関する決定を行えるようにします。キーワードを使うと,1 つの特定のプロセッサー・タイプ,複数のプロセッサー・タイプ,またはコンパイルに使用しているプロセッサー・タイプを指定することができます。/tune:keyword の設定がどうであろうと,ia32 システムでコンパイルして生成されたコードは,ia32 アーキテクチャーのすべての実装上で正常に動作します。 特定のプロセッサーに合わせて最適化されたコードの要求
/unroll:num 最適化レベル /optimize:3 以上を指定したときに,ループが展開される回数 (num) を指定します。/unroll:num を省略すると,オプティマイザがループを展開する回数を決定します。特に ia32 システムでは,基本展開回数の上限を増やすと,一部アプリケーションの実行時性能が向上することがあります。 ループ展開

次表は,ia32 システムと ia64 システムでプログラムの性能を低下させる可能性のあるオプションを示しています。浮動小数点例外処理を必要とする一部のアプリケーションは,最適な結果をもたらすものとは別の /fpe:n オプションを使用しなければならないことがあります。また,アプリケーションによっては,互換性上の理由から,/assume:dummy_aliases オプションや /vms オプションを使わなければならないことがあります。この表に示しているその他のオプションは,主にトラブルシューティングやデバッグの目的に用意されているものです。

実行時性能を低下させるオプション

オプション名 説明 関連情報
/assume:dummy_aliases コンパイラは,手続への仮引数が,他の仮引数と,または参照結合,親子結合,あるいは共通ブロック結合を通して共有された変数と,メモリー位置を共有していると仮定します。このプログラム解釈は性能を低下させるので,/assume:dummy_aliases は,このような別名に依存している,呼び出される側の副プログラムにのみ使用するようにしてください。仮別名化は,FORTRAN 77 および Fortran 90 標準に違反していますが,一部の古いプログラムでは使用されていることがあります。 仮別名化の仮定
/compile_only 複数のソース・ファイルをコンパイルするときに /compile_only を使用する場合,複数のソース・ファイルが 1 つのオブジェクト・ファイルにまとめてコンパイルされるように /object:file も指定するようにしてください。複数の DF コマンドを使ったり,/compile_only/object:file オプションなしで使って別々にコンパイルを行うと,一部の手続間の最適化が行われなくなります。 適切なオプションと複数のソース・ファイルのコンパイル
/check:bounds 実行時に配列境界検証を行うための追加コードを生成します。 /[no]check
/check:overflow 実行時に算術オーバーフローの整数計算を検証するための追加コードを生成します。プログラムのデバッグが終了したら,このオプションを取り除くことで,実行形式プログラムの大きさを減らし,実行時性能を若干向上させることができます。 /[no]check
/fpe:n ia32 システムでは,/fpe:3 が最適な性能を提供します。他の /fpe 値を使うと,プログラムの実行速度が低下します。

ia64 システムでは,/fpe:0 が最適な性能を提供します。/fpe:3 を指定したプログラムでは,実行時性能に大きな影響が及ぶ可能性があります。

/fpe
/debug:full/debug
またはこれと等価なオプション
オブジェクト・ファイル中に追加のシンボル表を生成します。また,/debug を指定すると,基本最適化レベルが /optimize:0 に下がります。 /[no]debug
/inline:none
/inline:manual
すべての手続のインライン展開を禁止します (文関数を除く)。 手続のインライン展開の制御
/optimize:0
/optimize:1
/optimize:2
/optimize:3
最適化レベルを低下させ,実行される最適化形式を減らします。プログラム開発の初期の段階で,またはデバッガーを使用するときに使用します。 /[no]optimize
最適化レベル:/optimize:num オプション
/vms 位置合わせを含めて,いくつかの VMS に関連した実行時の省略時の設定を制御します。/vms オプションを指定する場合,最適な実行時性能を得るために,/align:records オプションも指定する必要があります。 /[no]vms

複数のファイルのコンパイルについての詳細は,「最適化のためのコンパイルとリンク」を参照してください。