海湾合作委员会:游行与mtune有何不同?

时间:2012-05-11 22:12:19

标签: optimization gcc compiler-construction options flags

我试图为此刷新GCC手册页,但仍然没有得到它,真的。

-march-mtune之间有什么区别?

什么时候才使用-march,而不是两者?是否有可能只是-mtune

2 个答案:

答案 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>,如果你只想在你构建的同一台机器上运行。