2012-04-26 8 views
0

CPUとGPUの違いについて私が理解することは、GPUは汎用プロセッサではなく、ビデオカードに10個のGPUが含まれている場合、各GPUは実際に同じプログラムポインタを共有し、 GPU各GPUが実際に同じコードを実行していることを確認する必要があります。OpenCLと複数のビデオカード

各GPUが物理的に並行して実行されているため、同じカード上で同期が問題になることはありません。

私の質問は、これは複数のカードでどのように機能するのですか?それらが動作する速度では、ハードウェアは実行時間にわずかな違いを生じさせないので、あるカード上の1つのGPUでの計算が、別のカード上の別のGPUでの同じ計算より速くまたは遅くなる場合があります。

おかげ

答えて

2

彼らは同時にすべてが完了する必要がありますので、各GPUが物理的に並列に実行されているので、同期が同じカード上の問題ではありません。

これは当てはまりません。例えば、GPU上の異なるスレッドは、メモリアクセスレイテンシの違いのために、異なる時間に完了することがあります。そのため、OpenCLにはbarrierコマンドのような同期プリミティブが存在します。あなたのスレッドが正確に並行して動作しているとは決して想像できません。

複数のGPUで同じことが言えます。それらが同期しているという保証はないので、clFinishなどのAPI呼び出しを使用して明示的に作業を同期する必要があります。

2

GPUでスレッドがどのように動作するのか混乱するかもしれないと思います。最初に複数のGPUの問題に対処する複数のGPUは決してプログラムポインタを共有しないので、同時にカーネルを完成させることはほとんどありません。

単一のGPUでは、同じコンピュータユニット(またはNVIDIA用語ではSM)上で実行され、同じワープ/波面の一部であるスレッドのみが同期して実行されることが保証されています。 あなたはこれを本当に信じることはできませんが、いくつかのデバイスでは、コンパイラはその場合を決定できます(worgroupのサイズが64にハードコードされている限り、AMDデバイスについて特に考えています)。

@vocaroが指摘したように、ローカルメモリにはバリアを使用する必要があります。 同じGPUであっても、スレッドはデバイス全体で並列に実行されるのではなく、各計算ユニット内でのみ実行されます。

+0

こんにちはルーカス、私は混乱するかもしれません:o)..あなたは私のために1つのポイントを明確にしていただけますか?あなたがGPUを参照するとき、それはカード上の計算ユニット(CL_DEVICE_MAX_COMPUTE_UNITSはclGetDeviceInfoを使用していますか)ですか、またはGPUは多くの計算ユニットを含む可能性のある物理カード自体を参照していますか? – mfc

+0

@mfc、GPUはグラフィックスチップ(カード)全体です。 GPUは、1つ以上の計算ユニットで構成されます。各計算ユニットは、いくつかの処理要素(またはコア)で構成されています。あなたはアーキテクチャを本当にうまく理解していることを確認するために、AMD、NVIDIA、Intelのプログラミングガイドを読むべきです。 –