このためにGCCのマニュアルページをスクラブしようとしましたが、それでも実際には取得できません。
-march
との違いは何-mtune
ですか?
どちらを使用する-march
のか、両方を使用するのか。ただすることは今までに可能-mtune
ですか?
このためにGCCのマニュアルページをスクラブしようとしましたが、それでも実際には取得できません。
-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=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
ます。generic
GCCが現在のCPUで最適に動作するコードを生成するようにします(generic
GCCのあるバージョンから別のバージョンへの変更を意味します)。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
、ビルドするのと同じマシンでのみ実行する場合。