2010-09-05 167 views
50

CUDA是否支持递归?CUDA是否支持递归?

+0

请注意,所有循环都涉及递归,并且尾递归不会/不应涉及递归函数调用。 – Potatoswatter 2010-09-06 08:35:44

+4

请参阅[这里](http://stackoverflow.com/q/3644809/1129194)以获取更多信息 – 2012-10-13 10:57:04

回答

45

它确实在NVIDIA硬件支持计算能力2.0和CUDA 3.1:加入到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的网站代码示例,但对forum有人张贴这样的:

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

拥有“最近”的硬件是不够的。并非所有最近的卡都是费米(又名计算能力2.0)。目前,没有费米移动GPU。 – 2010-09-07 14:38:25

+0

你是对的,我更新了我的anwser。但是,Geforce GTX 480M呢?里面有一块费米芯片。 – Stringer 2010-09-07 15:06:22

+0

费米有笔记本电脑; Geforce 480M和Quadro FX5000M已经有一段时间了。 – Tom 2010-09-09 08:53:57

2

任何递归算法都可以用堆栈和循环来实现。这更多的是一种痛苦,但如果你真的需要递归,这可以工作。

11

是,请参阅NVIDIA CUDA Programming Guide:在设备代码仅

设备功能支持递归编译设备计算能力2.0 。

您需要一张费米卡才能使用它们。

2

CUDA 3.1支持递归

+0

你有个例子吗? – JuanPablo 2010-09-06 15:26:16

8

尽管它只支持特定芯片的递归,但有时您可以通过“模拟”递归获得:see how I used compile-time recursion for my CUDA raytracer

+0

非常有用!荣誉 – 2013-12-30 12:24:09

+0

我认为这会产生比实际递归更快的代码。 – 2013-12-30 12:25:28

+0

@林珉:啊,但是我的评论还是在1分呢?你欠我一个赞! :-) – ttsiodras 2014-02-10 10:43:17

-2

刚刚在我的电脑上试用了具有1.1计算能力的NVIDIA GPU。它说递归尚不支持。所以它没有任何关系运行时间,但硬件本身

6

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

3

确实如此,但它需要开普勒架构来做到这一点。 查看他们关于经典快速排序的最新示例。

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

据我所知,只有最新的开普勒GK110支持动态并行,允许这种递归调用和内核中新线程产卵。在开普勒GK110之前,这是不可能的。并且并不是所有的开普勒架构都支持这一点,只有GK110可以。

如果您需要递归,您可能需要特斯拉K20。我不确定费米是否支持它,从来没有读过它。:\ 但开普勒确实。 =)

1

如果你的算法包含很多递归,那么支持与否,它不是为GPU设计的,要么重新设计你的algorthims,要么得到一个更好的CPU,无论哪种方式它会更好(我敢打赌,在很多情况下,更好),然后在GPU上执行recurisons。

5

只有2.0兼容设备上的计算能力后

0

是的,它支持实际的版本。但是,尽管事实上有可能执行递归函数,但您必须记住,不能预测来自执行堆栈的内存分配(必须执行递归函数才能知道递归的真实深度),因此您的堆栈可能会导致您的目的不够,并且可能需要手动增加默认堆栈大小