CUDA目前不允许嵌套内核。
具体来说,我有以下问题: 我有N个M维数据。要处理N个数据点中的每一个,需要按顺序运行三个内核。因为不允许嵌套内核,所以无法通过调用三个内核来创建内核。因此,我必须连续处理每个数据点。
一种解决方案是编写一个包含所有其他三个内核功能的大内核,但我认为它将是次优的。
任何人都可以建议如何使用流来并行运行N个数据点,同时保留三个较小的内核。
感谢。
答案 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兼容性,可以启动并行内核