1

我想将动态并行用于我的一种算法,我从 CPU 启动一个具有 12 个块 * 512 个线程的内核,我想知道何时使用动态并行,每个线程都会启动新内核。

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)
}
4

1 回答 1

4

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

如果您只想从父内核启动一个子内核,则第二种方法将起作用。

您可能想阅读动态并行编程指南。您可以使用编程指南部分中给出的简单示例并修改内核启动参数以查看一个或多个子内核是否启动。

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

于 2013-03-13T20:02:59.983 回答