【发布时间】:2019-03-10 05:13:55
【问题描述】:
对于大多数 C/C++ 编译器,有一个标志可传递给编译器,-march=native,它告诉编译器为主机 CPU 的微架构和 ISA 扩展调整生成的代码。即使名称不同,基于 LLVM 的编译器通常也有一个等效选项,例如 rustc 或 swiftc。
根据我自己的经验,这个标志可以为数字密集型代码提供巨大的加速,并且它听起来对于你只是为你自己的机器编译的代码来说是没有妥协的。也就是说,我认为我没有看到任何默认启用它的构建系统或静态编译器:
显然,任何需要您传递它的命令行编译器可执行文件默认都不会使用它。
我想不出任何默认启用此功能的 IDE。
我想不出任何我使用过的通用构建系统(
cmake、automake、cargo、spm等)默认启用它,即使是优化构建。
我能想到几个原因,但没有一个是真正令人满意的:
使用
-march=native不适用于将分发到其他计算机的二进制文件。也就是说,我发现自己为自己的机器编译源代码的频率比为其他机器编译的要多,这并不能解释它在调试版本中缺乏使用的原因,因为它无意分发。至少在 Intel x86 CPU 上,据我了解,不经常使用 AVX 指令会降低性能或电源效率,因为 AVX 单元在不使用时会断电,需要通电才能使用,许多英特尔 CPU 降频以运行 AVX 指令。尽管如此,它只解释了为什么不启用 AVX,而不是为什么不针对特定微架构对常规指令的处理进行调整。
由于大多数 x86 CPU 使用带有寄存器重命名的花哨的乱序超标量流水线,因此针对特定微架构调整代码可能并不是特别重要。不过,如果它可以有帮助,为什么不使用它呢?
【问题讨论】:
-
人们通常喜欢他们编译的代码在编译它的机器以外的机器上运行。
-
我认为 Gentoo 用户一直在使用它。除此之外 - 大多数时候不会给你那么多,二进制文件不能在其他机器上使用。不要忘记,您可能正在动态链接可能未调整的其他库,因此像这样优化您的应用程序可能一无所获。
-
这个“基于意见”的原因被误用在了这个问题上。正如正文所指出的那样,关闭的原因是针对其答案可能“几乎完全基于意见”的问题。这不是一个有争议的问题,关于使用
-march=native的事实将很有用。它应该重新打开。 -
这个问题更适合论坛讨论
-
@interjay:Stack Overflow 的一个目的是创建一个问题和答案的存储库,为将来寻求的其他人提供信息,而不仅仅是向提出问题的人提供信息。
标签: gcc clang compiler-optimization