Jam*_*son 76 compiler-construction optimization flags gcc options
我试图为此刷新GCC手册页,但仍然没有得到它,真的.
-march和之间有什么区别-mtune?
什么时候才使用-march,而不是两者兼而有之?是否有可能只是-mtune?
Jam*_*man 90
如果您使用,-march那么GCC将可以自由生成在指定CPU上工作的指令,但不能生成(通常)架构系列中较早的CPU.如果您使用-mtune,那么编译器将生成适用于其中任何一个的代码,但将支持在您指定的特定CPU上运行速度最快的指令序列.
LRN*_*LRN 46
这就是我用Google搜索的内容:
该-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=generic.generic使GCC生成的代码在当前CPU上运行得最好(意味着generic从一个版本的GCC更改为另一个版本).还有一些对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>,因为您可能不希望针对最老的CPU进行优化).或者只是-march=native,如果你只想在你建立的同一台机器上运行.