我试图为此擦洗 GCC 手册页,但仍然不明白,真的。
-march
和有什么区别-mtune
?
什么时候使用 just -march
, vs. both?有没有可能只是-mtune
?
我试图为此擦洗 GCC 手册页,但仍然不明白,真的。
-march
和有什么区别-mtune
?
什么时候使用 just -march
, vs. both?有没有可能只是-mtune
?
如果您使用-march
,那么 GCC 将可以自由地生成在指定 CPU 上工作的指令,但(通常)不能在架构系列中的早期 CPU 上工作。
如果您只使用-mtune
,那么编译器将生成适用于其中任何一个的代码,但会偏向在您指定的特定 CPU 上运行速度最快的指令序列。例如,为该 CPU 适当地设置循环展开启发式。
-march=foo
暗示-mtune=foo
除非您还指定不同的-mtune
. 这就是为什么使用-march
比只启用选项(例如-mavx
不做任何调整)更好的原因之一。
警告:-march=native
在 GCC 未明确识别的 CPU 上,仍会启用 GCC 可以检测到的新指令集,但会离开-mtune=generic
. 如果您希望它编写好的代码,请使用了解您的 CPU 的足够新的 GCC。
这是我用谷歌搜索的:
该-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
提供给您的功能要多得多!),但要为更新的haswell
CPU 优化代码,而不是为core2
.
还有-mtune=generic
。generic
使 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
,如果您只在您构建的同一台机器上运行。