GPU で可能な CUDA グリッドの数はいくつですか?
GPU に 2 つのグリッドを一緒に存在させることはできますか? それとも、1 つの GPU デバイスに 1 つのグリッドしかありませんか?
Kernel1<<gridDim, blockDim>>(dst1, param1);
Kernel1<<gridDim, blockDim>>(dst2, param2);
上記の 2 つのカーネルは同時に実行されますか、それとも順番に実行されますか?
GPU で可能な CUDA グリッドの数はいくつですか?
GPU に 2 つのグリッドを一緒に存在させることはできますか? それとも、1 つの GPU デバイスに 1 つのグリッドしかありませんか?
Kernel1<<gridDim, blockDim>>(dst1, param1);
Kernel1<<gridDim, blockDim>>(dst2, param2);
上記の 2 つのカーネルは同時に実行されますか、それとも順番に実行されますか?
上記のように 2 つのカーネルが発行されると、シリアル化されます (順次実行されます)。これは、他のコード (つまり、ストリームを切り替える) がなければ、2 つのカーネルが同じ cuda ストリームに発行されるためです。同じストリームに対して発行されたすべての cuda 呼び出しは、cudaMemcpyAsync などを使用しているために別の方法で表示する必要があると思われる場合でも、順次実行されます。
複数のカーネルを相互に非同期で (場合によっては同時に) 実行することは確かに可能ですが、これを実現するには cuda ストリーム API を使用する必要があります。
ストリームとカーネルの同時実行の詳細については、『 CUDA C Programmers Guide』のセクション 3.2.5「Asynchronous Concurrent Execution」を参照してください。さらに、nvidia CUDA SDKには、概念を説明する単純なストリームなどのサンプルが多数あります。並行カーネルのサンプルは、(ストリームを使用して) 複数のカーネルを並行して実行する方法を示しています。カーネルを同時に実行するには、計算能力 2.0 以上のハードウェアが必要であることに注意してください。
また、CUDA C プログラミング ガイドのセクション 3.2.5.2からの最初の質問に答えるために、「デバイスが同時に実行できるカーネル起動の最大数はデバイスによって異なりますが、一部のデバイスでは 128 に達する場合があります」
参考までに、「グリッド」は、1 回のカーネル起動に関連付けられたスレッド配列全体です。
Kernel1
Robertの答えを詳しく説明するために、ストリームを使用して2つのインスタンスを同時に実行する方法の例を次に示します。
cudaStream_t stream1; cudaStreamCreate(&stream1);
cudaStream_t stream2; cudaStreamCreate(&stream2);
Kernel1<<gridDim, blockDim, 0, stream1>>(dst1, param1);
Kernel1<<gridDim, blockDim, 0, stream2>>(dst2, param2);
ストリームとの同時実行に関するいくつかの注意事項:
Kernel1<<<g, b>>>()
特定のストリームでカーネルを起動すると、終了するのを待ちます。Kernel2<<<g, b, 0, stream>>>()
Kernel2
Kernel1
Kernel1<<<g, b>>>()
)なしで起動されると、Nvidiaはこれを「NULLストリームを使用して」と呼びます。cudaEvents
と、カーネルを複数のストリームに分散している場合でも、作業がシリアル化されることがあります。