我一直在这里搞乱了一段时间,但似乎无法做到正确。我试图复制包含数组到CUDA设备内存中的对象(和回来,但我会船到桥头时,我来给它):结构中的指针传递给CUDA
struct MyData {
float *data;
int dataLen;
}
void copyToGPU() {
// Create dummy objects to copy
int N = 10;
MyData *h_items = new MyData[N];
for (int i=0; i<N; i++) {
h_items[i].dataLen = 100;
h_items[i].data = new float[100];
}
// Copy objects to GPU
MyData *d_items;
int memSize = N * sizeof(MyData);
cudaMalloc((void**)&d_items, memSize);
cudaMemCpy(d_items, h_items, memSize, cudaMemcpyHostToDevice);
// Run the kernel
MyFunc<<<100,100>>>(d_items);
}
__global__
static void MyFunc(MyData *data) {
int idx = blockIdx.x * blockDim.x + threadIdx.x;
for (int i=0; i<data[idx].dataLen; i++) {
// Do something with data[idx].data[i]
}
}
当我打电话MYFUNC(d_items),我可以访问数据[idx] .dataLen就好了。但是,数据[idx] .data尚未被复制。
我不能在copyToGPU使用d_items.data作为由于主机代码cudaMalloc/cudaMemCpy操作的目的地不能解除引用的装置指针。
怎么办?