LSF上的MPI + OpenMP作业提交脚本

时间:2015-06-09 10:05:10

标签: sockets mpi openmp hybrid lsf

我对LSF很新。我有4个节点,每个节点有2个套接字。每个节点有8个核心。我开发了混合MPI + OpenMP代码。我提交的工作如下,要求每个核心执行一个MPI任务。所以我放弃了OpenMP的力量。

##BSUB -n 64

我希望提交作业,以便每个套接字运行一个MPI任务而不是每个核心,以便套接字内的核心可以用于OpenMP。如何构建作业提交脚本以优化代码中杂交的强大功能。

1 个答案:

答案 0 :(得分:0)

首先,BSUB哨兵前面必须有一个#符号,否则会将其作为常规评论跳过。

使用较旧的LSF版本启动混合作业的正确方法是仅传递span资源请求和请求节点。要使用8个MPI进程和每个8个OpenMP线程启动一个作业,您应该使用以下内容:

#BSUB -n 8
#BSUB -x
#BSUB -R "span[ptile=2]"

参数如下:

  • -n 8 - 为MPI进程请求8个插槽
  • -x - 专门请求节点
  • -R "span[ptile=2]" - 指示LSF跨越每个节点的两个插槽来完成作业

您应该独占地请求节点,否则LSF会将其他作业安排到相同的节点,因为每个节点只使用两个插槽。

然后你必须将OMP_NUM_THREADS环境变量设置为4(每个插槽的核心数),告诉MPI库将变量传递给MPI进程,并使每个库限制MPI进程到自己的CPU插槽。遗憾的是,这非常特定于实现,例如:

打开MPI 1.6.x或更早版本:

export OMP_NUM_THREADS=4
mpiexec -x OMP_NUM_THREADS --bind-to-socket --bysocket ./program.exe

打开MPI 1.7.x或更新版本:

export OMP_NUM_THREADS=4
mpiexec -x OMP_NUM_THREADS --bind-to socket --map-by socket ./program.exe

英特尔MPI(由于我不经常使用IMPI,因此不确定这一点):

mpiexec -genv OMP_NUM_THREADS 4 -genv I_MPI_PIN 1 \
        -genv I_MPI_PIN_DOMAIN socket -genv I_MPI_PIN_ORDER scatter \
        ./program.exe