CUDA目前不允许嵌套内核。CUDA中的嵌套内核
具体而言,我有以下问题: 我有N个M维数据。为了处理N个数据点中的每一个,需要按顺序运行三个内核。由于内核的嵌套是不允许的,我不能创建一个调用这三个内核的内核。因此,我必须连续处理每个数据点。
一个解决方案是编写一个包含所有其他三个内核功能的大内核,但我认为它不是最优的。
任何人都可以建议如何使用流并行运行N个数据点,同时保留三个较小的内核。
感谢。
CUDA目前不允许嵌套内核。CUDA中的嵌套内核
具体而言,我有以下问题: 我有N个M维数据。为了处理N个数据点中的每一个,需要按顺序运行三个内核。由于内核的嵌套是不允许的,我不能创建一个调用这三个内核的内核。因此,我必须连续处理每个数据点。
一个解决方案是编写一个包含所有其他三个内核功能的大内核,但我认为它不是最优的。
任何人都可以建议如何使用流并行运行N个数据点,同时保留三个较小的内核。
感谢。
好吧,如果你想使用流......你将要创建N个流:
cudaStream_t streams;
streams = malloc(N * sizeof(cudaStream_t));
for(i=0; i<N; i++)
{
cudaStreamCreate(&streams[i]);
}
然后为第i个数据点,你想用cudaMemcpyAsync用于传输:
cudaMemcpyAsync(dst, src, kind, count, streams[i]);
,并打电话给你的所有四个配置参数内核(共享内存可以为0,当然):
kernel_1 <<< nBlocks, nThreads, sharedMemory, streams[i] >>> (args);
kernel_2 <<< nBlocks, nThreads, sharedMemory, streams[i] >>> (args);
当然清理:
for(i=0; i<N; i++)
{
cudaStreamDestroy(streams[i]);
}
free(streams)
如今,随着费米兼容性,能够发动平行内核
作为更新到所选择的答案,NVIDIA的GPU计算能力3.5现在允许嵌套仁,他们称之为Dynamic Parallelism。
大内核有什么问题? – Anycorn 2010-12-12 04:23:58
我无法实现细粒度并行。假设我正在一个数据点上进行三种不同的矩阵运算。我可以为它们中的每一个编写内核。假定其中一个内核是矩阵乘法C = A * B。乘法内核将并行发现C(i,j)的每个条目。当我拥有一个包含所有三个操作的大内核时,我无法做到这一点。大内核将会做的只是并行处理数据点。 – Prasanna 2010-12-12 04:43:25
你当然可以运行多个流。相当简单,基本上内核启动的第四个参数是流。在同一个流上启动的内核将按顺序执行,但在不同的流上启动的内核将以非同步的顺序执行。如果你有关于实现的具体问题,我可以帮助你, – Anycorn 2010-12-12 05:00:08