2012-03-23 3 views
3

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

__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(); 
} 

ответ

0

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

2

на самом деле это не нужно «расплющить» ваш 2D массив перед использованием его на GPU (хотя это может ускорить доступ к памяти). Если вам нужен 2D-массив, вы можете использовать что-то вроде cudaMallocPitch, которое описано в руководстве по программированию CUDA C. Я считаю, что ваш код не работает, потому что вы только malloc ed a 1D array - A [0] [0] не существует. Если вы посмотрите на свой код, вы создали 1D-массив из int s, а не int* s. Если вы хотите, чтобы таНос уплощенной 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 ]); 
}