我对LSF非常新颖。我有4个节点,每个节点有2个插座。每个节点有8个核心。我开发了混合MPI + OpenMP代码。我提交的工作如下,要求每个核心执行一项MPI任务。所以我失去了OpenMP的力量。LSF上的MPI + OpenMP作业提交脚本
##BSUB -n 64
我希望让每个插座运行一个MPI任务,而不是每个内核,以便在插槽内的内核可用于OpenMP的提交作业。如何构建作业提交脚本以优化代码中的杂交功能。
我对LSF非常新颖。我有4个节点,每个节点有2个插座。每个节点有8个核心。我开发了混合MPI + OpenMP代码。我提交的工作如下,要求每个核心执行一项MPI任务。所以我失去了OpenMP的力量。LSF上的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
英特尔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