在我的一个应用程序中,我需要在长数据流中有效地解交织位。理想情况下,我希望在可用时使用BMI2 pext_u32()
和/或pext_u64()
x86_64内在指令。我在x86intrin.h
(海湾合作委员会)上搜索了互联网上的文档,但在这个主题上找不到多少内容;所以,我要求StackOverflow上的专家帮助我。
x86intrin.h
?pext_*()
的实现是否已经有代码支持它,或者我是否需要自己编写回退代码(用于条件编译)?pext_*()
进行编译时自动转换为-mbmi2
?答案 0 :(得分:3)
英特尔发布Intrinsics Guide,这也适用于GCC。如果使用这些内在函数,则必须编写自己的回退代码。
您可以使用IFUNC resolvers实现自动切换实现,但对于非库代码,使用条件或函数指针可能更简单。
查看gcc/config/i386/i386.md
和gcc/config/i386/i386.c
文件,我在GCC 8中看不到任何会在源代码中自动选择pext
指令而没有内在函数的内容。
答案 1 :(得分:1)
英特尔内在函数的设计理念是,您只能在仅在具有所需扩展的CPU上运行的函数中使用它们。检查每条指令的支持会增加方式过多的开销,然后必须有一个后备(没有)。
英特尔内在函数与GNU C __builtin_popcountll
不同(如果在没有-mpopcnt
的情况下编译,它会使用回退,但是您不能在每个函数的基础上使用属性启用目标选项。)