Recursion nvcc是否支持动态并行中的尾部调用优化?

Recursion nvcc是否支持动态并行中的尾部调用优化?,recursion,cuda,tail-recursion,dynamic-parallelism,Recursion,Cuda,Tail Recursion,Dynamic Parallelism,根据CUDA编程指南第C.4.3.1.2节。“嵌套和同步深度”,其中提到: “如果系统检测到在父内核从不调用cudaDeviceSynchronize()的情况下不需要为父内核的状态保留空间,则允许进行优化。在这种情况下,由于从未发生显式父/子同步,程序所需的内存占用将远小于保守的最大值。这样的程序可以指定较浅的最大同步深度,以避免备份存储的过度分配。” 这是否意味着编译器支持动态并行下的尾部递归?例如,如果我有一个递归调用自身的内核: __global__ void kernel(int la

根据CUDA编程指南第C.4.3.1.2节。“嵌套和同步深度”,其中提到:

“如果系统检测到在父内核从不调用cudaDeviceSynchronize()的情况下不需要为父内核的状态保留空间,则允许进行优化。在这种情况下,由于从未发生显式父/子同步,程序所需的内存占用将远小于保守的最大值。这样的程序可以指定较浅的最大同步深度,以避免备份存储的过度分配。”

这是否意味着编译器支持动态并行下的尾部递归?例如,如果我有一个递归调用自身的内核:

__global__ void kernel(int layer){
  if(layer>65535){
    return;
  }
  printf("layer=%d\n",layer);
  kernel<<<1,1>>>(layer+1);
}
\uuuuu全局\uuuuuu无效内核(int层){
如果(图层>65535){
返回;
}
printf(“层=%d\n”,层);
内核(层+1);
}
在主机上启动:

   kernel<<<1,1>>>(0);
内核(0);
如果尾部递归可以由编译器优化,那么它是否仍然受到最大递归级别24的限制,因为“父/子同步从未发生”?如果没有限制,编译器如何打开优化


谢谢

请注意,更精确的引用是“从不发生显式父/子同步”。还有一种方法(除其他外)可以防止父内核在其所有子内核退出之前退出。