Matlab中createJob/createTask的差异及函数适配性咨询
我需要并行运行多个仅1-2个参数存在差异的完全独立脚本,因此将核心逻辑编写为函数,通过createJob和createTask实现参数传递,代码如下:
% Run_DMRG_HubbardKondo UList = [1, 2, 4, 8]; J_UList = [-1, 0:0.2:2]; c = parcluster; c.NumThreads = 3; j = createJob(c); for iU = 1:numel(UList) for iJ_U = 1:numel(J_UList) t = createTask(j, @DMRG_HubbardKondo, 0, {{UList(iU), J_UList(iJ_U)}}); end end submit(j); wait(j,'finished') delete(j); clear j t exit function DMRG_HubbardKondo(U_Job, J_U_Job) ...% (skipped) end
我想了解:若改为多次调用createJob且每个Job仅创建一个Task,在任务独立性上与单Job多Task的方式是否存在差异?我的函数内部包含setenv环境变量设置逻辑(代码如下):
function DMRG_HubbardKondo(U_Job, J_U_Job) ...% (skipped) DirTmp = '/tmp/swan'; setenv('LMA', DirTmp) Para.DateStr = datestr(datetime('now'),30); % RCDir named by parameter and datetime Para.RCDir = [DirTmp,'/RCStore',Para.DateStr,sprintf('U%.4gJ%.4g', [U_Job,J_U_Job])]; k = [strfind(Para.Symm,'SU2'), strfind(Para.Symm,'-v')]; if ~isempty(k) RC = Para.RCDir if exist(RC, 'dir')==0 mkdir(RC); % creat if not exist fprintf([RC,' made.\n']) end setenv('RC_STORE', RC); setenv('CG_VERBOSE', '0'); end ... % (skipped) end
该函数会调用基于wigner-eckart theorem的mex-compiled functions,这类函数会通过getenv获取RCDir路径来生成和检索cg系数数据。我已知sbatch脚本可实现需求(代码如下):
function GenSubmitsh(partition,nodeNo,TLim,NCore,mem,logName,JobName,ParaName,ScriptName) if isnan(nodeNo) nodeStr = '##SBATCH --nodelist=auto \n'; else nodeStr = sprintf('#SBATCH --nodelist=node%g \n',nodeNo); end Submitsh = sprintf([ '#!/bin/bash -l \n',... '#SBATCH --partition=%s \n',... nodeStr,... '#SBATCH --exclude=node1051 \n',... '#SBATCH --time=%s \n',... '#SBATCH --nodes=1 \n',... '#SBATCH --ntasks=1 \n',... '#SBATCH --cpus-per-task=%g \n',... '#SBATCH --mem=%s \n',... '#SBATCH --output=%s \n',... '#SBATCH --job-name=%s \n',... '\n',... '##Do not remove or change this line in GU_CLUSTER \n',... '##export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK \n',... '\n',... 'echo \"Job Started At\" \n',... 'date \n',... '\n',... 'matlab -nodesktop -nojvm -nodisplay -r \"ParaName=''%s'',%s\" \n',... '\n',... 'echo \"Job finished at\" \n',... 'date \n'],... partition,TLim,NCore,mem,logName,JobName,ParaName,ScriptName); fileID = fopen('Submit.sh','w'); fprintf(fileID,'%s',Submitsh); fclose(fileID); end
提问
- 单Job下创建多个Task与创建多个各含单个Task的Job之间的差异是什么?
createJob/createTask能否适配我的函数,达到与sbatch等价的完全独立运行效果?
问题1:单Job多Task vs 多Job单Task的差异
1. 资源调度与隔离
- 单Job多Task:所有Task归属同一集群Job,调度器会一次性分配整组资源(通常是同一节点或相邻节点),Task共享该Job的资源池。每个Task是独立的MATLAB worker进程,进程内的
setenv修改不会跨Task共享,但Job级别的环境变量会被所有Task继承。 - 多Job单Task:每个Job是独立的集群调度单元,调度器为每个Job单独分配资源,Job之间完全隔离,资源、进程环境都不会共享,每个Task的环境变量修改仅作用于自身进程。
2. 生命周期管理
- 单Job多Task:所有Task同步提交、批量启动(资源允许时),整个Job的状态统一(需所有Task完成才标记为完成),单个Task失败会影响Job整体状态,重试需针对整个Job或单个Task单独处理。
- 多Job单Task:每个Job独立提交、调度、执行,单个Job失败不影响其他Job,可单独重试失败任务,生命周期管理更灵活。
3. 任务独立性核心区别
两种方式在进程级独立性上一致——每个Task都是独立的MATLAB worker进程,环境变量修改不会跨Task污染。但集群调度级独立性不同:多Job单Task的隔离度更高,每个Job拥有独立的调度上下文和资源配额;单Job多Task共享同一Job的资源池,调度优先级统一。
问题2:是否能达到与sbatch等价的完全独立效果
可以,只要做好以下配置和细节:
1. 保证进程级完全隔离
MATLAB Parallel Server的createJob默认每个Task运行在独立的worker进程中,函数内部通过setenv设置的环境变量仅作用于当前Task进程,Mex函数调用getenv获取的路径也是当前进程的环境变量值,不会和其他Task冲突——这和sbatch每个Job启动独立MATLAB进程的效果一致。
2. 对齐资源配置与sbatch参数
需要将parcluster配置和sbatch脚本参数匹配:
- 设置
c.NumThreads对应sbatch的--cpus-per-task; - 通过
j.ResourceTemplate(或集群配置文件)设置内存限制(对应--mem)、分区(--partition)等参数,确保每个Job/Task的资源配额和sbatch一致。
3. 确保目录与环境变量唯一性
你的函数通过Para.DateStr+参数生成唯一RCDir,只要该逻辑能保证不同Task的目录不重复(比如datetime('now')精度足够,或额外加入Task ID),就不会出现Mex函数的CG系数数据冲突,这和sbatch每个Job生成独立目录的效果完全等价。
注意事项
- 若用单Job多Task,需确保集群分配的总资源能容纳所有Task的并发需求;
- 若用多Job单Task,需注意集群的Job提交限制(比如最大同时Job数),避免被调度器限流。
内容的提问来源于stack exchange,提问作者蒋思源

