Matlab并行计算方法(下)

       上次咱们谈到了Matlab的并行计算,用的是parfor的并行方式,详情查看:Matlab并行计算方法(上)

       parfor并行计算比较方便,但是也要注意几点:一是分配给每个核的任务不能有相互调用,否则会出问题;二是存放数据的数组需要预分配,在这里要注意,预分配的数组只能是向量的形式,二维的数组不能用来存放数据,至少我在使用时出现了这种情况,解决方法就是先开一个一维向量存放数据,然后再根据需要转成二维的数组。

       科研中并行计算不限于导师给的(破)台式机,一般这些台式机的CPU核心数不会很多,开不了太多线程来跑程序,这样子进行测试还可以,如果要进行大量的计算(比如参数扫描)的话,恐怕还是不太够,那么这时候就需要把任务提交到学校的服务器上进行计算。这时候并行计算用parfor就不太方便,事实上,在服务器上调用parfor只能在管理节点上进行计算,这样不太好,除非你就是管理员。

       那么废话不多说,我们来看一下如何在服务器上运行matlab

1、安装\color{red}{MATLAB}

       要想跑matlab程序,那你首先要在服务器上安装matlab,这里不讲安装的事情,可自行百度或者联系管理员安装,如果自行安装强烈建议安装破😆解😆版matlab,因为学校的服务器不一定能连接外网;并且破解版功能全面,安装较快。

2、编写\color{red}{MATLAB}程序

       这里我会详细的说明相应的流程,请各位看的仔细一点。

2.1、将程序封装成函数

       譬如我写了一段计算的代码,接下来我想要放到服务器上并行计算,那么第一步我就要封装自己写的代码,比如:

function c = myCode(a)
  xxx;
  xxx;
  xxx;
  xxx;
  c = xxxxx;
end

       这里的xxx就是你自己写的代码,c是你输入参数a从而想要得到的输出结果,封装函数的好处有两个:一是可以随时随地调用;二是分离代码,使得整个代码框架变得简洁易懂。这一步不难,学过python或者C的同学应该十分清楚。

2.2、编写并行计算框架

       函数封装之后,接下来是最重要的并行计算框架搭建:

       首先规定你要调用的计算机核数:

% 比如你要调用30个核心,这里cpu_core只是一个变量名而已,没有其他意思
cpu_core = 30;

       接下来采用函数parcluster创建一个集群:

c = parcluster();

       注意这里不像之前是创建进程池parpool哦!

       然后规定这个集群上的核心数,aka你之前创立的核心数变量:

c.NumWorkers = cpu_core;

       在这个集群之上创建job

job = createJob(c);

       到这里,革命已经成功了一半,剩下的是根据你自己的程序来改写,这里举个例子:

       比如我需要扫描参数a_scan,该参数范围:a\_scan=0:0.1:10,也就是说我要把参数a_scan扫描100次(😉😉),根据输入的不同a来得到不同的c,那么程序可以这么写:

for i = 1:length(a_scan)
  a = a_scan(i);
  parameter = {a};
  t = createTask(job,@myCode,1,parameter)
end

       OK,我知道各位想赶紧编写程序的同学已经迷糊了,这里解释一下:

       首先for循环是很清楚的,就是每次提取一个参数a然后把函数放在某个核上面跑(是哪个核不用管)。

       然后,parameter这个玩意,正如其名,就是你自己的函数myCode的参数。

最后,在job上创建一个taskcreateTask这个函数有这么几个参数:

  • 第一个参数是你创建的job,这个不用作改动

  • 第二个参数是调用刚才你封装的函数myCode,要注意有一个@.

  • 第三个参数是:你调用的函数需要返回的参数个数,比如说,这里你的函数myCode由于只有一个参数c需要返回,所以你就写上1就可以了,记住是返回的参数个数!

  • 最后一个参数就是函数的输入参数,也就是刚才定义的parameter.

       有人可能觉得我这里这个parameter非常多余,相信我,如果你的参数有10个以上,这绝对不是多余的,要时刻记住代码的可读性简洁性是非常重要的,方便自己也方便他人阅读。

       编写完这个,最后再加上几个函数:

 % 提交job
submit(job);
 
 % 等待服务器算完结果
wait(job);
 
 % 提取结果
output = fetchOutputs(job);

最后千万别忘了保存计算结果!

% save函数保存结果,注意都需要引号
save("myData.mat","output")

       那么并行计算框架就搭好了!接下来通过pbs作业脚本提交到服务器上就可以运行了!


3、总结

       读者诸君不难发现,这里的并行计算实际上可以分为三部分:

       1. 创建集群,并在集群上创建job

       2. 根据自己的情况根据参数依次分配任务

       3. 提交任务


       第一部分不需要作太多改动,只要改动你需要的核心数cpu_core

       第二部分则需要作出改动,但是思路已经全部告诉各位了

       第三部分不需要改动(当然你可以改动保存的文件名称)


4、附录

       最后附上整个框架:

 % 第一部分
cpu_core = 30;
 
c = parcluster();
 
c.NumWorkers = cpu_core;
 
job = createJob(c);
 
 % 第二部分
a_scan = 0:0.01:100;

for i = 1:length(a_scan)
  a = a_scan(i);
  parameter = {a};
  t = createTask(job,@myCode,1,parameter);
end
 
 % 第三部分
submit(job);

wait(job);

output = fetchOutputs(job);
save("myData.mat","output")
 
 %% =======================封装的函数============================
function c = myCode(a)
  xxx;
  xxx;
  xxx;
  xxx;
  c = xxxxx;
end

       上面这个是最为简单的并行计算的框架,请各位根据自身的情况酌情修改,有问题可以在下面留言讨论。
       另外:简书上的markdown显示出来的结果比较奇怪,比如英文字母和中文大小不一样;代码的颜色变化显得支离破碎,我在typora上编写时不是这样的,请读者谅解。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,165评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,720评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,849评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,245评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,596评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,747评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,977评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,708评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,448评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,657评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,141评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,493评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,153评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,890评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,799评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,685评论 2 272

推荐阅读更多精彩内容