每个线程都启动动态并行吗?

时间:2013-03-13 19:45:40

标签: cuda nvidia

我想使用Dynamic Parallelism作为我的算法之一,我从CPU启动了一个带有12个块* 512个线程的内核,我想知道当我使用动态并行时,每个线程都将启动新内核。 / p>

void main(){
 dynamic<<<12,512,0>>>(x,y,z);
}

__global__ void dynamic(int x,int y, int z){
preprocessing<<<1,100>>>(x,y);
}

__global__ void preprocessing(int x,int y){

 //do stuff
}

这是否意味着我的~6000个线程中的每一个都会尝试启动100个线程?或者是我的第一个动态内核将暂停所有~6000个线程,启动100个线程并返回结果由我的6000个以前的线程处理?

如果是,如何,我可以简单地使用100个线程吗?我应该使用像

这样的条件吗?
if(tid==1){
preprocessing<<<1,100>>>(x,y)
}

1 个答案:

答案 0 :(得分:4)

是的,在您的第一个实例中,遇到内核启动的每个线程都将启动它自己的内核。设备内核启动是异步的,即控制立即返回到调用线程,就像在主机上一样。所以线程没有暂停。

如果您只想从父内核启动单个子内核,则第二种方法可以正常工作。

您可能需要阅读dynamic parallelism programming guide。您可以使用编程指南部分中给出的简单示例,并修改内核启动参数以查看是否启动了一个或多个子内核。

有关异步设备内核启动的说明,请参阅编程指南的第11页。