3

simd プラグマを icc コンパイラで使用して、リダクション演算子を実行できます。

#pragma simd
#pragma simd reduction(+:acc)
#pragma ivdep
for(int i( 0 ); i < N; ++i )
{
  acc += x[i];
}

msvcまたは/およびgccに同等のソリューションはありますか?

参照 (p28): http://d3f8ykwhia686p.cloudfront.net/1live/intel/CompilerAutovectorizationGuide.pdf

4

3 に答える 3

2

GCC は間違いなくベクトル化できます。次の内容のファイル reduce.c があるとします。

int foo(int *x, int N)
  {
    int acc, i;

    for( i = 0; i < N; ++i )
      {
        acc += x[i];
      }

    return acc;
  }

コマンドラインでコンパイルします(gcc 4.7.2を使用しました):

$ gcc -O3 -S reduc.c -ftree-vectorize -msse2

これで、アセンブラーでベクトル化されたループを確認できます。

また、詳細なベクトライザー出力をオンにすることもできます

$ gcc -O3 -S reduc.c -ftree-vectorize -msse2 -ftree-vectorizer-verbose=1

これで、コンソール レポートが表示されます。

Analyzing loop at reduc.c:5
Vectorizing loop at reduc.c:5
5: LOOP VECTORIZED.
reduc.c:1: note: vectorized 1 loops in function.

GCC がベクトル化できるケースとできないケースをよりよく理解するには、公式ドキュメントを参照してください。

于 2013-07-12T06:16:04.900 に答える
1

gcc では、#pragma omp simd reduction の使用に関係なく、この最適化を有効にするために -ffast-math が必要です (上記の参考文献に記載されています)。icc は、この最適化のためにプラグマにあまり依存しなくなりつつあります (プラグマがない場合に /fp:fast が必要になることを除いて) が、元の投稿の余分な ivdep および simd プラグマは望ましくありません。icc は、関連するすべての削減、firstprivate、および lastprivate 節を含まないプラグマ simd を指定すると、悪いことをする可能性があります (また、gcc は -ffast-math で、特に -march または -mavx と組み合わせて壊れる可能性があります)。msvc 2012/2013 では、自動ベクトル化が非常に制限されています。simd リダクション、OpenMP 並列領域内のベクトル化、条件のベクトル化はありません。

于 2015-05-23T13:39:03.033 に答える