コンパイラ(例:gcc)の-marchフラグは本当に重要ですか?
-march=i686の代わりに-march=my_architectureを使用して、すべてのプログラムとカーネルをコンパイルすると、より高速になりますか?
コンパイラ(例:gcc)の-marchフラグは本当に重要ですか?
-march=i686の代わりに-march=my_architectureを使用して、すべてのプログラムとカーネルをコンパイルすると、より高速になりますか?
はい、そうですが、違いが関連する場合もあります。ただし、コードをベクトル化して、あるアーキテクチャーでは利用できるが別のアーキテクチャーでは利用できない SSE やその他の拡張命令セットを使用できる場合、それらは非常に大きくなる可能性があります。そしてもちろん、32 ビットと 64 ビットの違いは (必ずしもそうである必要はありませんが) 顕著になる可能性があります (これは、パラメーター-m64
のタイプと見なす場合です-march
)。
逸話的な証拠として、数年前、Pentium 4 で実行された特定のコードが でコンパイルされたときよりも でコンパイルされたときよりgcc
も約 2 倍遅くなるという面白いバグに遭遇しました。-march=pentium4
-march=pentium2
つまり、多くの場合、違いはありません。違いがある場合もあれば、予想とは逆の場合もあります。いつものように、「安全な」範囲を超える最適化を使用することを決定する前に測定してください (たとえば、より一般的なモデルの代わりに実際の正確な CPU モデルを使用します)。
march
コンパイルするコードが他のバージョンよりも速く/遅くなるという保証はありません。それは実際にはコードの「種類」に依存し、実際の結果は測定によってのみ得られる場合があります。たとえば、コードにベクトル化の可能性がたくさんある場合、'march' がある場合とない場合で結果が異なる可能性があります。一方で、ベクトル化中にコンパイラーがうまく機能しない場合があり、特定のアーキテクチャー用にコンパイルするとコードが遅くなる可能性があります。