如何使用x86intrin.h?求GCC下该头文件及pext_*相关文档
关于x86intrin.h文档与GCC中pext_*指令的使用
嘿,刚好我对这块比较熟悉,给你梳理一下:
一、找x86intrin.h相关文档的几个靠谱途径
- 本地文档与头文件注释:在装了GCC的系统里,直接运行
man gcc,搜索"Intrinsics"章节就能看到内在函数的整体说明。另外,你可以直接打开x86intrin.h头文件(一般路径是/usr/lib/gcc/x86_64-linux-gnu/<你的GCC版本号>/include/x86intrin.h),里面每个内在函数都有简洁的注释,虽然是代码注释,但信息准确直接。部分系统还支持man x86intrin.h,可以直接查看头文件的文档。 - GCC离线文档包:很多Linux发行版都有GCC的文档包,比如Debian/Ubuntu上的
gcc-doc,安装后就能离线查看完整的内在函数分类文档,里面把SSE、AVX、BMI/BMI2等指令集对应的内在函数都分好类了,参数、返回值和用途讲得很清楚。 - Intel官方指令手册:因为x86的内在函数基本都是对应硬件指令的封装,Intel的《Intel 64 and IA-32 Architectures Software Developer Manuals》里的Volume 2(指令集参考)会详细说明PEXT指令的功能,搞懂指令本身,用内在函数就没难度了。
二、GCC中pext_*的实现与使用注意事项
GCC从4.8版本开始就支持BMI2指令集的内在函数了,_pext_u32()和_pext_u64()其实定义在bmi2intrin.h里,而x86intrin.h会自动包含这个头文件(只要你开启了对应的编译选项)。
给你几个关键要点:
- 编译必须加选项:一定要用
-mbmi2编译,这样GCC才会生成硬件的PEXT指令;如果没加,编译器会用软件模拟实现,性能差很多,完全发挥不出BMI2的优势。 - 简单使用示例:
#include <x86intrin.h> #include <stdint.h> // 从32位源数据中提取mask标记的位,按顺序拼接成结果 uint32_t deinterleave_32(uint32_t src, uint32_t extract_mask) { return _pext_u32(src, extract_mask); } // 64位版本 uint64_t deinterleave_64(uint64_t src, uint64_t extract_mask) { return _pext_u64(src, extract_mask); }
- 实现细节:当启用
-mbmi2时,GCC会直接输出PEXT硬件指令;没有这个选项时,会用一系列移位、与或操作模拟PEXT的功能,效率大打折扣,所以务必记得加编译选项。
你说的长数据流位解交织场景,PEXT简直是量身定做的——把需要提取的位位置用mask标记好,一次调用就能完成解交织,比手动写循环移位高效太多了。
内容的提问来源于stack exchange,提问作者Michael Back
相关产品推荐
相关产品推荐

