You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

为何GCC -march=native在Coffee Lake CPU上选Broadwell?该选哪种编译架构?

GCC 7.3.0识别Coffee Lake为Broadwell的原因及正确编译选项

这是个典型的GCC版本对新CPU微架构支持滞后的问题,我来帮你理清楚前因后果和解决方案:

为什么-march=native会识别成Broadwell?

  • 你的i5-8600K是Coffee Lake微架构,属于Intel Skylake家族的衍生型号,2017年底才正式发布;
  • 而GCC 7.3.0在2018年初推出,它的代码库中还没有更新Coffee Lake的CPU识别规则——-march=native的工作原理是匹配内置的CPU型号与架构映射表,当遇到未收录的CPU时,会自动 fallback 到功能最接近的已支持架构,这里就错误地匹配到了Broadwell。

你应该用哪个架构选项编译?

直接用-march=skylake就完全能满足需求,理由如下:

  • Coffee Lake本质是Skylake的改良版,二者指令集高度兼容(Coffee Lake主要升级了核心数、缓存,没有新增GCC 7.3.0不支持的指令集特性);
  • -march=skylake会启用Skylake家族支持的全部优化指令集(比如AVX2、FMA3等),这些都是i5-8600K完全支持的,能充分发挥CPU性能;
  • 如果你追求极致,也可以手动补充个别小优化选项,但实际上GCC 7.3.0的skylake配置已经覆盖了所有必要的优化,没必要多此一举。

另外提一句:如果后续你升级到GCC 8及以上版本,-march=native就能正确识别Coffee Lake了,因为GCC 8开始正式加入了对该架构的支持。

内容的提问来源于stack exchange,提问作者henkkeli

火山引擎 最新活动