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

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

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

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

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

一、gpuArray与gather命令实现GPU Computing

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

A = randn(1e8,1,single);
A_gpu = gpuArray(A);

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

A_gpu = randn(1e8,1,single,gpuArray);

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

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

A = gather(A_gpu);

下面对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进行计算
A = randn(1e8,1,single);
f = @() filter(num,1,A);
timeit(f)
% 用时0.5472秒

%% 用GPU进行计算
A_gpu = randn(1e8,1,single,gpuArray);
num_gpu = gpuArray(num);
f_gpu = @() filter(num_gpu,1,A_gpu);
gputimeit(f_gpu)
% 用时0.2185秒

从运行结果来看,用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图标
推荐阅读:

相关文章