2012-03-23 155 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 ]); 
}