Intel 的 pragma simd 与 OpenMP 的 pragma omp simd

Intel's pragma simd vs OpenMP's pragma omp simd

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

向量化循环
#pragma simd
for ( ... )

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

#pragma omp simd
for ( ... )

两者有什么区别吗?

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

此外,OpenMP 版本中有几个子句允许您以更稳健的方式向量化指令(safelen()linear()aligned()reduction() ,然后 collapse() 浮现在脑海中)。

#pragma simd

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

#pragma omp simd 

- 是 OpenMP 标准的一部分,因此它自然更易于跨编译器和平台移植。

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

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

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