4

我想知道,cuda 4.0 是否支持使用本地内存或共享内存进行递归?我必须自己使用全局内存维护一个堆栈,因为系统级递归无法支持我的程序(可能递归级别太多)。当递归变得更深时,线程停止工作。
所以我真的很想知道默认递归在CUDA中是如何工作的,它是否使用共享内存的本地内存?谢谢!

4

1 回答 1

11

使用递归需要使用 ABI,它要求架构 >= sm_20。ABI 有一个函数调用约定,其中包括使用堆栈帧。堆栈帧分配在本地内存中(“本地”表示“线程本地”,即线程私有的存储)。有关 CUDA 内存空间的基本信息,请参阅 CUDA C 编程指南。另外,你可能想看看之前的这个问题:CUDA在哪里为内核分配堆栈帧?

对于深度递归函数,可能会超出默认堆栈大小。例如,在我当前的系统上,默认堆栈大小是 1024 字节。您可以通过 CUDA API 函数检索当前堆栈大小cudaDeviceGetLimit()。您可以通过 CUDA API 函数调整堆栈大小cudaDeviceSetLimit()

cudaError_t stat;
size_t myStackSize = [your preferred stack size];
stat = cudaDeviceSetLimit (cudaLimitStackSize, myStackSize);

请注意,堆栈帧所需的内存总量至少是每个线程大小乘以内核启动中指定的线程数。由于分配粒度,它通常可能更大。因此,增加堆栈大小会很快耗尽内存,并且您可能会发现深度递归函数需要的本地内存比在 GPU 上分配的要多。

虽然现代 GPU 支持递归,但由于函数调用开销,它的使用可能导致代码性能相当低,因此您可能需要检查您正在实现的算法的迭代版本是否可能更适合 GPU .

于 2013-09-26T03:16:48.867 回答