c - 如何使用 x86intrin.h

标签 c gcc x86-64 intrinsics bmi

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

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

最佳答案

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

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

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

关于c - 如何使用 x86intrin.h,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49602761/

相关文章:

x86-64 - 在 Intel x86-64 架构上是否以 little endian 4 字节字获取机器代码指令?

macos - 后端错误 : 32-bit absolute addressing is not supported in 64-bit mode

c - 单线程模式下并行合并非常慢

c - C中的自由动态二维矩阵

gcc - 尝试在 GCC 中使用地址清理程序时出现 "undefined reference"错误

C 宏观评估

c - 64 位可执行文件的运行速度比 32 位版本慢

无法理解代码片段

c - 在 C 中扩展 ruby​​ - 如何指定函数的默认参数值?

c++ - 无法使用 gcc 编译 C++