私はこのためにGCCのマニュアルページをスクラブしようとしましたが、実際にはそれを取得していません。GCC:marchはmtuneとどう違うのですか?
-march
と-mtune
の違いは何ですか?
いずれの場合も、-march
を使用するのはどちらですか? -mtune
はこれまでに可能ですか?
私はこのためにGCCのマニュアルページをスクラブしようとしましたが、実際にはそれを取得していません。GCC:marchはmtuneとどう違うのですか?
-march
と-mtune
の違いは何ですか?
いずれの場合も、-march
を使用するのはどちらですか? -mtune
はこれまでに可能ですか?
-march
を使用すると、GCCは指定されたCPUで動作する命令を自由に生成できますが、アーキテクチャファミリの以前のCPUでは使用できません。 -mtune
を使用すると、コンパイラはそれらのいずれかで動作するコードを生成しますが、指示した特定のCPUで最も高速に実行される命令シーケンスを優先します。
これは私がGoogleで検索した内容です:
-march=X
オプションは、CPU名X
を取り、GCCはX
のすべての機能を使用するコードを生成することができます。 GCCのマニュアルでは、どのCPUファミリがどのCPUファミリおよび機能を意味するのかを正確に説明しています。
の特徴は、通常は追加しましたが、削除されないので、-march=X
で構築されたバイナリは、CPU X
上で実行されます、X
より新しいCPU上で実行するための良い機会を持っていますが、それは、ほぼ確実にX
よりも古いものでは動作しません。特定の命令セット(3DNow!、おそらく?)は、特定のCPUベンダーに固有のものかもしれません。これらを使用すると、競合するCPU上で実行されないバイナリを取得することになります。
-mtune=Y
オプションを使用すると、実行される可能性のある他のCPUよりも、Y
で高速に実行されるように、生成されたコードが調整されます。 -march=X
は-mtune=X
を意味します。 -mtune=Y
は-march=X
を上書きしません。たとえば、-march=core2
と-mtune=i686
には意味がありません。-march=core2
のために、コードはcore2
より古いものでは実行されません。なぜ地球上で古いもの特徴が少ない) -march=core2 -mtune=haswell
はより意味があります:core2
が提供するもの以上の機能を使用しないでください(-march=i686
よりもまだ多くのものがあります)。core2
ではなく、より新しいhaswell
CPUのコードを最適化します。
-mtune=generic
もあります。 generic
は、GCCに現在のCPU(GCCのあるバージョンから別のバージョンへの変更はgeneric
の意味)が最も良いコードを生成します。 Gentooフォーラムには-march=X -mtune=generic
というコードでは、のコードよりも速く実行するコードがX
であるという噂があります(あるいは、-march=X
、-mtune=X
という意味です)。これが真実かどうかは分かりません。一般
、あなたが必要な正確に何を知っている限り、(あなたはおそらく最も古いCPUを最適化したくないので-mtune=generic
は、暗黙の-mtune=<oldest CPU you want to run on>
に対抗するためにここにある)最高のコースは-march=<oldest CPU you want to run on>
と-mtune=generic
を指定することであると思われます。あるいは、あなたが構築したのと同じマシン上でのみ実行する場合は、-march=native
です。
同じ値に設定した場合、両方を使用すること、またはmtuneが冗長であるかどうかは答えません。 –
@PavelŠimerda直感的に答えは、2つの機能の定義に暗黙のうちに書かれています。さらに、ドキュメンテーションは明示的に「行進」は「mtune」を意味すると述べている。だから、あなたの反対への答えはそれぞれ「いいえ」と「はい」です。 –
これをとても上品に説明してくれてありがとう!あなたは理解しやすい。 –