。 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
$
:ここ
は、デバイス上のmodifedデバイスに渡されたホスト上で初期化されて、あなたの構造体の配列を、示す加工した例だと、ホストに戻りました。 – Olaf