私の経験に基づいて、CPUとGPUの並列プログラム間のパフォーマンスの重要な違いを要約します。私を信じて、比較は世代から世代に変更することができます。だから、私はちょうど良いとCPUとGPUに悪いことを指摘します。もちろん、悪い面や悪い面しか持たない極端なプログラムを作成すると、が確実に1つのプラットフォーム上でを実行します。しかし、それらの混合物は非常に複雑な推論を必要とします。
ホストプログラムレベル
一つの重要な違いは、メモリの転送コストです。 GPUデバイスにはメモリ転送が必要です。このコストは、いくつかのケースでは重要ではありません。たとえば、大きなアレイを頻繁に転送する必要がある場合などです。私の経験では、このコストは最小限に抑えられますが、ほとんどのホストコードはデバイスコードに置き換えられます。あなたがそうすることができる唯一のケースは、モニタに出力するなど、プログラムでホストオペレーティングシステムと対話する必要がある場合です。
デバイスのプログラムレベル
今はまだ完全には明らかにされていない複雑な絵を見に来て。私が意味することは、公開されていないGPUには神秘的なシーンがたくさんあるということです。しかし、パフォーマンス面ではCPUとGPU(カーネルコード)を区別しています。
私が気づいた要因は、その違いに劇的に寄与するということはほとんどありません。多くの実行ユニットから成る
のGPUは、大規模並列プログラムを処理するように設計されています。仕事が少なく、いくつかの連続したタスクを言い、これらのタスクをGPUに入れれば、それらの多くの実行ユニットのほんの少しだけがビジーであるため、CPUよりも遅くなります。これに対して、CPUは短期間および順次のタスクを処理する方が優れているためです。理由は簡単です、CPUははるかに複雑で、命令レベルの並列性を利用することができますが、GPUはスレッドレベルの並列性を利用します。さて、私はNVIDIA GF104がSuperscalarをやることができると聞きましたが、私はそれを経験するチャンスはありませんでした。
GPUでは、ワークロードが小さなブロック(またはOpenCLのワークグループ)に分割され、ブロックが1つのストリーミングプロセッサ(NVIDIAの用語を使用しています)で実行されるチャンク単位で配置されています。 。しかし、CPUでは、これらのブロックは順番に実行されます - 私は単一のループ以外の何かを考えることはできません。
したがって、ブロック数の少ないプログラムの場合、CPUでより高速に実行するには、となる可能性があります。
支店常に、のGPUに悪いものです。 GPUは同等のものを好むことに注意してください。等ブロック、ブロック内の等しいスレッド、およびワープ内の等しいスレッドしかし、最も重要なのは何ですか?
***Branch divergences.***
Cuda/OpenCLプログラマは分岐の相違を嫌う。すべてのスレッドは何とかワープと呼ばれる32スレッドのセットに分割され、ワープ内のすべてのスレッドはロックステップで実行されるため、分岐の分岐によってワープ内の一部のスレッドがシリアル化されます。したがって、ワープの実行時間はそれに応じて乗算される。
GPUと異なり、CPUの各コアは独自のパスに従うことができます。さらに、CPUが分岐予測を有するので、分岐を効率的に実行することができる。
このように、ワープの相違がさらに多いプログラムは、というCPUで高速に実行されます。
これは本当にのは、それが簡単に作ろう十分に複雑です。
グローバルメモリアクセスは非常に高い遅延(400〜800サイクル)を持つことに注意してください。古い世代のGPUでは、メモリアクセスが合体するかどうかは決定的に重要な問題でした。今あなたのGTX560(フェルミ)は2つのレベルのキャッシュを持っています。したがって、多くの場合、グローバルメモリアクセスコストを削減することができます。しかし、CPUとGPUのキャッシュは異なるため、その効果も異なります。
私が言うことは、あなたのメモリアクセスパターン、カーネルコードパターン(メモリアクセスがどのように計算、操作の種類などにインターリーブされているか)がGPUでより高速に実行されるかどうかを判断することですまたはCPU。
しかし、何とか(GPUで)膨大な数のキャッシュミスがGPUに悪影響を及ぼしていると思います(コードによって異なります)。
さらに、共有メモリはGPUの重要な機能です。共有メモリへのアクセスは、GPU L1キャッシュへのアクセスと同じくらい速いです。だから、共有メモリを利用するカーネルにはかなりのメリットがあります。
私は本当に言及していないが、それらは、このようなバンク競合、メモリトランザクションのサイズ、GPU占有など、多くのケースでパフォーマンスに大きな影響を持つことができますいくつかの他の要因...
[このブログの記事]をお読みください(http://blog.stackoverflow.com/2011/08/gorilla-vs-shark/)これ以上の質問をする前にstackoverflowで質問してください。 – talonmies
@talonmies:私は同意しません。これは非常に具体的な質問で、非常に具体的な答えです。反対の唯一の点は、おそらく他の質問と重複していることでしょう。 –
[GPGPU vs. Multicore?]の複製が可能です(http://stackoverflow.com/questions/5919172/gpgpu-vs-multicore) –