2016-05-04 5 views
0

Ich habe die Knoten eines Octree in einem Array gespeichert und pos_childs zeigen auf die Array-Position, wo der Childnode ist. Wie bekomme ich eine Struktur wie diese in die GPU, greife auf sie zu und bekomme sie von der GPU zurück? Ich kann aufgrund von Hardware-Einschränkungen keinen einheitlichen Speicher verwenden.CUDA - Kopieren einer Struktur mit einem Array auf die GPU und zurück

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

CUDA nicht C ist. – Olaf

Antwort

1

Arbeiten mit einer Reihe von Strukturen, die dynamisch zugewiesenen Daten sind nicht viel anders als die Arbeit mit einer Reihe von Grundtypen nicht enthalten eingebettete Zeiger auf.

Hier ist ein ausgearbeitetes Beispiel eine Reihe von Ihrer Struktur zeigt auf dem Host initialisiert wird, an das Gerät übertragen, auf dem Gerät modifed und an den Host zurückgegeben:

$ 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

Danke, das hat mir sehr geholfen. – mad1Z

Verwandte Themen