ループ変換の最適化は,/transform_loops オプションまたは /optimize:5 オプションを使用することで有効となります。ループ変換は,メモリー・システムをより効果的に利用できるようにループを書き換えることで,性能を向上させようと試みます。ループ変換の最適化は,ループを書き換えることにより,実行される命令数を増やすことがあるので,一部のプログラムでは実行時性能が低下する可能性があります。
ソフトウェア・パイプラインなしのループ変換の最適化を要求するには,次のいずれかを行います。
/nopipeline とともに /optimize:5 を指定する (推奨方法)。
/transform_loops とともに /optimize:4,/optimize:3,または /optimize:2 を指定する。この最適化は /optimize:2 よりも下の最適化レベルでは実行されません。
ループ変換の最適化は,ループ内の配列引用に適用されます。これらの最適化はメモリー・システムの性能を向上させることができ,通常は複数のループの入れ子に適用されます。ループ変換の最適化の対象として選択されるループは,つねに繰返し回数付きループです。繰返し回数付きループとは,ループに入る前に繰返し回数がわかるような形で,繰返し回数を数える変数を使用しているループのことです。たとえば,ほとんどの DO ループは繰返し回数付きループです。
一般に,ループ変換の最適化が行われるのを妨げる条件には,インライン展開されない副プログラム引用 (外部関数呼び出しなど),複雑な終了条件,および繰返し回数のないループなどがあります。
/transform_loops に関連付けられた最適化の形式には次のものが含まれます。
現在キャッシュに含まれている配列要素に対してできるだけ多くの演算を行うことで,複次元配列要素でのメモリー・システムの使用量を最小限に抑えることができます。ループのタイル化とも呼ばれます。
1 つのループに含まれている命令を,別の新しいループに移動します。これにより,1 つのループ内で使用されるメモリー量を減らし,残りのメモリーをキャッシュ内に収めることができます。また,ループのブロック化を行う機会を増やすことにもなります。
いくつかの同じメモリー位置を使用する 2 つ以上の隣接するループの命令を組み合わせて,1 つのループにします。これにより,これらのメモリー位置を何度もキャッシュにロードする必要がなくなります。また,命令スケジューリングの機会を増やすことにもなります。
一部または全ループの入れ子の順序を変更します。これにより,ループ実行時の配列要素の参照回数を最小限に抑え,必要なメモリー参照数を減らすことができます。ループ置換とも呼ばれます。
特定の条件下で,配列要素の使用をスカラ変数に置き換えます。
特定の条件下で,内部ループ中の外部ループを展開し,必要な命令とメモリー参照数を最小限に抑えます。これはまた,命令スケジューリングとスカラ置換の機会も増やすことになります。
コンパイラ・オプションの相互作用と,ループ変換の最適化を使ってコンパイルされたプログラムの実行時間の測定についての詳細は,「/[no]transform_loops」を参照してください。