GCC:マーチはmtuneとどう違うのですか?


88

これについてGCCのmanページをスクラブしようとしましたが、それでも実際には取得できません。

違いは何だ-marchとは-mtune

-marchどちらを使用するのか、両方を使用するのか。ただそれは可能-mtuneですか?

回答:


97

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

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


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

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


10
両方を使用することが理にかなっているのか、同じ値に設定したときにmtuneが冗長であるのかについては答えません。
パベルŠimerda

12
@PavelŠimerda直感的に、答えは2つの機能の定義に暗黙のうちに含まれています。その上、ドキュメントはそれがmarch意味することを明示的に述べていmtuneます。したがって、あなたの反対意見に対する答えは、それぞれ「いいえ」と「はい」です。
underscore_d

これをとてもエレガントに説明してくれてありがとう!わかりやすくします。
Rahim Khoja 2016年

5
tl; drが必要です。プロセッサでのみ実行する場合は-marchを使用し、他のプロセッサで安全にしたい場合は-mtuneを使用します。
j riv 2017

3
また、ユーザーは(存在していなかったいくつかのCPUの前にリリース)古いコンパイラが異なる最適になることを理解しなければならないmtunemarchの組み合わせ。このブログ記事の点灯は、他者とのポイントその:lemire.me/blog/2018/07/25/...
qneill

53

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

この-march=XオプションはCPU名Xを取り、GCCがのすべての機能を使用するコードを生成できるようにしますX。GCCマニュアルでは、どのCPU名がどのCPUファミリと機能を意味するかを正確に説明しています。

機能は通常追加されますが削除されないため、で構築されたバイナリ-march=XはCPUXで実行され、より新しい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ます。genericGCCが現在のCPUで最適に動作するコードを生成するようにします(genericGCCのあるバージョンから別のバージョンへの変更を意味します)。Gentooフォーラムに-march=X -mtune=genericは、dosXによって生成されたコードよりも高速に実行されるコードを生成するという噂があります-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、ビルドするのと同じマシンでのみ実行する場合。


4
あなたが使用している場合でも-march=native、次のように指定することもできます-mtune=X。デフォルトはまだあるので、-mtune=genericここで説明したように、:lemire.me/blog/2018/07/25/...
ローランド・ウェーバー

@RolandWeber:これは、CPUについて知るには古すぎるGCCを使用している場合にのみ発生します。 CPUを認識しているGCCを使用している場合は、問題がないことを-march=native意味しtune=nativeます。その記事は悪いケースを提示するだけです。新しいGCCバージョンは、特にAVX2やAVX-512などの新しい命令を使用する場合に、一般的に優れたコードを作成します。また、CPU用に設計されたチューニング設定(ループ展開ヒューリスティックなど)があることは間違いなくプラスです。したがって、これらのオプションを使用するのに十分なパフォーマンスを気にする場合は、新しいGCCを使用してください。少なくとも、CPUを認識しているもの、できれば現在の安定したリリースを使用してください。
PeterCordes20年

GCCがtune=generic、同じマイクロアーキテクチャファミリの新しいメンバー、特にSkylakeのマイクロアーキテクチャと文字通り同一であるKabyLakeのようなものよりも優れていることはありません。しかし、それはまだ異なるファミリー/ステッピングを持っていると思うので、Skylake以上についてしか知らなかったGCCはチューニングのためにそれを認識できない可能性があります。
PeterCordes20年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.