一、说明
前一阵子我在简书上发布了有关matlab
的并行计算方法之后(Matlab并行计算方法(下)),大家对这个方式有不少疑问,实际在运行过程中还是问题不断,那么在这里我会把一些运行时必要步骤补上,供大家参考。
在之前的那个操作中,基本的matlab
主程序编写方式已经没问题了,如果是自己的台式机直接点击F5
运行就好了,这里主要是探讨在服务器上运行的一些问题。
二、实际操作
2.1、作业脚本
首先还是要申明一下,在服务器上运行matlab
程序时,必须要使用作业脚本来指定计算节点与核心数量,如果不指定,那么程序的运行就会在login node
上,这样,虽然也可以并行计算,但是一来你所使用的核心数量有限,二来在login node
上保存着用户的数据,运行程序很容易出现一些问题,对服务器不好。
作业脚本文件其实不难写,我这里提供一个范例(注意我这儿的服务器上采用的是PBS
作业调度系统,其他的调度系统,比如LSF
调度系统等等也是类似的,可自行上网搜索):
#!/bin/sh -x
#PBS -q batch
#PBS -l nodes=c1:ppn=10
#PBS -N CodeName
#PBS -l walltime=100:00:00
#PBS -o print_file
#PBS -e error_file
#PBS -M xxxx@xx.com
cd $PBS_O_WORKDIR
date
hostname
matlab -nosplash -nodesktop -r "parrlleComputing;exit"
date
这里第一行是解释执行这个shell
文件,是必须使用的,后面紧跟的那些#PBS
都是在指定一些关键的参数,具体来说:
-q batch
指服务器的队列类型nodes = c1:ppn = 10
就是在计算节点c1
上使用10个核心,这几个参数可以自己调整,但是记得和你的主程序中的cpu_code
保持一致,详情请参考:Matlab并行计算方法(下)CodeName
是你的程序提交上去之后,你每次查询时出现的名称,这个可以自己任意定walltime
是你指定的程序的最大运行时间,填的大一些就好了print_file、error_file
是你每次提交任务之后,任务的运行情况输出,如果有错误,直接vim
查看这两个文件就可以查找错误最后一行是你的邮箱地址,意思就是让程序执行完之后把消息发送到你的邮箱里,这个可填可不填
接下来就是最重要的程序执行语句:
第13行中,请大家注意,服务器的
matlab
命令未必已经添加到环境变量中,我这里已经添加过了,若是未添加,可以使用命令which matlab
查询绝对路径,然后把上述的matlab
命令补全路径即可。这一行中,只需要改动最后的
parrlleComputing
为你自己的matlab
主程序的名称即可,记住:要引号,不要后缀.m
!
总的来说,基本上,只要复制这段代码,然后修改第3、4、8、13行就可以了。
2.2、查看服务器上的空闲核心
你要尽快出结果,就最好是要用别人没有占用的核心,也就是空闲的核心,这里也提供一个简单范例
首先用远程工具登录自己的服务器账号,见:Windows和Ubuntu之间建立远程连接的客户端简介,登录之后,输入命令:pbsnodes
查看核心的情况,
如图可见,这里计算节点c1、c2、c3
都是state = job-exclusive
的状态,也就是有人在用,又注意到c4
是free
的状态,那么就可以直接使用计算节点c4
来计算,不过要小心哦,c4
虽然显示state = free
,但是如果你仔细观察,会发现其实上面有些核心以及有人在用了,换句话说,你只能用这个计算节点上剩下的核心,做一个简单的数学运算:总核心数np=24
减去有人在用的核心数jobs = 17/6779....
,也就是有6个被占用了,那么就是24-6=18
个还空闲可用,那你就可以直接使用这些节点啦!只需要在脚本中第13改成nodes=c4:ppn=18
即可,注意不需要指定具体的核心编号,这个是自动分配的,首先使用的是空闲的核心。
另外,如果觉得出现的内容太多眼花缭乱,也可以先使用命令pbsnodes -l all
查看计算节点的整体状态,然后再去细看空闲的计算节点。
2.3、提交作业脚本
修改完之后,把文件保存为.sh
或者.pbs
格式文件,实测都是可以的,比如可以保存为:matlab.sh
,然后将这个脚本文件和你的matlab
文件以及数据等等所有需要的的东西全部上传到服务器的一个文件夹底下,譬如maltab parrllel computing
。之后,在远程命令行界面输入命令qsub matlab.sh
就能提交文件,系统会自动给你分配一个任务编号,到这里任务就完成了,可以开始干其他事情啦!
担心自己的任务是否提交,可以使用命令qstat -a
来查询任务的运行状态.
提交程序之后,发现问题,想要取消自己已经在运行的程序,可以使用命令:qdel + 你的任务编号
来取消提交的任务。
运行结束之后,从文件夹底下提取你需要的数据即可!
以上就是对之前的一些问题解答,若还有问题,请大家积极留言,我会尽力回答。