我有一个节点树,我试图将其复制到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