2010-09-05 172 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

是的,它支持實際的版本。但是,儘管事實上有可能執行遞歸函數,但您必須記住,不能預測來自執行堆棧的內存分配(必須執行遞歸函數才能知道遞歸的真實深度),因此您的堆棧可能會導致您的目的不夠,並且可能需要手動增加默認堆棧大小