Recursion C++;AMP定长递归与树遍历 使用C++ +AMP,需要一个最大深度为10的四叉树。我意识到C++ AMP不支持递归,因为它不要求设备具有堆栈,但我希望它能够推出一个小的有限递归深度调用树,因此它仍然可以被内嵌和处理,而不需要堆栈。

Recursion C++;AMP定长递归与树遍历 使用C++ +AMP,需要一个最大深度为10的四叉树。我意识到C++ AMP不支持递归,因为它不要求设备具有堆栈,但我希望它能够推出一个小的有限递归深度调用树,因此它仍然可以被内嵌和处理,而不需要堆栈。,recursion,tree,c++-amp,Recursion,Tree,C++ Amp,像 int循环(int i)限制(amp){ if(i5)返回1000;//仅使用伪代码来限制深度 否则返回i+重复(i-1); } 看来运气不好。没有递归规则真的没有例外吗 关于这个问题,我想知道用C++来做树旅行的常用方法是什么?显然,我可以创建自己的每线程堆栈,然后在深入之前推动当前节点,并在返回的过程中弹出,或者我可以扩展我的树,使“指针”备份到树上,不仅向下,而且

int循环(int i)限制(amp){
if(i5)返回1000;//仅使用伪代码来限制深度
否则返回i+重复(i-1);
}
看来运气不好。没有递归规则真的没有例外吗

关于这个问题,我想知道用C++来做树旅行的常用方法是什么?显然,我可以创建自己的每线程堆栈,然后在深入之前推动当前节点,并在返回的过程中弹出,或者我可以扩展我的树,使“指针”备份到树上,不仅向下,而且

<找不到任何C++和AMP树遍历的例子,我想知道这里最好的实践是什么?
编辑:我这样做是为了在2D域中查找邻居。我有n个随机定位的点,需要为每个点找到最近的邻居。这些点位于由空间填充曲线()排序的单个一维数组中,因此在一维数组中接近的点在二维数组中也趋于接近,这意味着它们也趋向于共享许多相同的邻居。

尽管这个问题已经过时,我想给出一些建议,不仅适用于C++的AMP,而且适用于所有试图执行最近邻居查询的GPGPU应用程序。 有几种方法可以避免在GPU内核中使用堆栈。我(在OpenCL中)使用的一种方法是使用所谓的历史标志。该方法如中所述
其思想是在树的每一级存储4位。每4位对下一个需要访问的节点进行明确编码。不幸的是,历史标记所需的大小太大,无法放入线程专用内存中,您必须将它们放置在
tile\u static
内存中,以防出现库冲突

根据我的经验,执行radius搜索会带来一些无法在GPU上有效解决的问题。首先,由于您正在执行半径搜索,您不知道单个点将有多少个相邻点,但您必须事先提供空间来保存相应的点。最后,您将以具有有限搜索半径的kNN搜索结束。根据您试图解决的问题,这可能已经成为交易的破坏者。

因为您需要找到最近的点,所以您必须以某种方式对最近的候选点进行排序,这些候选点最终会出现在某种堆结构中。此时,线程分歧将减少任何性能增益(点均匀分布除外)。

如果知道最大递归深度,可以使用模板让编译器将递归扩展到最大深度:

template <int I>
int recur(int i) restrict(amp) {
    if (i <= 1) return 1;
    else if (i > 5) return 1000; //just dummy code to limit the depth
    else return i + recur<I-1>(i - 1);
}

template<>
int recur<0>(int i) restrict(amp)
{ // maximum depth reached...
    return 1000;
}   

void f() restrict(amp)
{
    recur<10 /* maximum depth */>(3);
}
模板
整数重现(整数i)限制(安培){
if(i5)返回1000;//仅使用伪代码来限制深度
否则返回i+重复(i-1);
}
样板
整数重现(整数i)限制(安培)
{//已达到最大深度。。。
返回1000;
}   
void f()限制(amp)
{
复发3例;
}

在GPU代码的上下文中,“树”并不常见。GPU过去的分支预测能力很差,当您使用这种数据结构时,这会降低性能。首先执行所有代码,然后确定应该执行哪个分支是常见的!也许使用“数组作为固定深度树”可能有意义。另请参见,递归代码可以用迭代来表示:请参见感谢您的评论。你是对的,如果不加以防范,树会导致发散,这对gpu来说是非常糟糕的。对于邻居搜索,沿空间填充曲线对数据进行排序不会阻止这一点,但会大大缓解这一问题。我将编辑我的问题以保留实际使用场景,因为这是相关的。我的CPU版本的节点已经在一个平面数组中,我考虑了使用我自己的堆栈结构的迭代遍历。我主要想知道“最好”的GPU实现。你说的邻居发现是什么意思。。。对于n个点,找到每个点的最近邻居?所以输入是(p1,p2,p3…),输出是点对(pa,pb)(pc,pd)。。。?您需要为每个点查找多少个邻居?我需要查找特定搜索半径内的所有邻居。
template <int I>
int recur(int i) restrict(amp) {
    if (i <= 1) return 1;
    else if (i > 5) return 1000; //just dummy code to limit the depth
    else return i + recur<I-1>(i - 1);
}

template<>
int recur<0>(int i) restrict(amp)
{ // maximum depth reached...
    return 1000;
}   

void f() restrict(amp)
{
    recur<10 /* maximum depth */>(3);
}