英特尔编译器允许我们通过
对循环进行矢量化#pragma simd
for ( ... )
但是,您也可以选择使用OpenMP 4&#39指令执行此操作:
#pragma omp simd
for ( ... )
两者之间有什么区别吗?
答案 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的新功能尚未在此链接中反映出来。)