我正在尝试使用双指针在两个动态数组之间编写一个简单的数组和,用于主机和设备数组。以下代码可以正常编译,但最后,包含和的结果的数组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;}