无法打印出正确的CUDA矩阵相加结果

Unable to print out correct CUDA matrix addition result

我正在尝试使用块和线程并行添加两个矩阵,但我没有打印出正确的结果矩阵。我认为我无法从主机与设备通信,反之亦然。

这是我得到的输出。结果矩阵乱了。

矩阵一: 18 27 48 28 6 16 40 15 30 41
30 15 25 24 8 0 7 18 7 23
0 15 47 13 26 16 6 17 39 30
6 25 11 22 44 34 37 38 31 15
8 16 17 0 29 6 13 3 30 46
24 21 30 48 15 23 47 41 26 21
25 45 14 15 27 20 44 14 7 39
28 49 3 40 35 40 45 0 37 5
31 17 24 1 48 6 6 2 46 42
10 43 20 17 14 23 2 21 26 8

矩阵b: 44 40 26 14 2 49 6 20 46 36
0 9 5 46 13 26 29 7 46 13
39 41 30 28 4 6 34 32 43 47
30 15 46 19 46 45 49 35 1 8
31 16 36 7 31 38 34 25 26 24
30 11 11 13 13 25 40 14 42 7
30 40 49 44 13 1 44 26 13 22
13 25 41 31 13 10 36 9 18 14
28 25 33 31 41 27 5 11 44​​ 31
32 5 44 7 22 45 42 26 24 24

结果矩阵:

400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496
400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496
400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496 400848496

这是我的代码:

#include <stdio.h>
#include <cuda.h>
#include <stdlib.h>
#include <time.h>

#define N 10
#define BLOCK_DIM 5

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

 int a[N][N], b[N][N], c[N][N];
 int *dev_a, *dev_b, *dev_c;
 int size = N * N * sizeof(int);
 time_t t;

 //initialize rand function
 srand((unsigned) time(&t));

// initialize a and b with values 

    for(int i=0; i<N; i++ )
    {
        for(int j=0; j<N; j++)
        {
            a[i][j]= rand() % 50;
            b[i][j]= rand() % 50;
        }
    }
// print matrix a   
    printf("matrix a: ");
    for(int i=0; i<N; i++)
    {
     printf("\n\t ");
        for(int j=0; j<N; j++)
        {
            printf("%d   ", a[i][j]);
        }
    printf(" ");
    }

    printf("\n ");
//print matrix b    
    printf("matrix b: ");
    for(int i=0; i<N; i++)
    {
     printf("\n\t ");
        for(int j=0; j<N; j++)
        {
            printf("%d   ", b[i][j]);
        }
    printf(" ");
    }

    printf("\n ");

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

 cudaMemcpy(dev_a, a, size, cudaMemcpyHostToDevice);
 cudaMemcpy(dev_b, 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);
 /// __syncthreads(); function call from host not allowed
 cudaMemcpy(c, dev_c, size, cudaMemcpyDeviceToHost);

// print matrix c   

printf("The resultants matrix: \n");
// print matrix c   

    for(int i=0; i<N; i++)
    {
     printf("\n\t ");
        for(int j=0; j<N; j++)
        {
            printf("%d ", c);
        }
    printf(" ");
    }

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

 return 0;

}

__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;
 int index = col + row * N;

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

您的最终输出 printf 语句中有错字。这个:

printf("%d ", c);

应该是这样的:

printf("%d ", c[i][j]);

(与你之前的printf说法一致)

FWIW,内核中最后的 __syncthreads() 语句毫无用处。