Punteros en estructuras pasadas a CUDA

He estado jugando con esto por un tiempo, pero parece que no puedo hacerlo bien. Estoy tratando de copiar objetos que contienen matrices en la memoria del dispositivo CUDA (y de regreso, pero cruzaré ese puente cuando llegue a él):

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]
  }
}

Cuando llamo a MyFunc (d_items), puedo acceder a datos [idx] .dataLen muy bien. Sin embargo, los datos [idx] .data aún no se han copiado.

No puedo usar d_items.data en copyToGPU como destino para las operaciones cudaMalloc / cudaMemCpy ya que el código de host no puede desreferenciar un puntero de dispositivo.

¿Qué hacer?

Respuestas a la pregunta(2)

Su respuesta a la pregunta