gcc的__builtin_popcountll作用是什么?为何实际使用效率偏低?
关于GCC
__builtin_popcountll 效率偏低问题的解答 __builtin_popcountll 的实际作用
__builtin_popcountll 是GCC专门提供的内置工具函数,作用是统计一个64位无符号整数中二进制值为1的位的总数量,设计目标就是尽可能调用目标CPU架构的原生硬件指令实现该功能,以达到最优计算性能。
你遇到性能低下的具体原因
- 核心问题出在编译参数配置上:你使用的GCC 4.8.5版本默认生成兼容全系列x86_64架构的通用代码,而统计位数量的
popcnt硬件指令属于SSE4.2指令集扩展,默认编译参数不会启用该指令集支持。此时GCC会自动降级,调用软件实现的__popcountdi2库函数完成计数,该函数确实采用循环/查表实现,性能远低于原生硬件指令,就是你观测到的CPU占用高的来源。 - 解决方法非常简单:在编译参数中添加
-msse4.2或者-march=native即可。-march=native会自动识别你当前使用的AMD EPYC 7401P处理器支持的所有指令集,直接生成popcnt硬件指令调用,不再调用软件实现的__popcountdi2,性能会有数量级提升。 - 补充说明:如果有条件升级GCC版本到7.x及以上,对新架构的指令集适配、默认优化策略都会更完善,也能避免很多老旧版本的已知问题。
内容的提问来源于stack exchange,提问作者U. Windl
相关产品推荐
相关产品推荐

