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