我试图为此刷新GCC手册页,但仍然没有得到它,真的。
-march
和-mtune
之间有什么区别?
什么时候才使用-march
,而不是两者?是否有可能只是-mtune
?
答案 0 :(得分:88)
如果使用-march
,GCC将可以自由生成在指定CPU上运行的指令,但不能生成(通常)架构系列中较早的CPU。如果使用-mtune
,则编译器将生成适用于其中任何一个的代码,但将支持在您指定的特定CPU上运行速度最快的指令序列。
答案 1 :(得分:46)
这就是我用谷歌搜索的内容:
-march=X
选项采用CPU名称X
,并允许GCC生成使用X
的所有功能的代码。 GCC手册确切地解释了哪些CPU名称意味着哪些CPU系列和功能。
由于功能通常是添加但未删除,因此使用-march=X
构建的二进制文件将在CPU X
上运行,很有可能在比X
更新的CPU上运行,但它几乎肯定不会在X
以上的任何东西上运行。某些指令集(3DNow !,我猜?)可能特定于某个特定的CPU供应商,利用这些可能会使您无法在竞争的CPU上运行二进制文件,无论是更新还是其他。
-mtune=Y
选项调整生成的代码,使其在Y
上运行得比在其运行的其他CPU上运行得更快。 -march=X
隐含-mtune=X
。 -mtune=Y
不会覆盖-march=X
,因此,例如,-march=core2
和-mtune=i686
可能没有任何意义 - 您的代码不会运行在{{1}以上的任何内容上无论如何,因为core2
,你为什么要在地球上优化比core2更老的(功能更少)? -march=core2
更有意义:不要使用除-march=core2 -mtune=haswell
提供的功能之外的任何功能(这仍然远远超过core2
提供给你的功能!),但是要优化代码较新的-march=i686
CPU,不适用于haswell
。
还有core2
。 -mtune=generic
使GCC生成的代码在当前CPU上运行得最好(意味着generic
从一个版本的GCC更改为另一个版本)。有关Gentoo论坛的传言generic
生成的代码在-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
,因为你可能不想为最老的CPU进行优化。或者只是-mtune=<oldest CPU you want to run on>
,如果你只想在你构建的同一台机器上运行。