我是CUDA
的初学者。我正在编写一个程序,在不使用共享内存的情况下将两个矩阵相乘。这是我的程序,我将4x4矩阵乘以1
。
输出为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();
}
答案 0 :(得分:2)
问题出在
行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
或省略第3个参数(然后将其默认初始化为1
)后,代码才有效:
dim3 grid(array_width/block_size, array_width/block_size );
dim3 block(block_size, block_size );
如果设置不正确,则会在内核调用上抛出运行时错误invalid configuration argument
。您可以使用proper CUDA error checking(或使用cuda-memcheck
运行程序)轻松找到自己。
答案 1 :(得分:1)
初始化 GRID &amp; BLOCK 配置错误。
立即强>
dim3 grid(array_width/block_size, array_width/block_size, 0); //grid size
dim3 block(block_size, block_size, 0); //block size
<强>预期:强>
dim3 grid(array_width/block_size, array_width/block_size, 1); //grid size
dim3 block(block_size, block_size, 1); //block size
使用CUDA错误语句的好习惯。以下是一个非常简单的示例,只需将 stmt 替换为您预期的代码Statement。
#define wbCheck(stmt) do{
cudaError_t err = stmt;
if (err != cudaSuccess) {
printf( "Failed to run stmt %d ", __LINE__);
printf( "Got CUDA error ... %s ", cudaGetErrorString(err));
return -1;
}
} while(0)