#pragma unroll

C に適用 C++ に適用

説明

#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 プラグマを使用可能にして (あるいはその両方を行って)、プログラムを再コンパイルしてから、同じ条件下で再実行して、パフォーマンスが改善されたかどうか確認してください。

  1. 以下の例では、ループ制御は変更されません。
    #pragma unroll(2)
    while (*s != 0)
    {
      *p++ = *s++;
    }
    
    これを係数 2 でアンロールすると、以下が生成されます。
    while (*s)
    {
      *p++ = *s++;
      if (*s == 0) break;
      *p++ = *s++;
    }
    
  2. この例では、ループ制御が変更されます
    #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];
      } 
    }
    

関連参照

IBM Copyright 2003