我的代码中存在问题检测问题| CUDA c

我的代码中存在问题检测问题| CUDA c,cuda,Cuda,我很难理解代码中的错误在哪里 该项目的目的是将两个矩阵相乘,并比较顺序和并行之间的时间 当我打印矩阵时,我看到设备矩阵基本上是空的 此外,我将矩阵视为大小为n*n的数组 谢谢 //This program computes the multiplication of two Matrices GPU using CUDA #include <stdio.h> #include <cassert> __global__ void matrixMul(int * m,

我很难理解代码中的错误在哪里

该项目的目的是将两个矩阵相乘,并比较顺序和并行之间的时间

当我打印矩阵时,我看到设备矩阵基本上是空的

此外,我将矩阵视为大小为n*n的数组

谢谢

//This program computes the multiplication of two Matrices  GPU using CUDA

#include <stdio.h>
#include <cassert>


__global__ void matrixMul(int * m,int * n,int * p,int size)
{
    //Calculate Row and Column
   int row=threadIdx.y*blockDim.y+threadIdx.y;
    int column=threadIdx.x*blockDim.x+threadIdx.x;
   int p_sum=0;

   for (int i = 0; i < size; i++)
   {
      p_sum += m[row*size + i] * n[i*size +column];

   }
   p[row*size + column] = p_sum;

}

void matrixMul_seq(int * m,int * n,int * p,int size){
    for(int i = 0; i < size; i++){
        for(int j = 0; j < size; j++){
            for(int k = 0; k < size; k++){
                p[i*size +j] += m[i*size +k] +n[k*size +j];
            }
        }
    }
}



//Initialize matricies
void init_matricies(int * mat,int n){
    for(int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++)
        {
            mat[i*n+j]=rand()%1024;
        }
        
    }
}

int main(int argc,char **argv)
{

   //Set our problem Size(Default = 2^10 == 1024)
   int n = 1<<10;
   printf("Square Matrix of size:%d\n",n);

   //Size in Bytes
   size_t bytes=n*n*sizeof(bytes);

   //Host matricies
   int *h_m;
   int *h_p;    
   int *h_n;
   int *h_p_seq;
   //Host matricies
   int *d_m;
   int *d_p;    
   int *d_n;


   //Memory allocation for Host Matricies
   h_m=(int*)malloc(bytes);
   h_n=(int*)malloc(bytes);
   h_p=(int*)malloc(bytes);
   h_p_seq=(int*)malloc(bytes);



   init_matricies(h_m,n);
   init_matricies(h_n,n);

   //Allocate memory on device side
   cudaMalloc(&d_n, bytes);
   cudaMalloc(&d_m, bytes);
   cudaMalloc(&d_p, bytes);

   //Copy data to Device
   cudaMemcpy(d_m,h_m, bytes, cudaMemcpyHostToDevice);
   cudaMemcpy(d_n,h_n, bytes, cudaMemcpyHostToDevice); 

    
   int threads_per_block =16;
   dim3 block_size(threads_per_block,threads_per_block);
   dim3 grid_size( n / block_size.x , n / block_size.y);

   printf("Grid size  X:%d, Grid size y:%d\n",grid_size.x,grid_size.y);
   printf("THE RESULT OF THE SIZES: 2^6 * 2^4 * 2^6 * 2^4  \n");

   matrixMul <<<grid_size,block_size>>>(d_m,d_n,d_p,n);
   matrixMul_seq(h_m,h_n,h_p_seq,n);
   cudaMemcpy(h_p,d_p, bytes, cudaMemcpyDeviceToHost);   

    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
        //printf("Grid size  X:%d, Grid size y:%d\n",h_p[ n * i + j],h_p_seq[ n * i + j]);

            assert(h_p[ n * i + j]==h_p_seq[ n * i + j]);
    }
 }
    free(h_m);
    free(h_p);
    free(h_n);
    free(h_p_seq);

    cudaFree(d_m);
    cudaFree(d_n);
    cudaFree(d_p);
  

     return 0;
  

}
//此程序使用CUDA计算GPU上两个矩阵的乘法
#包括
#包括
__全局无效矩阵MUL(int*m,int*n,int*p,int size)
{
//计算行和列
int row=threadIdx.y*blockDim.y+threadIdx.y;
int column=threadIdx.x*blockDim.x+threadIdx.x;
int p_sum=0;
对于(int i=0;iint n=1您的代码中有各种各样的问题:

  • 您计算的内核索引变量不正确。这是不正确的:

    int row=threadIdx.y*blockDim.y+threadIdx.y;
    int column=threadIdx.x*blockDim.x+threadIdx.x;
    
    应该是:

    int row=blockIdx.y*blockDim.y+threadIdx.y;
    int column=blockIdx.x*blockDim.x+threadIdx.x;
    
  • 计算函数中的矩阵运算彼此不匹配。内核:

    p_sum += m[row*size + i] * n[i*size +column];
                             ^
                             multiplication
    
    主机代码:

    p[i*size +j] += m[i*size +k] +n[k*size +j];
                                 ^
                                 addition
    
    我们还从上面观察到,主机代码正在对输出变量进行求和(
    +=
    ),而内核正在对输出变量进行赋值(
    =
    ):

    这对下一个问题有影响

  • malloc
    不初始化数据。由于此操作正在创建主机代码将使用的输出数组,主机代码正在对其进行求和,因此我们必须将此分配初始化为零:

    h_p_seq=(int*)malloc(bytes);
    memset(h_p_seq, 0, bytes);  // must add this line to initialize to zero
    
  • 以字节为单位的数组大小计算太大。您已将数组定义为
    int
    类型。但大小计算如下:

    size_t bytes=n*n*sizeof(bytes);
    
    int
    是一个4字节的数量,而
    size\u t
    变量如
    bytes
    是一个8字节的数量。这不会导致实际问题,但没有必要。我建议将其更改为:

    size_t bytes=n*n*sizeof(int);
    

  • 在解决了上述问题后,您的代码对我来说运行正常。

    我看不到GPU上的这三个阵列中的任何一个都没有设备内存分配。您认为没有它们,这会如何工作?您的意思是什么?所有这些阵列都有一个分配:size\u t bytes=nnsizeof(bytes);h\u m=(int*)malloc(bytes);h\u n=(int*)malloc(bytes)h_p=(int*)malloc(字节);h_p_seq=(int*)malloc(字节);cudaMemcpy(d_m,h_m,bytes,cudaMemcpyHostToDevice);cudaMemcpy(d_n,h_n,bytes,cudaMemcpyHostToDevice);cudaMemcpy(h_p,d_p,bytes,cudamemcpydocydevicetohost);没有分配
    dum
    dun
    dup
    code@talonmies你是对的,我没有注意到。但是assert函数返回了一个我找不到的错误。
    size_t bytes=n*n*sizeof(int);