gcc 的 `__builtin_popcountll` 有什么意义?
What's the sense of gcc's `__builtin_popcountll`?
我在 C 中实现了位集(位图)。
假设 __builtin_popcountll
是一个高效的实现,我用它来计算位而不是自己实现。
然而,在调试程序时,它看起来好像 __builtin_popcountll
正在使用一些循环(而不是我所期望的:汇编指令)。
实际上,当使用 gprof 分析我的测试程序时,__popcountdi2
消耗了总量的 12% CPU,而使用它的“周围代码”消耗了“0%”。
所以我想知道:当它看起来如此低效时,这样的内置函数有什么用?
平台是 x86_64 (AMD EPYC 7401P) 使用 gcc 4.8.5。
根据 __builtin_popcountll
生成的代码取决于 gcc 选项的设置 -march=
CPU-TYPE:
- 对于 Intel CPUs 第一个支持 SSE4a
popcnt
指令的是 CPU-TYPE corei7
- 对于 AMD CPUs 它是 CPU-TYPE
amdfam10
或 barcelona
。
- 如果当前 CPU 知道指令,使用 CPU-TYPE
native
也将启用它。
如果设置正确(即:CPU 知道 popcnt
指令),gcc 会创建相应的内联汇编指令;
否则它将调用 __popcountdi2
(来自 libgcc2)计算执行循环的位(每字节一次迭代)。
我在 C 中实现了位集(位图)。
假设 __builtin_popcountll
是一个高效的实现,我用它来计算位而不是自己实现。
然而,在调试程序时,它看起来好像 __builtin_popcountll
正在使用一些循环(而不是我所期望的:汇编指令)。
实际上,当使用 gprof 分析我的测试程序时,__popcountdi2
消耗了总量的 12% CPU,而使用它的“周围代码”消耗了“0%”。
所以我想知道:当它看起来如此低效时,这样的内置函数有什么用?
平台是 x86_64 (AMD EPYC 7401P) 使用 gcc 4.8.5。
根据 __builtin_popcountll
生成的代码取决于 gcc 选项的设置 -march=
CPU-TYPE:
- 对于 Intel CPUs 第一个支持 SSE4a
popcnt
指令的是 CPU-TYPEcorei7
- 对于 AMD CPUs 它是 CPU-TYPE
amdfam10
或barcelona
。 - 如果当前 CPU 知道指令,使用 CPU-TYPE
native
也将启用它。
如果设置正确(即:CPU 知道 popcnt
指令),gcc 会创建相应的内联汇编指令;
否则它将调用 __popcountdi2
(来自 libgcc2)计算执行循环的位(每字节一次迭代)。