【问题标题】:How to use x86intrin.h如何使用 x86intrin.h
【发布时间】:2018-09-11 04:01:29
【问题描述】:

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

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

【问题讨论】:

标签: c gcc x86-64 intrinsics bmi


【解决方案1】:

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

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

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

【讨论】:

  • target_clones 属性之类的东西可以为您创建 ifunc 解析器,尽管对于这种特殊情况可能不太方便。
  • 是的,目标克隆只有在代码本身独立于架构的情况下才有效。当使用特定于 CPU 的内在函数时,情况并非如此。
  • @Florian,感谢您的出色意见 - 这几乎回答了我的所有问题。如果您知道我可以找到有关 gcc 支持并将尝试作为优化目标的操作码的任何来源,您会补充您的答案吗?
  • 好吧,您需要查看i386.mdi366.c 以获取此信息。没有其他整洁的来源。
  • 抱歉,没有 IFUNC 解析器是 GNU/ELF 功能。对不起。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 2012-02-29
    • 2019-02-09
    相关资源
    最近更新 更多