c - 使用 CUDA 的矩阵乘法 :Wrong output

标签 c cuda matrix-multiplication

我是 CUDA 的初学者。我正在编写一个程序来将两个矩阵相乘,而不使用共享内存。这是我的程序,其中我将填充 1 的 4x4 矩阵相乘。

输出为 26853932,正确的输出应为 4

有人可以告诉我我错在哪里吗?也许我犯了一个非常幼稚的错误?

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
#include<stdlib.h>  

//kernel deifnition

__global__ void mulKernel(int *d_M,  int *d_N,  int *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)
{
    int pvalue=0;
    for (int k = 0; k < width; k++)
    {
        pvalue = pvalue + (d_M[row*width + k] * d_N[k*width + col]);
    }

    d_P[row*width + col] = pvalue;
}
}

int main()
{
const int block_size = 2;
const int array_width = 4;
int h_M[array_width][array_width] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };

int h_N[array_width][array_width] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
int h_P[array_width][array_width];

int size = array_width*array_width*(sizeof(int));
int *d_M, *d_N, *d_P;

//memory allocation
cudaMalloc((void**)&d_M, size);
cudaMalloc((void**)&d_N, size);
cudaMalloc((void**)&d_P, size); 

//copy data from host to memory
cudaMemcpy(d_M, h_M, size, cudaMemcpyHostToDevice);
cudaMemcpy(d_N, h_N, size, cudaMemcpyHostToDevice);

dim3 grid(array_width/block_size, array_width/block_size, 0);       //grid size
dim3 block(block_size, block_size, 0);  //block size

mulKernel << <grid, block >> >(d_M,d_N,d_P,array_width);

cudaMemcpy(h_P, d_P, size, cudaMemcpyDeviceToHost);

printf("%d", h_P[0][0]);

printf("Press enter to exit....\n");
getchar();


}

最佳答案

问题出在行

dim3 grid(array_width/block_size, array_width/block_size, 0);       //grid size
dim3 block(block_size, block_size, 0);  //block size

其中 z 方向的网格范围设置为 0。3D 网格中 2D 对象的正确表示是将其中一个方向的范围设置为 1。

0 替换为 1 或省略第三个参数(然后默认初始化为 1)后,代码即可工作:

dim3 grid(array_width/block_size, array_width/block_size );
dim3 block(block_size, block_size );
<小时/>

如果设置不正确,内核调用时会抛出运行时错误无效的配置参数。您可以通过使用 proper CUDA error checking 轻松找到自己(或者通过使用 cuda-memcheck 运行您的程序)。

关于c - 使用 CUDA 的矩阵乘法 :Wrong output,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36150406/

相关文章:

cuda - 不同的 nvcc 版本使用哪个 g++ 版本?

c++ - 使用 CUDA 对矩阵进行按行/按列操作

iPhone GPU 上的大型矩阵乘法

julia - Julia 中的特征分解和 "composition"

c - while 循环无法与 || 一起正常工作

c - 在单独的线程中使用全局变量控制 while 循环

c++ - 在 Cuda 8+ 中使用默认推力自展开 CUDA n 暗淡的相同类型元组创建?

python - 任意形状 NumPy 数组的点积

c - 如何访问结构体数组的第二个元素?

python - C 到 Python 代码转换(打印类似地址的值)