8

在我的一个应用程序中,我需要有效地对长数据流中的位进行解交织。理想情况下,我想在可用时使用 BMI2pext_u32()和/或pext_u64()x86_64 内在指令。我在互联网上搜索有关x86intrin.h( GCC ) 的文档,但找不到太多关于该主题的内容;所以,我要求 StackOverflow 上的专家帮助我。

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

2 回答 2

6

英特尔发布了Intrinsics Guide,该指南也适用于 GCC。如果您使用这些内在函数,则必须编写自己的后备代码。

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

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

于 2018-04-02T10:13:37.390 回答
3

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

英特尔内在函数不像 GNU C __builtin_popcountll(如果编译时不使用 GNU C,它会使用回退-mpopcnt,但您不能使用属性在每个功能的基础上启用目标选项。)

于 2018-04-02T10:22:09.037 回答