我的代码中存在问题检测问题| CUDA c
我很难理解代码中的错误在哪里 该项目的目的是将两个矩阵相乘,并比较顺序和并行之间的时间 当我打印矩阵时,我看到设备矩阵基本上是空的 此外,我将矩阵视为大小为n*n的数组 谢谢我的代码中存在问题检测问题| 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,
//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;i int 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);