2012-03-23 142 views
3

我在CUDA中閱讀了很多關於處理2D數組的內容,我認爲在將它發送到GPU之前有必要將其平坦化。但是,我可以在GPU上分配一維數組並將其作爲GPU中的二維數組訪問嗎?嘗試,但未能我的代碼看起來像如下: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

這是怎麼了我修正了問題 我以通常的方式使用cudaMalloc,但是在發送指向內核的指針時,我將它轉換爲int(*)[col],並且這對我很有用

2

其實,這是沒有必要使用它在GPU上之前爲「扁平化」的二維數組(雖然這可以加快內存訪問)。如果您想要2D陣列,可以使用類似於CUDA C編程指南中記錄的cudaMallocPitch之類的內容。我相信你的代碼不工作的原因是因爲你只有malloc ed一個數組 - 一個[0] [0]不存在。如果你看看你的代碼,你做了一個int s的一維數組,而不是int* s。如果你想malloc的扁平二維數組,你可以這樣做:

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 ]); 
}