2D массивы в CUDA - PullRequest
       5

2D массивы в CUDA

3 голосов
/ 23 марта 2012

Я много читал об обработке 2D-массивов в CUDA, и я думаю, что необходимо сплющить его перед отправкой в ​​GPU. Как я могу выделить 1D-массив на GPU и получить доступ к нему как 2D-массив в GPU?код выглядит следующим образом:

__global__ void kernel( int **d_a )
{ 

   cuPrintf("%p",local_array[0][0]);
}

int main(){

    int **A;

    int i;

    cudaPrintfInit();

    cudaMalloc((void**)&A,16*sizeof(int));

    kernel<<<1,1>>>(A);

    cudaPrintfDisplay(stdout,true);

    cudaPrintfEnd();
}

Ответы [ 2 ]

2 голосов
/ 27 марта 2012

На самом деле нет необходимости «выравнивать» ваш 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 ]);
}
0 голосов
/ 27 марта 2012

Так я исправил проблему cudaMalloc обычным способом, но, отправляя указатель в ядро, я вводил его в int (*) [col], и это работает для меня

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