如何使用x86intrin.h

时间:2018-04-01 21:22:52

标签: c gcc x86-64 intrinsics bmi

在我的一个应用程序中,我需要在长数据流中有效地解交织位。理想情况下,我希望在可用时使用BMI2 pext_u32()和/或pext_u64() x86_64内在指令。我在x86intrin.h海湾合作委员会)上搜索了互联网上的文档,但在这个主题上找不到多少内容;所以,我要求StackOverflow上的专家帮助我。

  1. 在哪里可以找到有关如何使用x86intrin.h
  2. 中的函数的文档
  3. gcc pext_*()的实现是否已经有代码支持它,或者我是否需要自己编写回退代码(用于条件编译)?
  4. 如果目标不支持内在函数,是否可以编写一个自动回退到备用实现的二进制文件?如果是这样,一个人怎么做?
  5. 是否有已知的编程模式, GCC 会识别并在启用优化并使用pext_*()进行编译时自动转换为-mbmi2

2 个答案:

答案 0 :(得分:3)

英特尔发布Intrinsics Guide,这也适用于GCC。如果使用这些内在函数,则必须编写自己的回退代码。

您可以使用IFUNC resolvers实现自动切换实现,但对于非库代码,使用条件或函数指针可能更简单。

查看gcc/config/i386/i386.mdgcc/config/i386/i386.c文件,我在GCC 8中看不到任何会在源代码中自动选择pext指令而没有内在函数的内容。

答案 1 :(得分:1)

英特尔内在函数的设计理念是,您只能在仅在具有所需扩展的CPU上运行的函数中使用它们。检查每条指令的支持会增加方式过多的开销,然后必须有一个后备(没有)。

英特尔内在函数与GNU C __builtin_popcountll不同(如果在没有-mpopcnt的情况下编译,它会使用回退,但是您不能在每个函数的基础上使用属性启用目标选项。)