Matlab
是被广泛使用的商业编程软件,对应的M
语言也是公认的简单易上手的好语言,其数组运算能力十分强大,天生就适合科学计算,不过它有一个天生的问题,就是慢
,运行相同代码的速度,通常都比C
、C++
等语言慢上许多,不过根据我自己的编程经验,Matlab
的运行速度并不比Python
慢,有时候甚至会反超(Linux
下Matlab
的运行速度要比Windows
下快上许多),这样一来,有时候我们需要进行一些反复的操作(比如参数扫描)的时候,用单核运算的速度就相对较慢了,优化代码确实可以提速;不过这里不谈代码如何优化,而是另一种加速方法:并行计算。
并行计算道理很简单,就是说:你有一个任务,现在要把这个任务反复做10遍,你一个人做,只能一遍一遍的来;但是,要是有10个人一起做,那就只需要做一遍的时间,这就是并行计算。
科研中经常遇到需要并行计算的程序,如何编写程序?下面介绍两种方法:
注意:以下的并行计算方法都需要安装工具包Parallel Computing Toolbox
,据我所知,这个工具包破解版的Matlab
都是有的;至于正版的Matlab
,如果以前没有安装,那么可以打开Matlab
,在“主页---附加功能---获取附加功能”中搜寻安装。
打开matlab
,如果在窗口左下角出现这个四个竖杠的图标,就说明安装成功:
1、parfor
并行
第一种方式是比较方便快捷的parfor
并行方式,代码框架如下:
%% 准备工作
% 指定你要开启的线程数量,开启进程池
core = 5
p = parpool(core)
% 自行设定程序最大运行时间
p.IdleTimeout = 100;
%% 实际并行计算
% 一个用来记录数据的数组
data = zeros(1,5)
% 并行循环
parfor i = 1:5
% 调用你自己编写的某个函数testFunction并返回了某个结果a
a = testFunction(i)
data(i) = a
end
% 关闭进程池
delete(p)
%% 自定义的函数:输入值为i;输出值为a
function a = testFunction(i)
***
***
a = your_answer;
end
简单来说,就是:
开启进程池,指定核心数、运行时间等参数
设定接受结果的矩阵
parfor
并行运算结束后关闭进程池
需要注意的是,在使用parfor
并行计算时,很容易就会提示错误编写,这是因为每个核(好像线程更加准确些)在运行时都应该是独立在运行自己的程序,也就是说你的并行运算程序不能相互有数据传递操作。要是你想传递数据,那我也不会,因为我从来都不这样编程。
parfor
并行运算非常的优雅且实用,适用范围是在你自己的台式机或者笔记本上,parpool()
开启之后的worker
数是默认的机器线程数量,如下图所示:
这里的几个性质可以自行改动,由于我的电脑比较老,所以只有4个线程。
这种并行计算的好处是简单易学、也不用去管核与核之间的消息分发和回收,因此本人强烈推荐!
另外,通过点击那个左下角的竖线图标也是打开进程池的,不过用程序控制还是能动性更大些。
还有问题的朋友,可以参考:matlab并行计算,这个写的比较详细,推荐大家看看。
2、集群并行计算
每次跑并行我都会想,4核?8核?这怎么够?!我有几百个参数要扫描!这怎么办?
那答案很简单啊,当然是上刚刚发布的第三代线程撕裂者3960X
套装啦!
24核48线程,TDP280W,zen2架构,超频上5G,秒飞Intel
全家!
如果觉得这么贵的东西并不适合我们,那么3950x
还是可以考虑的,毕竟也有16个核心在那里摆着......
开个玩笑,这种堆料堆钱没有啥意思,要谨记:
买前生产力,买后打游戏
你要打游戏,买3600
就可以了,6核12线程,这价位,还要什么自行车。
话说回来,在服务器上进行Matlab
并行计算要复杂一些,有关此内容,我会在下节再讲,等不及的朋友,直接去MathWorks
官网上查询parcluster
、createTask
、createJob
、submit
等等几个关键函数,相信看完之后,应该会有所收获。
谢谢各位的阅读!