我有一个关于编译器设置符号,特别是 CPU 功能标志(如 SSE、AES、AVX)实际设置方式的问题。例如,如果我使用 -mavx 调用 gcc,则
__AVX__
符号集不管要构建代码的系统是否实际上支持 AVX 指令,还是之前检查过?
我问这个问题是因为我需要根据 CPU 功能构建特定的代码路径,并且希望将其自动化,以便在基于构建系统的编译时确定正确的路径,而不是手动启用所需的功能。但由于我唯一的 CPU 基本上支持所有功能,我无法测试我的上述假设(第一世界问题,我知道)
将会有很多的代码,因此简单地保留所有内容并在运行时进行分支是不可接受的 - 并且假设我的库将在给定系统上使用之前构建。
我的意思是,在最坏的情况下,我可以通过将 gcc 参数包装在 cpuid 感知脚本中来强制执行此行为,但如果 gcc 自动执行此操作,那就更好了。那么有人知道是吗?
我最感兴趣的是 gcc 对此的看法,但我也很想知道其他 C 编译器的行为。
如果您传递
-mavx
标志,__AVX__
将为结果编译设置always(并且生成的代码可能无法在非 AVX 机器上运行)。
如果传递
-march=native
标志,gcc 将启用构建机器支持的指令集,因此仅当构建机器支持时才会设置 __AVX__
。