2016-05-04 12 views
0

私はオクツリーのノードを配列に格納し、pos_childsはその子ノードがある配列の位置を指しています。どのように私はgpuにこのような構造体を取得し、アクセスし、GPUから適切に戻って取得するのですか?ハードウェアの制約のために統合メモリを使用することはできません。CUDA - 配列を持つ構造体をGPUにコピーして戻す

が動的データは、基本型の配列で作業するよりもはるかに違いはありません割り当てられたために埋め込まれたポインタを含まない 構造体の配列を使用した作業
typedef struct Octree 
{ 
    //data 
    unsigned pos_childs[8]; 
}octree_t; 
+0

:ここ

は、デバイス上のmodifedデバイスに渡されたホスト上で初期化されて、あなたの構造体の配列を、示す加工した例だと、ホストに戻りました。 – Olaf

答えて

1

。 CUDAはCではない

$ cat t690.cu 
#include <iostream> 

const int dsize = 5; 
const int nTPB = 256; 

typedef struct Octree 
{ 
    //data 
    unsigned pos_childs[8]; 
}octree_t; 


__global__ void kernel(Octree *data, size_t n){ 

    int idx=threadIdx.x+blockDim.x*blockIdx.x; 
    if (idx < n) 
    data[idx].pos_childs[4] = data[idx].pos_childs[3]; 
} 


int main(){ 

    Octree *h_data, *d_data; 
    h_data = new Octree[dsize]; 
    cudaMalloc(&d_data, dsize*sizeof(Octree)); 
    for (int i = 0; i < dsize; i++) {h_data[i].pos_childs[3] = i; h_data[i].pos_childs[4] = 0;} 
    cudaMemcpy(d_data, h_data, dsize*sizeof(Octree), cudaMemcpyHostToDevice); 
    kernel<<<(dsize+nTPB-1)/nTPB,nTPB>>>(d_data, dsize); 
    cudaMemcpy(h_data, d_data, dsize*sizeof(Octree), cudaMemcpyDeviceToHost); 
    for (int i = 0; i < dsize; i++) std::cout << h_data[i].pos_childs[4] << " "; 
    std::cout << std::endl; 
    return 0; 
} 

$ nvcc -o t690 t690.cu 
$ cuda-memcheck ./t690 
========= CUDA-MEMCHECK 
0 1 2 3 4 
========= ERROR SUMMARY: 0 errors 
$ 
+0

ありがとう、これは私をかなり助けました。 – mad1Z

関連する問題