超级计算机上的OpenMP

时间:2015-09-04 03:00:47

标签: c++ mpi openmp

在我的本地群集上,我可以使用此脚本将我的OpenMP代码并行化为36个内核

#$ -S /bin/bash
#$ -N name_of_project
#$ -o output.out
#$ -pe orte 36
#$ -V
#$ -cwd

export OMP_NUM_THREADS=36
./my_programme

我可以在36个核心上运行OpenMP c ++代码,包含4个节点......

但是,在作为XSEDE一部分的超级计算机上:

https://portal.xsede.org/tacc-stampede

我被告知我只能通过16个核心在1个节点上运行OpenMP。我有点困惑,所以如果我想用超过17个线程并行化我的程序,我必须将我的程序重新编码为MPI程序?

我想问一下将OpenMP程序转换为MPI程序有多难?谢谢。

1 个答案:

答案 0 :(得分:2)

  

如果我希望有效地将我的程序并行化超过17个   线程,我必须将我的程序重新编码为MPI程序吗?

是的,您需要编写一些MPI代码才能利用您可以使用的节点。 OpenMP以共享内存架构为目标,您需要一个消息传递库才能在节点之间进行通信。

并行化分布式体系结构是不同的(您不能像在OpenMP中那样进行for循环并行化),因为每个节点都有自己的共享内存,并且一个节点无法知道其他节点的状态以便同步工作。你必须自己做。

  

我想问一下转换OpenMP程序有多困难   进入MPI计划?

根据您的应用程序和编写代码的方式,MPI并行化可以非常简单。你应该详细说明你的算法,以便判断。重要的是:

  • Embarrasingly parallel problem具有静态工作负载:每个MPI节点具有相同的工作量并执行相同的工作,与其他节点没有或只有很少的交互。如果您的应用程序进入此类别,则并行化是直截了当的,可以使用collective MPI routines完成。不过,您需要编写并理解MPI的工作原理。
  • 更复杂的并行问题/动态工作负载:您的问题需要同步,节点之间的某些通信和/或工作量是未知的,您需要负载平衡策略。这就是HPC家伙为生活所做的事情:)。

我希望你进入第一类!

最后,乐趣从这里开始,为了获得良好的加速,您将需要找到妥协并玩游戏,因为您将拥有混合的OpenMP / MPI并行化。