Matlab并行计算方法(上)

       Matlab是被广泛使用的商业编程软件,对应的M语言也是公认的简单易上手的好语言,其数组运算能力十分强大,天生就适合科学计算,不过它有一个天生的问题,就是,运行相同代码的速度,通常都比CC++等语言慢上许多,不过根据我自己的编程经验,Matlab的运行速度并不比Python慢,有时候甚至会反超(LinuxMatlab的运行速度要比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官网上查询parclustercreateTaskcreateJobsubmit等等几个关键函数,相信看完之后,应该会有所收获。

       谢谢各位的阅读!

你可能感兴趣的:(Matlab并行计算方法(上))