Как правильно распределить и скопировать 2D-массивы между хостом и устройством в CUDA - PullRequest
0 голосов
/ 14 февраля 2020

Можно ли скопировать выделенный таким образом массив 2D-хостов

h_A=(int**)malloc(N*sizeof(int*));

for(i=0;i<N;i++)
{
   h_A[i]=(int*)malloc(3*sizeof(int));
}

в выделенный таким образом массив 2D-устройств

cudaMallocPitch((void**)&d_A, &pitch, 3*sizeof(int), N);

Я пытался скопировать с хоста на устройство и обратно к хосту, чтобы проверить, работает ли процесс, и в результате правильно скопированы только 2 первые строки

https://drive.google.com/file/d/1gXpChyYd2Div0pDjTRxZhwYd7GHRfjXN/view?usp=sharing

Копировать из массива хоста h_A в массив устройств d_A

cudaMemcpy2D(d_A, pitch, h_A, 3*sizeof(int), 3*sizeof(int), N, cudaMemcpyHostToDevice);

Копирование из массива устройств d_A в массив хостов d_B

cudaMemcpy2D(h_B, pitch, d_A, 3*sizeof(int), 3*sizeof(int), N, cudaMemcpyDeviceToHost);

1 Ответ

1 голос
/ 14 февраля 2020

Если вы выделяете массив указателей для хранения строк, например:

h_A=(int**)malloc(N*sizeof(int*));

for(i=0;i<N;i++)
{
   h_A[i]=(int*)malloc(3*sizeof(int));
}

, то для выделения и перемещения его в сопоставимую структуру на стороне устройства с использованием обычной памяти устройства требуется следующее:

dh_A=(int**)malloc(N*sizeof(int*));

for(i=0;i<N;i++)
{
   int* p; 
   cudaMalloc(&p, 3*sizeof(int))
   cudaMemcpy(p, h_A[i], 3*sizeof(int), cudaMemcpyHostToDevice);
   dh_A[i]=p;
}

int** d_A = cudaMalloc(&d_A, sizeof(int*) * N);
cudaMemcpy(d_A, dh_A, N*sizeof(int*), cudaMemcpyHostToDevice);

[Примечание: весь код, написанный в браузере, не гарантированно компилируется или работает правильно]

Я оставлю читателю в качестве упражнения, как выполнить копирование с устройства на хост. На этом этапе вы можете сделать вывод, что проще использовать линейную память как на хосте, так и на устройстве. Это будет проще и быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...