英特尔C编译器(icc)中的错误自动矢量化



我需要用SSE对程序中的一些巨大循环进行矢量化。为了节省时间,我决定让ICC处理它。为此,我在考虑对齐的情况下正确准备数据,并使用编译器指令#pragma simd#pragma aligned#pragma ivdep。当使用几个-vec-report选项进行编译时,编译器告诉我循环是向量化的。快速查看编译器生成的程序集似乎可以证实这一点,因为您可以找到大量使用压缩单精度操作数的矢量指令(串行代码处理程序float操作数中的所有操作)。

问题是,当我使用具有PAPI的硬件计数器时,我在自动向量化代码中获得的FP运算的数量(PAPI_FP_INSPAPI_FP_OPS)与原始的FP运算非常相同,而在自动向化代码中预期会明显更少。更重要的是,手工矢量化是一个简化的问题,在这种情况下,我得到的FP运算大约减少了3倍。

有人经历过类似的事情吗?

溢出可能会破坏矢量化的优势,因此64位模式可能会显著优于32位模式。此外,icc可能会对循环进行版本化,即使存在向量版本,也可能会达到标量版本。最近一两年发布的icc版本解决了这方面的一些问题。

最新更新