原文地址:http://www./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中创建数据:
这些方法的具体用法可以使用类似下面的命令寻求帮助 help gpuArray/eye 其实,用法和对应的普通函数的用法都是类似的。 II = gpuArray.eye(1024,'int32'); size(II) 1024 1024 还可以用下面的命令生成随机数
对于CPU和GPU产生随机数方法的比较,有兴趣的可以看这里。 最后,一些处理普通数据的函数也可以用来检测GPU数据的属性
值得注意的是,GPU的数据是要存到显存里面的,显存可没有内存那么大,虽然maltab和CUDA为我们做了很多显存管理的工作,但是我们还是要保证处理的矩阵不会把显存撑爆。 matlab的工具箱支持GPU的情况可以在下面的网页上查询 http://www./products/parallel-computing/builtin-parallel-support.html 其中对于图像处理来说有一个很有用的。我曾经的一篇博文介绍过使用 blockproc 函数加速滑动窗。其实,这个函数还可以进一步被GPU加速,方法就是设置其中的 'UseParallel’ 变量。 例子下面是用gpu解波动方程的例子,cpu和gpu版本程序进行对比,改动其实不太大,细节见参考中第四个网页 编译.CU文件对于其他一些复杂的,无法用matlab内部函数进行GPU加速的代码,matlab还提供了一个更强大的工具,就是调用.cu文件。 熟悉matlab+c混合编程的都知道matlab可以把.c,.cc,.cpp等文件编译为能够使用的mex文件。对于CUDA程序.cu,matlab也提供了一套方法来调用,最终编译成.ptx文件。 具体流程在matlab官网上有详细说明。我暂时应该用不到这一步,所以没仔细研究,先记录在这里 http://www./cn/help/distcomp/executing-cuda-or-ptx-code-on-the-gpu.html 最后推荐大家浏览”参考“里面的页面,都是官方的,很详细。还有一个视频介绍在这里 http://www./videos/introduction-to-gpu-computing-with-matlab-68770.html 参考: http://www./cn/help/signal/examples/accelerating-correlation-with-gpus.html http://www./cn/help/distcomp/using-gpuarray.html http://www./discovery/matlab-gpu.html http://www./company/newsletters/articles/gpu-programming-in-matlab.html http://blog.sciencenet.cn/blog-791749-636038.html 上一篇:[转载]高效使用Matlab之二:用内建函数代替for循环 下一篇:[转载]高效使用matlab之四:一个加速matlab程序的例子 |
|
来自: lzqkean > 《Matlab GPU》