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

Jam*_*son 76 compiler-construction optimization flags gcc options

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

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

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

Jam*_*man 90

如果您使用,-march那么GCC将可以自由生成在指定CPU上工作的指令,但不能生成(通常)架构系列中较早的CPU.如果您使用-mtune,那么编译器将生成适用于其中任何一个的代码,但将支持在您指定的特定CPU上运行速度最快的指令序列.

  • @PavelŠimerda直观地说,答案隐含在2个特征的定义中.此外,文档明确指出"march"意味着"mtune".所以,你反对的答案分别是肯定和肯定的. (10认同)
  • 当设置为相同值时,不回答是否有意义使用两者或mtune是否冗余. (9认同)
  • 人们需要一个tl; dr:如果你只在你的处理器上运行它,请使用-march,如果你想让它对其他处理器安全,请使用-mtune. (4认同)
  • 用户还必须了解,较早的编译器(在不存在某些CPU之前发行)可能会导致不同的最佳“ mtune”和“ march”组合。这篇博客文章与其他人阐明了这一点:https://lemire.me/blog/2018/07/25/it-is-more-complicated-than-i-thought-mtune-march-in-gcc/ (2认同)

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

  • 但是,如果使用`-march = native`,则可能要指定`-mtune = X`,因为默认值仍然是`-mtune = generic`,如下所述:https://lemire.me/blog/2018 / 07/25 /它比我认为的gcc中的march-march更复杂/ (2认同)