请输入搜索信息

HPC技术文章

如有疏漏或错误之处,请联系lytyuan@126.com,以便修改及完善,多谢支持!
感谢李木易、沈雁两位老师!

一、关于分式计算的简要说明
main函数是你的计算程序,i每取一个不同值时,main独立运行一次,得到你想要的结果。
function main(i)
%your code here
fname=strcat('myoutput-','i=',num2str(i),'.txt');
fid=fopen(fname,'wt');
fprintf(fid,'your output');
fclose(fid);
end
如果你想执行函数main 100次,你可以使用以下语句
for i=1:100
main(i);
end
上述100次运算将顺序执行,如果main(i)运算一次要50分钟,那么100次要5000分钟。
为了节省时间,你可能手动启动多个MATLAB进程,甚至是登录到其他节点,再多启动几个MATLAB进程,然后把这100次计算任务手动分配给这些MATLAB进程。
有更容易、更节省时间的方法?
有!你可以使用创建为分布式作业(Distributed Job),并通过Windows HPC Server Scheduler自动调度到其他计算节点运行。
如果HPC为你自动启动了100MATLAB进程,同时进行计算,那么总计算时间将是50分钟。当然实际运行时间可能更长些,有两个原因:(1)main(i)可能在一些负载较重的节点运行,每次运行时间可能会超过50分钟。(2)100个R进程可能没有一次性同时开启,需要排队,因为其他用户也可能占用了HPC资源或HPC对用户可使用资源进行了限制,HPC Pack会根据实际情况进行调度。
二、分布程序代码与计算程序示例
(一)分布程序代码示例
行号
程序代码
1
clear;
2
clc;
3
job=hpcdjob;
4
job.Parent.JobTemplate='Core';
5
set(job,'AdditionalPaths', {'Z:\User\Documents\MATLAB\your programs and data folder\'});
6
datadir=job.AdditionalPaths(1,1);
7
for i=1:100
8
createTask(job,@main,0,{i,datadir});
9
end
10
submit(job);
11
wait(job);
12
errmsgs = get(job.Tasks, {'ErrorMessage'});
13
destroy(job);
其中,程序main是计算主程序,需要运算100次。
以上代码将创建100个Task,由多Worker(Matlab进程)同时进行计算。Worker的数量取决于第4 行中模板所规定的可使用资源,假定允许同时打开50个Worker,共同执行这100次计算,那么每个Worker大概执行2次计算。
datadir传递给计算程序main函数,指定计算结果输出路径。必须是网络路径,必须以“\”结束!具体请参见“分布程序代码说明”。
上述代码首次运行时,可能需要输入HPC用户密码!
(二)计算程序main示例
行号
程序代码
1
function main(i,datadir)
2
%your code here
3
fname=strcat(datadir,'myoutput-','i=',num2str(i),'.txt');   %指定输出文件名,含路径
4
fname=char(fname);     %务必执行
5
fid=fopen(fname,'wt');
6
fprintf(fid,’your output!’);
7
fclose(fid);
8
end
函数main是计算程序,含两个参数idatadir
参数i,取一个新值时,main进行了一次计算,得到你想要的结果。main独立运行,即main的计算不受前一次i取值的影响。
请务必将计算结果输出到一个文件中,而不是直接显示在MATLAB窗口。结果输出路径由参数datadir指定。
 
*注意:请务必先测试分布程序是否能得到正确的结果,可以先让main仅执行几次,如5次。
如果main程序执行有错误,具体错误信息通过errmsgs变量返回,可据此调试程序。
三、代码详细说明
(一)分布程序代码说明
3行:
连接到Windows HPC Server Scheduler,并设置好相关参数(如作业模板),最后返回一个simplejob对象jobHPC系统中,默认作业模板按核(core)分配置资源。
4行: 
指定作业模板(例中模板名为Core),该模板控制作业可使用的资源。请联系管理员确认可使用的模板名称!
5行:
指定计算程序与数据所在网络路径。
作业jobAdditionalPaths默认指向Z:\User\Documents\MATLAB\,且它是一个1*1Cell Array。“Z:\”会被自动改写成“\\UFS\HPCUserFile$\< 用户名>\”。
程序与数据必须放到AdditionalPaths这个目录中,如果放到了Z盘的其他目录,则必须改写AdditionalPathsAdditionalPaths所指定的目录会自动加入每一个Worker搜索路径的最前面。
如何将其他目录加入到AdditionalPaths列表?
方法一:下面的语句将Z:\User\Documents\MATLAB中的Other目录添加到AdditionalPaths列表中
job. AdditionalPaths=[job. AdditionalPaths;'Z:\User\Documents\MATLAB\Other']
之后,job. AdditionalPaths就是2*1Cell Array了。
方法二:下面的语句将Z:\User\Documents\MATLAB及其子目录替代原有的AdditionalPaths列表
p=textscan(genpath('Z:\User\Documents\MATLAB'),'%s','delimiter',';');
job.AdditionalPaths= p{1,1};
6行:
变量datadir用于指定输出结果的网络路径。
将传递到每一个Worker中。如果不是采用datadir=job.AdditionalPaths{1,1}datadir赋值,而是直接赋值,那么datadir不能是以Z:\开头的路径,而必须是一个网络路径(并且你必须有完全访问权限)。
datadir=’Z:\User\Documents\MATLAB\’    错误
datadir=’\\UFS\HPCUserFile$\< 你的用户名>\User\Documents\MATLAB\’    正确
datadir=strcat(getenv('HOMESHARE'),'\User\Documents\MATLAB\')
虽然在你的登录节点,“\\UFS\HPCUserFile$\< 你的用户名>”被映射成成了“Z:”盘,但上面的第二个赋值语句才是正确的。
需要注意datadir必须以“\”结束!
7-9行:
为作业job建立100个任务,即main执行100次。
createTask(job, @main, 0, {i,datadir});
第一个参数是作业变量名
第二个参数是你想要计算的程序名称main(必须以函数的形式),前面要加上@
第三个参数指定任务(main函数)返回值数量。一般而言,请务必将结果写入到一个文件中,此时不需要函数的返回值,第三个参数设为0即可。
第四个参数是你所运行main函数的参数,是一个row cell array,具体请参见MATLAB帮助。
请注意:建议每次最多建立100个任务,以避免占用过多资源,影响其他用户!
如果建立任务的时间过长(有可能大大超过任务计算所需时间),请减少建立的任务数量!此建议来自于用户的实际使用经验!
10行:
提交作业,由Windows HPC Server Scheduler自动调度执行。
11行:
等待作业job改变状态。
不使用该语句,则可以继续其他操作,比如在command windows输入其他命令。此时,可以通过job.State或“四、查看作业运行状态”中的方法来判断作业job的状态。
如果不使用该语句,则以下语句(12-13行)请在作业完成(或失败)后执行!
12行:
返回错误信息。可以通过查看errmsgs得到程序返回的错误信息。
13行:
消除作业对象j,释放所占用的资源。
当在登录节点提交了计算任务后,这些提交的计算任务(一般而言,有几个任务,就打开了几个MATLAB进程)在完成后会自动关闭,并释放资源。
当提交的计算任务还在执行时,把登录节点的MATLAB关闭,并不影响计算任务的继续执行。
没有执行destroy(j)而直接关闭登录节点的MATLAB,除了MatlabJobDataWindows HPC Server SchedulerDataLocation属性,默认指向Z:\User\Documents\MATLAB\MatlabJobData)目录下残留了一些文件外,该进程所占用的其他资源均得到释放。
MatlabJobData目录下残留的文件体积一般不大,只要定期清除就可以了。并且MatlabJobData目录属用户私有目录,一般来讲,这个目录的体积不会影响到其他用户!
(二)计算程序main代码说明
3行:
指定输出文件名,含路径。注意main将进行100次计算,每次计算都会输出一个结果文件,因为是放在同一个网络路径的,所以保存结果的文件名不能一样。
4行:
fname转换成char类型,原先是cell类型。因为“fopen(fname,'wt');中的fname必须是字符类型的。
5-7行:
打开文件,并写入计算结果,写入完成后关闭文件。
四、查看作业运行状态
双击桌面上的“HPC Job Manager”图标,打开Job Manager,点击My jobs下的Active按钮,可以查看作业运行状态。
    
双击作业可以查看所分配的资源等信息!
附:MATLAB中Distributed Job和Parallel Job的区别
Distributed Job
Parallel Job
MATLAB sessions, called workers, perform the tasks but do not communicate with each other.
MATLAB sessions, called labs, can communicate with each other during the running of their tasks.
You define any number of tasks in a job.
You define only one task in a job. Duplicates of that task run on all labs running the parallel job.
Tasks need not run simultaneously. Tasks are distributed to workers as the workers become available, so a worker can perform several of the tasks in a job.
Tasks run simultaneously, so you can run the job only on as many labs as are available at run time. The start of the job might be delayed until the required number of labs is available.