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 中)。
英特尔编译器允许我们通过
向量化循环#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 中)。