Использование функции 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);

Если вы действительно хотите работать с массивами с двойной подпиской (то есть неизвестными во время компиляции), вы можете просмотреть этот вопрос / ответ.

Другие вопросы по тегам