英特尔的pragma simd vs OpenMP的pragma omp simd

时间:2016-01-26 15:31:44

标签: openmp vectorization simd

英特尔编译器允许我们通过

对循环进行矢量化
#pragma simd
for ( ... )

但是,您也可以选择使用OpenMP 4&#39指令执行此操作:

#pragma omp simd
for ( ... )

两者之间有什么区别吗?

2 个答案:

答案 0 :(得分:4)

出于所有意图和目的,它们应该是相同的。不同之处在于OpenMP 4.0 #pragma omp simd指令是可移植的,并且应该与支持OpenMP 4.0以及Intel的其他编译器一起使用。

此外,OpenMP版本中有几个条款允许您以更健壮的方式(safelen()linear()aligned()reduction()和我会想到collapse()

答案 1 :(得分:3)

#pragma simd

- 定位为英特尔C ++ Cilk SIMD扩展(以及数组表示法)的一部分。这种定位看起来有点奇怪,因为Cilk不适用于Fortran,而Fortran Compiler支持大多数相同的指令simd。

#pragma omp simd 

- 是 OpenMP 标准的一部分,因此它在编译器和平台上自然更具可移植性。

通常,英特尔首先在Cilk中推出新功能,然后在OpenMP中推出。原因很自然:接受某些东西作为OpenMP标准的一部分需要时间。例如,simdlen仅在2015年11月的OpenMP4.5中添加,而相同的子句(vectorlength)已经成为3或4年前Cilk pragma的一部分。 simdlen与vectorlength强调了另一个观察结果,即simd和omp simd之间的某些编译指示子句语法可能不同

因此,如果您需要跨编译器的可移植性,请使用OpenMP pragma。但是,如果您尽可能早地访问新的simd编译器功能对您来说更重要,那么您可能更喜欢或选择使用Cilk(专有)编译指示。所有相同的论点和注意事项同样适用于#pragma omp declare simd vs. #pragma declare simd(这应该回答你可能的第二个问题)。

参考" Cilk" pragma simd子句可在此处获取:https://software.intel.com/en-us/node/524555 (我认为它已经过时了;我已经听说过pragma simd的新功能尚未在此链接中反映出来。)