【问题标题】:CPU features and compiler symbolsCPU 特性和编译器符号
【发布时间】:2012-08-02 02:19:02
【问题描述】:

我有一个关于编译器设置符号的问题,特别是 CPU 功能标志(如 SSE、AES、AVX)实际上是如何设置的。例如,如果我用 -mavx 调用 gcc,__AVX__ 符号集 不管 将要构建代码的系统是否真的支持 AVX 指令,还是它之前检查过?

我之所以这样问,是因为我需要根据 CPU 功能构建特定的代码路径,并希望将其自动化,以便在基于构建系统的编译时确定正确的路径,而不是手动启用所需的功能。但是由于我唯一的 CPU 基本上支持所有功能,我无法测试我的上述假设(我知道第一世界的问题)

将会有很多代码,因此简单地保留所有内容并在运行时进行分支是不可接受的 - 并且假设我的库将在用于给定系统之前构建。

我的意思是,在最坏的情况下,我可以通过将 gcc 参数包装在可识别 cpuid 的脚本中来强制执行此行为,但如果 gcc 自动执行它会更可取。那么有没有人知道呢?


我最感兴趣的是 gcc 对此的看法,但我也很想知道其他 C 编译器的行为方式。

【问题讨论】:

    标签: c gcc compiler-construction cpu symbols


    【解决方案1】:

    如果您传递-mavx 标志,__AVX__始终设置为生成的编译(生成的代码可能无法在非 AVX 机器上运行)。

    如果你传递-march=native 标志,gcc 将启用构建机器支持的指令集,所以__AVX__ 只有在构建机器支持的情况下才会设置。

    【讨论】:

    • 啊,太好了,所以我可以使用'-march=native',所有支持的功能的符号都会自动设置,非常简洁。我会阅读这面旗帜,谢谢!
    • 解释为什么编译器会这样:“-mavx”之类的开关告诉编译器target机器是什么,编译器设置预处理器符号来匹配它,以便源代码可以使用这些符号来针对目标机器进行调整。您构建的机器可能与目标机器没有关系;它只是将 C 源代码转换为目标机器的可执行代码的通用计算设备。只是因为我们经常使用编译器为当前机器进行编译,我们才认为当前机器就是编译器设置的目标。
    • @EricPostpischil 感谢您的解释,这是有道理的。我同意这不是很直观,尤其是因为例如在 Linux 中您很少将二进制文件发送出去,所以通常当您编译某些东西时,它是在它被编译的系统上运行它。但这种方式更加灵活和合乎逻辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 2011-06-15
    • 2011-10-15
    相关资源
    最近更新 更多