数年前、IntelがVisual Studio互換のコンパイラを販売していることを発見したとき、私は驚きました。特にC/C++と素晴らしい診断ツールで試してみました。しかし、コードは違いに気付くためにそれほど計算集約的ではありませんでした。唯一の印象は次のとおりです。インテルは本当に今すぐに私のためにそれを行いましたか、すごい、ナノ秒の分解能を備えた驚くべきツールで、信じられないほどです。しかし、裁判は終了し、チームは購入を真剣に検討しませんでした。
あなたの経験から、ライセンスコストが問題ではない場合、どのベンダーが勝者ですか?
spark聖なる戦争への広いまたは曖昧な質問または試みではありません。この種の質問は2つの非常に目に見えるツールについてです。ツールが持っているときに誰も好きではありませんミステリーや驚きがあります。ベストとベストの選択は常に苦痛です。私も理解しています 草は常に緑が多い 引数。すべての「もしも」の話を聞きたいのです。
Intelがその月のチップステッピングのためにローカルで最適化し、すべてのハードウェアターゲットがMicrosoftのコンパイルと同じように機能するとは限らない場合はどうなりますか? AMDハードウェアがターゲットであり、すべてが理由もなく遅くなる場合はどうなりますか?あるいは、一方で、Intelのハードウェアに気づかれないほど多くの機会があり、Microsoftコンパイラの作成者が採用するには遅すぎて、コンパイラに実装できない場合はどうなりますか?両方がまったく同じ場合、実際には単一のコードベースが2つの異なるボックスにラップされ、サードパーティのショップによって両方のベンダーにライセンスされていますか?
など。しかし、誰かがいくつかの答えを知っています。
警告:自分の経験に基づく回答-YMMV
コードが本当に計算コストが高い場合、はい、間違いなくです。標準のMicrosoft Visual C++コンパイラと比較して、以前のインテルC++コンパイラ(正しく思い出せば今はインテルスタジオ)で20倍以上の改善が見られます。確かに、コードは完全ではなく、それが役割を果たした可能性があります(実際には、インテルコンパイラーを使用するのが面倒だったので、巨大なコードベースをリファクタリングするよりも簡単でした)。クワッド、これはそのようなものに最適なCPUですが、結果は衝撃的でした。コンパイラ自体には、たとえば [〜#〜] sse [〜#〜] 機能の観点から特定のCPUをターゲットにするなど、コードを最適化する無数の方法が含まれています。それは本当に-O2
/-O3
を恥ずかしく思います。そして、それはプロファイラを使用してbeforeでした。
ただし、非常に積極的な最適化を有効にすると、コンパイルにかなり時間がかかることに注意してください。大規模なプロジェクトでは2時間も不可能ではありません。また、最適化のレベルが高いと、コードでエラーが発生する可能性が高くなります(これはgcc -O3
でも確認できます)。あなたがよく知っているプロジェクトにとって、これはプラスになるかもしれません。以前は見つけられなかった最終的なバグを見つけて修正するからです。しかし、厄介な混乱をコンパイルするときは、指をクロスしてx86の神々に祈るだけです。
AMDマシンのパフォーマンスについて:Intel CPUほどではありませんが、MS C++コンパイラよりもway優れています(これも私の経験から)。理由は、 SSE2 などのサポートを備えた汎用CPUもターゲットにできるためです。そうすれば、SSE2を搭載したAMD CPUはあまり区別されません。ただし、Intel CPU上のIntelコンパイラは実際にショーを盗みます。ただし、すべてが二重の虹や光沢のあるユニコーンではありません。 GenuineIntel以外のCPUでバイナリがまったく実行されていないこと、および(これは認められますが)他のベンダーによって CPUのパフォーマンスが人工的に低下したことについて、いくつかの激しい非難がありました 。また、これは少なくとも3年前の情報であり、現時点での有効性は不明ですが、新しい製品の説明では、IntelがIntel以外のCPUに適合しているのと同じくらい低速で実行できるように、バイナリが明確に分岐しています。
インテルの概要や、数値計算ツールが優れている理由はわかりませんが、こちらもご覧ください。 http://julialang.org/ 。比較があり、最後の行を見ると、 [〜#〜] matlab [〜#〜] は、Cコードと Julia 、私を驚かせたのは、著者が理由をIntelの Math Kernel Library だと思っていることです。
これはIntel Compilerツールキットの宣伝のように聞こえますが、私の経験では、それは本当にうまく機能し、単純なロジックでさえ、CPUを作成する人はそれらのためにプログラムする方法を最もよく知っているはずです。 IMO、インテルC++コンパイラーは、可能な限りパフォーマンスの最後のビットを絞り込みます。
インテルコンパイラーは、非常に効率的な数値コードを生成するという評判があります。
https://stackoverflow.com/questions/1733627/anyone-here-has-benchmarked-intel-c-compiler-and-gcc
http://www.open-mag.com/754088105111.htm
http://www.freewebs.com/godaves/javabench_revisited/
私がそれがが最速のコンパイラであるとは主張していませんが、効率性については非常に高い評価を得ています。 Windows用の「公式」LAPACKバイナリの作成者は、Intel Fortranコンパイラを使用してそれらをビルドすることに注意してください: http://icl.cs.utk.edu/lapack-for-windows/ 効率に関することです。
Intel C++には、コードジェネレーターに加えて、gccに比べていくつかの利点があります。これらは両方とも(主に) [〜#〜] edg [〜#〜] フロントエンドに基づいているという事実に由来します。良くも悪くも、これらの両方が(ゆっくりと)侵食されているため、利点はかつてほど大きくありません。
1つ目は、原則としてはるかに優れたエラーメッセージを発行することです。 Clangとgcc間のエラーメッセージの 比較 を確認することをお勧めします。 Intel C++(およびEDGフロントエンドに基づく他のほとんど)は、長年にわたってClangに類似した診断を発行しています。
第二に、EDGフロントエンドは、Intelコードジェネレーターが高速コードを生成するためのものであるのと同じくらい、非常に優れた言語適合性で知られています。 EDGフロントエンドは、ほとんどすべての妥当な手段によって、C++ 98、03、または(現在のバージョンでは)C++ 0xへの準拠を、利用可能な他のコンパイラよりも優れています。
私が言ったように、これらの利点の両方は、時間とともにさまざまな程度に侵食されました。 gccの最近のバージョンは、かなり適切な言語に準拠しています。 Clangのエラーメッセージは大幅に改善されており、C++言語全体の実装にも順調に進んでいます。ただし、インテルC++はどちらの点でもどちらの場合よりも優れています。優れた診断のために1つのコンパイラーを必要とし、適合性とコード生成を向上させるために別のコンパイラーを必要とするのではなく、単一のパッケージです。
しばらく前に仕事でこれを試しました。私たちのコードベースのほとんどはDelphiにありますが、C++で実行することをお勧めします高度に計算集約的な機能をいくつか備えていますDLLいつ戻るか。そして、私の1つ同僚はIntelコンパイラについて素晴らしいことを聞いていたので、彼はそれを試すことにしました。DLLをIntelコンパイラで再構築し、いくつかの速度テストを実行しました。その結果、彼は非常に驚きました彼は何か悪いことをしているに違いないと考えた。
DLLは、組み合わせ論とトポロジーコンポーネントに関する非常に難しい問題を計算する必要があります。これらは、技術的にNP-hard難易度クラスで「適切」に実行した場合に発生しますが、さまざまなヒューリスティックを使用して回避します= NP=パフォーマンス。それでも、多くの処理が行われています。実行したテストでは、VSコンパイラとIntelコンパイラの違いは、イプシロン内にあるか、Intelコンパイラが著しく遅くなり、一般的には20%近くになりました。そして、インテルコンパイラーがより高速なコードを生成できるようにするためにコンパイル設定をどのように変更しても、それは同じままでした。
もちろん、これは実際の例の1つにすぎません。あなたのマイレージは異なる場合があります。
私がかつて取り組んだ組み込みアプリケーションでは、Intelコンパイラの試験により、新しいハードウェアをより高いパフォーマンスでスピンする必要がなくなることが示されました。新しいハードウェアのコストは約10ドル/ユニットで、100万ユニットの予測売上高、開発コストの追加、プロジェクトの遅延がありました。オプション2はプロファイル/マイクロ最適化であり、すでに十分にプロファイル/最適化されたコードベース-未知の結果、未知の時間。
コンパイラを購入するための資金を要求したとき、ボスは何と言ったと思いますか…….
ただし、これは非常に幸運でまれなEdgeケースでした。Intelコンパイラからの10%速いコード出力により、パフォーマンスの正しい側面に戻りました。すでに右側にいる場合、または10%オーバーの場合、違いはありませんでした。コードを最適化してハードウェアの回転を節約でき、インテルコンパイラーを必要としないエンジニアがいたら、リスクは高く、インテルコンパイラーはエンジニアリング時間よりも安く機能しました。
全体として、これはマイクロ最適化の1つの形式であると言えます-必要なことがわかるまで、そして問題の実際の原因をプロファイルして見つけた後でのみ、それを実行しないでください。これは、プロファイルの特に良い選択であり、「どこでも」遅く、ボトルネックが特定されていないことを示しています。
私は3つの利点に遭遇しました:
他のコンパイラよりもはるかに早く、新しいIntel CPUの機能をサポートしています。
これは、警告を発行し、他のコンパイラーが見逃している問題をキャッチするための優れた追加のコンパイラーです。 GCCはICCがキャッチしないものをキャッチし、その逆も同様です。 Visual Studioは、ICCがキャッチしないものをキャッチし、その逆も同様です。
他のどのコンパイラーよりも、ループを自動並列化(複数のスレッドに自動的に分散)するというはるかに優れた働きをします。これによるコードのメリットはあまりありませんが、そのようなコードがあると、大きな違いが生じます。
コードベースのすべてのパフォーマンス基準プロジェクトにインテルコンパイラーを使用しています。それの素晴らしいところは、コードの最適化を本当に維持しやすくすることです。すべての場所に__mm呼び出しを手動で追加し、コンパイラーにデータをプリフェッチするように指示する代わりに、次のリリースではこれらすべてが再び最適ではなくなり、コードをいくつか再配置して、非常に高速化します。
多くの場合、最適化されたコードは、手動で最適化されたコードよりも追跡が容易であり、手動で最適化されたコードよりも高速です。新しい命令セットがリリースされると、コンパイラはその命令セットを使用します。すごいね。
同じことは、armコンパイラにも当てはまります(intelではなくarmから)。armでリリースすると、ベクトル化に非常に役立ちます。
このベンチマークのページを確認してください。 つまり、インテルが勝利します。
しかし、マージンはそれほど大きくない場合があります。32ビットにコンパイルし、ビルドシステムがプロファイルに基づく最適化をサポートできない場合、ゲインは10%程度です。このような改善は、問題が発生し、コンパイル時間が長くなりますか?
IntelがAndroid OS用のIntel C++コンパイラv13.0をリリースしたと言われています。これは、Googleのモバイルプラットフォーム用に特別に設計された最適化C/C++コンパイラを提供する最初の試みです。
開発者は、Linux *ベースのシステムでコンパイラーを使用して、Intel®Atom™プロセッサーを含むIntelプロセッサーをベースにしたAndroidデバイス用のアプリを作成できます。インテルコンパイラーはGNU C++およびAndroidネイティブ開発キット(NDK)の開発者ツールと互換性があります。コンパイラーを開発マシンだけで使用することもできません。 WindowsもOS Xもサポートされていません。ツールはUbuntu 10.04または11.04での使用のみが認定されています
Android NDKの現在のバージョンは、デフォルトでオープンソースのGnu Compiler Collection(GCC)ツールチェーンのバージョン4.6を使用します。しかし、インテルのコンパイラーには、独自のチップ用の独自の最適化が数多く含まれており、多くの場合、GCCなどのサードパーティのコンパイラーが生成するよりも実行可能なコードを出力できます。