我已经尝试了一段时间,但似乎无法做到正确。我正在尝试将包含数组的对象复制到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)时,我可以很好地访问data[idx].dataLen。然而,data[idx].data尚未被复制。
由于主机代码无法解引用设备指针,因此我无法在copyToGPU中使用d_items.data作为cudaMalloc/cudaMemCpy操作的目标。
该怎么办?