c/c++语言开发共享将多分支树复制到GPU内存

我有一个节点树,我试图将其复制到GPU内存。 Node看起来像这样:

struct Node { char *Key; int ChildCount; Node *Children; } 

我的复制function如下所示:

 void CopyTreeToDevice(Node* node_s, Node* node_d) { //allocate node on device and copy host node cudaMalloc( (void**)&node_d, sizeof(Node)); cudaMemcpy(node_d, node_s, sizeof(Node), cudaMemcpyHostToDevice); //test printf("ChildCount of node_s looks to be : %dn", node_s->ChildCount); printf("Key of node_s looks to be : %sn", node_s->Key); Node *temp; temp =(Node *) malloc(sizeof(Node)); cudaMemcpy(temp, node_d, sizeof(Node), cudaMemcpyDeviceToHost); printf("ChildCount of node_d on device is actually : %dn", temp->ChildCount); printf("Key of node_d on device is actually : %sn", temp->Key); free(temp); // continue with child nodes if(node_s->ChildCount > 0) { //problem here cudaMalloc( (void**)&(node_d->Children), sizeof(Node)*(node_s->ChildCount)); cudaMemcpy(node_d->Children, node_s->Children, sizeof(Node)*node_s->ChildCount, cudaMemcpyHostToDevice); for(int i=0;iChildCount;i++) { CopyTreeToDevice(&(node_s->Children[i]), &(node_d->Children[i])); } } } 

但我有一个问题:

 cudaMalloc( (void**)&(node_d->Children), sizeof(Node)*(node_s->ChildCount)); 

给我访问冲突exception。测试部分工作顺利。初始化字段没有问题。

这是测试部分的输出:

 ChildCount of node_s looks to be : 35 Key of node_s looks to be : root ChildCount of node_d on device is actually : 35 Key of node_d on device is actually : root 

这是什么原因?

谢谢。

    node_d->Children是驻留在设备代码中的变量。 您不能像主机代码那样直接使用它,就像使用第二个cudaMalloc 。 Morover,将主机指针复制到设备没有太大意义,因为您无法在设备代码中取消引用它们。

    一种更好,更快捷的方法是:

    看起来node_d本身就在gpu上。 您无法使用 – >或访问gpu上的结构。 您需要将node_d复制回主机,分配必要的数据并将其复制回来。

      以上就是c/c++开发分享将多分支树复制到GPU内存相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/523215.html

      (0)
      上一篇 2020年12月11日
      下一篇 2020年12月11日

      精彩推荐