我想知道,cuda 4.0是否支持使用本地内存或共享内存的递归?我必须自己维护一个使用全局内存的堆栈,因为系统级递归不能支持我的程序(可能是太多级别的递归).当递归变得更深时,线程停止工作.
所以我真的想知道CUDA中的默认递归是如何工作的,它是否使用共享内存的本地内存?谢谢!
nju*_*ffa 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);
Run Code Online (Sandbox Code Playgroud)
请注意,堆栈帧所需的内存总量至少是每线程大小乘以内核启动中指定的线程数.由于分配粒度,它通常可能更大.因此,增加堆栈大小可以很快吃内存,你可能会发现一个深深的递归函数需要比可以在你的GPU被分配一个以上本地存储器.
虽然现代GPU支持递归,但由于函数调用开销,它的使用会导致代码性能相当低,因此您可能需要检查是否存在可能更适合GPU的算法的迭代版本.
| 归档时间: |
|
| 查看次数: |
1987 次 |
| 最近记录: |