如何在CUDA中使用2Darrays?

我是CUDA的新手。 如何分配大小为MXN的二维数组? 如何在CUDA中遍历该数组? 给我一个示例代码。 ………………………………………….. ……………………………………

嗨..谢谢你的回复。 我在下面的程序中使用了你的代码。 但是我没有得到正确的结果。

__global__ void test(int A[BLOCK_SIZE][BLOCK_SIZE], int B[BLOCK_SIZE][BLOCK_SIZE],int C[BLOCK_SIZE][BLOCK_SIZE]) { int i = blockIdx.y * blockDim.y + threadIdx.y; int j = blockIdx.x * blockDim.x + threadIdx.x; if (i < BLOCK_SIZE && j < BLOCK_SIZE) C[i][j] = A[i][j] + B[i][j]; } int main() { int d_A[BLOCK_SIZE][BLOCK_SIZE]; int d_B[BLOCK_SIZE][BLOCK_SIZE]; int d_C[BLOCK_SIZE][BLOCK_SIZE]; int C[BLOCK_SIZE][BLOCK_SIZE]; for(int i=0;i<BLOCK_SIZE;i++) for(int j=0;j<BLOCK_SIZE;j++) { d_A[i][j]=i+j; d_B[i][j]=i+j; } dim3 dimBlock(BLOCK_SIZE, BLOCK_SIZE); dim3 dimGrid(GRID_SIZE, GRID_SIZE); test<<<dimGrid, dimBlock>>>(d_A,d_B,d_C); cudaMemcpy(C,d_C,BLOCK_SIZE*BLOCK_SIZE , cudaMemcpyDeviceToHost); for(int i=0;i<BLOCK_SIZE;i++) for(int j=0;j<BLOCK_SIZE;j++) { printf("%d\n",C[i][j]); } } 

请帮帮我。

如何分配二维数组:

 int main(){ #define BLOCK_SIZE 16 #define GRID_SIZE 1 int d_A[BLOCK_SIZE][BLOCK_SIZE]; int d_B[BLOCK_SIZE][BLOCK_SIZE]; /* d_A initialization */ dim3 dimBlock(BLOCK_SIZE, BLOCK_SIZE); // so your threads are BLOCK_SIZE*BLOCK_SIZE, 256 in this case dim3 dimGrid(GRID_SIZE, GRID_SIZE); // 1*1 blocks in a grid YourKernel<<<dimGrid, dimBlock>>>(d_A,d_B); //Kernel invocation } 

如何遍历该数组:

 __global__ void YourKernel(int d_A[BLOCK_SIZE][BLOCK_SIZE], int d_B[BLOCK_SIZE][BLOCK_SIZE]){ int row = blockIdx.y * blockDim.y + threadIdx.y; int col = blockIdx.x * blockDim.x + threadIdx.x; if (row >= h || col >= w)return; /* whatever you wanna do with d_A[][] and d_B[][] */ } 

我希望这是有帮助的

也可以参考关于matrix乘法的CUDA编程指南

最好的方法是将vectorforms的二维数组A存储起来。 例如,你有一个matrixA的大小为nxm,它的(i,j)元素指向指针表示的指针将会是

 A[i][j] (with i=0..n-1 and j=0..m-1). 

在vectorforms,你可以写

 A[i*n+j] (with i=0..n-1 and j=0..m-1). 

在这种情况下使用一维数组将简化复制过程,这将是简单的:

 double *A,*dev_A; //A-hous pointer, dev_A - device pointer; A=(double*)malloc(n*m*sizeof(double)); cudaMalloc((void**)&dev_A,n*m*sizeof(double)); cudaMemcpy(&dev_A,&A,n*m*sizeof(double),cudaMemcpyHostToDevice); //In case if A is double