#pragma unroll ディレクティブは、プログラム内の最内部または最外部の for ループをアンロールするために使用され、プログラムのパフォーマンス改善を支援します。
>>-#--pragma--+-nounroll------------+-------------------------->< '-unroll--(--+---+--)-' '-n-'
ここで、n は、ループのアンロール係数です。 C プログラムでは、n の値は正の整数定数式です。C++ プログラムでは、n の値は正のスカラー整数またはコンパイル時の定数初期化式です。 アンロール係数 1 はアンロールを使用不可にします。n が指定されておらず、 -qhot、-qsmp、 または -O4 以上が指定されている場合、 最適化プログラムはそれぞれネストされたループごとに適切なアンロール係数を判別します。
#pragma unroll および #pragma nounroll ディレクティブは、for ループまたは block_loop ディレクティブでのみ使用できます。これは do while および while ループには適用できません。
#pragma unroll および #pragma nounroll ディレクティブは、ループまたは影響を受ける block_loop ディレクティブの直前に現れなければなりません。
1 つの特定のループには、これらのディレクティブの 1 つだけを指定することができます。 ループ構造体は、以下の条件を満たしている必要があります。
ループに #pragma nounroll を指定すると、 コンパイラーにそのループをアンロールしないよう命令します。 #pragma unroll(1) を指定しても同じ結果になります。
unroll オプションによって、 特定のアプリケーションのパフォーマンスが改善されるかどうかを確認するには、 まず、通常オプションでプログラムをコンパイルしてから、 それを代表的なワークロードで実行してください。 次に、コマンド行 -qunroll オプションを指定するか、unroll プラグマを 使用可能にして (あるいはその両方を行って)、プログラムを再コンパイルしてから、同じ条件下で再実行して、 パフォーマンスが改善されたかどうか確認してください。
#pragma unroll(3) for (i=0; i<n; i++) { a[i]=b[i] * c[i]; }3 でアンロールすると、以下が生成されます。
i=0; if (i>n-2) goto remainder; for (; i<n-2; i+=3) { a[i]=b[i] * c[i]; a[i+1]=b[i+1] * c[i+1]; a[i+2]=b[i+2] * c[i+2]; } if (i<n) { remainder: for (; i<n; i++) { a[i]=b[i] * c[i]; } }
関連情報