我想知道,cuda 4.0是否支持使用本地内存或共享内存的递归?我必须自己维护一个使用全局内存的堆栈,因为系统级递归不能支持我的程序(可能是太多级别的递归)。当递归变得更深时,线程停止工作 所以我真的想知道CUDA中的默认递归是如何工作的,它是否使用共享内存的本地内存?谢谢!
答案 0 :(得分:11)
使用递归需要使用ABI,这需要架构> = sm_20。 ABI有一个函数调用约定,包括使用堆栈帧。堆栈帧分配在本地存储器中("本地"表示"线程本地",即存储专用于线程)。有关CUDA存储空间的基本信息,请参阅“CUDA C编程指南”。此外,您可能需要查看上一个问题:Where does CUDA allocate the stack frame for kernels?
对于深度递归函数,可以超出默认堆栈大小。例如,在我当前的系统上,默认堆栈大小为1024字节。您可以通过CUDA API函数cudaDeviceGetLimit()
检索当前堆栈大小。您可以通过CUDA API函数cudaDeviceSetLimit()
调整堆栈大小:
cudaError_t stat;
size_t myStackSize = [your preferred stack size];
stat = cudaDeviceSetLimit (cudaLimitStackSize, myStackSize);
请注意,堆栈帧所需的内存总量至少每个线程大小乘以内核启动中指定的线程数。由于分配粒度,它通常可能更大。因此,增加堆栈大小会非常快地占用内存,并且您可能会发现深度递归函数需要比GPU上分配的本地内存更多。
虽然现代GPU支持递归,但由于函数调用开销,它的使用会导致代码性能相当低,因此您可能需要检查是否存在正在实现的算法的迭代版本,这可能更适合到GPU。