【发布时间】:2012-09-06 14:11:20
【问题描述】:
我需要使用 SSE 对程序中的一些巨大循环进行矢量化。为了节省时间,我决定让ICC来处理。为此,我准备好数据,考虑到对齐,并使用编译器指令#pragma simd、#pragma aligned、#pragma ivdep。当使用几个-vec-report 选项进行编译时,编译器告诉我循环是矢量化的。快速查看编译器生成的程序集似乎证实了这一点,因为您可以找到大量适用于压缩单精度操作数的矢量指令(串行代码处理程序中的所有操作 float 操作数)。
问题是,当我使用 PAPI 获取硬件计数器时,我得到的 FP 操作数(PAPI_FP_INS 和 PAPI_FP_OPS)在自动矢量化代码和原始代码中几乎相同,当人们期望在自动矢量化代码中显着减少。更重要的是,手动矢量化是一个简化的问题,在这种情况下,我得到的 FP 操作减少了 3 倍。
有没有人遇到过类似的情况?
【问题讨论】:
-
您可能需要仔细检查 PAPI 是否将每条 SSE 指令计为 2 或 4 个 FLOP 而不是 1。
-
正如我所提到的,我手动矢量化了一个简化的案例(基本上,同样的问题,但操作少得多),我从 PAPI 计数器获得的 FP 操作少了 3 倍。事实上,我在标量中留下了一些代码,我不能指望 1/4 FP 操作,但 3 倍的声音听起来足够合理,所以我假设 PAPI 计数 decoded 指令(和矢量指令只是一条指令)
-
我对自己的代码进行了矢量化,FP 指令的数量急剧下降了 2 倍。这种减少在某种程度上是可以预期的,因为在其标量版本中保留了一些操作。所以我认为ICC并没有真正矢量化。一种可能的解释可能是操作数过多,这会导致大量寄存器溢出并降低矢量化可以为您提供的加速,尽管编译器从不抱怨。
标签: sse vectorization simd icc papi