c - gcc 如何确定 x86 上的 -march=native? ARM 上?

标签 c gcc x86 arm

我知道通常建议使用 -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=<...> 中使用它.

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

  • solaris sparc : 使用 kstat界面
  • Linux sparc : 使用 /proc/cpuinfo
  • alpha : 使用 implver说明
  • Darwin rs6000 : 使用 hw.cpusubtype系统调用
  • freebsd rs6000 : 使用硬编码 powerpc
  • Linux rs6000 : checkin /proc/self/auxv对于自身进程elf解释器的平台值(value)
  • 继续 rs6000 : 使用 _system_configuration (显然是一个全局结构)

关于c - gcc 如何确定 x86 上的 -march=native? ARM 上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19417978/

相关文章:

c++ - 派生类中的模板函数参数

c++ - 使用进位标志的高效 128 位加法

c - diStorm库,反汇编CALL指令

c - 如何获得最大的 float ?

assembly - 使用手写汇编调用 native 代码

assembly - 使用监控/等待指令

c - fopen 返回没有这样的文件或目录,文件存在

c - 检测进程是否空闲

c 程序时间转换 24 小时到 12 小时

c# - P/Invoke 调用中的 AccessViolationException