提交作业
提交作业
提交作业的命令主要有salloc、sbatch与srun,其多数参数、输入输出变量等都是 一样的。
1. 主要参数
参数 | 描述 |
---|---|
-A,--account=<account> | 指定此作业的责任资源为账户,即账单(与计算费对应)记哪个名下,只有账户属于多个账单组才有权指定。 |
--accel-bind= | srun特有,控制如何绑定作业到GPU、网络等特定资源, 支持同时多个选项,支持的选项如下: – g:绑定到离分配的CPU最近的GPU; – m:绑定到离分配的CPU最近的MIC; – n:绑定到离分配的CPU最近的网卡; – v:详细模式,显示如何绑定GPU和网卡等等信息。 |
--acctg-freq | 指定作业记账和剖面信息采样间隔。支持的格式为--acctg-freq= – task= – energy= – network= – filesystem= |
-B --extra-node-info= |
选择满足 – --socketspernode= – --corespersocket= – --threadspercore= |
-A,--account=<account> | 指定此作业的责任资源为账户,即账单(与计算费对应)记哪个名下,只有账户属于多个账单组才有权指定。 |
--accel-bind= | srun特有,控制如何绑定作业到GPU、网络等特定资源, 支持同时多个选项,支持的选项如下: – g:绑定到离分配的CPU最近的GPU; – m:绑定到离分配的CPU最近的MIC; – n:绑定到离分配的CPU最近的网卡; – v:详细模式,显示如何绑定GPU和网卡等等信息。 |
--acctg-freq | 指定作业记账和剖面信息采样间隔。支持的格式为--acctg-freq= – task= – energy= – network= – filesystem= |
-B --extra-node-info= |
选择满足 – --socketspernode= – --corespersocket= – --threadspercore= |
--bcast[= |
srun特有,复制可执行程序到分配的计算节点的[ |
--begin= | 设定开始分配资源运行的时间。时间格式可为HH:MM:SS,或添加AM、PM等,也可采用MMDDYY、MM/DD/YY或YYYYMMDD格式指定日期,含有日期及时间的格式为:YYYYMMDD[THH:MM[:SS]],也可以采用类似now+时间单位的方式,时间单位可以为seconds(默认)、minutes、hours、days和weeks、today、tomorrow等,例如: – --begin=16:00:16:00开始。 – --begin=now+1hour:1小时后开始。 – --begin=now+60:60秒后开始(默认单位为秒)。 – --begin=20170220T12:34:00:20170220T12:34:00开始。 |
--bell | 分配资源时终端响铃,参见nobell。 |
--cpu-bind=[quiet,verbose,]type | srun特有,设定CPU绑定模式。 |
--comment= |
作业说明 |
--contiguous | 需分配到连续节点,一般来说连续节点之间网络会快一点,如在同 一个IB交换机内,但有可能导致开始运行时间推迟(需等待足够多的连续节点)。 |
--cores-per-socket= |
分配的节点需要每颗CPU至少 |
--cpus-per-gpu= |
每颗GPU需 |
-c, --cpus-per-task= |
每个进程需 |
--deadline= |
如果在此deadline(start > (deadline - time[-min])之前没有结束,那么移除此作业。默认没有deadline,有效的时间格式为: - HH:MM[:SS] [AM/PM] - MMDD[YY]或MM/DD[/YY]或MM.DD[.YY] - MM/DD[/YY]HH:MM[:SS] - YYYYMMDD[THH:MM[:SS]]] |
-d,--dependency= |
满足依赖条件 - after:job_id[:jobid...]:当指定作业号的作业结束后开始运行。 - afterany:job_id[:jobid...]:当指定作业号的任意作业结束后开始运行。 - aftercorr:job_id[:jobid...]:当相应任务号任务结束后,此作业组中的开始运行。 - afternotok:job_id[:jobid...]:当指定作业号的作业结束时具有异常状态(非零退出码、节点失效、超时等)时。 - afterok:job_id[:jobid...]:当指定的作业正常结束(退出码为0)时开始运行。 - expand:job_id:分配给此作业的资源将扩展给指定作业。 - singleton:等任意通账户的相同作业名的前置作业结束时。 |
-D, --chdir= |
在切换到 |
-e, --error= |
设定标准错误如何重定向。非交互模式下,默认srun重定向标准错误到与标准输出同样的文件(如指定)。此参数可以指定重定向到不同文件。如果指定的文件已经存在,那么将被覆盖。参见IO重定向。salloc无此选项。 |
--epilog= |
srun特有,作业结束后执行 |
-E,--preserveenv | 将环境变量SLURM_NNODES和SLURM_NTASKS传递给可执行文件,而无需通过计算命令行参数。 |
--exclusive[=user/mcs] | 排他性运行,独占性运行,此节点不允许其他[user]用户 或mcs选项的作业共享运行作业。 |
--export=<[ALL,]environment variables/ALL/NONE> | sbatch与srun特有,将环境变量传递给应用程序。 - ALL:复制所有提交节点的环境变量,为默认选项。 - NONE:所有环境变量都不被传递,可执行程序必须采用绝对路径。一般用于当提交时使用的集群与运行集群不同时。 - [ALL,]environment variables:复制全部环境变量及特定的环境变量及其值, 可以有多个以,分隔的变量。如:“--export=EDITOR,ARG1=test”。 |
--exportfile= |
sbatch特有,将特定文件中的变量设置传递到计算节点,这允许在定义环境变量时有特殊字符。 |
-F,-- nodefile= |
类似nodelist指定需要运行的节点,但在一个文件中含有节点列表。 |
-G, --gpus=[ |
设定使用的GPU类型及数目,如gpus=v100:2。 |
--gpus-per-node=[ |
设定单个节点使用的GPU类型及数目。 |
--gpus-per-socket=[ |
设定每个socket需要的GPU类型及数目。 |
--gpus-per-task=[ |
设定每个任务需要的GPU类型及数目。 |
--gres= |
设定通用消费资源,可以以,分隔。每个
|
-H, --hold | 设定作业将被提交为挂起状态。挂起的作业可以利用scontrol release |
-h, --help | 显示帮助信息。 |
--hint= |
绑定任务到应用提示: - compute_bound:选择设定计算边界应用:采用每个socket的所有CPU核,每颗CPU核一个进程。 - memory_bound:选择设定内存边界应用:仅采用每个socket的1颗CPU核,每颗CPU核一个进程。 - no multithread:在incore multithreading是否采用额外的线程,对通信密集型应用有益。仅当task/affinity插件启用时。 - help:显示帮助信息。 |
-I, --immediate[= |
salloc与srun特有,在 |
--ignore-pbs | sbatch特有,忽略批处理脚本中的“#PBS”选项。 |
-i, --input= |
sbatch与srun特有,指定标准输入如何重定向。默认,srun对所有任务重定向标准输入为从终端。参见IO重定向。 |
-J, --job-name= |
设定作业名 |
--jobid= |
srun特有,初始作业步到某个已分配的作业号 |
-K, --kill-command[=signal] | salloc特有,设定需要终止时的signal,默认,如没指定,则对于交互式作业为SIGHUP,对于非交互式作业为SIGTERM。格式类似可以为“K1”,但不能包含空格为“-K1”。 |
-K, –kill-on-bad-exit[=0/1] | srun特有,设定是否任何一个任务退出码为非0时,是否终止作业步。 |
-k,-- no-kill | 如果分配的节点失效,那么不会自动终止。 |
-L, --licenses= |
设定使用的 |
-l, --label | srun特有,在标注正常输出或标准错误输出的行前面添加作业号。 |
--mem= |
设定每个节点的内存大小,后缀可以为[K/M/G/T],默认为MB。 |
--mem-per-cpu= |
设定分配的每颗CPU对应最小内存,后缀可以为[K/M/G/T],默认为MB。 |
--mem-per-gpu= |
设定分配的每颗GPU对应最小内存,后缀可以为[K/ M/G/T],默认为MB。 |
--mincpus= |
设定每个节点最小的逻辑CPU核/处理器。 |
--mpi= |
srun特有,指定使用的MPI环境, - list:列出可用的MPI以便选择。 - pmi2:启用PMI2支持。 - pmix:启用PMIx支持。 - none:默认选项,多种其它MPI实现有效。 |
--multi-prog | srun特有,让不同任务运行不同的程序及参数,需指定一个配置文件,参见MULTIPLE PROGRAM CONFIGURATION。 |
-N, --nodes= |
采用特定节点数运行作业,如没指定maxnodes则需特定节点数,注意,这里是节点数,不是CPU核数,实际分配的是节点数×每节点CPU核数。 |
--nice[=adjustment] | 设定NICE调整值。负值提高优先级,正值降低优先级。调整范围为:+/ 2147483645。 |
-n, --ntasks= |
设定所需要的任务总数。默认是每个节点1个任务,注意是节点,不是CPU核。仅对作业起作用,不对作业步起作用。--cpus-per-task选项可以改变此默认选项。 |
--ntasks-per-core= |
每颗CPU核运行 |
--ntasks-per-node= |
每个节点运行 |
--ntasks-per-socket= |
每颗CPU运行 |
--no-bell | salloc特有,资源分配时不终端响铃。参见bell。 |
--no-shell | salloc特有,分配资源后立即退出,而不运行命令。但Slurm作业仍旧被生成,在其激活期间,且保留这些激活的资源。用户会获得一个没有附带进程和任务的作业号,用户可以采用提交srun命令到这些资源。 |
-o, --output= |
sbatch与srun特有,指定标准输出重定向。在非交互模式中, 默认srun收集各任务的标准输出,并发送到吸附的终端上。采用--output可以将其重定向到同一个文件、每个任务一个文件或/dev/null等。参见IO重定向。 |
--open-mode= |
sbtach与srun特有,对标准输出和标准错误输出采用追加模式还是覆盖模式。 |
-O, --overcommit | 采用此选项可以使得每颗CPU运行不止一个任务。 |
--openmode= |
标准输出和标准错误输出打开文件的方式: - append:追加。 - truncate:截断覆盖。 |
-p, --partition= |
使用 |
--prolog= |
srun特有,作业开始运行前执行 |
-Q, --quiet | 采用安静模式运行,一般信息将不显示,但错误信息仍将被显示。 |
--qos= |
需要特定的服务质量(QS)。 |
--quit-on-interrupt | srun特有,当SIGINT (Ctrl-C)时立即退出。 |
-r, -- relative= |
srun特有,在当前分配的第n节点上运行作业步。该选项可用于分配一些作业步到当前作业占用的节点外的节点,节点号从0开始。-r选项不能与-w或-x同时使用。仅对作业步有效。 |
--reservation= |
从 |
–requeue | sbtach特有,当非配的节点失效或被更高级作业抢占资源后,重新运行 该作业。相当于重新运行批处理脚本,小心已运行的结果被覆盖等。 |
--no-requeue | 任何情况下都不重新运行。 |
-S, --core-spec= |
指定预留的不被作业使用的各节点CPU核数。但也会被记入费用。 |
--signal=<sig_num>[@ |
设定到其终止时间前信号时间 |
--sockets-per-node= |
设定每个节点的CPU颗数。 |
-T, --threads= |
srun特有,限制从srun进程发送到分配节点上的并发线程数。 |
-t, --time= | 作业最大运行总时间 |
--task-epilog= |
srun特有,任务终止后立即执行 |
--task-prolog= |
srun特有,任务开始前立即执行 |
--test-only | sbatch与srun特有,测试批处理脚本,并预计将被执行的时间,但并不际执行脚本。 |
--thread-spec= |
设定指定预留的不被作业使用的各节点线程数。 |
--threads-per-core= |
每颗CPU核运行 |
--time-min= |
设定作业分配的最小时间,设定后作业的运行时间将使得time设定的时间不少于timemin设定的。时间格式为:minutes、minutes:seconds、hours:minutes:seconds、days-hours、days-hours:minutes和days-hours:minutes:seconds。 |
--usage | 显示简略帮助信息。 |
--tmp= |
设定/tmp目录最小磁盘空间,后缀可以为[K/M/G/T],默认为MB。 |
-u, --usage | 显示简要帮助信息。 |
-u, --unbuffered | srun特有,该选项使得输出可以不被缓存立即显示出来。默认应用的标准输出被glibc缓存,除非被刷新(flush)或输出被设定为步缓存。 |
--use-min-nodes | 设定如果给了一个节点数范围,分配时,选择较小的数。 |
-V, --version | 显示版本信息。 |
-v, --verbose | 显示详细信息,多个v会显示更详细的详细。 |
-W, --wait= |
设定在第一个任务结束后多久结束全部任务。 |
-w, --nodelist= |
在特定 |
--wait-all-nodes= |
salloc与sbatch特有,控制当节点准备好时何时运行命令。默认,当分配的资源准备好后salloc命令立即返回。 - 0:当分配的资源可以分配时立即执行,比如有节点以重启好。 - 1:只有当分配的所有节点都准备好时才执行。 |
-X, --disablestatus | srun特有,禁止在srun收到SIGINT (CtrlC)时显示任务状态。 |
-x, --exclude= |
在特定 |
2. 交互式提交并行作业:srun
srun可以交互式提交运行并行作业,提交后,作业等待运行,等运行完毕后,才返 回终端。语法为:
srun \[OPTIONS...\] executable \[args...\]
常见例子
示例一:使用8个CPU核(n8)运行作业,并在标准输出上显示任务号(l):
srun -p pocg -n8 -l hostname
输出结果:
0:node0
1:node0
2:node1
3:node1
4:node2
5:node2
6:node3
7:node3
示例二:在脚本中使用-r2参数使其在第2号(分配的节点号从0开始)开始的两个节点上运行,并采用实时分配模式而不是批处理模式运行:
脚本test.sh内容:
\#!/bin/sh
echo $SLURM\_NODELIST
srun -lN2 -r2 hostname
srun -lN2 hostname
运行:
salloc -p pocg -N4 test.sh
输出结果:
dev\[7-10\]
0: node9
1: node10
0: node7
1: node8
示例三:在分配的节点上并行运行两个作业步:
脚本test.sh内容:
\#!/bin/bash
srun -lN2 -n4 -r 2 sleep 60 &
srun -lN2 -r 0 sleep 60 &
sleep 1 squeue
squeue -s
wait
运行:
salloc -p pocg -N4 test.sh
输出结果:
JOBID PARTITION NAME USER ST TIME NODES NODELIST65641 batch test.sh grondo R 0:01 4 dev\[7-10\]
STEPID PARTITION USER TIME NODELIST
65641.0 batch grondo 0:01 dev\[7-8\]
65641.1 batch grondo 0:01 dev\[9-10\]
示例四:运行MPICH作业:
脚本test.sh内容:
\#!/bin/sh
MACHINEFILE="nodes.$SLURM_JOB_ID"
\#生成MPICH所需的包含节点名的machinfile文件
srun -l /bin/hostname \| sort -n \| awk ’{print $2}’ > $MACHINEFILE
\#运行MPICH作业
mpirun -np $SLURM\_NTASKS -machinefile $MACHINEFILE mpi-app
rm $MACHINEFILE
采用2个节点(-N2)共4个CPU核(-n4)运行:
salloc -p pocg -N2 -n4 test.sh
示例五:利用不同节点号(SLURM_NODEID)运行不同作业,节点号从0开始:
脚本test.sh内容:
case $SLURM\_NODEID in
0) echo "I am running on "
hostname ;;
1) hostname
echo "is where I am running" ;;
esac
运行:
srun -p pocg -N2 test.sh
输出结果:
dev0
is where I am running
I am running on
ev1
示例六: 利用多核选项控制任务执行:
采用2个节点(N2),每节点4颗CPU每颗CPU 2颗CPU核(B 44:22),运行作业:
srun -p pocg -N2 -B 4-4:2-2 a.out
示例七:运行GPU作业:
脚本gpu.script内容:
#!/bin/bash
srun -n1 -p GPU-V100 -{}-gres=gpu:v100:2 prog1 &
wait
-p GPUV-100指定采用GPU队列GPU-V100,--gres=gpu:v100:2指明每个节点使用2块NVIDIA V100 GPU卡。
示例八:排它性独占运行作业:
脚本my.script内容:
\#!/bin/bash
srun -{}-exclusive -n4 prog1 &
srun -{}-exclusive -n3 prog2 &
srun -{}-exclusive -n1 prog3 &
srun -{}-exclusive -n1 prog4 &
wait
3. 批处理方式提交作业:sbatch
Slurm支持利用sbatch命令采用批处理方式运行作业,sbatch命令在脚本正确传递给作业调度系统后立即退出,同时获取到一个作业号。作业等所需资源满足后开始运行。
sbatch提交一个批处理作业脚本到Slurm。批处理脚本名可以在命令行上通过传递0给sbatch,如没有指定文件名,则sbatch从标准输入中获取脚本内容。
脚本文件基本格式:
第一行以#!/bin/sh等指定该脚本的解释程序,/bin/sh可以变为/bin/bash、/bin/csh等。
在可执行命令之前的每行“#SBATCH”前缀后跟的参数作为作业调度系统参数。在任何非注释及空白之后的“#SBATCH”将不再作为Slurm参数处理。
默认,标准输出和标准出错都定向到同一个文件slurm%j.out,“%j”将被作业号代替。
脚本myscript内容:
#!/bin/sh
#SBATCH -{}-time=1
#SBATCH -p pocgt
srun hostname |sort
采用4个节点(N4)运行:
sbatch -p pocg -N4 myscript
在这里,虽然脚本中利用“#SBATCH -p pocgt”指定了使用pocgt队列,但命令行中的-p pocg优先级更高,因此实际提交到pocg队列。
提交成功后有类似输出:
salloc: Granted job allocation 65537
其中65537为分配的作业号。
程序结束后的作业日志文件slurm65537.out显示:
node1
node2
node3
node4
常见例子
示例一:串行作业提交
对于串行程序,用户可类似下面两者之一:
1、直接采用sbatch -n1 -o job%j.log -e job-%.err yourprog方式运行。
2、编写命名为pocg_job.sh(此脚本名可以按照用户喜好命名)的串行作业脚本,其 内容如下:
#!/bin/sh
#An example for serial job.
#SBATCH -J job\_name\#SBATCH -o job-%j.log
#SBATCH -e job-%j.errecho Running on hosts
echo Time is \`date\`
echo Directory is $PWD
echo This job runs on the following nodes:
echo $SLURM\_JOB\_NODELIST
module load intel/2019.update5
echo This job has allocated 1 cpu core.
./yourprog
必要时需在脚本文件中利用module命令设置所需的环境,如上面的module load intel/2019.update5
作业脚本编写完成后,可以按照下面命令提交作业:
hmli@login01:~/work$ sbatch -n1 -p pocg pocg\_job.sh
示例二:OpenMP共享内存并行作业提交
对于OpenMP共享内存并行程序,可编写命名为omp_job.sh的作业脚本,内容如下:
#!/bin/sh
#An example for serial job.
#SBATCH -J job\_name
#SBATCH -o job-%j.log
#SBATCH -e job-%j.err
#SBATCH -p pocg -N 1 -n 8
echo Running on hosts
echo Time is \`date\`
echo Directory is $PWD
echo This job runs on the following nodes:
echo $SLURM\_JOB\_NODELIST
module load intel/2016.3.210
echo This job has allocated 1 cpu core.
export OMP\_NUM\_THREADS=8
./yourprog
相对于串行作业脚本,主要增加export OMP_NUM_THREADS=8和#SBATCH -N 1 -n 8,表示使用一个节点内部的八个核,从而保证是在同一个节点内部, 需几个核就设置-n为几。-n后跟的不能超过单节点内CPU核数。
作业脚本编写完成后,可以按照下面命令提交作业:
hmli@login01:~/work$ sbatch omp\_job.sh
示例二:MPI并行作业提交
与串行作业类似,对于MPI并行作业,则需编写类似下面脚本mpi_job.sh:
#!/bin/sh
#An example for MPI job.
#SBATCH -J job\_name
#SBATCH -o job-%j.log
#SBATCH -e job-%j.err
#SBATCH -p pocg -N 1 -n 8echo Time is \`date\`
echo Directory is $PWD
echo This job runs on the following nodes:
echo $SLURM\_JOB\_NODELIST
echo This job has allocated $SLURM\_JOB\_CPUS\_PER\_NODE cpu cores.
module load intelmpi/5.1.3.210
#module load mpich/3.2/intel/2016.3.210
#module load openmpi/2.0.0/intel/2016.3.210
MPIRUN=mpirun \#Intel mpi and Open MPI
#MPIRUN=mpiexec \#MPICH
MPIOPT="-env I\_MPI\_FABRICS shm:ofa" \#Intel MPI 2018
#MPIOPT="-env I\_MPI\_FABRICS shm:ofi" \#Intel MPI 2019
#MPIOPT="-{}-mca plm\_rsh\_agent ssh -{}-mca btl self,openib,sm" \#Open MPI
#MPIOPT="-iface ib0" \#MPICH3
#目前新版的MPI可以自己找寻高速网络配置,可以设置MPIOPT为空,如去掉下行的
# MPIOPT=
$MPIRUN $MPIOPT ./yourprog
与串行程序的脚本相比,主要不同之处在于需采用mpirun或mpiexec的命令格式提 交并行可执行程序。采用不同MPI提交时,需要打开上述对应的选项。
与串行作业类似,可使用下面方式提交:
hmli@login01:~/work$ sbatch mpi\_job.sh
示例三:GPU作业提交
运行GPU作业,需要提交时利用gres=gpu等指明需要的GPU资源并用p指明采用的GPU队列。
脚本gpu_job.sh内容:
#!/bin/sh
#An example for gpu job.
#SBATCH -J job\_name
#SBATCH -o job-%j.log
#SBATCH -e job-%j.err
#SBATCH -N 1 -n 8 -p GPU-V100 -{}-gres=gpu:v100:2./your-gpu-prog
wait
上面p GPU-V100 指定采用GPU队列GPU-V100,--gres=gpu:v100:2指明每个节点使用2块NVIDIA V100 GPU卡。
示例四:作业获取的节点名及对应CPU核数解析
作业调度系统主要负责分配节点及该节点分配的CPU核数等, 在Slurm作业脚本中利用环境变量可以获取分配到的节点名(SLURM_JOB_NODELIST及对应核数(SLURM_JOB_CPUS_PER_NODE)或对应的任务数(SLURM_TASKS_PER_NODE),然后根据自己程序原始的命令在Slurm脚本中进行修改就成。
SLURM_JOB_NODELIST及SLURM_TASKS_PER_NODE有一定的格式,以下为一个参考解析脚本,可以在自己的Slurm脚本中参考获取自己的节点等信息。
#!/bin/bash
#Auther HM\_Li
#SLURM\_JOB\_NODELIST=cnode\[001-003,005,440-441\]
BASENAME=${SLURM\_JOB\_NODELIST%\[\*}
LIST=${SLURM\_JOB\_NODELIST\#\*\[}
LIST=${LIST%\]}
IDLIST=''
for i in \`echo $LIST \| tr ',' ' '\`
do
if \[\[ $i =~ '-' \]\]; then
IDLIST=$IDLIST' '\`seq -w \`echo $i\| tr '-' ' '\`\`
else
IDLIST=$IDLIST' '$i
fi
done
NODELIST=''
for i in $IDLIST
do
NODELIST=$NODELIST" $BASENAME"$i
done
echo -e "Node list: \n\t"$NODELIST
#SLURM\_TASKS\_PER\_NODE='40\(x3\),23,20\(x2\)'
#SLURM\_JOB\_CPUS\_PER\_NODE='40\(x3\),23,20\(x2\)'
CORELIST=''
for i in \`echo $SLURM\_JOB\_CUPS\_PER\_NODE\| tr ',' ' '\`
do
if \[\[ $i =~ 'x' \]\]; then
read CORES NODES <<<\`echo $i\| tr '\(x\)' ' '\`
for n in \`seq 1 $NODES\`
do
CORELIST=$CORELIST' '$CORES
done
else
CORELIST=$CORELIST' '$i
fi
done
echo -e "\nCPU Core list: \n\t$CORELIST"
echo -e "\nNode list with corresponding CPU Cores: "
CARR=\(${CORELIST}\)
i=0
for n in $NODELIST
do
echo -e "\t"$n: ${CARR\[$i\]}
i=$\(\($i+1\)\)
done
上面只是例子,要加在自己的Slurm脚本中,而不是先提交上面这个脚本获取节点名后放到slurm脚本中,其原因在于除非提交时指定节点名,否则每次提交后获取的节点名等是有可能变的。比如针对star-cmm+软件,原来的方式是:
/STATCMM+PATH/bin/starccm+ -rsh ssh -batch -power -on cnode400:40,cnode432:40 FireAndSmokeResampled.sim >residual.log
则可以改为下面脚本:
#!/bin/sh
#An example for MPI job.
#SBATCH -J job\_name
#SBATCH -o job-%j.log
#SBATCH -e job-%j.err
echo This job runs on the following nodes:
echo $SLURM\_JOB\_NODELIST
echo This job has allocated $SLURM\_JOB\_CPUS\_PER\_NODE cpu cores.
BASENAME=${SLURM\_JOB\_NODELIST%\[\*}
LIST=${SLURM\_JOB\_NODELIST\#\*\[}
LIST=${LIST%\]}
IDLIST=''
for i in \`echo $LIST \| tr ',' ' '\`
do
if \[\[ $i =~ '-' \]\]; then
T=\`echo $i\| tr '-' ' '\`
IDLIST=$IDLIST' '\`seq -w $T\`
else
IDLIST=$IDLIST' '$i
fi
done
NODEOPT=''
for i in $IDLIST
do
NODEOPT=$NODEOPT,$BASENAME$i:40
done
NODEOPT=${NODEOPT:1} \#trim the first ,
/STARCMM+PATH/bin/starccm+ -rsh ssh -batch -power -on $NODEOPT FireAndSmokeResampled.sim > residual.log
4. 分配式提交作业:salloc
salloc将获取作业的分配后执行命令,当命令结束后释放分配的资源。其基本语法为:
salloc \[options\] \[<command> \[command args\]\]
command可以是任何是用户想要用的程序,典型的为xterm或包含srun命令的shell。 如果后面没有跟命令,那么将执行Slurm系统slurm.conf配置文件中通过SallocDefaultCommand 设定的命令。如果SallocDefaultCommand没有设定,那么将执行用户的默认shell。 注意:salloc逻辑上包括支持保存和存储终端行设置,并且设计为采用前台方式执行。如果需要后台执行salloc,可以设定标准输入为某个文件,如:salloc -n16 a.out </dev/null &。
常见例子
示例一:获取分配,并打开csh,以便srun可以交互式输入:
salloc -p pocg -N16 csh
将输出:
salloc: Granted job allocation 65537
(在此,将等待用户输入,csh退出后结束)
salloc: Relinquishing job allocation 65537
示例二:获取分配并并行运行应用:
salloc -p pocg -N5 srun -n10 myprogram
示例三:生成三个不同组件的异构作业,每个都是独立节点:
salloc -p pocg w node\[23\] : w node4 : w node\[57\] bash
将输出:
salloc: job 32294 queued and waiting for resources
salloc: job 32294 has been allocated resources
salloc: Granted job allocation 32294