Optimization 自动矢量化与手动矢量化代码

Optimization 自动矢量化与手动矢量化代码,optimization,gcc,loops,vector-processing,Optimization,Gcc,Loops,Vector Processing,从某种意义上讲,使用显式pragmas手动对代码进行矢量化更好,还是依赖或使用自动矢量化更好?为了使用自动矢量化获得最佳性能,必须监视编译器输出,以确保循环被矢量化或修改它们,直到它们可矢量化为止 通过手工编码,可以确定发出了所需的指令,但现在代码可能无法移植(无论是移植到其他体系结构还是其他编译器)。自动矢量化对我来说从来都不起作用。在我看来,目前自动矢量化似乎只适用于非常琐碎的循环 我使用pragma/内在方法并查看程序集。如果编译器生成错误代码(比如将SSE注册表溢出到堆栈或添加冗余移动)

从某种意义上讲,使用显式pragmas手动对代码进行矢量化更好,还是依赖或使用自动矢量化更好?为了使用自动矢量化获得最佳性能,必须监视编译器输出,以确保循环被矢量化或修改它们,直到它们可矢量化为止


通过手工编码,可以确定发出了所需的指令,但现在代码可能无法移植(无论是移植到其他体系结构还是其他编译器)。

自动矢量化对我来说从来都不起作用。在我看来,目前自动矢量化似乎只适用于非常琐碎的循环

我使用pragma/内在方法并查看程序集。如果编译器生成错误代码(比如将SSE注册表溢出到堆栈或添加冗余移动),我将对整个循环体使用内联汇编程序


顺便说一句,可移植性不是问题。通常从C/C++循环开始,并使用内部函数对其进行优化。只需保留旧循环,并将其用作SIMD实现的单元测试/回退。此外,通过编译时定义从项目中删除所有SIMD代码总是明智的。这样调试应用程序就容易多了。相同的定义可用于交叉编译。

我永远不会依赖任何编译器的自动矢量化。对于
gcc
,我会加倍小心,因为
gcc
的优化效果总是因版本而异。我所认识的几乎所有依赖于特殊优化或gcc扩展的人在发布新的
gcc
版本时都必须处理破坏问题

您通常可以信任pragmas和intrinsic,但是您应该密切关注新gcc版本的发行说明,并且应该告诉您自己的用户编译代码需要什么gcc版本


有一两次,当矢量化真的很重要时,我们在测试套件中添加了一些东西来调用
objdump
,并验证是否实际使用了矢量指令。能够自动检测“坏向量代码”(正如Nils所描述的)也会很好,但我们从来没有做到这一点。

同样,评论也已经10年了。这仍然是一个有效的答案吗?