これについてGCCのmanページをスクラブしようとしましたが、それでも実際には取得できません。
違いは何だ-march
とは-mtune
?
-march
どちらを使用するのか、両方を使用するのか。ただそれは可能-mtune
ですか?
回答:
を使用すると-march
、GCCは、指定されたCPUで動作する命令を自由に生成できますが、(通常は)アーキテクチャファミリの以前のCPUでは動作しません。
を使用するだけの場合-mtune
、コンパイラはそれらのいずれかで機能するコードを生成しますが、指定した特定のCPUで最も高速に実行される命令シーケンスを優先します。たとえば、そのCPUに適切にループ展開ヒューリスティックを設定します。
-march=foo
-mtune=foo
別のを指定しない限り、を意味します-mtune
。これが、チューニングについて何もせずに-march
オプションを有効にするよりも、使用する方が優れている理由の1つ-mavx
です。
警告:-march=native
GCCが特に認識しないCPUでも、GCCが検出できる新しい命令セットは有効になり-mtune=generic
ますが、そのままになります。優れたコードを作成したい場合は、CPUを認識している十分に新しいGCCを使用してください。
march
意味することを明示的に述べていmtune
ます。したがって、あなたの反対意見に対する答えは、それぞれ「いいえ」と「はい」です。
mtune
とmarch
の組み合わせ。このブログ記事の点灯は、他者とのポイントその:lemire.me/blog/2018/07/25/...
これは私がググったものです:
この-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
あなたに提供するものよりはるかに多いです!)が、ではなく、はるかに新しいhaswell
CPU用にコードを最適化してくださいcore2
。
もあり-mtune=generic
ます。generic
GCCが現在のCPUで最適に動作するコードを生成するようにします(generic
GCCのあるバージョンから別のバージョンへの変更を意味します)。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
、ビルドするのと同じマシンでのみ実行する場合。
-march=native
、次のように指定することもできます-mtune=X
。デフォルトはまだあるので、-mtune=generic
ここで説明したように、:lemire.me/blog/2018/07/25/...
-march=native
意味しtune=native
ます。その記事は悪いケースを提示するだけです。新しいGCCバージョンは、特にAVX2やAVX-512などの新しい命令を使用する場合に、一般的に優れたコードを作成します。また、CPU用に設計されたチューニング設定(ループ展開ヒューリスティックなど)があることは間違いなくプラスです。したがって、これらのオプションを使用するのに十分なパフォーマンスを気にする場合は、新しいGCCを使用してください。少なくとも、CPUを認識しているもの、できれば現在の安定したリリースを使用してください。
tune=generic
、同じマイクロアーキテクチャファミリの新しいメンバー、特にSkylakeのマイクロアーキテクチャと文字通り同一であるKabyLakeのようなものよりも優れていることはありません。しかし、それはまだ異なるファミリー/ステッピングを持っていると思うので、Skylake以上についてしか知らなかったGCCはチューニングのためにそれを認識できない可能性があります。