MATLAB
MATLAB是美国MathWorks公司出品的商业数学软件,用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人,控制系统等领域
MATLAB单核心提交
默认情况下matlab程序只会使用到单核心,假设以下是需要运行的代码,文件名为abc.m
。
% for i = 1:2048
A = zeros(100,1);
parfor i = 1:100
A(i) = sin(i*2*pi/20);
end
save myResult.mat A
那么提交abc.m程序的作业脚本为:
#!/bin/bash
#SBATCH -o job.%j.%N.out
#SBATCH --partition=C032M0128G # 根据集群的实际情况需要修改分区名
#SBATCH --qos=low # 根据集群的实际情况需要修改QOS
#SBATCH -J matlabJOB
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
module load matlab/R2019a
matlab -nodesktop -nosplash -nodisplay -r abc
MATLAB单节点多核心运行
想要多核心运行MATLAB的话,最简单的方式,就是将for
循环改成parfor
(循环带递归属性的话parfor
会不起作用),如上例的abc.m使用parfor
修改后代码如下:
parpool('local',32)
% parfor i = 1:2048
A = zeros(100,1);
parfor i = 1:100
A(i) = sin(i*2*pi/20);
end
save myResult.mat A
提交abc.m程序的脚本为:
#!/bin/bash
#SBATCH -o job.%j.%N.out
#SBATCH --partition=C032M0128G # 根据集群的实际情况需要修改分区名
#SBATCH --qos=low # 根据集群的实际情况需要修改QOS
#SBATCH -J matlabJOB
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=32
module load matlab/R2019a
matlab -nodesktop -nosplash -nodisplay -r abc
需要注意的是parpool的并行的数量不会超过申请的核心的数量。
MATLAB跨节点多核心运行
目前 matlab 2019a 版本的 matlab 上配置了跨节点运行的方式,可支持跨节点多核心运行matlab 程序。
以下为运行 matlab 代码 abc_mps.m 为例。
下为 abc_mps.m 代码,与前一个例子的不同是,去掉了parpool('local',32)
:
% parfor i = 1:2048
A = zeros(100,1);
parfor i = 1:100
A(i) = sin(i*2*pi/20);
end
save myResult.mat A
需要跨节点运行上面的 matlab 程序 abc_mps.m,还需要用到两个文件,以未名一号为例,这两个文件分别为 SubmitTemplates_new.m、Weiming1_HPC_MATLAB.settings。 Weiming1_HPC_MATLAB.settings 为运行跨节点 matlab 需要用到的 matlab 配置文件,是管理员预先配置好的。 SubmitTemplates_new.m 其实也是一个 matlab 程序,相当于 matlab 通过运行该程序来向作业调度系统申请资源,并“真正”执行 abc_mps.m,下为 SubmitTemplates_new.m 内容:
%% The path of your job
JobPath = '/gpfs/share/home/1606190053/MATLAB_MPS';
cd(JobPath);
%% Import Cluster Profile
allName = parallel.clusterProfiles();
if ~ismember('Weiming1_HPC_MATLAB',allName)
parallel.importProfile([JobPath,'/Weiming1_HPC _MATLAB']);
end
%% Culster Settings
c = parcluster(' Weiming1_HPC_MATLAB ');
c.ClusterMatlabRoot = '/gpfs/share/soft/MATLAB/R2019a';
c.AdditionalProperties.JobName = 'matlabJOB';
c.AdditionalProperties.JotPriority = 'low';
c.AdditionalProperties.Mail = '***@163.com';
c.AdditionalProperties.Partition = 'C032M0128G';
c.AdditionalProperties.NodeNum = '2';
c.AdditionalProperties.WorkerPerNode = '32';
c.AdditionalProperties.WallTime = '1:00:00';
j = batch(c,'abc_mps','Pool',63) % Run a job for 63 works which is (64-1)
exit
注意
1)、jobPath 为工作路径,需要更改为自己的工作路径; 2)、%% Import Cluster Profile 部分的内容作用为检测 matlab 中是否有 Weiming1_HPC_MATLAB 的配置,没有的话则导入工作路径下的 Weiming1_HPC_MATLAB.settings 配置。 3)、%% Culster Settings 定义了 matlab 的安装路径,和 slurm 提交作业的相关信息,包括作业名、作业优先级、邮箱等。 4)j = batch(c,'abc_mps','Pool',63),相当于把 abc_mps.m 扔到了申请到的资源上运行,这里申请了 2*32=64 个核心,但是只能用 63 个核心能用来跑程序,是因为在跨节点运行时,matlab 需要用一个核心来进行调度管理。
以下为提交作业的脚本:
#!/bin/bash
#SBATCH -o job.%j.%N.out
#SBATCH --partition=C032M0128G
#SBATCH --qos=low
#SBATCH -J matlabJOB
#SBATCH --get-user-env
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --mail-type=end
#SBATCH --time=1:00:00
module load matlab/R2019a
matlab -nodesktop -nosplash -nodisplay -r SubmitTemplates_new -log LogFile.txt
注意
1)这个提交作业的脚本只申请了一个核心,是因为执行 SubmitTemplates_new.m 的目的不是计算,而是通过 matlab 来向作业调度系统申请资源来对 abc_mps.m 进行计算。 2)该 case 路径在未名一号和生科一号的/gpfs/share/example/app/MATLAB_MPS。