Использование функции Cudamemcpy
Как будет работать функция cudaMemcpy в этом случае?
Я объявил такую матрицу
float imagen[par->N][par->M];
и я хочу скопировать его на устройство cuda, поэтому я сделал это
float *imagen_cuda;
int tam_cuda=par->M*par->N*sizeof(float);
cudaMalloc((void**) &imagen_cuda,tam_cuda);
cudaMemcpy(imagen_cuda,imagen,tam_cuda,cudaMemcpyHostToDevice);
Будет ли это копировать 2d массив в 1d массив нормально?
И как я могу скопировать в другой 2d массив? Могу ли я изменить это, и это будет работать?
float **imagen_cuda;
1 ответ
Это не тривиально обрабатывать дважды подписанный массив C при копировании данных между хостом и устройством. По большей части, cudaMemcpy
(в том числе cudaMemcpy2D
) ожидать обычный указатель для источника и назначения, а не указатель на указатель.
Самый простой подход (я думаю) состоит в том, чтобы "сгладить" двумерные массивы, как на хосте, так и на устройстве, и использовать индексную арифметику для моделирования 2D координат:
float imagen[par->N][par->M];
float *myimagen = &(imagen[0][0]);
float myval = myimagen[(rowsize*row) + col];
Затем вы можете использовать обычные операции cudaMemcpy для обработки переводов (используя myimagen
указатель):
float *d_myimagen;
cudaMalloc((void **)d_myimagen, (par->N * par->M)*sizeof(float));
cudaMemcpy(d_myimagen, myimagen, (par->N * par->M)*sizeof(float), cudaMemcpyHostToDevice);
Если вы действительно хотите работать с массивами с двойной подпиской (то есть неизвестными во время компиляции), вы можете просмотреть этот вопрос / ответ.