#pragma unrollandfuse

C に適用 C++ に適用

説明

このプラグマは、ネストされた 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_loopnounrollandfusenounrollunroll、または stream_unroll ディレクティブと組み合わせて使用しないでください。

#pragma nounrollandfuse を指定すると、コンパイラーにそのループをアンロールしないように指示します。

  1. 以下の例では、#pragma unrollandfuse ディレクティブがループの本体を複製し、フューズします。これにより、配列 b のキャッシュ・ミスの数が削減されます。
    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 ループは、 #pragma unrollandfuse(2) ディレクティブを上記のループ構造体に適用した場合に考えられる結果を示します。

    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];
        }
    }
     
    
  2. ネストされたループ構造体で、複数の #pragma unrollandfuse ディレクティブを指定することもできます。

    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];
            }
        }
    }
     
    

関連参照

IBM Copyright 2003