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 プラグマは、指定したループをアンロールしないようにコンパイラーにヒントを与えます。

例: unroll_and_jam プラグマの使用

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];

            }

       }

    }

}

関連情報