IntelコンパイラはMicrosoftコンパイラより本当に優れていますか?[閉まっている]


56

数年前、IntelがVisual Studio互換コンパイラを販売していることを発見したとき、私は驚きました。私は特にC / C ++および素晴らしい診断ツールでそれを試しました。しかし、コードは、違いに気付くほど計算集約的ではありませんでした。唯一の印象は、Intelがまさに今私のためにそれを行ったのか、すごい、ナノ秒の解像度を備えた驚くべきツール、信じられないほどでした。しかし、トライアルは終了し、チームは真剣に購入を検討しませんでした。

あなたの経験から、ライセンス費用が問題にならない場合、どのベンダーが勝者ですか?

神聖な戦争を引き起こすのは、広範で曖昧な質問や態度ではありません。この種の質問は、非常に目に見える2つのツールに関するものです。ツールに謎や驚きがあるときは誰も好きではありません。そして最高と最高の間の選択は常に痛みです。また、草は常に環境に優しい議論であることも理解しています。すべての「what ifs」ストーリーを聞きたいです。

Intelが今月のチップステッピング用にローカルに最適化し、すべてのハードウェアターゲットがMicrosoftのコンパイルと同じように実際に動作するとは限らない場合はどうなりますか?AMDハードウェアがターゲットであり、すべてが理由なくスローダウンする場合はどうなりますか?または、一方で、Intelのハードウェアに気付かないほど多くの機会があり、Microsoftコンパイラライターが採用するには遅すぎて、コンパイラに実装できない場合はどうでしょうか。両方が正確に同じ場合、実際には単一のコードベースが2つの異なるボックスにラップされ、サードパーティショップによって両方のベンダーにライセンスされている場合はどうでしょうか。

等々。しかし、誰かがいくつかの答えを知っています。


17
インテル®コンパイラーは、非常に効率的な数値コードを生成することで定評があります。
quant_dev

2
@honk:quant_devがそれをバックアップするためのリンクを提供できるなら、そうでしょう!
FrustratedWithFormsDesigner

2
@RocketSurgeon:すべての人があなたの声明に同意するとは限りません。実際、エリックレイモンドは、Microsoftがビジネス慣行により数十年前までコンピューティングの進歩を遅らせてきたことに対して、かなり強い主張をしています。
メイソンウィーラー

2
@RocketSurgeonのオープンソースはお金とは何の関係もありません。
kaoD

1
Microsoftコンパイラーは非常に優れたコードを生成します。アセンブリを手動で検査しても、ばかげた命令シーケンスが見つかることはほとんどありません。実際、最適化がどれほど深く行われているかに感銘を受けました。これにより、命令がキャッシュラインの境界を越えることさえできなくなりました。
doug65536

回答:


57

警告:自分の経験に基づいた回答-YMMV

コードが本当に計算上高価な場合、はい、間違いなく。以前のインテル®C ++コンパイラー(正しく思い出せば、インテル®Studio)と標準のMicrosoft Visual C ++コンパイラーでは、20倍以上の改善が見られました。コードが完璧からはほど遠いことは確かであり、それが役割を果たしている可能性があります(実際、Intelコンパイラを使用して悩まされた理由は、巨大なコードベースをリファクタリングするよりも簡単でした)、またコードを実行するために使用されたCPUはIntel Core 2でしたクワッド、これはそのようなものに最適なCPUですが、結果は衝撃的でした。コンパイラ自体には、SSE機能などの特定のCPUを対象とするなど、コードを最適化するための無数の方法が含まれています。それは本当に可能-O2/ -O3恥じて逃げます。そしてそれはプロファイラーを使用する前に

ただし、非常に積極的な最適化を有効にすると、コンパイルにかなりの時間がかかり、大規模なプロジェクトで2時間かかることはまったく不可能ではありません。また、高レベルの最適化では、コードにエラーが発生する可能性が高くなります(これはgccでも確認できます-O3)。あなたがよく知っているプロジェクトにとって、これはプラスかもしれません、あなたが以前に見つけなかった最終的なバグを見つけて修正しますが、毛むくじゃらの混乱をコンパイルするとき、あなたは指を交差させてx86神に祈るだけです。

AMDマシンのパフォーマンスについての何か:それはインテルのCPUほど良好ではないのですが、それはまだだ(再び、私の経験から)MS C ++コンパイラよりも良いです。その理由は、SSE2をサポートする汎用CPUもターゲットにできるからです(たとえば)。そうすれば、SSE2を搭載したAMD CPUはそれほど差別されません。しかし、Intel CPU上のIntelコンパイラーはショーを本当に盗みます。ただし、すべてが二重の虹と光沢のあるユニコーンではありません。バイナリがGenuineIntel以外のCPUでまったく実行されておらず、(これは認められていますが)他のベンダーによってCPUのパフォーマンスが人為的に引き起こされたという非難がいくつかありました。また、これは少なくとも3年前の情報であり、現時点での有効性は不明ですが、新しい製品の説明により、IntelがIntel以外のCPUに適合するほど遅く動作するようにバイナリを提供しています。

Intelが何であるか、なぜ数値計算ツールが非常に優れているのかはわかりませんが、これもご覧ください:http : //julialang.org/。比較があり、最後の行を見ると、MATLABはCコードとJuliaの両方を打ち負かすことで輝いています。著者は、IntelのMath Kernel Libraryが理由であると著者が考えているのが印象的です。

これはインテルコンパイラツールキットの広告のように聞こえますが、私の経験では実際にうまく機能しました。また、単純なロジックでさえ、CPUを作成する人はそれらのプログラミング方法を最もよく知っている必要があります。IMOは、インテルC ++コンパイラーであり、可能な限りのパフォーマンス向上を実現します。


@ K.Steffこのvs msコンパイラとプログラム全体の最適化およびプロファイルガイド最適化を比較しましたか。
再実行

2
Intelは、CPUがIntelによって製造されていない場合、実行時にコンパイラが意図的に最適化されていないコードパスを使用することを開示することを余儀なくされました。IntelはFTCで問題を起こしました。ICCを使用するために私に支払うことができませんでした。私は10フィートの棒でその反競争的ながらくたに触れません。
doug65536

@ doug65536尋ねられる質問は、「Intelコンパイラは本当に優れているか」であり、「Intelはソフトウェアの根拠をさらに得るためにこの独占を悪用するハードウェア市場の独占者ではありません」。私はあなたのコメントがトピック外であると言っているわけではありませんが、私にとってイデオロギーはこの議論に場所がありません。使用するかどうか-あなたの呼び出しですが、それはICCがIntel CPU用のバイナリを作成するのにかなり良いという事実を変更しません。
K.ステフ

1990年代に普及したC言語は、プログラマがより効率的なコードを記述できるようにする多くの方法でC言語を拡張しましたが、一部の最適化コンパイラはサポートしていません。マイクロソフトは、他のベンダーよりもそのような拡張機能と互換性のない最適化を追求することにあまり熱心ではないと言うことができます。これにより、コンパイラは、それらを必要としないコードを処理する際にそのような互換性を気にかけないコンパイラよりも効率が低下しますが、それらを必要とするコードを正しく処理できます。
-supercat

35

インテル®コンパイラーは、非常に効率的な数値コードを生成することで定評があります。

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バイナリの作成者がそれらを構築するために、インテルFortranコンパイラーを使用することに注意してくださいhttp://icl.cs.utk.edu/lapack-for-windows/と、彼らは効率性についての事または2を知っている必要があります。


2
それはその評判を持っているだけでなく、それに応えています。CRUDアプリケーションを作成するために使用する場合は必要ありませんが、C、C ++、およびFORTRAN製品は、数値計算に関しては絶対に生々しいものです。
Blrfl

27

インテルC ++には、コードジェネレーターに加えて、gccよりもいくつかの利点があります。これらは両方とも(大部分)EDGフロントエンドに基づいているという事実に由来しています。良くも悪くも、これらは両方とも(ゆっくりと)侵食されるため、利点は以前ほど大きくはありません。

1つ目は、原則としてはるかに優れたエラーメッセージを発行することです。あなたは見たいかもしれません比較クランとGCCとのエラーメッセージの。インテルC ++(EDGフロントエンドに基づいた他のほとんどのものと一緒に)は、長年Clangに類似した診断を発行してきました。

第二に、EDGフロントエンドは、Intelコードジェネレーターが高速コードを生成するための言語適合性で非常によく知られていることです。ほぼすべての合理的な手段により、EDGフロントエンドは、利用可能な他のコンパイラーよりもC ++ 98、03、または(現在のバージョンでは)C ++ 0xとの適合性を高めます。

私が言ったように、これらの利点の両方は、時間の経過とともにさまざまな程度に浸食されています。gccの最近のバージョンは、かなり適切な言語に準拠しています。Clangのエラーメッセージは大幅に改善されており、C ++言語全体の実装も順調に進んでいます。ただし、すぐにわかると、Intel C ++は両方の点でどちらよりも優れています。適切な診断のために1つのコンパイラーを、適合性とコード生成を向上させるために別のコンパイラーを必要とするのではなく、ほとんどのことを行う単一のパッケージです。


14

しばらく前に職場でこれを試しました。コードベースの大部分はDelphiにありますが、高度に計算集約的な機能がいくつかあり、誰かがC ++ DLLを使用することをお勧めします。私の同僚の1人がIntelコンパイラについて素晴らしいことを聞いていたので、彼は試してみることにしました。IntelコンパイラでDLLを再構築し、速度テストをいくつか実行しましたが、結果は非常に驚いたため、何か間違ったことをしているに違いないと考えました。

DLLは、コンビナトリクスおよびトポロジコンポーネントに関するいくつかの非常に難しい問題を計算する必要があります。これらは、「正しく」行うとNPハード難易度クラスに含まれますが、NPパフォーマンスを回避するためにさまざまなヒューリスティックを使用します。それでも、多くの数の計算が行われています。そして、実行したテストでは、VSコンパイラとIntelコンパイラの違いはイプシロン内にあったか、Intelコンパイラが著しく遅く、一般に20%前後のどこかでした。そして、インテルのコンパイラーがより高速なコードを生成できるようにするために、彼がコンパイル設定にどのような変更を加えたとしても、それはそのままでした。そのため、最終的には切り替えませんでした。

もちろん、これは実際の1つの例にすぎません。あなたのマイレージは異なる場合があります。


ベンチマークが実行されたCPUの詳細を共有してもらえますか?
オーク

22
最初の段落を読んだとき、スピードテストの結果が彼に良い意味で驚いたと言っていると思いました。どうやら、2番目の段落を読んだ後、間違っています。最初の読書で私を誤解させるものがわからない。綿密に調べてみると、実際にその認識を残してしまうような肯定的な言葉は使用していません。他の誰かが同じ間違いを犯し、あなたが実際にここで言っていることについて混乱している場合にコメントしたいと思いました。
コーディグレイ

2
テストにAMDプロセッサーを使用していましたか?関連する情報だと思います(コンパイラが意図的にパフォーマンスが悪かったのか、ベストを尽くしても何もできなかったのかどうか)。
モニカを復元

3
Intel Core i7プロセッサーです。
メイソンウィーラー

ショートバージョン:IntelはVS2010よりも低速でした。私も、C ++を処理するかなり簡潔なデータのコードベースで、それほど前に職場でこれを試しました。さまざまな設定を試しました。既存のパフォーマンステストを使用した個々のアルゴリズムのいくつかは、著しく高速ですが、最も遅くなりました。全体として、ソフトウェアで行った高レベルの操作は、一貫して測定可能なほど遅くなりました。また、インテルのコンパイラの2013および2010バージョンでこれを試しましたが、2010はより良いコードであり、より安定しているようです。私のテストのほとんどは、AVX i7より前のバージョンで行われましたが、一部は古いCore2で行われました。
リッチ14年

9

私がかつて取り組んだ組み込みアプリケーションでは、Intelコンパイラの試用により、新しいハードウェアをより高いパフォーマンスでスピンする必要がなくなることが示されました。新しいハードウェアのコストは約10ドル/ユニットで、販売予測は100万ユニットで、開発コストとプロジェクトの遅延を追加しました。オプション2は、プロファイル/マイクロ最適化で、既に十分にプロファイリング/最適化されたコードベース-未知の結果、未知の時間です。

コンパイラを購入するための資金を求めたとき、上司は何と言ったと思いますか......

しかし、これは非常に幸運でまれなエッジケースでした-Intelコンパイラからの10%高速なコード出力により、パフォーマンスの正しい側面に戻りました。すでに右側にいた場合、または10%以上だった場合、違いはありませんでした。エンジニアがいれば、おそらくコードを最適化し、ハードウェアスピンを節約でき、Intelコンパイラは不要だったかもしれませんが、リスクは高く、Intelコンパイラはエンジニアリング時間よりも安く動作しました。

バランス上、私はそれがミクロ最適化の一種であると言います-あなたが必要とするまで、そしてあなたが問題の実際の原因をプロファイリングして見つけた後にだけそれをしないでください。それは、あなたが「どこでも」遅く、ボトルネックが特定されていないことを示すプロファイルの特に良い選択です。


5

次の3つの利点しかありません。

  1. 他のコンパイラよりもはるかに早く、新しいIntel CPUの機能をサポートしています。

  2. 警告を発行し、他のコンパイラーが見逃している問題をキャッチするための優れた追加コンパイラーです。GCCはICCがキャッチしないものをキャッチし、その逆も同様です。Visual Studioは、ICCができないことをキャッチします。

  3. ループの自動並列化(ループを複数のスレッドに自動的に分散させる)は、他のどのコンパイラよりもはるかに優れています。これによるコードの利点はそれほど多くありませんが、そのようなコードがある場合、大きな違いが生じる可能性があります。


3

コードベースのすべてのパフォーマンスの重要なプロジェクトにインテルコンパイラを使用しています。すばらしいのは、コードの最適化を本当に維持しやすくすることです。すべての場所に__mm呼び出しを手動で追加し、データをプリフェッチするようコンパイラーに指示するのではなく、次のリリースですべてが最適ではなくなるので、コードを再配置して非常に高速化します。

多くの場合、最適化されたコードは、手で最適化されたコードよりも簡単に追跡でき、手で最適化されたコードよりも高速です。また、新しい命令セットがリリースされると、コンパイラはその命令セットを使用します。すごいね。

同じことがarmコンパイラ(Intelからではなくarmから)にも当てはまります。armでのリリースがベクトル化で素晴らしい仕事をするなら。


+1。IntelにはARMコンパイラがありますか?信じられない!

1
いいえ、インテルにはARMコンパイラはありません。ただし、ARMにはARMコンパイラがあり、素晴らしい仕事をしています。
マルティエット

2
「編集:armにはarmコンパイラがありません。」これは本当にあなたが意図したものですか?
-luiscubal

0

このベンチマークページを確認してください。要するに、インテルが勝ちます。

ただし、マージンはそれほど大きくない場合があります。32ビットにコンパイルし、ビルドシステムがプロファイルガイドによる最適化をサポートできない場合、ゲインは10%程度になります。このような改善は、トラブルと長いコンパイル時間の価値がありますか?


URLリンクは死んでいるようです。
コンタンゴ

0

IntelがAndroid OS用Intel C ++ Compiler v13.0をリリースしたと言われています。これは、Googleのモバイルプラットフォーム専用に設計された最適化C / C ++コンパイラを提供する最初の試みです。

開発者は、Linux *ベースのシステムでコンパイラーを使用して、Intel®Atom™プロセッサーを含むIntelプロセッサーに基づいたAndroidデバイス用のアプリを作成できます。Intelコンパイラーは、GNU C ++およびAndroid Native Development Kit(NDK)の開発者ツールと互換性があります。どの開発マシンでもコンパイラーを使用することはできません。WindowsもOS Xもサポートされていません。ツールは、Ubuntu 10.04または11.04での使用のみが認定されています

Android NDKの現在のバージョンは、デフォルトでオープンソースのGnu Compiler Collection(GCC)ツールチェーンのバージョン4.6を使用しています。しかし、Intelのコンパイラには、独自のチップに対する独自の最適化が多数含まれており、GCCなどのサードパーティコンパイラが生成する実行可能コードよりもパフォーマンスの高い実行可能コードを出力できることがよくあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.