【问题标题】:How is POPCNT implemented in hardware?POPCNT如何在硬件中实现?
【发布时间】:2015-05-02 09:15:37
【问题描述】:

根据http://www.agner.org/optimize/instruction_tables.pdfPOPCNT 指令(返回 32 位或 64 位寄存器中设置的位数)在现代 Intel 和 AMD 处理器上每个时钟周期的吞吐量为 1 条指令。这比任何需要多条指令的软件实现都要快得多 (How to count the number of set bits in a 32-bit integer?)。

POPCNT 是如何在硬件中如此高效地实现的?

【问题讨论】:

标签: assembly x86 hardware


【解决方案1】:

有一项组合popcnt,位扫描正向/反向的专利:

US8214414 B2 - Combined set bit count and detector logic

摘要

描述了 PopCount 和 BitScan 的合并数据路径。硬件电路包括用于 PopCount 函数的压缩器树,它被 BitScan 函数重用(例如,位扫描正向 (BSF) 或位扫描反向 (BSR))。选择器逻辑使压缩器树能够根据微处理器指令对 PopCount 或 BitScan 操作的输入字进行操作。如果选择了 BitScan 操作,则对输入字进行编码。压缩树接收输入字,对位进行操作,就好像所有位都具有相同的重要性级别(例如,对于 N 位输入字,输入字被视为 N 个一位输入)。压缩树电路的结果是一个二进制值,表示与执行的操作相关的数字(PopCount 的设置位数,或扫描输入字时遇到的第一个设置位的位位置)。

【讨论】:

  • 虽然我不喜欢仅链接的答案,但这是一个非常酷的链接。
  • 那么 9 张原理图图像很难作为答案发布。既然是专利,一切都解释清楚了。
  • 哇,这就解释了为什么popcnt 对英特尔 SnB 系列的输出寄存器存在错误的依赖关系。我认为它只是在同一类 uops 中,并不是说它真的在与 bsr/bsf 相同的执行单元的同一路径上运行(需要将目标作为输入,以便他们可以保持不变) src=0 case.) 有趣的事实:英特尔修复了 Skylake 中 tzcnt/lzcnt 的错误 dep,但未修复 popcnt
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多