for ループに含まれたストリームを複数のストリームに切断します。
>>-#--pragma--stream_unroll--(--+---+--)----------------------->< '-n-'
ここで、n はループのアンロール係数です。C プログラムでは、n の値は正の整数定数式です。C++ プログラムでは、n の値は正のスカラー整数またはコンパイル時の定数初期化式です。 1 のアンロール係数はアンロールを使用不可にします。n が指定されておらず、 -qhot、-qsmp、 または -O4 以上が指定されている場合は、最適化プログラムがそれぞれネストされたループごとに適切なアンロール係数を判別します。
-O3 または -qipa=level=2 のいずれもストリームのアンロールを使用可能にするのに十分ではありません。追加で -qhot または -qsmp を指定するか、最適化レベル -O4 以上を使用してください。
ストリームのアンロールが発生するためには、#pragma stream_unroll ディレクティブが for ループの前に指定される最後のプラグマでなければなりません。 同じ for ループに #pragma stream_unroll を複数回指定したり、それを他のループのアンロール・プラグマ (unroll、nounroll、unrollandfuse、nounrollandfuse) と結合した場合も、XL C から警告が発行されます。XL C++ は同じ for ループに指定された複数のループのアンロール・プラグマのうち最後のプラグマを除き、黙ってすべて無視します。
ストリームのアンロールは、特定の最適化オプションが指定されたコンパイルでも抑制されます。オプション -qstrict が有効な場合、ストリームのアンロールは行われません。したがって、-qhot オプションのみでストリームのアンロールを使用可能にしたい場合は、-qnostrict も指定する必要があります。
以下は、#pragma stream_unroll がどのようにパフォーマンスを改善できるかを示した例です。
int i, m, n; int a[1000][1000]; int b[1000][1000]; int c[1000][1000]; .... #pragma stream_unroll(4) for (i=1; i<n; i++) { a[i] = b[i] * c[i]; }
以下のように、アンロール係数 4 は反復の数を n から n/4 に削減します。
for (i=1; i<n/4; i++) { a[i] = b[i] + c[i]; a[i+m] = b[i+m] + c[i+m]; a[i+2*m] = b[i+2*m] + c[i+2*m]; a[i+3*m] = b[i+3*m] + c[i+3*m]; }
より多くの読み取り操作と保管操作がコンパイラーによって決定された多くのストリームに分散されたことにより、計算時間が削減され、パフォーマンスが改善されます。
関連情報