【问题标题】:False autovectorization in Intel C compiler (icc)英特尔 C 编译器 (icc) 中的错误自动向量化
【发布时间】:2012-09-06 14:11:20
【问题描述】:

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

问题是,当我使用 PAPI 获取硬件计数器时,我得到的 FP 操作数(PAPI_FP_INSPAPI_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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2014-02-03
    • 2013-11-11
    • 2018-08-17
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    • 2013-06-06
    • 2021-01-31
    • 2014-06-14
    相关资源
    最近更新 更多