手动向量化代码并使用显式的pragma,还是依赖于或使用自动向量化,从某种意义上说哪种更好呢?为了实现最佳性能,使用自动向量化,必须监视编译器输出以确保循环被向量化,或修改它们直到它们可向量化。
通过手工编码,可以确保所需的指令被发出,但现在代码可能不具备可移植性(无法移到其他架构或其他编译器)。
手动向量化代码并使用显式的pragma,还是依赖于或使用自动向量化,从某种意义上说哪种更好呢?为了实现最佳性能,使用自动向量化,必须监视编译器输出以确保循环被向量化,或修改它们直到它们可向量化。
通过手工编码,可以确保所需的指令被发出,但现在代码可能不具备可移植性(无法移到其他架构或其他编译器)。
自动向量化对我来说从未表现良好。目前看来,对我而言,自动向量化似乎只适用于非常简单的循环。
我使用#pragma/intrinsic方法并查看汇编代码。如果编译器生成糟糕的代码(例如将SSE寄存器溢出到堆栈或添加冗余移动),我会为整个循环体使用内联汇编。
可移植性不是问题。通常你从C/C++循环开始,并使用intrinsic进行优化。只需保留旧循环,并将其用作SIMD实现的单元测试/备选项即可。此外,能够通过编译时定义从项目中删除所有SIMD代码总是明智的选择。这样调试应用程序就容易得多了。同样的定义也可以用于交叉编译。