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