当除一个线程外的所有线程都退出(返回)时,寄存器资源的情况如何



我正在编写一个具有动态并行机制的CUDA程序,如下所示:

{
if(tid!=0) return;
else{
anotherKernel<<<gridDim,blockDim>>>();
}

我知道在子内核函数完成工作之前,父内核不会退出。这是否意味着其他线程在父内核中的注册资源(tid==0除外(将不会被检索?有人能帮我吗?

终止的线程的资源(例如寄存器使用(何时以及如何返回到机器以供其他块使用是未指定的,并且根据经验似乎会因GPU架构而异。这里合理的候选者是在块完成时或者在曲速完成时返回资源。

但这种不确定性不必超出区块级别。完全失效的块将其资源返回到其驻留的SM,用于将来的调度目的。它不等待内核的完成。这个特性是不言而喻的(*(,因为它是CUDA GPU正确操作的必要条件。

因此,对于您给出的示例,我们可以确定,除了第一个线程块之外的所有线程块都将在return语句的时候释放它们的资源。我不能具体声明第一个线程块中的扭曲何时可以释放它们的资源(除了当线程0终止时,资源将在那时释放,如果不是之前的话(。

(*(如果不是这样的话,GPU将无法处理块数相对较少的内核(例如,对于最新的GPU,大约几千个块(。然而,很容易证明,即使是最小的GPU也可以处理数百万个块的内核。

最新更新