我的程序使用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
如何为此编写更好的脚本?
答案 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
这样你知道等级
其中第二个主机有备用插槽,以利用排名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获得了它自己的节点。