インテル® C++ コンパイラー 17.0 デベロッパー・ガイドおよびリファレンス

unroll_and_jam/nounroll_and_jam

ループアンロールとジャムを有効/無効にします。 これらのプラグマは、反復される 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];
            }
       }
    } 
}