海湾合作委员会:三月和三月有什么不同?
我试图擦洗这个GCC手册页,但仍然没有得到它,真的。
-march
和-mtune
什么区别?
什么时候一个人只是使用,而不是两个? 是否有可能只是 – -mtune
?
谢谢。
如果使用-march
那么GCC将可以自由地生成在指定的CPU上工作的指令,但不能在架构系列中的(通常)较早的CPU上工作。 如果使用-mtune
,则编译器将生成可在其中任何一个上运行的代码,但会偏向指定的特定CPU上运行速度最快的指令序列。
这是我google了谷歌:
-march=X
选项使用CPU名称X
并允许GCC生成使用X
所有特征的代码。 GCC手册准确解释了哪些CPU名称是指哪些CPU系列和function。
由于function通常是添加的,但不会被删除,所以使用-march=X
构build的二进制文件将在CPU X
上运行,并有机会在比X
更新的CPU上运行,但几乎肯定不会运行在比X
更早的任何东西上。 某些指令集(3DNow!,我猜?)可能特定于某个特定的CPU供应商,使用这些指令集可能会得到不能在竞争的CPU上运行的二进制文件,不pipe是新的还是其他的。
-mtune=Y
选项会调整生成的代码,以便在Y
上运行得比在可能运行的其他CPU上运行得更快。 -march=X
意味着-mtune=X
-mtune=Y
不会覆盖-march=X
,因此,例如对于-march=core2
和-mtune=i686
可能没有意义 – 因为-march=core2
,那么为什么你要在地球上优化比core2更老的东西(function更less)呢? -march=core2 -mtune=haswell
更有意义:除了core2
提供的function之外,不要使用任何function(这仍然比-march=i686
提供的更多),但是要为更新的haswell
CPU优化代码,不是为了core2
。
还有-mtune=generic
。 generic
使GCC产生的代码在当前的CPU上运行得最好(意味着从一个版本的GCC到另一个版本的generic
变化)。 在Gentoo论坛上有传言说, -march=X -mtune=generic
产生的代码在X
上运行得比在-march=X -mtune=X
产生的代码上运行速度快(或者只是-march=X
,因为-mtune=X
被暗示)。 不知道这是否属实。
一般来说,除非你确切地知道你需要什么,似乎最好的方法是指定-march=<oldest CPU you want to run on>
和-mtune=generic
( -mtune=generic
在这里是为了-mtune=<oldest CPU you want to run on>
隐含的-mtune=<oldest CPU you want to run on>
,因为您可能不想为最早的CPU进行优化)。 或者只是-march=native
,如果你只打算在你build立的同一台机器上运行。