自分自身を複数回呼び出すcudaカーネルを開発中です(動的並列処理)。後続のカーネル呼び出しは、親カーネルが終了した後で実行する必要があります。アルゴリズムは順番に動作します。 EDIT動的並列処理:親カーネルが終了した後に次のカーネルを実行
$ cat turn.cu
#include <stdio.h>
__global__ void turnBasedAlgo(int depth, cudaStream_t stream) {
if (depth < 3) {
printf("depth: %d\n", depth);
cudaEvent_t e;
cudaEventCreateWithFlags(&e, cudaEventDisableTiming);
cudaEventRecord(e, stream);
turnBasedAlgo<<<1,1,0,stream>>>(depth+1, stream);
cudaStream_t s2;
cudaStreamCreateWithFlags(&s2, cudaStreamNonBlocking);
cudaStreamWaitEvent(s2, e, 0);
turnBasedAlgo<<<1,1,0,s2>>>(depth+1, s2);
// some work
clock_t start = clock();
clock_t end = clock();
while (end - start < 100000) {
end = clock();
}
}
}
int main(int argc, char **argv) {
cudaStream_t s;
cudaStreamCreateWithFlags(&s, cudaStreamNonBlocking);
turnBasedAlgo<<<1,1,0,s>>>(0, s);
cudaDeviceSynchronize();
cudaDeviceReset();
return 0;
}
$ nvcc -arch=sm_35 -dc turn.cu && nvcc -arch=sm_35 -link -o turn turn.o
$ ./turn
depth: 0
depth: 1
depth: 2
$ nvvp ./turn
最初の下位呼び出しが親ストリームにカーネルを置くことによって行われます。
はここで、最小限の例です。それはまったく実行されません。 2番目のサブコールは、新しいストリームを作成し、親カーネルが終了したときに記録されるイベントe
を待つことによって行われます。このサブコールは直ちに実行されます。
EDIT:子グリッド内で使用する場合のストリームと親グリッドによって作成されたイベントは、未定義の動作を持っているのと同様に、任意のカーネル内で使用された場合の動作は未定義です
ストリームとホスト上に作成されたイベント
。それでも http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#ixzz4KngEXdsC:
で続きを読むターンベースの動的並列処理を実現する方法はありますか?
[mcve] –