首页 文章

英特尔C编译器(icc)中的虚假自动向量化

提问于
浏览
1

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

问题在于,当我使用PAPI获取硬件计数器时,我得到的FP操作数( PAPI_FP_INSPAPI_FP_OPS )在自动矢量化代码和原始代码中是相同的,当人们期望在自动向量中显着减少时矢量化代码 . 更重要的是,手工矢量化是一个简化的问题,在这种情况下,我确实得到了比FP操作少3倍的东西 .

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

1 回答

  • 0

    溢出可能会破坏矢量化的优势,因此64位模式可能会在32位模式下显着增加 . 此外,icc可能会对循环进行版本控制,即使存在矢量版本,您也可能会遇到标量版本 . 去年或2年发布的icc版本修复了该领域的一些问题 .

相关问题