CUDA是否支持recursion?
CUDA是否支持recursion?
它支持NVIDIA硬件,支持计算能力2.0和CUDA 3.1:
添加到CUDA C / C ++的 新语言function 包括 :
对函数指针和recursion的支持使得将许多现有的algorithm移植到费米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
recursion:我无法在NVIDIA的网站上find代码示例,但在论坛上有人发帖:
__device__ int fact(int f) { if (f == 0) return 1; else return f * fact(f - 1); }
是的,请参阅NVIDIA CUDA编程指南 :
设备function仅支持为计算能力2.0的设备编译的设备代码recursion。
你需要一张费米卡来使用它们。
尽pipe它只支持特定芯片的recursion,但有时你可以用“模拟”recursion来逃避: 看看我如何使用CUDA光线跟踪器的编译时recursion 。
在CUDA 4.1版本中,CUDA仅支持__device__函数的recursion,而不支持__global__函数。
仅在兼容设备上具有2.0计算能力之后
当然,但是这需要开普勒架构来做到这一点。 看看他们在经典快速sorting上的最新例子。
http://blogs.nvidia.com/2012/09/how-tesla-k20-speeds-up-quicksort-a-familiar-comp-sci-code/
据我所知,只有最新的开普勒GK110支持dynamic并行机制,允许这种recursion调用和内核中新线程的产生。 开普勒GK110之前,这是不可能的。 并且并不是所有的开普勒架构都支持这个,只有GK110可以。
如果你需要recursion,你可能需要特斯拉K20。 我不确定费米是否支持它,从来没有读过它。 :\但开普勒确实如此。 =)
任何recursionalgorithm都可以用一个堆栈和一个循环来实现。 这是更痛苦的方式,但如果你真的需要recursion,这可以工作。
CUDA 3.1支持recursion
如果你的algorithm需要大量的递推,那么支持与否,它不是为GPUdevise的,要么重新devise你的algorthims,要么得到一个更好的CPU,不pipe是哪种方式,它会更好(我敢打赌,在许多情况下,更好的),然后做recunalongraphics处理器。
是的,它支持实际的版本。 但是,尽pipe事实上有可能执行recursion函数,但您必须记住,不能预测来自执行堆栈的内存分配(必须执行recursion函数才能知道recursion的真实深度),因此您的堆栈可能会导致您的目的不够,可能需要手动增加默认堆栈大小
刚刚在我的电脑上试用了一款具有1.1计算能力的NVIDIA GPU。 它说recursion尚不支持。 所以它没有任何关系到运行时间,而是硬件本身