如何在MATLAB上使用GUP加速跑代码
近几年来AMD的CPU性价比很高,但还是推荐使用Intel的CPU。因为Intel在科学计算的积淀很深,MATLAB使用的是Intel MKL(Math Kernel Library)数学核心计算库,而MKL从来没有真正在AMD CPU上测试过,并且计算速度会显著降低。所以,目前仅推荐使用Intel CPU运行MATLAB。而要加快MATLAB代码的运行速度,除了对代码进行优化、向量化编程等手段外,也可以使用GPU来加速计算。
CPU和GPU的主要区别
首先我们来看CPU和GPU的主要区别:CPU是电脑的中央处理器,GPU是电脑的图形处理器。
CPU是一块超大规模的集成电路,其中包含ALU算术逻辑运算单元、Cache高速缓冲存储器以及Bus总线。是一台计算机的控制和运算核心,它的主要功能便是解释计算机发出的指令以及处理电脑软件中的大数据。
GPU是图像处理器的缩写,它是一种专门为PC或者嵌入式设备进行图像运算工作的微处理器。GPU的工作与上面说过的CPU类似,但又不完全像是,它是专为执行复杂的数学和几何计算而生的,而这游戏对这方面的要求很高,因此不少游戏玩家也对GPU有着很深的感情。
所以,CPU和GPU是两个完全不一样的东西,他们只是名字听起来差不多。CPU和GPU因为最初用来处理的任务就不同,所以设计上有不小的区别,而某些任务和GPU最初用来解决的问题比较相似,所以用GPU来算了,GPU的运算速度取决于雇了多少小学生,CPU的运算速度取决于请了多么厉害的教授,教授处理复杂任务的能力是碾压小学生的,但是对于没那么复杂的任务,还是顶不住人多。当然现在的GPU也能做一些稍微复杂的工作了,相当于升级成初中生高中生的水平,但还需要CPU来把数据喂到嘴边才能开始干活,究竟还是靠CPU来管的。
查看CUDA版本并下载安装
我们首先得知道一个基础知识,CUDA:是显卡厂商NVIDIA推出的运算平台。 CUDA是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。也就是用GPU跑MATLAB代码也必须要用到CUDA包,每一个显卡只能安装对应版本的CUDA包。
怎么在电脑上查看CUDA版本,我的电脑是win11,查看步骤如下:桌面上右击——>显示更多选项 ——>NVIDIA控制面板——>左下角系统信息——>组件——>产品名称
可以看到我的电脑对应的版本是11.6,此时就需要在你电脑安装对应版本的cuda版本,可以查看一下链接安装cuda:
https://developer.nvidia.com/cuda-toolkit-archive
这里我选择的是11.6进行安装。至于选择哪个版本,应该没多大差别,一般就是看这个版本是否要求GPU的计算能力是多少以上。
读者可以按照自己的电脑,选择Linux还是Windows安装即可。安装完成之后,便是配置环境变量。根据以下步骤:系统——>系统信息——>高级系统设置——> 环境变量——>新建。环境变量配置如下图所示。
怎么检查CUDA是否安装成功
根据如下步骤查看:win+R——>输入cmd——>在命令行中输入 nvcc -V 可以查看版本信息
如何查看cuda的安装位置:win+R——>输入cmd——>在命令行中输入 set cuda 可以查看安装位置信息
确认MATLAB与cuda对应版本
安装好之后需要确认MATLAB版本与cuda版本对应才行,比如我的cuda11.6,但是我的没有对应的版本,所以我选择了MATLAB2018b,不影响计算效果。这是截止到MATLAB2020b的版本:
matlab官网查询链接:
https://ww2.mathworks.cn/help/parallel-computing/gpu-support-by-release.html
在MATLAB查看GPU版本
到此你已经安装好了cuda了,MATLAB版本也对,就可以打开MATLAB查看GPU了,若是你没有安装cuda,会提示错误的。在命令行输入
gpuDevice
正常情况会出现:
可以看到我的显卡是RTX 3060,cuda的版本是11.6。
测试gpu在MATLAB上跑代码
使用gpu跑代码首先需要了解几个函数
gpuArray | 存储在 GPU 上的数组 |
---|---|
gather | 将分布式数组或 gpuArray 传输到本地工作空间 |
gpuDevice | 查询或选择 GPU 设备 |
arrayfun | 将函数应用于 GPU 上数组的每个元素 |
速度测试:输入如下代码在cpu运行并显示时间
tic
G=randn(1e4);
toc
输入如下代码在gpu运行并显示时间
tic
G=randn(1e4,'gpuArray');
toc
运行结果如下:
可以看出在GPU上运算速度直接提高了94.55%。
Matlab 有时候在使用GPU加速为什么速度慢
比如运行如下代码:
N=rand(2000,2000);
tic
[a1,b1]=eig(N);
t1=toc
tic
N=gpuArray(N);
[a2,b2]=eig(N);
a2=gather(a2);
t2=toc
运行结果如下:
主要原因是GPU适用于可以并行化运算的情况,比如求矩阵每个元素的导数,这个就可以并行化,使用GPU就很快,但是eig看起来并不能并行化。