要加快MATLAB代码的运行速度,除了对代码进行优化、向量化编程等手段外,也可以使用GPU来加速计算。
首先,你需要一个支持的GPU,目前仅支持Nvidia的GPU,不同版本的MATLAB对不同架构的GPU支持情况如下,带星号的需要重新编译CUDA。
可以用gpuDevice命令查看是否有支持的gpu,亮机卡GT 1030 也能支持。
GPU运算可以用两种方式实现,
- 用gpuArray和gather命令;
- 用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