2011-02-25 17 views
1

私がしなければならない短いレポートのために、クラスはgcc -O0とicc -O0の両方を使ってクラスター上でコードを実行しました。私たちは、gccがiccより約2.5倍速く、最適化がないことを発見しました。どうしてこれなの? gcc -O0は実際にマイナーな最適化を行っていますか、単にこのシステムでうまくいくのでしょうか?なぜgcc -o0はicc -o0より速いのですか?

コードは、cで書かれたナイーブな文字列検索アルゴリズムhereの実装です。

は-O0で

+4

最適化のないベンチマークは無意味なmakeworkのようです。 –

+4

アセンブリダンプを比較してください。その原因は明らかです。 – zwol

+1

大学の割り当て先。無意味なもののようです。 – Kurru

答えて

3

考慮に入れるべきいくつかのこと:

  • 各コンパイラがデフォルトで使用する命令セット。たとえば、GCCビルドがデフォルトでi686コードを生成する場合、ICCはi586オペコードに制限されますが、パフォーマンスに大きな違いが見られます。

  • クラスタ内の実際のCPU。 Intel CPUの代わりにAMDプロセッサを使用している場合、ICCはIntelプロセッサのみを対象としているため、欠点があります。

  • クラスタを使用して説明しました。このスピードの違いは、単一プロセッサ上にも存在しますか?コンパイラによって提供された並列化機能を使用した場合は、そこに大きな相違が生じる可能性があります。

  • 簡略化して、最適化を無効にすると、コンパイラは各コード構成にあらかじめ作成された "テンプレート"を使用します。これらのテンプレートは後で最適化されることを意図しているため、最適化パスがより良いコードを生成できるように構築されています。 -O0を使用すると、速度が遅くなったり遅くなったりすることは実際には何も意味しません。たとえば、より明示的な初期コードは、最適化が容易で実行が遅くなることがあります。

    大きな違いが嘘のコードの部分の組み立てを見て、何が起こっているのを確認する唯一の方法は、必要であれば、あなたのコードの実行をプロファイルとすることである、と述べた

+0

古代のCPUを見つけることさえ容易でないときは誰がi586を使っているのかわかりません –

+0

@LưuVĩnhPhúc:あなたは驚くでしょう。 1つは、使用中の古いCPUがたくさんあります。いくつかは、それらが壊れるまで存在します。 ATM、産業用コントローラ、e。同じように、古い命令セットを持つCPUのいくつかは、組み込み用にまだ生産中です。さらに、パフォーマンスが重要ではなく、ベンダーに関係なくほとんどのCPUでアプリケーションを動作させたい場合は、しばしば最も古いCPUである最低公倍数でコンパイルする必要があります。 – thkala

6

パフォーマンスが面白いか何かを示すものではありません、ありがとうございました。明示的に「パフォーマンスは気にしません」と書かれており、コンパイラーはそれを利用します。何が起こっても簡単なことはありません。不運なことによると、GCCの最も単純なものは、特定のハードウェア構成の特定のマイクロベンチマークのICCで最も簡単なものよりも速いです。他のマイクロベンチマークを100回実行した場合、ICCがより速い場所もあります。あなたがしなかったとしても、それでもそれほど意味はありません。コンパイラ間でパフォーマンスを比較する場合は、最適化をオンにします。これは、パフォーマンスを気にする場合に行うことなので、最適化をオンにします。

なぜ速いのかを理解したい場合は、実行をプロファイルします。実行時間はどこで使われていますか?屋台はどこにありますか?なぜこれらの屋台は起こるのですか?

+0

ある種の悪名高いコンパイラベンダーから、デバッグの最適化を無効にしなければならないことを学んだインストラクターと対処できる可能性があります。 –

関連する問題