2012-02-09 6 views
11

単純な例を考えてみましょう。OpenCL CPUデバイス対GPUデバイス

CL_DEVICE_TYPE_GPU用のプログラムをビルドし、CL_DEVICE_TYPE_CPU用の同じプログラムをビルドすると、それらの違いは何ですか(「CPUプログラム」がCPU上で実行され、「GPUプログラム」がGPU上で実行されていることを除きます)。

ありがとうございました。

答えて

35

デバイスの種類にはいくつかの違いがあります。あなたのベクトル質問への簡単な答えは:大きなベクトルにはGPUを使用し、小さなワークロードにはCPUを使用します。

1)メモリコピー。 GPUは、作業中のデータに依存してそれらに渡され、結果は後でホストに読み込まれます。これはPCI-eで行われ、バージョン2.0/2.1では約5GB/sになります。 CPUは、CL_MEM_ALLOC_HOST_PTRフラグまたはCL_MEM_USE_HOST_PTRフラグのいずれかを使用して、DDR3内の「インプレース」バッファを使用できます。参照:clCreateBufferこれは多くのカーネルの大きなボトルネックの1つです。

2)クロック速度。現在、クロック速度はgpusを上回っています。ほとんどのCPUのローエンドで2Ghz、最近ではほとんどのgpusのトップエンドとして1Ghzです。これは、小さなワークロードのためのGPUを上回るCPUの「勝利」に本当に役立つ1つの要因です。

3)同時に 'スレッド'。ハイエンドGPUは、通常、CPUよりも多くの計算ユニットを持っています。たとえば、6970 gpu(Cayman)には24個のopencl計算ユニットがあり、それぞれ16個のSIMDユニットに分割されています。トップデスクトップCPUの大半は8コアを持ち、サーバーCPUは現在16コアで停止しています。 (cpuコアは、1:1を計算してユニット数を計算する)openclの計算ユニットは、デバイスの残りの部分とは異なる作業を行うことができるデバイスの一部です。

4)スレッドの種類。 gpusにはSIMDアーキテクチャがあり、多くのグラフィック指向の命令があります。 cpusには、分岐予測と一般的な計算に専用の領域がたくさんあります。 CPUはSIMDユニットおよび/または浮動小数点ユニットを各コアに持つことができますが、上記のケイマンチップには1536ユニットがあり、それぞれにgpu命令セットが用意されています。 AMDはそれらをストリームプロセッサと呼び、上述のSIMDユニットにはそれぞれ4個(24x16x4 = 1536)が存在します。メーカーがキャッシュメモリや分岐予測ハードウェアをいくつか切り捨てる必要がある場合を除き、cpuにはそのような多くのsin(x)またはドットプロダクト対応ユニットがありません。 gpusのSIMDレイアウトは、大規模なベクトル追加の状況ではおそらく最大の「勝利」です。他の特化した機能も大きなボーナスです。

5)メモリ帯域幅。 cpus with DDR3:〜17GB/s。最近、ハイエンドのgpus> 100GB/s、200GB/s以上の速度が一般的になりつつあります。あなたのアルゴリズムがPCI-eに制限されていない場合(#1を参照)、gpuは未処理のメモリアクセスでCPUを上回ります。 GPU内のスケジューリングユニットは、メモリアクセスを待っていないタスクだけを実行することによって、メモリのレイテンシをさらに隠すことができます。 AMDはこれを波面と呼び、Nvidiaはそれをワープと呼んでいます。 cpusには、プログラムがデータを再利用している場合のメモリアクセス時間を隠すのに役立つ大規模で複雑なキャッシングシステムがあります。あなたのベクトル追加問題については、一般にベクトルが1回または2回だけ使用されるため、PCI-eバスでは制限が増えます。

6)電力効率。 gpu(適切に使用される)は、通常、CPUよりも電気的に効率的です。 cpusはクロック速度を支配するため、実際に消費電力を削減する唯一の方法の1つは、チップをダウンクロックすることです。これは、明らかに、より長い計算時間をもたらす。 Green 500リストのトップシステムの多くは、GPUが大幅に加速しています。参照:green500.org

関連する問題