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

Memory 无法打印正确的CUDA矩阵加法结果,memory,matrix,cuda,addition,Memory,Matrix,Cuda,Addition,我试图用块和线程并行地添加两个矩阵,但是我没有得到正确的结果矩阵来打印出来。我认为我无法从主机与设备通信,反之亦然 这是我得到的输出。结果矩阵被弄乱了 矩阵a: 18274828286160153041 30152424807118723 0 15 47 13 26 16 6 17 39 30 6251122443437381315 816170296133046 24213048152347412621 254514152720447139 28493403540450375 31172414

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

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

矩阵a: 18274828286160153041
30152424807118723
0 15 47 13 26 16 6 17 39 30
6251122443437381315
816170296133046
24213048152347412621
254514152720447139
28493403540450375
3117241486624642
10432071421268

矩阵b: 44 40 26 14 2 49 6 20 46 36
0954613269294613
394130284634347
3015461945495518
3116367313834252624
301111313254014427
30 40 49 44 13 1 44 26 13 22
13 25 41 31 13 10 36 9 18 14
28253331412721114431
32 5 44 7 22 45 42 26 24

结果矩阵:

400848496400848496400848496400848496400848496400848496400849640084964008496400849640084964008496400849640084964008496400849640084964008496400849640084964008496400849640084964008496400849640084964008496400849640084964008496400849640084964008496400849640084964008496400849640084964008496400849640084964008496400849640084964008496400848496 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
4008484964008484964008484964008484964008484964008484964008484964008496400849640084964008496400849640084964008496400849640084964008496400849640084964008496400849640084964008496

这是我的密码:

#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();
}
#包括
#包括
#包括
#包括
#定义n10
#定义块_DIM 5
__全局无效矩阵ADD(int*a,int*b,int*c);
int main(){
int a[N][N]、b[N][N]、c[N][N];
int*开发a、*开发b、*开发c;
int size=N*N*sizeof(int);
时间;
//初始化兰德函数
srand((未签名)时间(&t));
//用值初始化a和b

对于(int i=0;i您的最终输出
printf
语句中有一个输入错误。这是:

printf("%d ", c);
应该是这样的:

printf("%d ", c[i][j]);
(这与您以前的
printf
声明一致)


FWIW,最后的
\uuuu syncthreads()
内核中的语句没有任何作用。

我做了更改,但仍然没有得到结果数组的正确值。只是一些随机符号int,如-65081528 10967 1031850590 55 1 32767 1034029464 55 0 0 0 1059089896 55 1031850357 55-65082768 10967-653971456 109671034029464550 2007734016 32767 2007734031 32767 1031848544 55 1031836278 55 1034031064 55 2007733376 32767 2007734016 32767 32767更改后,您的代码对我有效。是我得到的输出。当您使用
cuda memcheck
运行代码时会发生什么?您是否正在运行您发布的代码?是的,我在这里复制并粘贴了我的代码,除了您建议的更改之外,它完全相同,但仍然不起作用。我启动cuda memcheck,如下所示:cuda memcheck./prog,最终结果是==========================错误摘要:打印相同的输出后出现0个错误。具有该更改的代码是正确的。我认为您还有一些其他错误r您的CUDA设置存在问题,显然不容易诊断。您能在您的设置上正确运行CUDA vectorAdd示例吗?好的,我解决了问题。我使用GeForce GTX 280作为我的设备。我通过ssh连接到一个有GeForce GTX 480设备的节点,现在我得到了正确的结果!谢谢!!