本节通过例子讲解进行简单的矩阵与矩阵乘法的具体步骤,即
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
接下来,检查输入数据类型是单精度还是浮点。然后,我们获得输入矩阵A和B的指针以及它们的大小。为简单起见,假设输入数据类型是单精度,否则退出编程:
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在示例代码目录中测试这些代码。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。