5

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

当然,要获得我相信编译器人员已经正确实现的后备代码(所以我不必引入 C 或 asm 代码来做我的 popcount),我需要一个单独的编译单元,它在编译时没有-mpopcntor-march=corei7标志。

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

4

3 回答 3

2

我不确定,但是在 popcnt 指令和回退实现之间进行选择所需的代码的成本可能比简单地一直使用非 popcnt 实现对性能的影响更大。

要切换另一个实现(在 popcnt 的站点进行切换),您至少需要以下内容:

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

我怀疑成本会阻止您描述的内在函数的有效实现。

于 2013-09-11T06:07:36.640 回答
1

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

于 2020-08-20T17:15:21.823 回答
0

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

int __popcountsi2 (int a)
int __popcountdi2 (long a)
int __popcountti2 (long long a)
于 2014-01-17T13:23:28.043 回答