-march=native 编译指令功能记录和避坑

记-march=native使用:

在CmakeLists.txt中,常为了优化代码性能,加入以下指令:

set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -march=native")

某次,我将同一程序分别在Docker和宿主机下进行编译(相同依赖环境),可执行文件在宿主机下正常运行,而在Docker下运行报段错误。查阅资料后,对该现象总结如下:

    总结:编译过程会受到所使用的编译器及其配置的影响。如果你在编译时指定了目标架构(如使用GCC的-march=-mtune=选项),那么即使宿主机和Docker容器运行在同一台机器上,生成的二进制文件也可能针对不同的CPU指令集进行了优化。默认情况下,大多数编译器会为宿主机架构生成最优化的代码。

后续,我将编译指令修改为:

set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall")

程序在两个环境下,均可正常运行。

继续了解了下,GCC的-march=选项:

   1. -march=native 是GCC编译器的一个特殊选项,它指示编译器生成针对当前编译代码的机器上运行的CPU架构进行优化的代码。换句话说,当使用-march=native时,GCC会自动检测并使用当前系统的CPU所支持的所有指令集扩展。这样可以确保生成的程序在编译该代码的计算机上能发挥最佳性能,但可能无法在不具备相同或更新CPU架构的其他系统上运行。

      2.使用-march=native是一种便捷的方式,以充分利用本地硬件的最新特性,而不必手动指定具体的CPU型号或架构。然而,需要注意的是,这样做生成的二进制文件可能不具有良好的向前或向后兼容性,即在不同的CPU上可能会遇到执行问题。因此,在考虑可移植性时应谨慎使用此选项。

      3.GCC的-march=选项用于指定编译生成的代码应针对哪个具体的CPU架构进行优化。这意味着编译器将启用该CPU架构支持的所有指令集特性,同时确保生成的代码能在指定架构及其后继架构上运行。这个选项可以帮助生成更高效但可能不兼容旧CPU的代码。以下是部分常见的-march=选项,但请注意,随着CPU技术的发展,这个列表可能会有所变化:

  • -march=x86-64 或 -march=amd64:针对64位x86架构(AMD64或Intel 64)的基本优化。
  • -march=nocona:早期的Intel 64位CPU。
  • -march=core2:Intel Core 2系列及以后的CPU。
  • -march=nehalem:Intel Nehalem架构及以后的CPU。
  • -march=sandybridge:Intel Sandy Bridge架构及以后的CPU。
  • -march=haswell:Intel Haswell架构及以后的CPU,支持更多的AVX指令。
  • -march=broadwell:Intel Broadwell架构。
  • -march(skylake):Intel Skylake架构。
  • -march=cascadelake:Intel Cascade Lake架构。
  • -march=znver1:AMD Zen 1架构。
  • -march=znver2:AMD Zen 2架构。
  • -march=znver3:AMD Zen 3架构。
  • -march=armv6-march=armv7-a-march=armv8-a:针对不同版本的ARM架构。
  • -march=aarch64:针对64位ARM架构(ARMv8-A)。

除了这些,还有许多其他特定于供应商和微架构的选项。选择哪个选项取决于你的目标部署环境以及你想要达到的性能与兼容性平衡。通常,为了获得最佳性能,建议指定你的目标硬件的确切架构或其最近的兼容前代。同时,可以结合使用-mtune=选项来微调代码以适应特定CPU型号,而不改变二进制的兼容性要求。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值