インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
ループアンロールとジャムを有効/無効にします。これらのプラグマは、反復される for ループにのみ適用できます。
#pragma unroll_and_jam #pragma unroll_and_jam(n) #pragma nounroll_and_jam |
n |
ループを何回アンロールするかを表すアンロール要素です。0 から 255 までの整数定数でなければなりません。 |
unroll_and_jam プラグマは、入れ子構造の中で、最内ループから 1 つまたは複数外側のループを部分的にアンロールして、結果として残ったループを融合/ジャムします。この変換により、ループでの再使用率を向上できます。
このプラグマは、最内ループでは効果がありません。コンパイラーにより開始された交換が完了した後で、直後に続くループが最内ループではないことを確認してください。
このプラグマを指定すると、コンパイラーにアンロールとジャムが有益であるというヒントを与えます。コンパイラーは可能な限り、この交換を有効にします。
unroll_and_jam プラグマは、それぞれの for ループが動作する for 文の前になければなりません。n が指定されると、最適化はループを n 回アンロールします。n が省略されるか、n が有効範囲外の場合、最適化はループをアンロールする回数を割り当てます。コンパイラーは、n とループカウンターを比較することによって、正しいコードを生成します。
このプラグマは、コンパイラー・オプション O3 が設定された場合のみサポートされます。unroll_and_jam プラグマは、コマンドラインから行われるループアンロールの設定を変更します。
ループをアンロールすることでレジスターとコードサイズが増える場合は、入れ子構造のループや不完全な入れ子構造のループアンロールを抑止する必要があります。このような場合には、nounroll_and_jam プラグマを使用してください。nounroll_and_jam プラグマは、指定したループをアンロールしないようにコンパイラーにヒントを与えます。
novector プラグマの使用例 |
---|
int a[10][10]; int b[10][10]; int c[10][10]; int d[10][10]; void unroll(int n) { int i,j,k; #pragma unroll_and_jam (6) for (i = 1; i < n; i++) { #pragma unroll_and_jam (6) for (j = 1; j < n; j++) { for (k = 1; k < n; k++){ a[i][j] += b[i][k]*c[k][j]; } } } } |