3

simd pragma 可以与 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

3

对于 Visual Studio 2012:使用选项/O1 /O2/GL,报告矢量化使用/Qvec-report:(1/2)

int s = 0; 
for ( int i = 0; i < 1000; ++i ) 
{ 
s += A[i]; // vectorizable 
}

在减少“ float”或“ double”类型的情况下,向量化需要/fp:fast抛出开关。这是因为矢量化归约操作取决于“浮点重新关联”。/fp:fast仅在抛出时才允许重新关联

参考(相关文档;p12)http://blogs.msdn.com/b/nativeconcurrency/archive/2012/07/10/auto-vectorizer-in-visual-studio-11-cookbook.aspx

于 2013-07-13T11:05:41.603 回答
2

GCC 绝对可以矢量化。假设您有包含内容的文件 reduc.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 需要 -ffast-math 来启用此优化(如上面给出的参考中所述),无论使用#pragma omp simd reduction。icc 对这种优化的 pragma 的依赖性越来越低(除了 /fp:fast 在没有 pragma 的情况下需要),但原始帖子中额外的 ivdep 和 simd pragma 是不可取的。当给出不包括所有相关归约、firstprivate 和 lastprivate 子句的 pragma simd 时,icc 可能会做坏事(并且 gcc 可能会与 -ffast-math 中断,特别是与 -march 或 -mavx 结合使用)。msvc 2012/2013 在自动矢量化方面非常有限。没有 simd 缩减,OpenMP 并行区域内没有向量化,没有条件向量化,

于 2015-05-23T13:39:03.033 回答