【发布时间】:2013-10-17 03:53:59
【问题描述】:
我知道通常建议使用 -march=native(如果您正在为您所在的机器进行编译),以便 gcc 确定您的 arch 和 cputype 并生成最特定于机器的代码,但是如何它会这样做吗?
它是否使用 cpuid(在 arm 或 x86 上)?在没有类似 cpuid 指令的平台上使用了哪些技术?
【问题讨论】:
我知道通常建议使用 -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=<...> 中使用。
只是为了好玩,我检查了其他架构(我不熟悉它们)。
sparc 上的 solaris:使用 kstat 接口sparc 上的linux:使用/proc/cpuinfo
alpha:使用implver指令rs6000:使用hw.cpusubtype 系统调用rs6000 上的freebsd:使用硬编码powerpc
rs6000 上的 linux:检查/proc/self/auxv 中自己进程的 elf 解释器中的平台值rs6000 上的 aix:使用 _system_configuration(显然是一个全局结构)【讨论】: