我想要 __builtin_popcountll 的两种实现

Ste*_* Lu 5 compiler-construction gcc bit-manipulation clang instructions

我有一些代码,我想运行快速的内置 CPU 指令popcnt(当__builtin_popcountll使用适当的标志编译时,例如 withg++ -mpopcntclang++ -march=corei7,会发生这种情况),但也能够在cpuid显示 CPU 不支持时回退到代码硬件指令。

当然,为了获得我相信编译器人员已正确实现的回退代码(因此我不必引入 C 或 asm 代码来执行我的 popcount),我需要一个单独的编译单元,该单元在编译时不使用-mpopcnt-march=corei7标志。

将单独编译的代码链接在一起是唯一的方法吗?是否没有编译器内在函数或其他类型的提示或其他我不知道的内置函数可以用来让它生成回退 popcount 代码?

lee*_*ker 2

我不确定,但是与始终简单地使用非 popcnt 实现相比,放入在 popcnt 指令和后备实现之间进行选择所需的代码的成本可能会产生更大的性能损失。

要切换到替代实现(在 popcnt 站点进行切换),您至少需要以下内容:

  • 加载并检查 cpuid 位 (CPUID.01H:ECX.POPCNT[Bit 23])
  • 分支选择 popcnt 或替代实现
  • 可能保存/恢复替代实现所需的寄存器
  • 如果替代实现是基于 SSE 或 AVX,则可能将数据移动到 SIMD 寄存器

我怀疑成本阻碍了您所描述的内在的有效实施。