假设我有一个运行在384个MPI进程上的代码(24个计算节点,每个计算节点有16个核心),并使用以下简单脚本将我的作业提交到作业队列
#!/bin/bash
#PBS -S /bin/bash
#PBS -l nodes=24:ppn=16
#PBS -l walltime=01:00:00
cd $PBS_O_WORKDIR
module load openmpi
mpirun mycode > output_file
以下场景是否可行:我需要再分配一个带有16个内核的节点,使用“openmp”进行一些特定的计算,并在某些时候使用计算结果更新其余的384个进程。所以现在我有384个MPI进程,每个进程依次运行一个线程,一个MPI进程有16个openmp线程。
是否可以通过OMP_NUM_THREADS和mpirun或任何其他工具来实现这一目标?
我感谢任何建议
谢谢
新浪
答案 0 :(得分:4)
您可以请求25个16 ppns的节点,然后只强制385个MPI进程:
#PBS -l nodes=25:ppn=16
...
mpirun -np 384 mycode : -np 1 -x OMP_NUM_THREADS=16 mycode > output_file
这利用了Open MPI的MPMD启动模式,其中不同的启动配置由冒号分隔。由于默认情况下按顺序在节点插槽上填充排名,因此前384个排名将精确地跨越24个节点,然后额外排名将在最后一个节点上开始。为此,OMP_NUM_THREADS
环境变量将设置为16,从而启用16个OpenMP线程。如果OpenMP程序是不同的可执行文件,只需在第二个启动配置中替换它的名称,例如:
mpirun -np 384 mycode : -np 1 -x OMP_NUM_THREADS=16 myompcode > output_file