2011-08-17 7 views
16

GPUがCPUよりもはるかに高速な例が多くあります。しかし、並列化が非常に難しいアルゴリズム(問題)が存在します。 CPUがGPUを克服できる時にいくつかの例やテストを教えてください。cpu対gpu - CPUがより良い場合

編集:提案のため

ありがとう!我々は、最も人気のあるCPUと最新のCPUとgpuを比較することができます。たとえば、Core i5 2500k vs GeForce GTX 560 Tiなどです。

SIMDモデルをどのように比較するのだろうか。例:Cudaはより正確にSIMTモデルをSIMTと呼んでいます。しかし、SIMTは、MIMDコア間でスレッド(タスク)を分散しているCPU上のマルチスレッド化(Core i5 2500kを4個のMIMDコアとして提供)と比較する必要があります。一方、これらのMIMDコアはそれぞれSIMDモデルを実装できますが、これはSIMT以外のものであり、それらを比較する方法はわかりません。最後に、並列カーネル実行を伴うフェルミアーキテクチャがSIMTを備えたMIMDコアとして考慮されるかもしれない。

+1

[このブログの記事]をお読みください(http://blog.stackoverflow.com/2011/08/gorilla-vs-shark/)これ以上の質問をする前にstackoverflowで質問してください。 – talonmies

+1

@talonmies:私は同意しません。これは非常に具体的な質問で、非常に具体的な答えです。反対の唯一の点は、おそらく他の質問と重複していることでしょう。 –

+1

[GPGPU vs. Multicore?]の複製が可能です(http://stackoverflow.com/questions/5919172/gpgpu-vs-multicore) –

答えて

15

私の経験に基づいて、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占有など、多くのケースでパフォーマンスに大きな影響を持つことができますいくつかの他の要因...

関連する問題