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