/pipeline オプションか /optimize:5 オプションを使用すると,ソフトウェア・パイプラインとそれに付随するソフトウェア依存関係解析が有効になります。ソフトウェア・パイプラインは,一部の場合では,実行時性能を向上させることがあります。
ソフトウェア・パイプライン最適化は,特定の最内部ループに命令スケジューリングを適用します。これにより,ループ内の命令は「ラップ・ラウンド」して,ループの異なる繰り返し中で実行できるようになります。これにより,長待ち時間操作の影響が抑えられ,ループの実行が高速化されます。
ループ展開 (/optimize:3 以上で有効になるもの) は,ループの異なる繰り返し間でスケジューリングを行うことはできません。ソフトウェア・パイプラインはループの異なる繰り返し間でスケジューリングを行うことができるので,より効率的なスケジューリングを実行して,ループ内の命令の機能停止を回避することができます。
たとえば,データの流れをソフトウェア依存関係で解析することによって,一部の計算をそのループの繰り返しの前後で行えることがわかった場合,ソフトウェア・パイプラインはこれらの命令をループの繰り返しの前か後,つまりその実行が命令の機能停止を回避したり,その他の形で性能を向上させられるような場所に再スケジューリングすることができます。
また,ソフトウェア・パイプラインはデータの先取りを行うことで,キャッシュ不足の影響を減らすことができます。
ソフトウェア・パイプラインは,/pipeline (または /optimize:5) を,目的のプロセッサーに応じた /tune:keyword と組み合わせることで,より高い効果を発揮することができます (「特定のプロセッサーに合わせて最適化されたコードの要求」を参照)。
ソフトウェア・パイプラインをループ変換の最適化なしで指定するには,次のいずれかを行います。
/notransform_loops とともに /optimize:5 を指定します (推奨方法)。
/pipeline とともに /optimize:4,/optimize:3,または /optimize:2 を指定します。この最適化は /optimize:2 よりも下の最適化レベルでは実行されません。
Visual Fortran では,ソフトウェア・パイプラインの対象として選択されるループは次の特徴を備えています。
つねに最内部ループ (最も多く実行されるもの)
飛越しや手続呼び出しを含んでいない
COMPLEX 浮動小数点データを使用していない
ソフトウェア・パイプラインは,展開されないループを変更し,必要に応じて展開されないループの前後に命令を挿入することで,一般に実行時性能を向上させることができます。ただし,ループが多数の既存の重複した演算とともに多数の命令を含んでいる場合,実行の性能を効果的に向上させるには,レジスタ数が足りなくなることがあります。/optimize:5 (または /pipeline) を使用したときの実行時性能は,/optimize:4 を使用したときほど性能を向上させないことがあります。
使用可能なレジスタを使い尽くすようなループを含んでいるプログラムの場合,/optimize:5 または /pipeline を使ったことで,実行時間が長くなることがあります。性能が向上しない場合,/optimize:5 または /pipeline とともに /unroll:1 オプションを指定してコンパイルを行うことで,ソフトウェア・パイプラインの効果が改善されることがあります。
関連情報
コマンド行オプションの相互作用と,ソフトウェア・パイプラインを使ってコンパイルされたプログラムの実行時間の測定についての詳細は,「/[no]pipeline (ia64 のみ)」を参照してください。