93

このためにGCCのマニュアルページをスクラブしようとしましたが、それでも実際には取得できません。

-marchとの違いは何-mtuneですか?

どちらを使用する-marchのか、両方を使用するのか。ただすることは今までに可能-mtuneですか?

4

2 に答える 2

104

を使用する場合-march、GCCは、指定されたCPUで動作する命令を自由に生成できますが、(通常は)アーキテクチャファミリの以前のCPUでは動作しません。

を使用するだけの場合-mtune、コンパイラはそれらのいずれかで動作するコードを生成しますが、指定した特定のCPUで最も高速に実行される命令シーケンスを優先します。たとえば、そのCPUに適切にループ展開ヒューリスティックを設定します。


-march=foo-mtune=foo別のを指定しない限り、を意味します-mtune。これが、チューニングについて何もせず-marchにオプションを有効にするよりも、使用する方が優れている理由の1つです。-mavx

警告:-march=nativeGCCが特に認識しないCPUでも、GCCが検出できる新しい命令セットは有効になりますが、そのままになり-mtune=genericます。優れたコードを作成したい場合は、CPUを認識している十分に新しいGCCを使用してください。

于 2012-05-11T22:22:49.963 に答える
56

これは私がググったものです:

この-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ます)。ただし、haswellではなく、はるかに新しいCPU用にコードを最適化してくださいcore2

もあり-mtune=genericます。genericGCCが現在のCPUで最適に動作するコードを生成するようにします(genericGCCのあるバージョンから別のバージョンへの変更を意味します)。Gentooフォーラムには、doesによって生成されたコードよりも-march=X -mtune=generic高速に実行されるコードを生成するという噂があります(または、暗黙のうちに)。これが本当かどうかはわかりません。X-march=X -mtune=X-march=X-mtune=X

-march=<oldest CPU you want to run on>一般に、必要なものを正確に理解していない限り、とを指定するのが最善の方法のようです-mtune=generic(おそらく、最も古いCPUに最適化する必要がないため-mtune=generic、暗黙的なに対抗するためにここにあります)。-mtune=<oldest CPU you want to run on>または-march=native、ビルドするのと同じマシンでのみ実行する場合。

于 2014-04-24T11:24:20.777 に答える