原文地址:http://www.bfcat.com/index.php/2012/11/matlab-gpu/
以前使用matlab的时候,很多人都用过里面的并行工具箱,用的最多的应该就是parfor。实际上,matlab里面已经有不少工具箱里面都有了支持GPU加速的函数。使用matlab+GPU加速的前提是,机器必须安装了支持CUDA的显卡,而且CUDA驱动的版本在1.3以上。
一些比较常用的函数例如fft,ifft,三角函数,相关函数xcorr以及常用的运算符等等都可以进行加速。方法也很简单,主要使用到gpuArray和gather这两个函数。
以xcorr为例,假设我们要求向量A和B的互相关,一般是使用代码
M = xcorr(A,B)
以下是使用gpu加速的版本
Ag = gpuArray(A);
Bg = gpuArray(B);
Mg = xcorr(Ag,Bg);
M = gather(Mg);
一般的小矩阵可能感觉不出来,不过如果矩阵规模很大,而且在多次循环内部,这个区别就很明显了。mathwork的网站上有对xcorr的gpu加速效率的详细分析报告,基本上,随着矩阵规模扩大,gpu加速的倍数是直线上升。
除了相关函数,还有很多支持gpuArray数据类型的函数,具体可以用下面的指令查看
methods('gpuArray')
其中某个函数的说明可以用help查看
help gpuArray/functionname
上面的例子中,gpuArray是把数据转换为GPU处理的类型,存储到GPU的显存里。gather是将数据转移回来。除了将现有的矩阵转移到GPU中,gpuArray自带的方法还可以直接在GPU中创建数据:
gpuArray.ones | gpuArray.colon |
gpuArray.zeros | gpuArray.rand |
gpuArray.inf | gpuArray.randi |
gpuArray.nan | gpuArray.randn |
gpuArray.true | gpuArray.linspace |
gpuArray.false | gpuArray.logspace |
gpuArray.eye |
这些方法的具体用法可以使用类似下面的命令寻求帮助
help gpuArray/eye
其实,用法和对应的普通函数的用法都是类似的。
II = gpuArray.eye(1024,'int32');
size(II)
1024 1024
还可以用下面的命令生成随机数
parallel.gpu.rng |
parallel.gpu.RandStream |
对于CPU和GPU产生随机数方法的比较,有兴趣的可以看这里。
最后,一些处理普通数据的函数也可以用来检测GPU数据的属性
Function | Description |
---|---|
classUnderlying | Class of the underlying data in the array |
existsOnGPU | Indication if array exists on the GPU and is accessible |
isreal | Indication if array data is real |
length | Length of vector or largest array dimension |
ndims | Number of dimensions in the array |
size | Size of array dimensions |
值得注意的是,GPU的数据是要存到显存里面的,显存可没有内存那么大,虽然maltab和CUDA为我们做了很多显存管理的工作,但是我们还是要保证处理的矩阵不会把显存撑爆。
matlab的工具箱支持GPU的情况可以在下面的网页上查询
http://www.mathworks.cn/products/parallel-computing/builtin-parallel-support.html
其中对于图像处理来说有一个很有用的。我曾经的一篇博文介绍过使用 blockproc 函数加速滑动窗。其实,这个函数还可以进一步被GPU加速,方法就是设置其中的 'UseParallel’ 变量。
例子下面是用gpu解波动方程的例子,cpu和gpu版本程序进行对比,改动其实不太大,细节见参考中第四个网页
对于其他一些复杂的,无法用matlab内部函数进行GPU加速的代码,matlab还提供了一个更强大的工具,就是调用.cu文件。
熟悉matlab+c混合编程的都知道matlab可以把.c,.cc,.cpp等文件编译为能够使用的mex文件。对于CUDA程序.cu,matlab也提供了一套方法来调用,最终编译成.ptx文件。
具体流程在matlab官网上有详细说明。我暂时应该用不到这一步,所以没仔细研究,先记录在这里
http://www.mathworks.cn/cn/help/distcomp/executing-cuda-or-ptx-code-on-the-gpu.html
最后推荐大家浏览”参考“里面的页面,都是官方的,很详细。还有一个视频介绍在这里
http://www.mathworks.cn/videos/introduction-to-gpu-computing-with-matlab-68770.html
参考:
http://www.mathworks.cn/cn/help/signal/examples/accelerating-correlation-with-gpus.html
http://www.mathworks.cn/cn/help/distcomp/using-gpuarray.html
http://www.mathworks.cn/discovery/matlab-gpu.html
http://www.mathworks.cn/company/newsletters/articles/gpu-programming-in-matlab.html
联系客服