Если вы выделяете массив указателей для хранения строк, например:
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);
[Примечание: весь код, написанный в браузере, не гарантированно компилируется или работает правильно]
Я оставлю читателю в качестве упражнения, как выполнить копирование с устройства на хост. На этом этапе вы можете сделать вывод, что проще использовать линейную память как на хосте, так и на устройстве. Это будет проще и быстрее.