0

我的程序使用 MPI+pthreads,其中 n-1 个 MPI 进程是纯 MPI 代码,而唯一一个 MPI 进程使用 pthreads。最后一个进程只包含 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

我怎样才能为此编写更好的脚本?

4

2 回答 2

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并替换$MPIEXECmpiexec

于 2014-10-31T07:56:25.560 回答
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 任务,使用 12 个内核,排名为 5

#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 就获得了它自己的节点。

于 2014-10-30T21:23:38.933 回答