我有一个八叉树的节点存储在一个数组中,pos_childs指向子节点所在的数组位置。我如何获得这样的结构到gpu,访问它并正确地从gpu中恢复?由于硬件限制,我无法使用统一内存。
typedef struct Octree
{
//data
unsigned pos_childs[8];
}octree_t;
答案 0 :(得分:1)
使用不包含动态分配数据的嵌入式指针的结构数组与使用基本类型数组没有太大区别。
这是一个工作示例,显示您的结构数组在主机上初始化,传递给设备,在设备上修改并返回到主机:
$ 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
$