我对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