我知道通常建议使用 -march=native(如果您正在为您所在的机器编译),以便 gcc 确定您的 arch 和 cputype 并生成最特定于机器的代码,但是如何它这样做?
它是否使用 cpuid(在 arm 或 x86 上)?在没有类似 cpuid 指令的平台上使用了哪些技术?
最佳答案
好问题。
我的直觉是它会去检查 /proc/cpuinfo
.实际上,它取决于编译运行的体系结构。好像host_detect_local_cpu
是负责的功能。它的工作是替换-march=native
好的-march=<...>
或一组与当前 cpu 尽可能匹配的标志( -mmmx
、 -mno-avx
等)。 i386
的示例和 arm
. i386
使用 cpuid
直接检查每个可能的功能。 arm
入住/proc/cpuinfo
对于 CPU part
行并有一个表,该表从 CPU 部件值映射到架构的生成,并直接在 -march=<...>
中使用它.
为了好玩,我检查了其他架构(我不熟悉它们)。
- solaris
sparc
: 使用kstat
界面 - Linux
sparc
: 使用/proc/cpuinfo
-
alpha
: 使用implver
说明 - Darwin
rs6000
: 使用hw.cpusubtype
系统调用 - freebsd
rs6000
: 使用硬编码powerpc
- Linux
rs6000
: checkin/proc/self/auxv
对于自身进程elf解释器的平台值(value) - 继续
rs6000
: 使用_system_configuration
(显然是一个全局结构)
关于c - gcc 如何确定 x86 上的 -march=native? ARM 上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19417978/