本例将使用CUDA函数进行卷积运算。除了通过CUDA实现以外,该CUDA函数和上节的c-mex函数功能相同。
步骤 1定义在CUDA函数中调用函数的原型。创建新文件并保存为conv2Mex.h:
步骤2 在CUDA中执行conv2Mex函数。创建conv2Mex.cu并输入如下代码:
使用cudaMalloc函数分配CUDA设备的内存。函数CudaMemcpy根据第四个参数从主机复制数据到设备,或者从设备复制数据到主机。然后在CUDA设备上,给输入图像、输出图像和掩膜分配内存。使用cudaMemset,初始化输出数据为零。使用conv2MexCuda进行CUDA调用。这里简单地设置网格大小和图像大小相同。在conv2MexCuda中,每个CUDA网格应用3×3掩膜,计算每个输出像素的卷积计算值。第4章将详解介绍网格大小的内容。
步骤3 编译CUDA代码生成目标文件,随后将其链接到c-mex函数。在MATLAB命令窗口输入如下指令完成编译:
如果遇到编译错误,请参考2.5节“实例:使用CUDA实现简单的向量加法”。编译成功后将会生成conv2Mex.obj文件。
步骤4 接着创建mex函数,调用基于CUDA的卷积函数。创建一个新文件,输入如下代码,并保存为conv2MexCuda.cpp:
新的mex函数和前一章的基本相同。唯一区别在于第一行#include"conv2Mex.h"。这里,我们在conv2Mex.h中定义conv2Mex函数,在conv2Mex.cu中执行该函数。
步骤5 这里基于CUDA的mex函数已经准备好。由于conv2Mex函数在conv2Mex.obj中,所以必须告知链接器函数的位置。同时,也告知链接器将要使用CUDA运行时库及其位置。在MATLAB命令窗口输入如下命令(www.xing528.com)
Windows 64位操作系统
Windows 32位操作系统
Linux操作系统
Mac OS X操作系统
成功后,MATLAB会生成mex函数,在Windows 64位操作系统中为convMexCuda.mexw64。
步骤6 在MATLAB命令窗口执行基于CUDA的卷积函数:
此时,你会在MATLAB中看见相同的输出图像。
可以使用convol_cuda.m运行上述整个过程,代码如下:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。