如何使用x86intrin.h

How to use x86intrin.h

在我的一个应用程序中,我需要高效地去交织长数据流中的位。理想情况下,我想在可用时使用 BMI2 pext_u32() and/or pext_u64() x86_64 内部指令。我在互联网上搜索了关于 x86intrin.h (GCC) 的文档,但找不到太多关于该主题的信息;所以,我请求 Whosebug 上的专家帮助我。

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

Intel 发布了 Intrinsics Guide,它也适用于 GCC。如果您使用这些内部函数,您将不得不编写自己的后备代码。

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

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

Intel 内在函数的设计理念是您只能在函数中使用它们 运行 仅在具有所需扩展的 CPU 上。检查每条指令的支持会增加 way 太多的开销,然后必须有回退(没有)。

Intel 内在函数不像 GNU C __builtin_popcountll(如果在没有 -mpopcnt 的情况下编译,它确实会使用回退,但您可以在 per-function 的基础上使用属性启用目标选项。 )