2010-12-12 107 views
3

CUDA目前不允许嵌套内核。CUDA中的嵌套内核

具体而言,我有以下问题: 我有N个M维数据。为了处理N个数据点中的每一个,需要按顺序运行三个内核。由于内核的嵌套是不允许的,我不能创建一个调用这三个内核的内核。因此,我必须连续处理每个数据点。

一个解决方案是编写一个包含所有其他三个内核功能的大内核,但我认为它不是最优的。

任何人都可以建议如何使用流并行运行N个数据点,同时保留三个较小的内核。

感谢。

+0

大内核有什么问题? – Anycorn 2010-12-12 04:23:58

+0

我无法实现细粒度并行。假设我正在一个数据点上进行三种不同的矩阵运算。我可以为它们中的每一个编写内核。假定其中一个内核是矩阵乘法C = A * B。乘法内核将并行发现C(i,j)的每个条目。当我拥有一个包含所有三个操作的大内核时,我无法做到这一点。大内核将会做的只是并行处理数据点。 – Prasanna 2010-12-12 04:43:25

+0

你当然可以运行多个流。相当简单,基本上内核启动的第四个参数是流。在同一个流上启动的内核将按顺序执行,但在不同的流上启动的内核将以非同步的顺序执行。如果你有关于实现的具体问题,我可以帮助你, – Anycorn 2010-12-12 05:00:08

回答

3

好吧,如果你想使用流......你将要创建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) 
0

如今,随着费米兼容性,能够发动平行内核

2

作为更新到所选择的答案,NVIDIA的GPU计算能力3.5现在允许嵌套仁,他们称之为Dynamic Parallelism