【发布时间】:2018-11-01 15:33:33
【问题描述】:
让我们在有父内核和子内核的情况下使用以下代码。从所述父内核开始,我们希望在不同的流中启动threadIdx.x 子内核,以最大化并行吞吐量。然后我们等待那些带有cudaDeviceSynchronize() 的子内核,因为父内核需要查看对global 内存所做的更改。
现在假设我们还希望使用流启动 n 父内核,并且在我们希望并行启动的每组 n 父内核之间,我们还必须使用 cudaDeviceSynchronize() 等待结果
这将如何表现?
来自this official introduction to Dynamic Parallelism by 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();
【问题讨论】:
标签: c++ cuda dynamic-parallelism