在CUDA中并行运行的多个子内核

时间:2013-11-25 00:34:37

标签: cuda gpu nvidia

    _global__ ChildKernel1(void* data){
        //Operate on data
    }


_global__ ChildKernel2(void* data){
        //Operate on data
    }


_global__ ChildKernel3(void* data){
        //Operate on data
    }

__global__ ParentKernel(void *data){
        ChildKernel1<<<16, 2>>>(data);
        ChildKernel2<<<64, 3>>>(data);
        ChildKernel3<<<32, 4>>>(data);
        ChildKernel4<<<16, 5>>>(data);

    }
    // In Host Code
    ParentKernel<<<256, 64>>(data);

我想并行运行所有子内核。那我该怎么办?

1 个答案:

答案 0 :(得分:2)

您是否阅读了编程指南的dynamic parallelism section

正如您所展示的那样,ParentKernel中的每个线程都将执行由4个子内核调用组成的代码。这使答案变得复杂。

因此,对于各个线程,是的,各个内核可以在线程之间并行运行。

但请记住,由给定线程发布到同一个流中的cuda内核将被序列化。因此,对于ParentKernel中的每个单独的线程,从该线程启动的各个子内核将被序列化。

要使单个线程中的内核可以并行运行,请将它们单独启动streams

最后,一个重要的警告:就像从主机发起的asynchronous concurrent execution of kernels一样,设备端内核可能只在资源允许的情况下“并行”运行。无法保证并行执行内核。