我知道通常建议使用 -march=native (如果您正在为您所在的机器进行编译),以便 gcc 确定您的 arch 和 cputype 并生成最特定于机器的代码,但它是如何做到的?
它是否使用 cpuid(在 arm 或 x86 上)?在没有类似 cpuid 指令的平台上使用了哪些技术?
好问题。
我的直觉是它会检查/proc/cpuinfo。实际上,它取决于已编译运行的架构。似乎host_detect_local_cpu是负责该功能的功能。它的工作是用与当前 cpu 尽可能匹配-march=native的好-march=<...>或一组标志 ( -mmmx,等) 替换。和-mno-avx的例子。直接用于检查每个可能的功能。签入该行并有一个表,该表将 CPU 部件值映射到架构的一代,并直接在.i386armi386cpuidarm/proc/cpuinfoCPU part-march=<...>
只是为了好玩,我检查了其他架构(我不熟悉它们)。
sparc: 使用kstat接口sparc: 使用/proc/cpuinfoalpha: 使用implver指令rs6000: 使用hw.cpusubtype系统调用rs6000: 使用硬编码powerpcrs6000:在/proc/self/auxv自己进程的elf解释器中检查平台值rs6000: 使用_system_configuration(显然是全局结构)