自动向量化 vs 手写向量化代码

5

手动向量化代码并使用显式的pragma,还是依赖于或使用自动向量化,从某种意义上说哪种更好呢?为了实现最佳性能,使用自动向量化,必须监视编译器输出以确保循环被向量化,或修改它们直到它们可向量化。

通过手工编码,可以确保所需的指令被发出,但现在代码可能不具备可移植性(无法移到其他架构或其他编译器)。

2个回答

14

自动向量化对我来说从未表现良好。目前看来,对我而言,自动向量化似乎只适用于非常简单的循环。

我使用#pragma/intrinsic方法并查看汇编代码。如果编译器生成糟糕的代码(例如将SSE寄存器溢出到堆栈或添加冗余移动),我会为整个循环体使用内联汇编。

可移植性不是问题。通常你从C/C++循环开始,并使用intrinsic进行优化。只需保留旧循环,并将其用作SIMD实现的单元测试/备选项即可。此外,能够通过编译时定义从项目中删除所有SIMD代码总是明智的选择。这样调试应用程序就容易得多了。同样的定义也可以用于交叉编译。


6
过去已经10年了,这个答案还有效吗? - J'e

5
我从不依赖于任何编译器的自动向量化。使用gcc时,我会加倍小心,因为gcc的优化效果总是因版本而异。我认识的几乎所有依赖于特殊优化或gcc扩展的人,在发布新的gcc版本时都必须应对软件崩溃的问题。
通常情况下,您可以信任pragma和intrinsic,但是您应该密切关注新的gcc版本发布说明,并告诉您的用户需要哪个gcc版本来编译您的代码。
曾经有一两次,当向量化真正重要时,我们添加了一些测试套件来调用objdump并验证实际上是否正在使用向量指令。能够自动检测“错误的向量代码”(如Nils所描述)也是很好的,但我们从未走得那么远。

2
同上,评论以便接收通知。 - Kari

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