我想要 __builtin_popcountll 的两个实现

问题描述 投票:0回答:3

我有一些代码想要运行快速内置CPU指令

popcnt
(当使用适当的标志(例如
__builtin_popcountll
g++ -mpopcnt
)编译
clang++ -march=corei7
时,会发生这种情况),但也可以当
cpuid
显示 CPU 不支持 HW 指令时,能够回退到代码。

当然,为了获得我相信编译器人员已经正确实现的后备代码(因此我不必引入 C 或 asm 代码来执行我的 popcount),我需要一个单独的编译单元,该编译单元不需要

-mpopcnt
-march=corei7
标志。

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

gcc x86 clang bit-manipulation instructions
3个回答
2
投票

我不确定,但在 popcnt 指令和回退实现之间进行选择所需的代码的成本可能比始终简单地使用非 popcnt 实现有更大的性能损失。

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

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

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


2
投票

gcc 有一个名为“多版本”的功能专门用于此目的。


0
投票

您可以直接调用“回退代码”。我相信标准库可以访问它:

int __popcountsi2 (int a)
int __popcountdi2 (long a)
int __popcountti2 (long long a)
© www.soinside.com 2019 - 2024. All rights reserved.