2

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

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

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

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


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

4

1 回答 1

1

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

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

于 2012-08-04T04:59:38.590 回答