gpt4 book ai didi

recursion - OpenCL 和间接递归

转载 作者:行者123 更新时间:2023-12-01 14:44:39 25 4
gpt4 key购买 nike

Opencl 不支持递归函数,但这也包括间接版本吗?

void recursiveA(int *a,int b) // call this first to start recursion
{
a[b]=3;
if(b<10)
{
recursiveB(a,b+1); // A calls B
}
}


void recursiveB(int *a, int b)
{
a[b]=3;
if(b<10)
{
recursiveA(a,b+1); // B calls A while A still not finished before
// and entry point & arguments of A are corrupt ?
}

}

代替

void recurse(int *a, int b)
{
a[b]=3;
if(b<10)
{
recurse(a,b+1); // some OpenCL devices does not have the ability so this is not
// possible in OpenCL
}

}

那么,即使第一个“R”未完成,我们是否可以从另一个函数调用“R”函数?这些函数每次我们调用它们时都只使用相同的常量地址作为参数吗?在 Opencl 2.0 发布之前,我是否必须使用自定义“堆栈”实现来进行间接递归?

最佳答案

OpenCL 不支持递归控制流,其中包括相互递归。因此,为确保您的代码在您可能希望定位的每个平台上都能正常工作,您应该避免使用任何形式的递归,而是使用迭代方法编写您的算法。

实际上,OpenCL 编译器可能能够很好地处理某些递归算法。例如,如果您的函数是尾递归函数,那么编译器可以通过应用标准的尾调用优化技术来生成非递归形式。我刚刚尝试了您发布的第二个递归代码片段,它被多个 OpenCL 编译器接受。第一个代码片段导致它们全部崩溃,这表明它们无法应用必要的转换来避免递归调用(尽管很明显它们应该产生合适的错误消息而不是崩溃)。

因此,您可以使用一些 OpenCL 实现来避免简单的递归,但为了在不同平台上实现最大的可移植性,我强烈建议您避免使用它。

关于recursion - OpenCL 和间接递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21329060/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com