在GPU上运行MATLAB程序
要加快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 = 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秒