3

私はハードワークを行うCUDAカーネルを持っていますが、CUDAで書き込むことができなかったCPUで実行する必要のあるハードワーク(同じ配列の2つの位置での計算)もあります(CUDAスレッドが同期していないため) 、配列の位置Xでハードワークを実行する必要があります。その後、z [x] = y [x] --y [x -1]を実行します。ここで、yは、各スレッドが動作するCUDAカーネルの結果の配列です。この配列の1つの位置とzは、結果を格納する別の配列です)。だから私はCPUでこれをやっています。

CPU側の作業を行うためのCPUスレッドがいくつかありますが、それぞれがCUDAカーネルを呼び出してデータを渡します。私の質問は、複数のCPUスレッドがGPU呼び出しを行っている場合、GPU側で何が起こるかということです。CUDAカーネル呼び出しを1回実行してから、CPU側の作業を実行するために複数のCPUスレッドを作成するとよいでしょうか。

4

2 に答える 2

2

CUDA 4.0以降では、複数のスレッドが同じCUDAコンテキストを共有できるため、cuPush/PopContextは不要になります。スレッドごとにcudaSetDeviceを呼び出す必要があります。次に、@ dzonderについて説明しますが、ストリームを使用してさまざまなスレッドから複数のカーネルをシミュレートして実行できます。

于 2012-10-25T09:55:41.723 に答える
2

カーネル呼び出しはキューに入れられ、単一のストリームで1つずつ実行されます。

ただし、カーネルの実行中にストリームを指定することはできます。その場合、異なるストリームのCUDA操作が同時に実行され、異なるストリームの操作がインターリーブされる可能性があります。デフォルトのストリームは0です。

参照:CUDAストリームと並行性

異なるプロセスが同じカードを使用する場合、状況は似ています。

また、カーネルはCPUのものから非同期で実行されることを忘れないでください。

于 2012-10-25T09:46:14.487 に答える