ループアンローリング

ループをほどいて一回のループで複数回分の処理をすると、ループのオーバーヘッドの影響が小さくなるため、処理速度が向上します。ループをほどく回数を変えて、その効果を調べました。

プログラムunroll.c

実行結果(クリックすると詳細な図を表示)

図1.ループアンローリングの効果
図1.ループアンローリングの効果

1つのループの中で8回処理した場合、アンローリングしない場合と比べて約1.2倍高速になりました。なお、Pentium IIIの場合はアンローリングすることで逆に遅くなってしまいました。コード上でアンローリングしなくてもコンパイラで最適化によって同様の処理が行われていて、手動で行うことにより最適化の効率が悪くなったものと思われます。実際、最適化しなかった場合はPentium IIIでもアンローリングにより高速になりました。

Pentium IV上でアンローリングの効果が大きかった理由は、CPUの構造の違いにあるのではないかと考えました。Pentium IVは、パイプラインを多段化してより周波数を上げやすい構造にすることで高速化を図っています。そのため、パイプラインを有効に使えない場合の性能低下が他のCPUに比べて大きく、それがこの結果の違いになったものと思われます。

なお、Microsoftのコンパイラを使った場合、gccと比べてループアンローリングの効果は出にくいようです。gccで試してみたところ、研究室のPentiumIVマシンmahonではアンローリングによって7.4倍になりました。一方、Pentium IIIマシンのbrieでは2.6倍でした。

次に、ループアンローリングをした場合に始めのノルム計算プログラムの速度がどのように変わるのかを調べてみました。

プログラムnorm_unroll.c

実行結果(クリックすると詳細な図を表示)

図2.アンローリングをした場合としない場合の比較
図2.アンローリングをした場合としない場合の比較

アンローリングの成果を始めのノルム計算のプログラムと比べてみると、ピーク時の性能のみが約1.5倍になっていることが分かります。他の部分は、他のオーバーヘッドがあるため、アンローリングの効果は出ていません。


Prev. ライン衝突、TLBあふれ Next 推測結果一覧
性能測定メニューへ戻る

最終更新日:2003/2/7