CUDA是否支持递归?

61

CUDA支持递归吗?


1
请注意,所有循环都涉及递归,并且尾递归不应该涉及递归函数调用。 - Potatoswatter
5
请参见此处以获取更多信息。链接地址为:https://dev59.com/anA65IYBdhLWcg3wxBmr。 - Alex L
12个回答

52

它仅适用于支持计算能力2.0和CUDA 3.1的NVIDIA硬件:

CUDA C/C++新增了以下语言特性:

支持函数指针和递归,使得许多现有算法更容易移植到Fermi GPU上。

http://developer.nvidia.com/object/cuda_3_1_downloads.html

函数指针:http://developer.download.nvidia.com/compute/cuda/sdk/website/CUDA_Advanced_Topics.html#FunctionPointers

递归:我在NVIDIA网站上找不到代码示例,但在论坛上有人发布了这个。

__device__ int fact(int f)
{
  if (f == 0)
    return 1;
  else
    return f * fact(f - 1);
}

2
仅拥有“最新”的硬件是不够的。并非所有最近的显卡都是Fermi架构(也称计算能力2.0)。目前,还没有Fermi移动GPU。 - Mark Borgerding
有一些笔记本电脑采用Fermi架构;Geforce 480M和Quadro FX5000M已经发布了一段时间。 - Tom
我认为这些不是真正的递归调用,因为nvcc默认情况下会内联每个标记为__device__的函数。然而结果是相同的。 - jopasserat
我不建议在CUDA上使用递归,因为每个CUDA线程的堆栈大小非常小,通过使用递归,您会扩大每个线程的堆栈。 - TripleS
@jHackTheRipper:如果在编译时不知道f的情况(它可能会展开它,但无法将其内联),那么它如何内联代码呢? - Maciej Piechotka
显示剩余2条评论

13

是的,请参阅NVIDIA CUDA编程指南

设备函数只支持在计算能力为2.0的设备上编译的设备代码中进行递归。

您需要一张Fermi显卡才能使用它们。


9

7
在CUDA 4.1版本中,CUDA仅支持__device__函数而不是__global__函数的递归。

5

只有兼容设备上的 2.0 计算能力才行。


3
任何递归算法都可以用栈和循环来实现。这样做会更加麻烦,但如果确实需要递归,这种方法也是可行的。

3
当然可以,但需要使用Kepler架构才能实现。 请查看他们在经典快速排序上的最新示例。

http://blogs.nvidia.com/2012/09/how-tesla-k20-speeds-up-quicksort-a-familiar-comp-sci-code/

据我所知,只有最新的Kepler GK110支持动态并行性,它允许这种递归调用和在内核中生成新线程。在Kepler GK110之前是不可能的。请注意,并非所有的Kepler架构都支持此功能,只有GK110支持。
如果需要递归,则可能需要Tesla K20。我不确定Fermi是否支持它,从未听说过。但是Kepler肯定支持。 =)

2

CUDA 3.1支持递归


1
如果您的算法涉及大量递归,那么无论是否支持,它都不适用于GPU,要么重新设计您的算法,要么获得更好的CPU,无论哪种方式都会更好(我敢打赌,在许多情况下,效果会好得多),而不是在GPU上进行递归。

0

是的,它支持递归。然而,在GPU上进行递归并不是一个好主意。因为每个线程都会执行它。


引用(文档等)将使此答案更完整。参考资料显示,这是在CUDA 3.1中添加的:“CUDA C / C ++新增了新的语言功能,包括:支持函数指针和递归,使许多现有算法更容易移植到Fermi GPU。” - s3cur3
这是正确的。CUDA C 工具包 3.1 版本中添加了此功能。最新版本的 CUDA 编程指南隐含地表明支持递归设备函数。但是 __global__ 函数不支持递归。请参考编程指南中的 F.3.9.6. 函数递归。 - palebluedot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接