これについてGCCのmanページをスクラブしようとしましたが、それでも実際には取得できません。
違いは何だ-marchとは-mtune?
-marchどちらを使用するのか、両方を使用するのか。ただそれは可能-mtuneですか?
回答:
を使用すると-march、GCCは、指定されたCPUで動作する命令を自由に生成できますが、(通常は)アーキテクチャファミリの以前のCPUでは動作しません。
を使用するだけの場合-mtune、コンパイラはそれらのいずれかで機能するコードを生成しますが、指定した特定のCPUで最も高速に実行される命令シーケンスを優先します。たとえば、そのCPUに適切にループ展開ヒューリスティックを設定します。
-march=foo-mtune=foo別のを指定しない限り、を意味します-mtune。これが、チューニングについて何もせずに-marchオプションを有効にするよりも、使用する方が優れている理由の1つ-mavxです。
警告:-march=nativeGCCが特に認識しない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あなたに提供するものよりはるかに多いです!)が、ではなく、はるかに新しい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、ビルドするのと同じマシンでのみ実行する場合。
-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はチューニングのためにそれを認識できない可能性があります。