ループアンスイッチング

ループ内の条件文に対するコンパイラの最適化

ループアンスイッチングはコンパイラの最適化です。ループ本体を複製し、条件文のif節とelse節のそれぞれにそのバージョンを配置することで、ループ内の条件文をループ外に移動します。[1]これにより、ループの並列化が向上します。現代のプロセッサはベクトルを効率的に処理できるため、この最適化によってプログラム速度が向上します。

簡単な例を挙げましょう。2つの配列xyを加算し、変数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]

参考文献

  1. ^ クーパー、キース、トルゾン、リンダ (2004). コンパイラのエンジニアリング. エルゼビア. ISBN 9781558606982
  2. ^ 「GCC 3.4 リリース シリーズ - 変更点、新機能、修正 - GNU プロジェクト」。
「https://en.wikipedia.org/w/index.php?title=Loop_unswitching&oldid=1309574403」から取得