unroll/nounroll

カウントされたループをアンロールする [しない] ようにコンパイラーに指示します。

構文

#pragma unroll

#pragma unroll(n)

#pragma nounroll

引数

n

ループを何回アンロールするかを表すアンロール要素です。0 から 255 までの整数定数です。

説明

unroll[n] プラグマは、コンパイラーに、カウントされたループをアンロールする回数を伝えます。

unroll プラグマは、各 FOR ループが動作する FOR 文の前になければなりません。n が指定されると、最適化機構はループを n 回アンロールします。n が省略されるか、n が有効範囲外の場合、最適化機構はループをアンロールする回数を割り当てます。

このプラグマは、オプション O3 が設定された場合のみサポートされます。unroll プラグマは、コマンドラインから行われるループアンロールの設定を変更します。

プラグマは最内ループの入れ子と外側のループの入れ子に適用できます。外側のループの入れ子に適用された場合は、現在の実装では完全な外側のループアンロールがサポートされます。ループの入れ子の内側は、まったくアンロールされないか、または部分的にアンロールされます。コンパイラーは、n とループカウンターを比較することによって、正しいコードを生成します。

ループをアンロールすることでレジスターとコードサイズが増える場合は、ループアンロールを抑止する必要があります。この場合は、nounroll プラグマを使用してください。nounroll プラグマは、指定したループをアンロールしないようにコンパイラーに指示します。

例 1: 最内ループアンロールにおける unroll プラグマの使用

void unroll(int a[], int b[], int c[], int d[])
{
  #pragma unroll(4)
  for (int i = 1; i < 100; i++) {
    b[i] = a[i] + 1;
    d[i] = c[i] + 1;
  }
}

例 2: 最内ループアンロールにおける unroll プラグマの使用

例 2 では、#pragma unroll を最初の for ループの前に配置すると、コンパイラーにより外側のループが完全にアンロールされます。#pragma unroll が内側の for ループの前と外側の for ループの前に配置された場合は、コンパイラーは内側の for ループの unroll プラグマを無視します。#pragma unroll が最内ループのみに配置された場合は、コンパイラーはいくつかの要因に従って最内ループをアンロールします。

int m = 0;
int dir[4]= {1,2,3,4};
int data[10];
#pragma unroll (4)  // outer loop unrolling
  for (int i = 0; i < 4; i++)
  {
     for (int j = dir[i]; data[j]==N ; j+=dir[i])
        m++;
  }

関連情報


このヘルプトピックについてのフィードバックを送信

© 1996-2010 Intel Corporation. 無断での引用、転載を禁じます。