omp simd early_exit

複数の終了ポイントを持つループのベクトル化を許可するように #pragma omp simd を拡張します。

構文

#pragma omp simd early_exit

説明

複数の終了ポイントを持つループのベクトル化を許可するように #pragma omp simd を拡張します。この節を指定すると、プログラムは次のように振る舞います。

次の例は、このプラグマの使用方法を示します。

次の例でプラグマは、ループの上限条件 j < ub が false になる前にループが終了する場合であっても、for ループのベクトル実行が安全であることを示します。j1lbub の間の最小の j.で、jb[j] <= 0 であると仮定します。j1j1+1j1+2、… が同じ (最後の) SIMD チャンク内にある場合、b[j1]b[j1+1]b[j1+2]、… の読み取りと続く <= 0 の評価は、同じループをスカラー実行した場合とは異なり、無条件に発生します。そのようなベクトル評価の安全性を確保するのは、プログラマーの責任です。必要に応じて、simdlen() 節を使用して SIMD チャンクサイズを制御できます。

void foo(int lb, int ub) {
  float a = 0;
  #pragma omp simd early_exit reduction(+:a)
      for(j=lb; j<ub; j++) { 
          if (b[j] <= 0 ) 
              break;
          a += b[j];
     } 
}