我正在运行一个物理解算器,它被编写为使用混合OpenMP/MPI并行化。我们集群上的作业管理器是SLURM。当我在纯MPI模式下运行时,一切都按预期进行。然而,一旦我尝试使用混合并行化,奇怪的事情就会发生:
1)首先,我尝试了下面的SLURM块:
#SBATCH --ntasks=8
#SBATCH --ntasks-per-node=2
#SBATCH --cpus-per-task=16(提示: 16是集群处理器的物理核数)
然而,发生的情况是,模拟在4个节点上运行,我看到每个节点都使用了4个核心(在htop中)。此外,求解器告诉我它是从16个内核开始的,这一点我并不真正理解。我想应该是8*16=128。
2)由于上述操作不成功,我在SLURM脚本中添加了以下循环:
if [ -n "$SLURM_CPUS_PER_TASK" ]; then
omp_threads=$SLURM_CPUS_PER_TASK
else
omp_threads=1
fi
export OMP_NUM_THREADS=$omp_threads现在求解器告诉我,它是在128个内核上启动的。但是当在各自的节点上使用htop时,很明显这些OpenMP线程使用相同的核心,因此求解器非常慢。代码的开发人员告诉我,他从来没有使用过我添加的循环,所以可能有问题,但我不理解为什么OpenMP线程使用相同的内核。然而,在htop中,线程似乎就在那里。另一件奇怪的事情是htop向我展示了每个集群4个活动核心……我希望是2个(每个节点2个MPI任务),或者更确切地说,如果一切按计划进行,32个(2个MPI任务,每个任务运行16个OMP线程)。
我们曾经遇到过一个问题,因为开发人员使用Intel Fortran编译器,而我使用GNU fortran编译器(分别为mpif90和mpifort)。
有没有人知道如何让我的OpenMP线程使用所有可用的内核,而不是只有几个?
一些系统/代码信息:
Linux发行版: OpenSUSE Leap15.0
编译器: mpif90
代码: FORTRAN90
发布于 2020-03-25 18:04:54
几件事,通过使用:
#SBATCH --ntasks=8
#SBATCH --ntasks-per-node=2
#SBATCH --cpus-per-task=16您告诉我们需要8个任务(即MPI worker),并且每个节点有两个任务,所以在4个节点上启动代码是很正常的。
然后告诉每个MPI worker使用16个OMP线程。你可以说:
此外,求解器告诉我它是从16个内核开始的
我不知道你的代码的细节,但通常如果你在网格上解决一个问题,你会将网格分成子域(每个MPI一个),然后在这个子域上用OMP求解。因此,在您的示例中,有8个并行运行的求解器,每个求解器使用16个内核。
添加的命令export OMP_NUM_THREADS=$omp_threads和if块是正确的(顺便说一句,这不是一个循环)。
如果群集上的每个节点有16个核心,则您的配置应该是:
#SBATCH --ntasks=8
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=16因此,每个节点一个MPI,然后每个核心一个OMP,而不是现在的两个,这可能只会减慢代码速度。
最后,如何获得htop输出,是否记录到计算节点?通常不是这样的。一个关于集群的好主意。
我知道这不是一个完整的回复,但没有实际的代码,很难说得更多,而且这篇文章太长了,无法作为评论发布。
https://stackoverflow.com/questions/60812699
复制相似问题