我一直在這裏搞亂了一段時間,但似乎無法做到正確。我試圖複製包含數組到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操作的目的地不能解除引用的裝置指針。
怎麼辦?