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



我对LSF很陌生。我有4个节点,每个节点有2个插座。每个节点有8个核。我开发了混合MPI+OpenMP代码。我正在提交像下面这样的工作,要求每个核心执行一个MPI任务。所以我失去了OpenMP的力量。

##BSUB -n 64

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

首先,BSUB前哨必须有一个单独的#符号,否则它们将作为常规注释跳过。

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

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

参数如下:

  • -n 8 -请求8个MPI进程槽位
  • -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

Intel 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

最新更新