GCC/Clang编译选项-march、-mcpu对应架构与处理器概念及差异问询
GCC/Clang
-march与-mcpu相关问题解答 1、-march参数语境中的架构具体指什么?
这里的架构指的是指令集架构(ISA, Instruction Set Architecture),是CPU支持的所有指令、寄存器规则、寻址方式的统一规范。你给编译器传-march=xxx参数时,就是明确告诉编译器可以放心使用xxx架构下的所有专属指令做优化,无需兼容更老的硬件。比如指定-march=skylake-avx512时,编译器会直接生成AVX512指令来加速计算,最终编译出的程序只能在支持AVX512的Skylake及更新架构的CPU上运行,放到老CPU上会直接报非法指令错误。
2、-mcpu参数语境中的处理器(CPU)具体指什么?
这里的处理器指的是具体的CPU硬件型号,是某款指令集架构的具体硬件实现,除了基础的指令集支持外,还有自身独有的流水线长度、缓存层级、指令调度延迟等微架构特性。传-mcpu=xxx参数时,编译器不会新增超出基础指令集范围的特殊指令,只会针对这款CPU的微架构特性调整指令排布、循环展开策略等,让指令在该CPU上的运行效率最优,最终编译出的程序仍可以在所有同架构的其他CPU上正常运行,只是在其他型号上不一定能拿到最优性能。
注意:在ARM等部分架构下,
-mcpu的行为会同时指定指令集和微架构,效果类似同时传入-march和对应微架构调优参数。
3、架构与处理器(CPU)的核心区别是什么?
核心区别主要有三点:
- 本质属性不同:架构是抽象的软件与硬件交互的规范标准,和具体硬件实现无关;处理器是这套规范的实体落地产品,包含大量硬件实现层面的独有特性。
- 兼容性范围不同:同一套架构可以对应几十上百款不同的处理器型号,只要是符合同一架构的处理器,都能正常运行针对该架构编译的二进制程序。
- 对编译器的作用不同:指定
-march是让编译器用新指令换取性能,会损失跨CPU兼容性;指定-mcpu是让编译器针对特定硬件做调优,不会损失同架构下的兼容性。
内容的提问来源于stack exchange,提问作者Pendyala
相关产品推荐
相关产品推荐

