1

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

问题是,当我使用 PAPI 进行硬件计数器时,我得到的 FP 操作的数量(PAPI_FP_INSPAPI_FP_OPS)在自动矢量化代码和原始代码中几乎相同,而在自动矢量化代码中预期会明显减少. 更重要的是,手动矢量化是一个相关问题的简化问题,在这种情况下,我得到的 FP 操作减少了 3 倍。

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

4

1 回答 1

0

溢出可能会破坏矢量化的优势,因此 64 位模式可能会比 32 位模式显着提高。此外,icc 可能会版本化循环,即使存在矢量版本,您也可能会遇到标量版本。去年或第二年发布的 icc 版本修复了这方面的一些问题。

于 2015-05-25T13:58:01.070 回答