针对抢占式的作业调度系统,如果分配节点时候是独占节点,那么每次申请的资源最少就是1个节点。如何实现一次提交作业,计算多个任务呢?(包括串行、openmp或mpi的任务)。最简单的方式就是按照自己的需求写一个运行脚本,然后通过作业管理系统提交即可。下面给出一个具体的例子加以说明,先给出实例,然后给出详细解释:

#!/bin/bash

cd ~/helloworld
yhrun -N1 -n1 ./helloworld &

cd ~/gaussian
export OMP_NUM_THREADS=2 
yhrun -N1 -n1 ./g09 &

cd ~/vasp
yhrun -N1 -n3 ./vasp &

cd ~/lmp
export OMP_NUM_THREADS=3
yhrun -N1 -n2 ./lmp < in.lj & 

wait

详细解释如下:

#!/bin/bash
# 这是一个bash的脚本
# 脚本里面写什么,就会执行什么
# 我将会申请1个有12cpu核的计算节点,具体如何分配这些核做计算,我自己说了算

# 先用1个核运行一个helloworld吧
cd ~/helloworld # 进入到helloworld所在目录
yhrun -N1 -n1 ./helloworld &

# yhrun 是天河系列的集群的"mpirun"
# -N1表示1个节点
# -n1表示一个核
# helloworld 是 可执行程序的名字
# & 表示放到后台执行(计算节点的后台),如果不写的话,脚本就会卡在这一行,
#   直到执行完这一行,才会往下执行。而我们希望同时执行多个任务,所以放到后台


# 再用2个核,运行一个openmp的程序吧
cd ~/gaussian
export OMP_NUM_THREADS=2 
yhrun -N1 -n1 ./g09 &

# OMP_NUM_THREADS=2 表示用OMP线程数=2
# ./g09 是一个openmp程序的名字(举例)


# 再用3个核,运行一个mpi的程序吧
cd ~/vasp
yhrun -N1 -n3 ./vasp &

# -n3 启用3个mpi进程,运行mpi任务

# 最后用6个核,运行一个mpi+openmp的程序吧
cd ~/lmp
export OMP_NUM_THREADS=3
yhrun -N1 -n2 ./lmp < in.lj & 

# 设置n=2,omp=3 开启2个mpi进程,每个mpi进程开启3个omp线程
# ./lmp 是mpi+openmp的程序名
# < in.lj 给定输入文件

# 末尾增加
wait

# 增加wait,让脚本等待以上后台任务运行结束后再停止
# 不添加的话,脚本运行到末尾就结束了,作业也就结束了。

当然,其实还有一种更为“精确”的控制每个进程运行哪个任务的高阶写法,但对于普通用户,一般没这个需求,故不在此介绍了。如确实有这个需求的欢迎留言。