如何遍历已曾在与global中的树

在CPU上实现了一个多关键字多节点的树
然后把树拷贝到GPU
然后GPU启动一个线程遍历
我的遍历代码如下

global static void TreeTest(Treenode* droot,char * word,int * num)
{
int i=0,branch=0;
while(word[i])
{
branch=word[i]-‘a’; //最多26个子结点
if(!droot->next[branch]) {
num[0]=0;
break;
}

droot=droot->next[branch];	//继续寻找分支结点。
    i++;

num[i]=droot->count;
num[0]=droot->count;
}
}

树已拷贝到GPU,树经过从GPU拷回cpu验证是没有错误的。
在遍历时,droot=droot->next[branch]; //继续寻找分支结点。
程序不能正常运行。

去掉droot=droot->next[branch]; 可以运行,但逻辑不对!

CUDA不是不支持指针嘛?能用指针查找吗?

学习了:)能用指针查找吗?

首先问下,你的GPU和driver支持统一地址码?如果不支持,个人感觉问题出在你的树在CPU上生成好以后,其内部的指针指向的是CPU内存的地址,而不是GPU的地址,所以执行到droot=droot->next[branch] 会出错误,因为GPU没有这个地址或有这个地址但没数据,而再拷贝回CPU,又可以用了是因为这个地址在CPU端是存在的

在缺乏统一地址空间的情况下,你不能使用cudaMemcpy的方式拷贝整个树,而应该在CPU生成树的时候动态在GPU端申请一个节点,将返回的GPU地址放入到next中