93

我试图为此擦洗 GCC 手册页,但仍然不明白,真的。

-march和有什么区别-mtune

什么时候使用 just -march, vs. both?有没有可能只是-mtune

4

2 回答 2

104

如果您使用-march,那么 GCC 将可以自由地生成在指定 CPU 上工作的指令,但(通常)不能在架构系列中的早期 CPU 上工作。

如果您只使用-mtune,那么编译器将生成适用于其中任何一个的代码,但会偏向在您指定的特定 CPU 上运行速度最快的指令序列。例如,为该 CPU 适当地设置循环展开启发式。


-march=foo暗示-mtune=foo除非您还指定不同的-mtune. 这就是为什么使用-march比只启用选项(例如-mavx不做任何调整)更好的原因之一。

警告:-march=native在 GCC 未明确识别的 CPU 上,仍会启用 GCC 可以检测到的新指令集,但会离开-mtune=generic. 如果您希望它编写好的代码,请使用了解您的 CPU 的足够新的 GCC。

于 2012-05-11T22:22:49.963 回答
56

这是我用谷歌搜索的:

-march=X选项采用 CPU 名称X并允许 GCC 生成使用X. GCC 手册准确解释了哪些 CPU 名称意味着哪些 CPU 系列和功能。

因为通常会添加但不会删除功能,所以用 构建的二进制文件-march=X将在 CPU 上运行X,很有可能在比 更新的 CPU 上运行X,但几乎可以肯定它不会在比X. 某些指令集(我猜是 3DNow!)可能特定于特定的 CPU 供应商,使用这些指令集可能会让您获得不在竞争 CPU 上运行的二进制文件,无论是更新的还是其他的。

-mtune=Y选项将生成的代码调整为Y比在它可能运行的其他 CPU 上运行得更快。-march=X暗示-mtune=X-mtune=Y不会覆盖-march=X,因此,例如,它可能没有意义-march=core2并且-mtune=i686- 您的代码将不会在任何比任何旧的东西上运行core2,因为-march=core2,那么究竟为什么您要针对比 core2 更旧(功能较少)的东西进行优化?-march=core2 -mtune=haswell更有意义:不要使用超出core2提供的任何功能(这仍然比-march=i686提供给您的功能要多得多!),但要为更新的haswellCPU 优化代码,而不是为core2.

还有-mtune=genericgeneric使 GCC 生成在当前 CPU 上运行最好的代码(意味着generic从一个版本的 GCC 更改为另一个版本)。Gentoo 论坛上有传言说生成的代码比 do 生成的-march=X -mtune=generic代码运行得更快(或者只是暗示)。不知道这是不是真的。X-march=X -mtune=X-march=X-mtune=X

通常,除非您确切知道自己需要什么,否则最好的方法似乎是指定-march=<oldest CPU you want to run on>and -mtune=generic(-mtune=generic在这里是为了对抗隐含的-mtune=<oldest CPU you want to run on>,因为您可能不想针对最旧的 CPU 进行优化)。或者只是-march=native,如果您只在您构建的同一台机器上运行。

于 2014-04-24T11:24:20.777 回答