[Matlab] 使用GPU进行滤波运算

从Matlab2013版本开始,matlab将可以直接调用gpu进行并行计算,而不再需要安装GPUmat库。这一改动的好处是原有的matlab内置函数都可以直接运用,只要数据格式是gpuArray格式的,那么计算过程会自动的调用GPU进行计算
具体操作起来,只要知道下面几个函数就可以像编写简单的m文件一样,进行matlab的GPU编程
1.GPU设备确认函数
1)n=gpuDeviceCount %返回设备上的GPU数目
2)gpuDevice %选择GPU设备
D=gpuDevice or gpuDevice(): 如果当前还未设置选择的GPU,则选择默认的GPU,D是返回对象;如果已经设 置了GPU,则返回设置的GPU对象。
D=gpuDevice(IDX): 表示选择IDX对应的GPU设置,D是返回对象
%PS: 目前的GPU设置一般至少包含两个GPU,分别用1和2表示对应的IDX。
3)reset(gpudev) %清空gpu的内存,类似matlab的clear的功能。其中gpudev是gpuDevice所返回的对象。

2.GPU以CPU之间的交互
1)gpuArray(CPU–>GPU)
主要有两个功能:
I) 将CPU内存数据传导到GPU内存中
例子-1:
X=rand(10,’single’); %定义在CPU上的一个10x10的随机初始化数组
GX=gpuArray(X); %在GPU开始数组GX,并且将X的值赋给GX
GX2=GX.*GX; %GPU上执行数组对应位置的点乘
II)在GPU内存中随机初始化一些内存数据。
例子-2:
GX=rand(10,’gpuArray’); %直接在GPU设备上随机初始化一个10x10的数组
%%PS:常用的随机初始化函数有:eye, ones, zeros, rand, randi, randn.
2)gather(GPU–>CPU)
主要是将GPU内存中的数据拷贝回CPU内存中。
继续例子-1
X2=gather(GX2) %将GPU内存中的数组GX2赋值给CPU中的X2
3)TF=existOnGPU(DATA)
用于判断DATA是否存在于GPU内存中。如果不存在则返回false。

3.计算效率统计
t=gputimeit(F,N) %返回执行F操作N次所需的时间,当N=1时可以缺省

4.实际例子,用GPU来进行FFT滤波
那么现在比如说我想对一个很长的数列进行FFT滤波,待处理的数列received_sig有1270000个数,而滤波器本身序列matched_sig也有2540个数。如果简单的使用filter(matched_sig,1,filtered_sig)指令,执行一次耗时17秒。如果多执行几次,所耗费的时间是无法承受的。而如果先将received_sig丢进GPU里面,让GPU来进行FFT运算,就能大大节省时间。

下面是相关的代码

G_received_sig=gpuArray(received_sig) ; 
G_get_sig=filter(matched_sig,1,G_received_sig) ;
get_sig=gather(G_get_sig) ;

其中,gpuArray将变量从CPU拷进GPU里面,进行完FFT运算以后,通过gather从GPU内拷出来。实际证明执行一次这样的指令平均耗时3.3秒,大大减少了所需要的时间。

还有一点要说明的是,尽量不要在需要gpu运算的部分有判断,循环等语句,这样会让gpu运算的效率急剧下降,因为gpu跟cpu之间的频繁交互也是很耗费时间的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值