Loading article…
ループ分割は、コンパイラの最適化手法です。ループを複数のループに分割し、同じ本体を持ちながらインデックス範囲の連続する異なる部分を反復処理することで、ループを簡素化したり、依存関係を排除したりします。
ループピーリング
ループ ピーリングは、ループ分割の特殊なケースであり、問題のある最初の (または最後の) 数回の反復をループから分割し、ループ本体の外部で実行します。
ループが次のように記述されているとします。
int p = 10 ; for ( int i = 0 ; i < 10 ; ++ i ) { y [ i ] = x [ i ] + x [ p ]; p = i ; }
p = 10最初の反復のみ、および他のすべての反復では、であることに注意してください。コンパイラは、ループから最初の反復
を巻き戻すp = i - 1(または「剥がす」)ことでこれを利用できます。
最初の反復をピールした後、コードは次のようになります。
y [ 0 ] = x [ 0 ] + x [ 10 ]; for ( int i = 1 ; i < 10 ; ++ i ) { y [ i ] = x [ i ] + x [ i -1 ]; }
pこの同等の形式では、ループ本体内の
変数が不要になります。
ループピーリングはgccバージョン3.4で導入されました。より一般的なループ分割はGCC 7で追加されました。[1]
この用語の簡単な歴史
どうやら「ピーリング」という用語は、1976 年に Cannings、Thompson、Skolnick [2]が(人間の) 遺伝の計算モデルに関する論文で初めて使用したようです。この論文では、表現型情報を親に集約する方法を表すためにこの用語が使用されました。その後、この用語は、複雑な家系図の確率関数に関する画期的な論文を含む、彼らの論文で再び使用されました[3] 。
コンパイラ技術において、この用語は1980年代後半のVLIWおよびスーパースカラーコンパイルに関する論文[4]や[5]で初めて登場しました。
参考文献
- ^ GCC 7 リリース シリーズ — 変更点、新機能、修正点 - GNU プロジェクト
- ^ Cannings, C.; Thompson, EA; Skolnick, HH (1976). 「複雑な家系図における尤度の再帰的導出」.応用確率論の進歩. 8 (4): 622– 625. doi :10.2307/1425918. JSTOR 1425918.
- ^ Cannings, C.; Thompson, EA; Skolnick, HH (1978). 「複雑な家系図上の確率関数」.応用確率論の進歩. 10 (1): 26– 61. doi :10.2307/1426718. JSTOR 1426718.
- ^ Callahan, D.; Kennedy, Ken (1988). 「分散メモリマルチプロセッサ向けプログラムのコンパイル」. The Journal of Supercomputing . 2 (2): 151– 169. doi :10.1007/BF00128175. S2CID 10214341.
- ^ Mahlke, SA; Lin, DC; Chen, WY; Hank, RE; Bringman, RA (1992).ハイパーブロックを使用した述語実行の効果的なコンパイラサポート。第25回マイクロアーキテクチャ国際シンポジウム。pp. 45– 54。
さらに読む
- Kennedy, Ken ; Allen, Randy (2002)。「第 5.7 章 インデックス セットの分割 - 第 5.7.2 章 ループ ピーリング」。最新アーキテクチャ向けのコンパイラの最適化: 依存関係ベースのアプローチ(2011 年第 1 版のデジタル印刷)。Academic Press / Morgan Kaufmann Publishers / Elsevier。pp . 211–212。ISBN 978-1-55860-286-1LCCN 2001092381 。
