このプラグマは、ネストされた for ループ上で、アンロールおよびフューズ操作を試行するようにコンパイラーに指示します。
>>-#--pragma--+-nounrollandfuse------------+------------------->< '-unrollandfuse--(--+---+--)-' '-n-'
ここで、n はループのアンロール係数です。C プログラムでは、 値 n は正の整数定数式です。C++ プログラムでは、n の値は正のスカラー整数またはコンパイル時定数の初期設定式です。 n を指定しない場合、および -qhot、-qsmp、または -O4 以上を指定した場合、最適化プログラムにより、それぞれのネストされたループごとに該当するアンロール係数が決定されます。
#pragma unrollandfuse ディレクティブは、以下の条件を満たす、ネストされた for ループ構造体の外部ループにのみ適用されます。
ループのアンロールを発生させるには、for ループの前に #pragma unrollandfuse ディレクティブが配置されている必要があります。 #pragma unrollandfuse は、最内部の for ループに対して指定してはなりません。
#pragma unrollandfuse を複数回指定したり、このディレクティブを同じ for ループの block_loop、nounrollandfuse、nounroll、unroll、または stream_unroll ディレクティブと組み合わせて使用しないでください。
#pragma nounrollandfuse を指定すると、コンパイラーにそのループをアンロールしないように指示します。
次の for ループは、 #pragma unrollandfuse(2) ディレクティブを上記のループ構造体に適用した場合に考えられる結果を示します。int i, j; int a[1000][1000]; int b[1000][1000]; int c[1000][1000]; .... #pragma unrollandfuse(2) for (i=1; i<1000; i++) { for (j=1; j<1000; j++) { a[j][i] = b[i][j] * c[j][i]; } }
for (i=1; i<1000; i=i+2) { for (j=1; j<1000; j++) { a[j][i] = b[i][j] * c[j][i]; a[j][i+1] = b[i+1][j] * c[j][i+1]; } }
int i, j, k; int a[1000][1000]; int b[1000][1000]; int c[1000][1000]; int d[1000][1000]; int e[1000][1000]; .... #pragma unrollandfuse(4) for (i=1; i<1000; i++) { #pragma unrollandfuse(2) for (j=1; j<1000; j++) { for (k=1; k<1000; k++) { a[j][i] = b[i][j] * c[j][i] + d[j][k] * e[i][k]; } } }
関連参照