4

我知道通常建议使用 -march=native (如果您正在为您所在的机器进行编译),以便 gcc 确定您的 arch 和 cputype 并生成最特定于机器的代码,但它是如何做到的?

它是否使用 cpuid(在 arm 或 x86 上)?在没有类似 cpuid 指令的平台上使用了哪些技术?

4

1 回答 1

4

好问题。

我的直觉是它会检查/proc/cpuinfo。实际上,它取决于已编译运行的架构。似乎host_detect_local_cpu是负责该功能的功能。它的工作是用与当前 cpu 尽可能匹配-march=native的好-march=<...>或一组标志 ( -mmmx,等) 替换。和-mno-avx的例子。直接用于检查每个可能的功能。签入该行并有一个表,该表将 CPU 部件值映射到架构的一代,并直接在.i386armi386cpuidarm/proc/cpuinfoCPU part-march=<...>

只是为了好玩,我检查了其他架构(我不熟悉它们)。

  • solaris on sparc: 使用kstat接口
  • linux on sparc: 使用/proc/cpuinfo
  • alpha: 使用implver指令
  • darwin on rs6000: 使用hw.cpusubtype系统调用
  • freebsd on rs6000: 使用硬编码powerpc
  • linux on rs6000:在/proc/self/auxv自己进程的elf解释器中检查平台值
  • aix on rs6000: 使用_system_configuration(显然是全局结构)
于 2013-10-17T04:42:02.340 回答