首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将混合OpenMP/OpenMPI并行化与GNU编译器一起使用?

如何将混合OpenMP/OpenMPI并行化与GNU编译器一起使用?
EN

Stack Overflow用户
提问于 2020-03-23 19:28:59
回答 1查看 199关注 0票数 0

我正在运行一个物理解算器,它被编写为使用混合OpenMP/MPI并行化。我们集群上的作业管理器是SLURM。当我在纯MPI模式下运行时,一切都按预期进行。然而,一旦我尝试使用混合并行化,奇怪的事情就会发生:

1)首先,我尝试了下面的SLURM块:

代码语言:javascript
复制
#SBATCH --ntasks=8
#SBATCH --ntasks-per-node=2
#SBATCH --cpus-per-task=16

(提示: 16是集群处理器的物理核数)

然而,发生的情况是,模拟在4个节点上运行,我看到每个节点都使用了4个核心(在htop中)。此外,求解器告诉我它是从16个内核开始的,这一点我并不真正理解。我想应该是8*16=128。

2)由于上述操作不成功,我在SLURM脚本中添加了以下循环:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2020-03-25 18:04:54

几件事,通过使用:

代码语言:javascript
复制
#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个核心,则您的配置应该是:

代码语言:javascript
复制
#SBATCH --ntasks=8
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=16

因此,每个节点一个MPI,然后每个核心一个OMP,而不是现在的两个,这可能只会减慢代码速度。

最后,如何获得htop输出,是否记录到计算节点?通常不是这样的。一个关于集群的好主意。

我知道这不是一个完整的回复,但没有实际的代码,很难说得更多,而且这篇文章太长了,无法作为评论发布。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60812699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档