2011-11-06 4 views
1

struct에 대한 포인터를 사용하는 C 코드가 있습니다. 나는 행운을 잃지 않고 그것을 쿠다 (cuda)에게 넘기는 법을 알아 내려고 노력 중이다.포인터 기반 구조체를 Cuda에 전달

나는

typedef struct node {  /* describes a tip species or an ancestor */ 
    struct node *next, *back; /* pointers to nodes      */ 
etc... 
} node; 
다음

내 코드에서

typedef node **pointptr; 
static pointptr treenode; 

나는이 모든 반복, 그리고 내가 수행 할 수 있도록 커널에게 전달하는 방법을 알아 내기 위해 노력하고있다 다음 작업 :

for (i = 1; i <= nonodes; i++) { 
    treenode[i - 1]->back = NULL; 
    etc.... 
} 

그러나 나는 그것을 전달하는 방법을 알아낼 수 없습니다. 아이디어가 있으십니까?

답변

1

문제는 커널 내부에서 트리를 사용하기 위해서 nextback은 아마도 장치 메모리의 어느 지점을 가리켜 야한다는 점입니다. 를 통과하면 다음 호스트에 트리를 구성하고 가정 할 때, 당신은 같은 것을 할 수있는 :

node* traverse(node*n){ 
    if (n==NULL) 
     return NULL; 

    node x, *d; 
    x.back = traverse(n->back); 
    x.next = traverse(n->next); 
    cudaMalloc(&d, sizeof(node)); 
    cudaMemcpy(d, &x, sizeof(node), cudaMemcpyHostToDevice); 
    return d; 
} 

를 루트에 전화하여 장치 메모리에 트리의 루트에 대한 포인터로 끝날 것 이것은 커널에 직접 전달할 수 있습니다. 나는이 코드를 테스트하지 않았으며 나중에 트리를 삭제하는 것과 비슷한 것을 작성해야한다.

또는 포인터 대신 backnext의 인덱스를 사용하여 트리 노드를 연속적으로 배열에 저장할 수 있습니다 (필요할 경우 장치 코드의 포인터로 다시 변경할 수 있음).

0

확인이 질문은 : 그것은 귀하의 질문에 정확히에 대답하지 않지만

Copying a multi-branch tree to GPU memory

, 나는 몇 가지를 취소 할 수있다 생각하고 궁극적으로 당신이 당신의 문제를 해결하는 데 도움.