首先以简单通用的向量加法为例。本例需要创建一个CUDA函数,完成两个相同大小的输入向量的加法,并输出具有相同大小的独立向量作为结果。
步骤1 在工作目录中创建AddVectors.h,输入以下代码并保存:
在此头文件中,声明了mex函数中将要使用的向量加法函数原型。extern表示该函数将在其他文件中执行。
步骤2 在AddVectors.cu中实现addVectors函数。文件扩展名.cu表示CUDA文件。在MATLAB编辑器中创建一个新文件。输入以下代码并保存为AddVectors.cu:
步骤3 此本步骤中,使用 -c选项编译简单的CUDA代码,生成目标文件,该文件稍后将用于链接mex代码。由此代码建立目标文件,在MATLAB命令窗口中输入以下指令:
成功后,你将会在命令窗口中看到nvcc返回如下所示相类似的信息:
如果命令窗口中显示如下错误信息
这说明未在系统中设置C++编译器路径。可以将C++编译器路径添加到系统环境中,或者通过使用 -ccbin选项明确设置:
步骤4 注意到在MATLAB当前文件夹窗口中,生成的目标文件位于相同的工作目录中,如图2.9所示。
图2.9 创建目标文件
步骤5 创建mex函数,(也可称为AddVectors函数)。与helloMex函数一样,先创建mexFunction。在MATLAB编辑器中创建新文件,输入以下代码,并保存为AddVectorsCuda.cpp:
第6行到第13行,是确保输入为支持的数据类型并修正向量大小。接着获取输入向量大小。第32行中,创建输出向量,存储两个向量相加的结果。第35行,调用基于CUDA的函数完成两个输入向量的相加。
步骤6 编译mex,并链接到创建的CUDA目标文件。在MATLAB命令窗口中输入以下命令。(运行环境为Windows 64位操作系统和CUDA v5.0):
(www.xing528.com)
如果你安装的是CUDA v4.0,将v5.0改为v4.0。如果运行环境为Windows 32位操作系统,将x64改为Win32。例如:
-lcudart告知mex正在使用CUDA运行时库。
-L"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\lib\x64"告知CUDA运行时库的位置。
对于MAC OS X操作系统
对于Linux 发行套件
步骤7 成功后,在同样的工作路径中会生成新的mex文件AddVectorsCuda. mexw64,如图2.10所示。
图2.10 生成的c-mex文件
步骤8 在MATLAB中运行新的mex函数。在命令窗口中,运行
步骤9 核实存储在向量C中的结果。当将每个向量元素相加时,结果向量C为11:
可以通过runAddVectors.m运行整个过程,如下所示:
综上所述,与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所示。
图2.11 与c-mex编译相关的CUDA总结框图
( :输入源文件, :指令, :生成文件)
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。