|||
因为要做大量仿真运算,辗转找到了可以使用的集群。好好研究了如何使用matlab MDCS在集群上做并行运算。现在把过程记录下来,以备将来再用。
我使用的是南安普顿大学的iridis4集群。 此集群使用PBS任务管理系统。
首先需要连接至南安普顿大学的vpn:vpn.soton.ac.uk;
其次使用ssh登录 username@iridis4_c.soton.ac.uk;
1. 找到合适的并行运算模式:这一步可以通过分析自己的代码以及阅读matlab中MDCS的文档找到适用于自己代码的并行运算模式。我的情况是做蒙特卡洛仿真,即数据密集型计算,且循环的每一次运行相互之间是独立的,即前后之间无关。在研究了batch等命令之后,发现batch是我需要的命令。batch可以根据clusterprofile申请资源,clusterprofile中规定了所需要的节点数,每个节点中包含的cpu个数,内存大小,以及预计运行时间。
2. clusterprofile可以在服务器端的matlab的菜单->Parallel->Manage Cluster Profile中定义。先通过import在/local/software/matlab/2014b/extern/examples/MDCS/ 下面的Iridis4_1node,再基于此profile修改并保存为自己需要的profile。注意不可以直接用local(default)那个profile,因为直接用local相当于在服务器的登录节点并行运算. 下面假定我自己定义的profile为Iridis4_1node_8h
3.使用batch申请一个节点,并使用其16个cpu进行运算:
在m文件中输入:
cluster1 = parcluster('Iridis4_1node_8h');
job = batch(cluster1,@ARsplitRunParforTriFreq,1,{ep,num,N},'Pool',15);
其中ARsplitRunParforTriFreq.m为需要并行运算的函数,里面包含parfor语句。
1是ARsplitRunParforTriFreq函数的输出参数个数,{ep,num,N}为ARsplitRunParforTriFreq函数的输入参数。
‘Pool’,15表示除了一个 master matlab之外,还有15个slave matlab要运行,总共是16个cpu。
ARsplitRunParforTriFreq.m文件内容为:
function outsolution=ARsplitRunParforTriFreq(ep,num,N)
parfor i=1:N
blah blah blah
end
return
4. 再通过for循环批量提交batch作业,申请多个节点
5. parfor 命令进行并行循环,请参见matlab帮助。
注意事项:
job = batch(cluster1,@ARsplitRunParforTriFreq,1,{ep,num,N},'Pool',15);
此语句中的1表示的是函数ARsplitRunParforTriFreq的输出参数个数,不是输入参数个数。如果搞错了的话,matlab虽然会申请到16个cpu运算,但是进不去ARsplitRunParforTriFreq函数。表现出来的现象是:16个matlab进程会同时闪退,而且不输出任何东西。妈的,调了3天才找到这个错误。。。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-26 08:27
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社