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