openCL 堆栈位置(递归)

openCL stack location (recursion)

我在一个线程上使用 openCL 进行快速排序(递归),我遇到了一些问题。如果我尝试为我的英特尔 cpu("recursion detected" 使用 openCL 2.0)编译我的代码,openCL 编译器将 return 出错,但它只能在我的 nvidia 950M(openCL 1.2)上编译和工作很少有递归调用。

经过一些调查,我发现当我的筹码量大于 32Ko 时会出现 "OUT_OF_MEMORY" 错误,所以我有两个问题要问各位专家 ;)

第一个:为什么我可以在 openCL 1.2 设备上而不是 openCL 2.0 设备上使用递归? (当 openCL 1.2 不应该支持递归时)。

第二个 : 私有内存不能大于 32Ko (比如我的堆栈的最大大小)。那么,我的堆栈是否存储在我的私人内存中?或者只是在具有相同 space 的另一个位置?

OpenCL 内核不允许递归(参见“6.9 限制”第 i 小节:"Recursion is not supported")。它在您的其中一台设备上(部分)工作的事实是一个错误。

解决方案:重新编码您的内核以使用迭代而不是递归。