#pragma unroll ディレクティブは、プログラム内の最内部または最外部のループをアンロールするために使用し、プログラムのパフォーマンスを向上させるのに役立つものです。
>>-#--pragma--+-nounroll------------+-------------------------->< '-unroll--(--+---+--)-' '-n-'
ここで、n は、ループのアンロール係数です。 C プログラムでは、 値 n は正の整数定数式です。C++ プログラムでは、値 n は正のスカラー整数またはコンパイル時定数の初期設定式です。 アンロール係数 1 はアンロールを使用不可にします。n を指定しないで、-qhot、-qsmp、または -O4 以上を指定した場合、最適化プログラムにより、それぞれのネストされたループごとに、該当するアンロール係数が決定されます。
#pragma unroll および #pragma nounroll ディレクティブは、影響されるループの直前になければなりません。
特定ループに対して、これらのディレクティブのうちの 1 つのみを指定することができます。ループ構造体は、以下の条件を満たしていなければなりません。
ループに #pragma nounroll を指定すると、コンパイラーにそのループをアンロールしないように指示します。 #pragma unroll(1) を指定しても同じ結果になります。
unroll オプションによって、特定のアプリケーションのパフォーマンスが改善されるかどうかを確認するには、まず、通常オプションでプログラムをコンパイルしてから、それを代表的なワークロードで実行してください。次に、コマンド行 -qunroll オプションを指定するか、unroll プラグマを使用可能にして (あるいはその両方を行って)、プログラムを再コンパイルしてから、同じ条件下で再実行して、パフォーマンスが改善されたかどうか確認してください。
#pragma unroll(2) while (*s != 0) { *p++ = *s++; }これを係数 2 でアンロールすると、以下が生成されます。while (*s) { *p++ = *s++; if (*s == 0) break; *p++ = *s++; }
#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]; } }
関連参照