2012-05-11 21 views
63

私はこのためにGCCのマニュアルページをスクラブしようとしましたが、実際にはそれを取得していません。GCC:marchはmtuneとどう違うのですか?

-march-mtuneの違いは何ですか?

いずれの場合も、-marchを使用するのはどちらですか? -mtuneはこれまでに可能ですか?

答えて

80

-marchを使用すると、GCCは指定されたCPUで動作する命令を自由に生成できますが、アーキテクチャファミリの以前のCPUでは使用できません。 -mtuneを使用すると、コンパイラはそれらのいずれかで動作するコードを生成しますが、指示した特定のCPUで最も高速に実行される命令シーケンスを優先します。

+8

同じ値に設定した場合、両方を使用すること、またはmtuneが冗長であるかどうかは答えません。 –

+7

@PavelŠimerda直感的に答えは、2つの機能の定義に暗黙のうちに書かれています。さらに、ドキュメンテーションは明示的に「行進」は「mtune」を意味すると述べている。だから、あなたの反対への答えはそれぞれ「いいえ」と「はい」です。 –

+0

これをとても上品に説明してくれてありがとう!あなたは理解しやすい。 –

35

これは私が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です。

関連する問題