在CUDA中使用双指针的动态2D数组

时间:2017-03-09 10:00:09

标签: cuda

我正在尝试使用双指针在两个动态数组之间编写一个简单的数组和,用于主机和设备数组。以下代码可以正常编译,但最后,包含和的结果的数组h_c充满了零。我认为设备阵列分配不好,主机阵列没有正确传输。有人可以解决这个问题吗?感谢。

#include <stdio.h>
#include <cuda_runtime.h>
#define N 16
#define BLOCK_DIM 4

__global__ void matrixAdd (int **a, int **b, int **c) {

int col = blockIdx.x * blockDim.x + threadIdx.x;
int row = blockIdx.y * blockDim.y + threadIdx.y;

if (col < N && row < N) 
c[row][col] = a[row][col] + b[row][col];}

int** create(int row, int col){
  int i,j;
  int** temp;

  temp=(int**) malloc(row*sizeof(int*));
  for(i=0;i<row;i++)
    temp[i]=(int*) malloc(row*sizeof(int));

  for(i=0;i<row;i++)
    for(j=0;j<col;j++)
    temp[i][j]=0;

 return(temp);}

void destroy(int **temp,int rows){
  int i;

  for(i=0;i<rows;i++)
    free(temp[i]);
  free(temp);
 }

int main() {
int i,j;
int** h_a=create(N,N);
int** h_b=create(N,N);
int** h_c=create(N,N);
int **dev_a, **dev_b, **dev_c;
int size = N * N * sizeof(int);

cudaMalloc((void**)&dev_a, size);
cudaMalloc((void**)&dev_b, size);
cudaMalloc((void**)&dev_c, size);

for(i=0;i<N;i++)  
   for(j=0;j<N;j++)
    h_a[i][j]=5;

for(i=0;i<N;i++)  
   for(j=0;j<N;j++)
    h_b[i][j]=15;  


cudaMemcpy(dev_a, h_a, size, cudaMemcpyHostToDevice);
cudaMemcpy(dev_b, h_b, size, cudaMemcpyHostToDevice);

dim3 dimBlock(BLOCK_DIM, BLOCK_DIM);
dim3 dimGrid((int)ceil(N/dimBlock.x),(int)ceil(N/dimBlock.y));

matrixAdd<<<dimGrid,dimBlock>>>(dev_a,dev_b,dev_c);
cudaMemcpy(h_c,dev_c, size, cudaMemcpyDeviceToHost);

for(i=0;i<N;i++)
{  
   for(j=0;j<N;j++)
    printf("%d ",h_c[i][j]);
   printf("\n");
}

cudaFree(dev_a); cudaFree(dev_b); cudaFree(dev_c);

destroy(h_a,N); destroy(h_b,N); destroy(h_c,N);

return 0;}

0 个答案:

没有答案