CPU功能和编译器符号

时间:2012-08-04 03:57:08

标签: c gcc compiler-construction cpu symbols

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

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

将会有很多代码,所以简单地保留所有内容并在运行时分支是不可接受的 - 并且假设我的库将在构建之前构建,然后才能在给定系统上使用。< / p>

我的意思是,在最坏的情况下,我可以通过将gcc参数包装在一个支持cpuid的脚本中来强制执行此行为,但是如果gcc自动执行此操作,则会更好。那么有人知道它是否存在吗?


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

1 个答案:

答案 0 :(得分:1)

如果您传递-mavx标记,__AVX__始终设置为生成的编译(并且生成的代码可能无法在非AVX计算机上运行)。< / p>

如果传递-march=native标志,gcc将启用构建机器支持的指令集,因此只有在构建机器支持它时才会设置__AVX__