问题描述
#pragma simd
#pragma可以在icc编译器中使用simd pragma simd reduction(+:acc)
#pragma ivdep
for(int i(0); i {
acc + = x [i ]。
}
在msvc或/和gcc中是否有任何等效的解决方案?
参考(p28):
GCC绝对可以进行矢量化。假设你有文件reduc.c的内容:
int foo(int * x,int N)
{
int acc,i;
for(i = 0; i {
acc + = x [i];
}
return acc;
}
使用命令行编译它(我使用gcc 4.7.2) p>
$ gcc -O3 -S reduc.c -ftree-vectorize -msse2
现在你可以在汇编中看到矢量化的循环。
你也可以打开verbose矢量输出,
$ gcc -O3 -S reduc.c -ftree-vectorize -msse2 -ftree-vectorizer -verbose = 1
现在您将获得控制台报告:
在reduc.c处分析循环:5
在reduc.c中向量化循环:5
5:LOOP VECTORIZED。
reduc.c:1:注意:向量化函数中的1个循环。
,以更好地了解GCC可以矢量化和无法矢量化的情况。
simd pragma can be used with icc compiler to perform a reduction operator:
#pragma simd
#pragma simd reduction(+:acc)
#pragma ivdep
for(int i( 0 ); i < N; ++i )
{
acc += x[i];
}
Is there any equivalent solution in msvc or/and gcc?
Ref(p28): http://d3f8ykwhia686p.cloudfront.net/1live/intel/CompilerAutovectorizationGuide.pdf
GCC definitely can vectorize. Suppose you have file reduc.c with contents:
int foo(int *x, int N)
{
int acc, i;
for( i = 0; i < N; ++i )
{
acc += x[i];
}
return acc;
}
Compile it (I used gcc 4.7.2) with command line:
$ gcc -O3 -S reduc.c -ftree-vectorize -msse2
Now you can see vectorized loop in assembler.
Also you may switch on verbose vectorizer output say with
$ gcc -O3 -S reduc.c -ftree-vectorize -msse2 -ftree-vectorizer-verbose=1
Now you will get console report:
Analyzing loop at reduc.c:5
Vectorizing loop at reduc.c:5
5: LOOP VECTORIZED.
reduc.c:1: note: vectorized 1 loops in function.
Look at the official docs to better understand cases where GCC can and cannot vectorize.
这篇关于“simd reduction(:)”的存在在GCC和MSVC?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!