首页 理论教育 GPU与MATLAB混合编程-CUBLAS矩阵乘法

GPU与MATLAB混合编程-CUBLAS矩阵乘法

时间:2023-11-24 理论教育 版权反馈
【摘要】:首先在程序开始部分添加另一个头文件cublas_v2.h:头文件cublas_v2.h中包含了CUBLAS库的函数原型。)删除句柄,这是我们调用所有CUBLAS函数之前要做的事情。

GPU与MATLAB混合编程-CUBLAS矩阵乘法

本节通过例子讲解进行简单的矩阵与矩阵乘法的具体步骤,即

C=A×B

其中,矩阵A的大小是M×N,矩阵B的大小是N×P,计算结果C的大小是M×P。

1.步骤1

打开MATLAB命令窗口,创建一个新文件,将其保存为cublasDemo.cpp。

2.步骤2

在空文件cublasDemo.cpp中,输入以下代码:

正如你可能记住的那样,这是一个空的子例行程序,并从这开始c-mex程序。

3.步骤3

接下来,检查输入数据类型是单精度还是浮点。然后,我们获得输入矩阵AB指针以及它们的大小。为简单起见,假设输入数据类型是单精度,否则退出编程:

4.步骤4

生成输出矩阵C,它的大小由矩阵A的行数和矩阵B的列数决定:

5.步骤5

现在在GPU设备上创建用于存储矩阵数据的存储空间。分别用cudaMalloc和cudaFree函数来分配和释放内存。这些函数在cuda_runtime.h中定义,所以在程序最开始的地方要声明这个头文件:

可以注意到,我们只是分配和释放了GPU中的内存,把CUBLAS代码插入其中。

6.步骤6(www.xing528.com)

现在开始添加CUBLAS代码。首先在程序开始部分添加另一个头文件cublas_v2.h:

头文件cublas_v2.h中包含了CUBLAS库的函数原型。首先创建CUBLAS句柄,最后通过调用cublasDestroy(…)删除句柄,这是我们调用所有CUBLAS函数之前要做的事情。然后,通过调用cublasSetMatrix(…)来准备矩阵,这样可以将矩阵从主机存储空间复制到分配好的GPU设备存储空间中去。注意,将数据移动到GPU设备时,我们并没有调用cudaMemcoy(…),这里因为文件cublasSetMatrix(…)已经在后台完成了这一工作。

7.步骤7

本步骤仅仅调用其中矩阵和矩阵相乘函数PCublasSgemm(…),这个函数在GPU上进行实际的运算。正如它的函数名一样,这个函数的作用是实现单精度数据类型的矩阵相乘。

文件cublasSgemm(…)完成所有低层次CUDA工作,并且将结果返回到为矩阵C分配的GPU内存中,然后文件cublasGetMatrix(…)将结果从GPU存储空间复制到主机存储中。我们不需要设置数据的线程块和线程的大小,CUBLAS会自动设定它们的维度,执行内核函数,并返回输出结果。

8.步骤8

现在c-mex编码完成,进入MATLAB命令窗口,输入mex命令来实际运行程序:

其中,各选项含义如下:

●-lcudart:表明在调用CUDA运行时库。具体而言,我们在调用两个基本CUDA函数cudaMalloc(…)和cudaFree(…)。

●-lcublas:表明在调用CUBLAS库。具体而言,我们在调用cublasXXX函数。

●-Ldir:dir是CUDA和CUBLAS库所在的目录。

●-Idir:dir是CUDA和CUBLAS头文件所在的目录。

9.步骤9

在Windows 64位操作系统中,运行步骤8中的MATLAB命令会生成c-mex文件cublasDemo1.mexw64,在MATLAB命令窗口中调用生成的函数来进行乘法计算:

可以用cublasExample.m在示例代码目录中测试这些代码。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈