Cuda 当除一个线程外,所有线程都退出(返回)时,注册资源的情况如何?

Cuda 当除一个线程外,所有线程都退出(返回)时,注册资源的情况如何?,cuda,Cuda,我正在用动态并行机制编写一个CUDA程序,如下所示: { if(tid!=0) return; else{ anotherKernel<<<gridDim,blockDim>>>(); } { 如果(tid!=0)返回; 否则{ 另一个内核(); } 我知道在子内核函数完成其工作之前,父内核不会退出。这是否意味着父内核中的其他线程的寄存器资源(tid==0除外)将不会被检索?任何人都可以帮助我吗?终止线程的资源何时以及如何使用(例如,寄存器使用)

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

{

if(tid!=0) return;

else{

 anotherKernel<<<gridDim,blockDim>>>();

}
{
如果(tid!=0)返回;
否则{
另一个内核();
}

我知道在子内核函数完成其工作之前,父内核不会退出。这是否意味着父内核中的其他线程的寄存器资源(tid==0除外)将不会被检索?任何人都可以帮助我吗?

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

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

因此,对于您给出的示例,我们可以确保除第一个threadblock之外的所有threadblock都将在
return
语句点释放其资源。我无法具体说明第一个threadblock中的warps何时可以释放其资源(除了当线程0终止时,资源将在该点释放(如果不是在此之前)


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

非常感谢,您说,包含线程的块的释放与我的代码类似是不确定的。这是否可能意味着资源的释放取决于我的下一个代码?如果我什么都不做,就启动子内核el,这种情况如何?不确定的是,资源是在扭曲完成时释放,还是仅在块完成时释放。但当然,在任何块完成时,其资源都会释放。不,这不取决于“下一个代码”.好的,我知道了。非常感谢,先生。您介意我再问您一个问题吗?使用Cuda向量(如float4)进行计算有什么好处吗?我知道它可以加快加载/存储操作,但是,我不确定它的计算效率。它的行为类似于SIMD,还是与普通向量一样?