ループアンスイッチングはコンパイラの最適化です。ループ本体を複製し、条件文のif節とelse節のそれぞれにそのバージョンを配置することで、ループ内の条件文をループ外に移動します。[1]これにより、ループの並列化が向上します。現代のプロセッサはベクトルを効率的に処理できるため、この最適化によってプログラム速度が向上します。
簡単な例を挙げましょう。2つの配列xとyを加算し、変数wの値に応じて何らかの処理を実行したいとします。次のようなCコードになります。
bool w ; int x [ 1000 ]; int y [ 1000 ]; for ( int i = 0 ; i < 1000 ; i ++ ) { x [ i ] += y [ i ]; if ( w ) { y [ i ] = 0 ; } }
このループ内の条件文により、このループを安全に並列化することが困難になっています。ループのスイッチを解除すると、次のようになります。
bool w ; int x [ 1000 ]; int y [ 1000 ]; if ( w ) { for ( int i = 0 ; i < 1000 ; i ++ ) { x [ i ] += y [ i ]; y [ i ] = 0 ; } } else { for ( int i = 0 ; i < 1000 ; i ++ ) { x [ i ] += y [ i ]; } }
ループの切り替えによって記述されるコードの量が 2 倍になる可能性がありますが、これらの新しいループはそれぞれ個別に最適化される可能性があります。
ループアンスイッチングはgccバージョン3.4で導入されました。[2]
参考文献
- ^ クーパー、キース、トルゾン、リンダ (2004). コンパイラのエンジニアリング. エルゼビア. ISBN 9781558606982。
- ^ 「GCC 3.4 リリース シリーズ - 変更点、新機能、修正 - GNU プロジェクト」。