Код, который вы предоставляете, копирует только структуры MyData: адрес хоста и целое число.Чтобы быть слишком ясным, вы копируете указатель, а не данные - вы должны явно копировать данные.
Если данные всегда одинаковы LENGTH
, то вы, вероятно, просто хотите создать один большой массив:
float *d_data;
memSize = N * LENGTH * sizeof(float);
cudaMalloc((void**) &d_data, memSize);
//and a single copy
cudaMemcpy(d_data, h_data, memSize, cudaMemcpyHostToDevice);
Если он должен быть в структуре с другими данными, то:
struct MyData {
float data[LENGTH];
int other_data;
}
MyData *d_items;
memSize = N * sizeof(MyData);
cudaMalloc((void**) &d_items, memSize);
//and again a single copy
cudaMemcpy(d_data, h_data, memSize, cudaMemcpyHostToDevice);
Но я предполагаю, что у вас есть данные различной длины.Одно из решений состоит в том, чтобы установить ДЛИНУ на максимальную длину (и просто потратить некоторое пространство), а затем сделать это так же, как описано выше.Это может быть самый простой способ начать, а потом оптимизировать позже.
Если вы не можете позволить себе потерянную память и время передачи, тогда у меня будет три массива, один со всеми данными, а затем одинсо смещениями и длиной, для хоста и устройства:
//host memory
float *h_data;
int h_offsets[N], h_lengths[N]; //or allocate these dynamically if necessary
int totalLength;
//device memory
float *d_data;
int *d_offsets, *d_lengths;
/* calculate totalLength, allocate h_data, and fill the three arrays */
//allocate device memory
cudaMalloc((void**) &d_data, totalLength * sizeof(float));
cudaMalloc((void**) &d_ffsets, N * sizeof(int));
cudaMalloc((void**) &d_lengths, N * sizeof(int));
//and now three copies
cudaMemcpy(d_data, h_data, totalLength * sizeof(float), cudaMemcpyHostToDevice);
cudaMemcpy(d_offsets, h_offsets, N * sizeof(int); cudaMemcpyHostToDevice);
cudaMemcpy(d_lengths, h_lengths, N * sizeof(int); cudaMemcpyHostToDevice);
Теперь в потоке i
вы можете найти данные, которые начинаются с d_data[d_offsets[i]]
и имеют длину d_data[d_lengths[i]]
* 1020.*