我使用以下wrapper代码(缩短)将批处理作业(存储在my_parjob.m文件中)提交到 matlab 集群。
files = { .... list of attached files ... };
cluster = parcluster(); %returns my cluster object
job = batch(cluster,'my_parjob','CaptureDiary',true,'AutoAttachFiles',true,'AttachedFiles',files,'Matlabpool',cluster.NumWorkers-1,'CurrentFolder','/path/to/my/job');
wait(job);
Run Code Online (Sandbox Code Playgroud)
该代码工作并使用该batch函数来创建具有最大可用工作人员的作业并运行该作业。(my_parjob.m包含我的程序parfor)。
batch有人可以向我解释命令和createJob+ createTask+之间的区别和/或相似之处吗submit?the batchonly 是以下内容的一种简写吗?
cluster = parcluster();
job = createJob(cluster);
t = createTask(j, ????); % ???
submit(job);
wait(job);
Run Code Online (Sandbox Code Playgroud)
是的,基本上是/工作流程batch的便捷简写。它不允许完全控制这些 API,但使用起来要简单得多。createJobcreateTask
编辑:以您的示例代码为例:
cluster = parcluster();
job = batch(cluster,... %# 1
'my_parjob',... %# 2
'CaptureDiary',true,... %# 3
'AutoAttachFiles',true,... %# 4
'AttachedFiles',files,... %# 5
'Matlabpool',cluster.NumWorkers-1,...%# 6
'CurrentFolder','/path/to/my/job'); %# 7
Run Code Online (Sandbox Code Playgroud)
每行主要对应于createJob或 的一个参数createTask。但有一些事情不能完美翻译 - 在您的情况下,您请求运行一个名为 的MATLAB脚本'my_parjob.m'。不幸的是,createJob/createTask仅适用于函数,因此您需要一个名为 的函数来my_parfcn.m执行相同的操作。此外,还有两种不同的变体createJob - 另一种称为createCommunicatingJob- 对应于指定参数的batch作业'Matlabpool'。所以,把它们放在一起,你最终会得到这个
cluster = parcluster();
job = createCommunicatingJob(cluster, ... %# 1
'AutoAttachFiles', true, ... %# 4
'AttachedFiles', files, ... %# 5
'NumWorkers', cluster.NumWorkers); %# 6
task = createTask(job, ...
@my_parfcn, 1, {}, ... %# 2 Task function, nargsout, input arguments
'CaptureDiary', true); . %# 3
submit(job);
Run Code Online (Sandbox Code Playgroud)
没有与 等效的东西'CurrentFolder',因此您必须在内部处理它my_parfcn。