要加快MATLAB代码的运行速度,除了对代码进行优化、向量化编程等手段外,也可以使用GPU来加速计算。

首先,你需要一个支持的GPU,目前仅支持Nvidia的GPU,不同版本的MATLAB对不同架构的GPU支持情况如下,带星号的需要重新编译CUDA。

b0fef2a829801fc30d0e69ffc2e05665.png

可以用gpuDevice命令查看是否有支持的gpu,亮机卡GT 1030 也能支持。

c8dd0d3938e1ab39542371ddebcf1692.png

GPU运算可以用两种方式实现,

  1. 用gpuArray和gather命令;
  2. 用GPU CUDA和MEX编程深度加速。

一、gpuArray与gather命令实现GPU Computing

gpuArray能够将内存中已有的数组传递到GPU的显存中,如下

A 

A_gpu现在是一个MATLAB gpuArray对象,代表着储存在GPU内存的一个1e8*1的single数组。上述代码等价于:

A_gpu 

除了randn之外,randi/rand/zeros/ones/inf/nan/eye/false/true等内置的能够生成矩阵的函数均可以通过添加参数‘gpuArray’,直接在显存中生成GPU Array.

gether命令能够将GPU显存中的数组提取到内存中。

A 

下面对MATLAB代码在CPU和GPU中的执行效率做一个简单的对比,测试环境CPU型号为Intel i7 8700 ,6核12线程,超频至4.3GHz。相比之下,GPU为NVIDIA GT 1030,垃圾亮机卡,性能也就集显水平。

用filterDesign设计一个101阶FIR滤波器,导出其滤波器系数为num,num为1个101*1的double数组。注意,不要导出为filter object,filter函数用于gpuArray时,不支持filter object,只能用滤波器系数。

%% 用CPU进行计算

从运行结果来看,用101阶FIR滤波器对长度为1亿的数组进行滤波,CPU运行时间约0.5秒,而GPU仅需0.2秒。可以看出,即使是渣显卡1030,计算能力也是秒了超频后的8700。

注意:

  • gpuArray和gather命令能够将数据在内存和显存中传递,这一过程本身也是有开销的,如果计算量较小,数据传递的开销可能比计算的时间还大,导致GPU计算不如直接用CPU.
  • GPU的显存一般比内存要小,对于大量的数据,可能计算效率比较低,甚至无法计算.

二、GPU CUDA and MEX programming

%% TODO
易夕:MATLAB Tricks 专栏目录​zhuanlan.zhihu.com
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐