POPCNT如何在硬件中实现?

Siq*_*Lin 6 hardware x86 assembly

根据http://www.agner.org/optimize/instruction_tables.pdf,该POPCNT指令(返回32位或64位寄存器中的设置位数)在现代的每个时钟周期内具有1个指令的吞吐量英特尔和AMD处理器.这比需要多条指令的任何软件实现要快得多(如何计算32位整数中的设置位数?).

POPCNT如何在硬件中如此有效地实施?

rcg*_*ldr 6

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

US8214414 B2 - 组合的设置位计数和检测器逻辑

抽象

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

  • 哇,这解释了为什么`popcnt`对Intel SnB系列上的输出寄存器有错误的依赖性.我认为它只是在同一类uops中,而不是它真的在与`bsr` /`bsf`相同的执行单元的相同路径上运行(它需要目的地作为输入,因此它们可以保留它不被修改为src = 0 case.)有趣的事实:英特尔在Skylake修复了`tzcnt` /`lzcnt`的假dep,但不修复`popcnt`. (3认同)
  • 如此微不足道的东西竟然能申请专利,真是太神奇了…… (3认同)
  • 好吧,9 张原理图图像很难作为答案发布。既然是专利,一切都解释清楚了。 (2认同)