LSF的批处理脚本,当其中只有一个MPI进程有2个或更多线程时

时间:2014-10-28 15:12:46

标签: mpi cluster-computing batch-processing job-scheduling lsf

我的程序使用MPI + pthreads,其中n-1个MPI进程是纯MPI代码,而唯一一个MPI进程使用pthread。最后一个进程只包含2个线程(主线程和pthread)。假设我想运行该程序的HPC集群由计算节点组成,每个计算节点有12个核心。我应该如何编写批处理脚本以最大限度地利用硬件?

以下是我写的批处理脚本。我使用export OMP_NUM_THREADS = 2,因为最后一个MPI进程有2个线程,并且必须假设其他进程也有2个线程。

然后我为每个节点分配6个MPI进程,因此每个节点可以运行6xOMP_NUM_THREADS = 12(=每个节点上的核心数)线程,尽管所有MPI进程但只有一个有1个线程。

#BSUB -J LOOP.N200.L1000_SIMPLE_THREAD
#BSUB -o LOOP.%J
#BSUB -W 00:10
#BSUB -M 1024
#BSUB -N
#BSUB -a openmpi
#BSUB -n 20
#BSUB -m xxx
#BSUB -R "span[ptile=6]"
#BSUB -x

export OMP_NUM_THREADS=2

如何为此编写更好的脚本?

2 个答案:

答案 0 :(得分:2)

如果您希望最后一个等级成为混合等级,则以下情况应该有效:

#BSUB -n 20
#BSUB -R "span[ptile=12]"
#BSUB -x

$MPIEXEC $FLAGS_MPI_BATCH -n 19 -x OMP_NUM_THREADS=1 ./program : \
         $FLAGS_MPI_BATCH -n 1  -x OMP_NUM_THREADS=2 ./program

如果您希望排名0成为混合排名,只需切换两行:

$MPIEXEC $FLAGS_MPI_BATCH -n 1  -x OMP_NUM_THREADS=2 ./program : \
         $FLAGS_MPI_BATCH -n 19 -x OMP_NUM_THREADS=1 ./program

这利用Open MPI启动MIMD程序的能力。

您提到您的混合排名使用POSIX线程,但您正在设置与OpenMP相关的环境变量。如果您没有真正使用OpenMP,则根本不必设置OMP_NUM_THREADS,这个简单的mpiexec命令就足够了:

$MPIEXEC $FLAGS_MPI_BATCH ./program

(如果我对你所在的教育机构的猜测结果是错误的,请删除$FLAGS_MPI_BATCH并将$MPIEXEC替换为mpiexec

答案 1 :(得分:1)

因为我使用过LSF已经有一段时间了,所以这可能不完全正确,所以你应该试一试。

我看了你的请求

#BSUB -n 20
#BSUB -R "span[ptile=6]"

as,总共20个任务,每个节点有6个任务。意思是你将获得4个节点。这似乎是浪费,因为你说每个节点有12个核心。

如何使用节点上的所有核心,因为您已请求独占主机(-x

#BSUB -x
#BSUB -n 20
#BSUB -R "span[ptile=12]"

export OMP_NUM_THREADS=2

这样你知道等级

  • 0..11在第一个主机上
  • 12..19在第二个主机上

其中第二个主机有备用插槽,以利用排名19的OpenMP'。

当然,如果你进入更有趣的位置,LSF可以让你塑造就业岗位。使用LSB_PJL_TASK_GEOMETRY

假设您有25个MPI任务,排名为5,使用12个核心

#BSUB -x
#BSUB -n 25
#BSUB -R "span[ptile=12]"

export LSB_PJL_TASK_GEOMETRY="{(0,1,2,3,4,6,7,8,9,10,11,12)\
                               (13,14,15,16,17,18,19,20,21,22,23,24)\
                               (5)}"

这样,任务5获得了它自己的节点。