假设我有一个在 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
Run Code Online (Sandbox Code Playgroud)
是否可能出现以下情况:我需要再分配一个具有 16 个内核的节点来使用“openmp”进行一些特定计算,并在某个时候使用计算结果更新其余 384 个进程。所以现在我有 384 个 MPI 进程,每个进程有一个线程依次运行,一个 MPI 进程有 16 个 openmp 线程。
是否可以通过 OMP_NUM_THREADS 和 mpirun 或任何其他工具来完成此操作?
我很感激任何建议
谢谢
新浪
您可以请求 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
Run Code Online (Sandbox Code Playgroud)
这利用了 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
Run Code Online (Sandbox Code Playgroud)