首页 理论教育 使用CUDA实现向量加法,GPU与MATLAB混合编程

使用CUDA实现向量加法,GPU与MATLAB混合编程

时间:2023-11-24 理论教育 版权反馈
【摘要】:首先以简单通用的向量加法为例。步骤1 在工作目录中创建AddVectors.h,输入以下代码并保存:在此头文件中,声明了mex函数中将要使用的向量加法函数原型。文件扩展名.cu表示CUDA文件。第35行,调用基于CUDA的函数完成两个输入向量的相加。当将每个向量元素相加时,结果向量C为11:可以通过runAddVectors.m运行整个过程,如下所示:综上所述,与CUDA相关的代码放在文件AddVectors.cu中。图2.11 与c-mex编译相关的CUDA总结框图

使用CUDA实现向量加法,GPU与MATLAB混合编程

首先以简单通用的向量加法为例。本例需要创建一个CUDA函数,完成两个相同大小的输入向量的加法,并输出具有相同大小的独立向量作为结果。

步骤1 在工作目录中创建AddVectors.h,输入以下代码并保存:

978-7-111-52904-0-Chapter02-20.jpg

在此头文件中,声明了mex函数中将要使用的向量加法函数原型。extern表示该函数将在其他文件中执行。

步骤2 在AddVectors.cu中实现addVectors函数。文件扩展名.cu表示CUDA文件。在MATLAB编辑器中创建一个新文件。输入以下代码并保存为AddVectors.cu:

978-7-111-52904-0-Chapter02-21.jpg

步骤3 此本步骤中,使用 -c选项编译简单的CUDA代码,生成目标文件,该文件稍后将用于链接mex代码。由此代码建立目标文件,在MATLAB命令窗口中输入以下指令:

978-7-111-52904-0-Chapter02-22.jpg

成功后,你将会在命令窗口中看到nvcc返回如下所示相类似的信息:

978-7-111-52904-0-Chapter02-23.jpg

如果命令窗口中显示如下错误信息

978-7-111-52904-0-Chapter02-24.jpg

这说明未在系统中设置C++编译器路径。可以将C++编译器路径添加到系统环境中,或者通过使用 -ccbin选项明确设置:

978-7-111-52904-0-Chapter02-25.jpg

步骤4 注意到在MATLAB当前文件夹窗口中,生成的目标文件位于相同的工作目录中,如图2.9所示。

978-7-111-52904-0-Chapter02-26.jpg

图2.9 创建目标文件

步骤5 创建mex函数,(也可称为AddVectors函数)。与helloMex函数一样,先创建mexFunction。在MATLAB编辑器中创建新文件,输入以下代码,并保存为AddVectorsCuda.cpp:

978-7-111-52904-0-Chapter02-27.jpg

第6行到第13行,是确保输入为支持的数据类型并修正向量大小。接着获取输入向量大小。第32行中,创建输出向量,存储两个向量相加的结果。第35行,调用基于CUDA的函数完成两个输入向量的相加。

步骤6 编译mex,并链接到创建的CUDA目标文件。在MATLAB命令窗口中输入以下命令。(运行环境为Windows 64位操作系统和CUDA v5.0):

978-7-111-52904-0-Chapter02-28.jpg(www.xing528.com)

如果你安装的是CUDA v4.0,将v5.0改为v4.0。如果运行环境为Windows 32位操作系统,将x64改为Win32。例如:

978-7-111-52904-0-Chapter02-29.jpg

-lcudart告知mex正在使用CUDA运行时库。

-L"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\lib\x64"告知CUDA运行时库的位置。

对于MAC OS X操作系统

978-7-111-52904-0-Chapter02-30.jpg

对于Linux 发行套件

978-7-111-52904-0-Chapter02-31.jpg

步骤7 成功后,在同样的工作路径中会生成新的mex文件AddVectorsCuda. mexw64,如图2.10所示。

978-7-111-52904-0-Chapter02-32.jpg

图2.10 生成的c-mex文件

步骤8 在MATLAB中运行新的mex函数。在命令窗口中,运行

978-7-111-52904-0-Chapter02-33.jpg

步骤9 核实存储在向量C中的结果。当将每个向量元素相加时,结果向量C为11:

978-7-111-52904-0-Chapter02-34.jpg

可以通过runAddVectors.m运行整个过程,如下所示:

978-7-111-52904-0-Chapter02-35.jpg

综上所述,与CUDA相关的代码放在文件AddVectors.cu中。AddVectors.h包含文什AddVectors.cu定义的函数原型。mex函数(AddVectorsCuda.cpp中的子例行程序)通过AddVectors.h调用CUDA函数。利用nvcc.exe将CUDA代码(.cu)编译为目标文件(.obi)后,使用mex命令编译C/C++代码(.cpp)并将其链接到CUDA目标文件(.obi)。最终得到可执行的二进制mex文件(.mexw64),该文件包含有常规的cpp文件和cu文件。流程如图2.11所示。

978-7-111-52904-0-Chapter02-36.jpg

图2.11 与c-mex编译相关的CUDA总结框图

( 978-7-111-52904-0-Chapter02-37.jpg :输入源文件, 978-7-111-52904-0-Chapter02-38.jpg :指令, 978-7-111-52904-0-Chapter02-39.jpg :生成文件)

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

我要反馈