CUDA中的嵌套内核

时间:2010-12-12 03:57:18

标签: arrays cuda

CUDA目前不允许嵌套内核。

具体来说,我有以下问题: 我有N个M维数据。要处理N个数据点中的每一个,需要按顺序运行三个内核。因为不允许嵌套内核,所以无法通过调用三个内核来创建内核。因此,我必须连续处理每个数据点。

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

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

感谢。

3 个答案:

答案 0 :(得分: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]);

并使用所有四个配置参数调用内核(当然,sharedMemory可以为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)

答案 1 :(得分:2)

作为所选答案的更新,NVidia的具有Compute Capability 3.5的GPU现在允许嵌套内核Dynamic Parallelism,因为他们称之为。

答案 2 :(得分:0)

如今,凭借Fermi兼容性,可以启动并行内核