CUDA程序代码--矩阵计算

这是一个CUDA矩阵计算的程序


#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include 
#include 
using namespace std;

void __global__ matrixMult(float * Md,float *Nd,float *Pd,int width)
{
	int tx=threadIdx.x;	//取得当前线程的ID号的X值
	int ty=threadIdx.y;	//取得当前线程的ID号的Y值
	float pvalue=0;
	for (int k = 0; k < width; ++k)
	{
		float Mel=Md[ty*width+k];	//计算矩阵中一行
		float Nel=Nd[k*width+tx];	//计算矩阵中一列
		pvalue+=Mel*Nel;	//计算后的结果
	}
	Pd[ty*width+tx]=pvalue;	//结果存入结果矩阵
}

void showMat(float *p)
{
	for (int i = 0; i <100; i++)
	{
		if (i%10==0)
		{
			printf_s("\n");
		}
		printf_s(" %1.1f ",p[i]);
	}
	printf_s("\n");
}


int main()
{
	int width=10;
	int size=width*width*sizeof(float);
	float *Md,*Nd,*Pd;
	float *M,*N,*P;

	M=(float*)malloc(size);	//生成一个10x10矩阵并初始化
	for (int i = 0; i < width*width; i++)
	{
		M[i]=(float)(rand()%(20));
	}
	showMat(M);

	N=(float*)malloc(size);//生成一个10x10矩阵并初始化
	for (int j = 0; j < width*width; j++)
	{
		N[j]=(float)(rand()%(20));
	}
	showMat(N);

	P=(float*)malloc(size);
	memset(P,0,size);

	cudaMalloc(&Md,size);	//在GPU上分配上内存
	cudaMemcpy(Md,M,size,cudaMemcpyHostToDevice);	//赋值
	cudaMalloc(&Nd,size);
	cudaMemcpy(Nd,N,size,cudaMemcpyHostToDevice);
	cudaMalloc(&Pd,size);

	dim3 dimBlock(width,width);	//定义block属性,这次是二维线程阵列
	dim3 dimGrid(1,1);	//只有一个grid

	matrixMult<<>>(Md,Nd,Pd,width);	//执行配置是Grid配置在前,block配置在后,启动内核,让GPU开始运算
	cudaMemcpy(P,Pd,size,cudaMemcpyDeviceToHost);	//取得结果

	for (int i = 0; i < width*width; i++)
	{
		if (i%width==0)
		{
			printf_s("\n");
		}
		printf_s(" %1.1f ",P[i]);
	}
	cudaFree(Md);
	cudaFree(Nd);
	cudaFree(Pd);
	printf_s("\n");
	system("pause");
	return 0;
}

程序运行的结果如下

CUDA程序代码--矩阵计算_第1张图片

在做这个小程序的时候第一次不小心将Grid和block配置写反了,导致结果异常。



你可能感兴趣的:(心得体会,原创代码)