首页 >后端开发 >C++ >为什么由于错误的数据依赖性,64 位 Popcount 在 Intel CPU 上比 32 位慢?

为什么由于错误的数据依赖性,64 位 Popcount 在 Intel CPU 上比 32 位慢?

Susan Sarandon
Susan Sarandon原创
2024-12-09 22:19:11860浏览

Why is 64-bit Popcount Slower Than 32-bit on Intel CPUs Due to False Data Dependencies?

虚假数据依赖性影响 Intel CPU 上的 Popcount 性能

问题:

您观察到显着使用 32 位和 64 位循环计数器进行 popcount 操作之间的性能偏差英特尔 CPU。使用 64 位计数器时性能下降 50%,最初归因于编译器错误。

说明:虚假数据依赖

Intel CPU 存在错误依赖在 popcnt 指令中的目标寄存器上,这会影响紧密循环的多次迭代。这种依赖性会暂停指令,直到目标寄存器可用。受此依赖关系影响的指令数量取决于循环的位置,从而导致性能变化。

依赖关系的后果:

  • 不同的寄存器: 当循环使用不同的寄存器进行连续的 popcnt 操作时,依赖性会分布在循环迭代中,显着影响性能。
  • 相同的寄存器:如果所有 popcnt 操作都使用相同的寄存器,则依赖关系保留在单次迭代中,从而减少性能影响。
  • 已损坏依赖链: 通过引入不相关的指令(例如异或)来打破依赖关系,通过允许处理器并行化循环来提高性能

编译器行为:

GCC 和 Visual Studio 都没有意识到这种错误的依赖关系,从而导致基于寄存器分配的不可预测的性能。其他编译器,例如 Clang 和 ICC,也缺乏这方面的知识。

AMD 性能:

AMD 处理器似乎没有这种错误的依赖关系,这有助于其更高的性能流行计数中的表现

缓解措施:

  • 内联汇编:使用内联汇编手动优化汇编代码可以绕过编译器对依赖关系的无意识.
  • 打破依赖链: 在每个 popcnt 操作后插入不相关的指令,打破了错误的依赖关系并提高了性能。
  • 使用不同的寄存器: 为连续的 popcnt 操作分配不同的寄存器可以缓解该问题,但可能会导致问题。并不总是可能的。

以上是为什么由于错误的数据依赖性,64 位 Popcount 在 Intel CPU 上比 32 位慢?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn