ループ展開

最適化レベル /optimize:3 以上では,Visual Fortran は一部の最内部ループを展開しようとし,飛越し数を最小限に抑えて,複数の命令を 1 つにグループ化することによって,重複した命令の効率的な実行を可能にします (命令パイプライン)。ループ展開の候補として最も適しているのは,制御の流れが限定されている最内部ループです。

展開されるループが多くなるにつれ,基本ブロックの平均的な大きさが増えます。ループ展開は,効率的なパイプラインが可能になるような形で,ループ本体のコードを複数個コピーします (ループ繰返し)。

ループ本体が,索引式を置き換えて,複数個コピーされます。主となる一連のループ用の第 1 引用として,初期化ループが作成されることがあります。また,残った作業を行うための追加ループが作成されることがあります。

ループが展開される回数は,オプティマイザによって,またはループ展開の上限を指定する /unroll オプションによって決定されます。ユーザーが値を指定しなかった場合,オプティマイザはほとんどのループについては 4 回,一部のループ (コードが大きいと仮定される場合や,ループ外への飛越しがある場合) については 2 回の展開を行います。

一般に,配列演算は命令に展開されると,一連のループの入れ子として表現されます。配列演算の最内部ループは,ループ展開の候補として最も適しています (DO ループなど)。たとえば,次の配列演算は,最適化の後にはループの入れ子として表現されますが,最内部ループはループ展開の候補となります。

	A(1:100,2:30) = B(1:100,1:29) * 2.0