На самом деле нет необходимости «выравнивать» ваш 2D-массив перед использованием его на GPU (хотя это может ускорить доступ к памяти). Если вам нужен 2D-массив, вы можете использовать что-то вроде cudaMallocPitch
, что описано в руководстве по программированию на CUDA C. Я считаю, что причина того, что ваш код не работает, в том, что вы только malloc
отредактировали одномерный массив - A [0] [0] не существует. Если вы посмотрите на свой код, вы создали одномерный массив int
с, а не int*
с. Если вы хотите использовать malloc для плоского 2D-массива, вы можете сделать что-то вроде:
int** A;
cudaMalloc(&A, 16*length*sizeof(int*)); //where length is the number of rows/cols you want
А затем в вашем ядре используйте (чтобы напечатать указатель на любой элемент):
__global__ void kernel( int **d_a, int row, int col, int stride )
{
printf("%p", d_a[ col + row*stride ]);
}