【问题标题】:Matrix multiplication using CUDA -- wrong results使用 CUDA 的矩阵乘法——错误的结果
【发布时间】:2012-05-22 15:00:06
【问题描述】:

我有以下用于矩阵操作的内核代码。矩阵 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;
}

我的内核代码调用如下

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);

但是我得到了错误的结果。我的结果总是为零。 谁能帮帮我。

【问题讨论】:

    标签: cuda


    【解决方案1】:

    代码看起来像它用于乘以 2 个相同大小的方阵。

    宽度是第一个矩阵的列数。

    您必须将此作为参数提供给函数。

    【讨论】:

    • 谢谢。是的,它确实是一个方阵。因此,对于宽度 = 300,块大小 32 将无法正常工作。因为它不是完全可分的。所以在这种情况下,我添加了 1 个额外的块来容纳剩余的线程。是这样吗?
    • 是的,如果宽度不是 32 的倍数,则必须添加额外的块。但请确保在内核中检查变量行和列是否在矩阵范围内。这可以在内核中这样做:if(row&gt;=Width || col&gt;=Width) return;
    • 但是当我改变矩阵的大小时,它给了我错误的结果。知道出了什么问题吗?
    • 如果你改变了矩阵的大小,那么也要相应地改变网格的大小。这是创建适用于任何大小矩阵的网格的简单技巧:dim3 dimBlock(block_size,block_size); dim3 dimGrid((block_size + Width - 1)/block_size,(block_size + Width - 1)/block_size);
    猜你喜欢
    • 1970-01-01
    • 2013-04-15
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    相关资源
    最近更新 更多