OpenMP指令的含义:不要进行向量化

5

我有一个循环的迭代次数非常低,向量化并不能提高性能,但是编译器仍然对其进行了向量化。有没有一种可移植的方法告诉编译器不要向量化循环,与#pragma omp simd相反的功能。


1
据我所知,一般没有这种方法。通常的方式是禁用某些优化,这取决于编译器。但总的来说,您不希望这样做,因为结果可能也依赖于平台。当编译器启发式算法无法正确衡量解决方案的成本时会出现这种情况。报告此类问题可以帮助编译器编写者改进他们的算法。 - Jérôme Richard
1个回答

5

如果您使用支持 OpenMP API 版本 5.1 的编译器,则应接受此代码:

#pragma omp simd if(simd:0)
for (...) { ... }

这样可以禁用与simd构造相关的循环向量化。

请参阅OpenMP规范中的simd构造


非常有趣。它适用于GCC >=9.2和Clang >=11.0。不幸的是,它还不能与最新版本的ICC一起使用(我猜这很快就会实现,因为据我所知,ICC的新版本现在基于Clang)。这里有一个例子:https://godbolt.org/z/M5advh1d6。 - Jérôme Richard
如果你不能使用 #pragma novector 作为解决方法,我可以联系英特尔OpenMP编译器团队,并询问他们何时会实现它。你试过ICX了吗? - Michael Klemm
1
刚刚检查了ICX,它也支持if(simd:0)语法并禁用矢量化。 - Michael Klemm
1
@JérômeRichard 英特尔的编译器名称可能会让您感到困惑。icc是“经典”的非LLVM基础编译器,并将保持不变。icx是较新的基于LLVM的编译器。因此,您不应该期望在icc中出现LLVM功能,而是在icx中出现。 - Jim Cownie
除了OpenMP标准中的语法解释之外,是否有关于if(simd:...)实际操作的文档? - Bogi
它在5.2规范文档的第235页上说:“当存在if子句并且评估为false时,无论是否指定simdlen子句,优选要同时执行的迭代次数为1。” - Michael Klemm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接