让我们在有父内核和子内核的地方使用以下代码。从所述父内核,我们希望threadIdx.x
在不同的流中启动子内核以最大化并行吞吐量。然后我们等待那些子内核,cudaDeviceSynchronize()
因为父内核需要查看对global
内存所做的更改。
现在假设我们还希望n
使用流启动父内核,并且在我们希望并行启动的每组n
父内核之间,我们还必须等待结果使用cudaDeviceSynchronize()
这将如何表现?
从Nvidia 对动态并行的官方介绍中,我认为这parent kernel[0]
只会等待其中启动的流。这个对吗?如果没有,会发生什么?
注意:我知道一次只能运行这么多流(在我的情况下是 32 个),但这更多是为了最大限度地提高占用率
编辑:一个小代码示例
__global__ void child_kernel (void) {}
__global__ void parent_kernel (void)
{
if (blockIdx.x == 0)
{
cudaStream_t s;
cudaStreamCreateWithFlags(&s, cudaStreamNonBlocking);
child_kernel <<<1,10,0,s>>> ();
cudaStreamDestroy(s);
}
cudaDeviceSynchronize();
}
for (int i=0; i<10; i++)
{
cudaStream_t s;
cudaStreamCreateWithFlags(&s, cudaStreamNonBlocking);
parent_kernel <<<10,10,0,s>>> ();
cudaStreamDestroy(s);
}
cudaDeviceSynchronize();