我需要用 SSE 对程序中的一些巨大循环进行矢量化。为了节省时间,我决定让ICC来处理。为此,我准备好数据,考虑到对齐,并使用编译器指令 #pragma simd
, #pragma aligned
, #pragma ivdep
. 当使用几个-vec-report
选项编译时,编译器告诉我循环是矢量化的。快速查看编译器生成的程序集似乎证实了这一点,因为您可以找到大量适用于压缩单精度操作数(串行代码处理程序浮点操作数中的所有操作)的矢量指令。
问题是,当我使用 PAPI 进行硬件计数器时,我得到的 FP 操作的数量(PAPI_FP_INS
和PAPI_FP_OPS
)在自动矢量化代码和原始代码中几乎相同,而在自动矢量化代码中预期会明显减少. 更重要的是,手动矢量化是一个相关问题的简化问题,在这种情况下,我得到的 FP 操作减少了 3 倍。
有没有人经历过类似的事情?