Лучшим способом было бы хранить двумерный массив A в его векторной форме.Например, у вас есть матрица A размером nxm, и ее (i, j) элемент в указателе на представление указателя будет
A[i][j] (with i=0..n-1 and j=0..m-1).
В векторной форме вы можете написать
A[i*n+j] (with i=0..n-1 and j=0..m-1).
Использование одномерного массива в этом случае упростит процесс копирования, который будет простым:
double *A,*dev_A; //A-hous pointer, dev_A - device pointer;
A=(double*)malloc(n*m*sizeof(double));
cudaMalloc((void**)&dev_A,n*m*sizeof(double));
cudaMemcpy(&dev_A,&A,n*m*sizeof(double),cudaMemcpyHostToDevice); //In case if A is double