У меня есть дерево узлов, и я пытаюсь скопировать его в память GPU.Узел выглядит так:
struct Node
{
char *Key;
int ChildCount;
Node *Children;
}
А моя функция копирования выглядит так:
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 : %d\n", node_s->ChildCount);
printf("Key of node_s looks to be : %s\n", 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 : %d\n", temp->ChildCount);
printf("Key of node_d on device is actually : %s\n", 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;i<node_s->ChildCount;i++)
{
CopyTreeToDevice(&(node_s->Children[i]), &(node_d->Children[i]));
}
}
}
Но у меня проблема со строкой:
cudaMalloc( (void**)&(node_d->Children), sizeof(Node)*(node_s->ChildCount));
Дает мне исключение нарушения прав доступа. Тестовый раздел работает гладко. Нет проблем при инициализации полей.
Вот результат теста тестового раздела:
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
В чем причина этого?
Спасибо.