分享

科学网—[转载]高效使用matlab之三:在matlab中使用GPU加速

 lzqkean 2014-03-11

原文地址: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加速的倍数是直线上升。

correlation gpu example

除了相关函数,还有很多支持gpuArray数据类型的函数,具体可以用下面的指令查看

methods('gpuArray')

其中某个函数的说明可以用help查看

help gpuArray/functionname

上面的例子中,gpuArray是把数据转换为GPU处理的类型,存储到GPU的显存里。gather是将数据转移回来。除了将现有的矩阵转移到GPU中,gpuArray自带的方法还可以直接在GPU中创建数据:

gpuArray.onesgpuArray.colon
gpuArray.zerosgpuArray.rand
gpuArray.infgpuArray.randi
gpuArray.nangpuArray.randn
gpuArray.truegpuArray.linspace
gpuArray.falsegpuArray.logspace
gpuArray.eye

这些方法的具体用法可以使用类似下面的命令寻求帮助

help gpuArray/eye

其实,用法和对应的普通函数的用法都是类似的。

II = gpuArray.eye(1024,'int32');

size(II)

1024 1024

还可以用下面的命令生成随机数

parallel.gpu.rng
parallel.gpu.RandStream

对于CPU和GPU产生随机数方法的比较,有兴趣的可以看这里

最后,一些处理普通数据的函数也可以用来检测GPU数据的属性

FunctionDescription
classUnderlyingClass of the underlying data in the array
existsOnGPUIndication if array exists on the GPU and is accessible
isrealIndication if array data is real
lengthLength of vector or largest array dimension
ndimsNumber of dimensions in the array
sizeSize of array dimensions

值得注意的是,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程序的例子

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多