我有一个关于编译器如何设置符号的问题,特别是CPU特性标志(如SSE、AES、AVX)实际上是如何设置的例如,如果我用-mavx调用gcc,那么无论代码将要构建的系统实际上是支持AVX指令,还是之前检查过,符号是否设置了__AVX__
?
我之所以这么问是因为我需要根据CPU的能力构建一个特定的代码路径,并希望将其自动化,以便根据构建系统的编译来确定正确的路径,而不是手动启用所需的功能但由于我仅有的CPU基本上支持所有功能,我无法测试我的上述假设(我知道,第一世界的问题)
会有很多代码,所以在运行时简单地保留所有内容和分支是不可接受的——而且假设我的库在被用于给定系统之前就已经构建好了。
我的意思是,在最坏的情况下,我可以通过将gcc参数包装到一个cpuid感知脚本中来强制执行此行为,但是如果gcc自动这样做,那就更好了那么有人知道它是否存在吗?
我最感兴趣的是gcc在这方面的表现,但我也很想知道其他C编译器是如何工作的。
最佳答案
如果传递-mavx
标志,则始终会为结果编译设置__AVX__
(并且结果代码可能不会在非AVX计算机上运行)。
如果传递-march=native
标志,gcc将启用生成计算机支持的指令集,因此只有生成计算机支持时才会设置__AVX__
。
关于c - CPU功能和编译器符号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11805791/