_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);
我想并行运行所有子内核。那我该怎么办?
答案 0 :(得分:2)
您是否阅读了编程指南的dynamic parallelism section?
正如您所展示的那样,ParentKernel
中的每个线程都将执行由4个子内核调用组成的代码。这使答案变得复杂。
因此,对于各个线程,是的,各个内核可以在线程之间并行运行。
但请记住,由给定线程发布到同一个流中的cuda内核将被序列化。因此,对于ParentKernel
中的每个单独的线程,从该线程启动的各个子内核将被序列化。
要使单个线程中的内核可以并行运行,请将它们单独启动streams。
最后,一个重要的警告:就像从主机发起的asynchronous concurrent execution of kernels一样,设备端内核可能只在资源允许的情况下“并行”运行。无法保证并行执行内核。