使用CUDA的矩阵乘法——错误的结果

使用CUDA的矩阵乘法——错误的结果,cuda,Cuda,我有以下用于矩阵操作的内核代码。矩阵A=1*3,矩阵B=3*3,所得矩阵C为1*3。在下面的代码中,宽度为3 __global__void MatrixMulKernel(float* d_M,float* d_N,float* d_P,int Width) { int row = blockIdx.y * blockDim.y + threadIdx.y; int col = blockIdx.x * blockDim.x + threadIdx.x; if(row>

我有以下用于矩阵操作的内核代码。矩阵A=1*3,矩阵B=3*3,所得矩阵C为1*3。在下面的代码中,宽度为3

__global__void MatrixMulKernel(float* d_M,float* d_N,float* d_P,int Width) {
   int row = blockIdx.y * blockDim.y + threadIdx.y;
   int col = blockIdx.x * blockDim.x + threadIdx.x;
    if(row>=Width || col>=Width){  // matrix range
      return;
    }
   float P_val = 0.0f;
   for (int k = 0; k < Width; ++k) {
   float M_elem = d_M[row * Width + k];
   float N_elem = d_N[k * Width + col];
   P_val += M_elem * N_elem;
  }
 d_p[row*Width+col] = P_val;
}
\uuuuu全局\uuuuu无效矩阵mulkener(float*d\M,float*d\N,float*d\P,int-Width){
int row=blockIdx.y*blockDim.y+threadIdx.y;
int col=blockIdx.x*blockDim.x+threadIdx.x;
如果(行>=宽度| |列>=宽度){//矩阵范围
返回;
}
浮动P_val=0.0f;
对于(int k=0;k
I内核代码的调用如下

int block_size = 32;
dim3 dimGrid(Width/block_size, Width/block_size);
dim3 dimBlock(block_size, block size);
MatrixMulKernel<<<dimGrid, dimBlock>>>(d_M, d_N, d_P,3);
int block_size=32;
dim3 dimGrid(宽度/块大小,宽度/块大小);
dim3 dimBlock(块大小,块大小);
MatrixMulKernel(d_M,d_N,d_P,3);
但是我得到了错误的结果。我得到的结果总是零。
谁能帮帮我吗。

这段代码看起来像是两个相同大小的方阵的乘法

宽度是第一个矩阵的列数


您必须将其作为函数的参数提供。

谢谢。是的,它确实是一个方阵。因此,对于宽度=300,块大小32将无法正常工作。因为它不是完全可分的。因此,在这种情况下,我添加了一个额外的块来容纳剩余的线程。是吗?是的,是的,如果宽度不是32的倍数,则必须添加额外的块。但是请确保在内核中检查变量行和列是否在矩阵范围内。在内核中可以这样做:
if(row>=Width | | col>=Width)返回dim3 dimBlock(block_size,block_size);dim3 dimGrid((块大小+宽度-1)/块大小,(块大小+宽度-1)/块大小)