CUDA スレッドは非常に軽量であり、ほとんどペナルティなしでスケジュール/停止できます。これは、実行の切り替えに多くのオーバーヘッドがある CPU スレッドとは異なります。その結果、CPU はタスクの並列処理に優れており、GPU はデータの並列処理に優れています。
CUDA アーキテクチャでは、(NVIDIA) GPU に「ストリーミング マルチプロセッサ」(SM) があり、それぞれがスレッドのブロックを実行します。各 SM には一連のストリーム プロセッサ (SP) があり、それぞれが任意の時点 (サイクル) で 1 つのスレッドの命令を実行します。
実際には、ブロック内のスレッドの最小数は 1 です。ブロックごとに 1 つのスレッドしかない場合、コードは正しく実行されます。ただし、32 の倍数のスレッドを持つようにブロックを設定する方がはるかに効率的です。これは、ハードウェアが 32 スレッドである「ワープ」全体で操作をスケジュールする方法によるものです。
プログラムをクロスコンパイルできます。エミュレーション モードで実行することもできます。つまり、CPU は CUDA GPU を「エミュレート」しますが、ハードウェアで実行するには NVIDIA GPU が必要です (CUDA が有効になっているもの、2006 年以降のものであれば何でも構いません)。
ハイエンドの現行世代の GPU には 240 個のコア (SP) があり、これを任意の時点で 240 個のスレッドを実行していると考えることができますが、複数のスレッドの状態 (コンテキスト) から、GPU を数千のスレッドを同時に実行していると考えると便利です。ロードされます。
CPU スレッドと GPU スレッドには違いがあることを認識することが重要だと思います。それらは同じ名前を持っていますが、GPU スレッドは軽量であり、通常はデータの小さなサブセットで動作します。CPU スレッド (のセット) が非並列処理を実行し、各 CPU スレッドがデータの並列処理のために数千の GPU スレッドに分岐し、CPU スレッドに再び参加することを考えると役立つかもしれません。明らかに、CPU スレッドを GPU と同時に動作させることができれば、それはさらに優れたものになります。
CPU とは異なり、GPU はスループット アーキテクチャであることを覚えておいてください。つまり、遅延を隠すためのキャッシュの代わりに、プログラムは多くのスレッドを作成して、一部のスレッドがメモリからデータが返されるのを待っている間、他のスレッドを実行できるようにする必要があります。詳細については、 GPU Technology Conferenceの「Advanced C for CUDA」の講演を視聴することをお勧めします。