MPI与OpenMP*的混合编程模型介绍

        1.  HPC领域中并行编程模型介绍

  在高性能计算HPC领域,MPI、OpenMP*、单边通信、shmem共享内存等并行编程模型正被广泛运用于应用中。本文将主要围绕MPI及OpenMP*来进行介绍,以及二者在Intel® Xeon Phi™协处理器上的应用。

  MPI(Message Passing Interface)是常用于在高性能计算中的分布式内存系统中常用的消息传递规范。在MPI模型中,数据在进程(或MPI rank)之间以协作的方式移动,每一个MPI rank拥有一个独立的地址空间。MPI规范包括通信及同步机制,它已成为分布式系统上进程间通信的默认标准。

  OpenMP(Open Multi-Processing)也是一种HPC领域中常用的编程规范,它对可使用的各种pragma、运行时库及环境变量都有标准的定义。共享的内存可以被所有OpenMP线程访问,这种编程方式主要用于多核共享内存的场景。

        2.  MPI/OpenMP混合编程的优势

  MPI/OpenMP混合编程正是利用了以上两种技术的优势:它使用了可在多异构节点间有效通信的MPI机制,并以OpenMP轻量级线程组的方式在共享内存的多核平台上运行。在纯MPI模型中,如果在每个节点上的MPI rank的数量持续增加,所有MPI ranks的消耗内存数量将最终超过节点上可提供的内存,从而导致性能下降;并且由于数据传输设备的带宽有限,MPI的并行度将会受到很大限制:同时负载均衡也是一个挑战,这往往因为Xeon及Xeon Phi架构的不同而引起。

  在混合编程模型中,OpenMP线程将共享每个节点的内存,因而此时的消耗内存总量会远远小于使用纯MPI进程模型时所占用的内存总量;可扩展性在此混合模型下也会由于跨节点间更少的MPI通信而得到显著提升;并且,轻量级线程间的通信也因为取代了传统的MPI进程收发通信机制而变得更快。值得注意的是,为了最大地使用硬件性能,线程需要合理地映射到现有的处理器核上、每个MPI rank中OpenMP的线程数需要合理地选择以及MPI blocking机制的使用需要注意以防引起死锁。

        3.  MPI/OpenMP混合编程模型在Xeon Phi协处理器上的应用

  Intel® MPI 库对Intel® Xeon Phi™协处理器的支持有三种编程模型:offload、仅使用协处理器及均衡模式:

  • 在offload模型中,MPI ranks仅运行于Xeon处理器上且会将指定的并行部分指派到协处理器上执行,通常这些并行部分也使用OpenMP方式执行。offload模型适用于一个MPI rank运行于host时将其高度并行的代码部分指派到协处理器上执行,且这部分并行代码以OpenMP多线程的方式在协处理器上执行。需要注意的是应用程序中的并行部分需要添加offload指示,以便其被分配到Xeon Phi上执行。
  • 在native即仅使用协处理器的模型中,MPI程序被编译为直接在每个协处理器上运行的代码,且协处理器上的MPI进程通过启用OpenMP线程来执行运行时的负载。此编程模型适用于当运行时的计算任务能在多个异构节点间平均分配时,且对于高度并行的程序也非常有效。对于此模型来说,用户只需要重新编译即可以将原来在host上执行的原代码移植到协处理器上运行,尽管要得到很高的性能时仍需要对代码的性能进行调优。
  • 在symmetric即均衡编程模型下,MPI程序需要同时为host及coprocessor结构进行编译,因此其可运行于异构的平台上。在同时使用了Xeon及Xeon Phi的平台上,此编程模式能够最大化计算性能,此时MPI的进程将同时运行于host及coprocessor上,同时OpenMP线程将被对应的MPI进程启动从而执行对应的计算任务。

  在设计混合MPI/OpenMP程序时,设计者需要考虑到通信的延时,因为计算节点间仍需要MPI发送接收消息,此时选择合适的架构网络能够最大化工作负载的性能;同时,设计者也需要考虑到协处理器间的PCIe的通信、最大化host及协处理器上可用CPU核的使用、充分地使用计算节点间的可用带宽等问题。

  在此混合并行计算模型下,MPI主要提供通信机制同时OpenMP多线程则主要承担计算的部分。通常通信及计算的部分是以串行的方式实现的:OpenMP多线程在运行计算任务时MPI ranks处于等待状态,当MPI ranks得到结果时,接着就会与其它节点交换结果与此同时OpenMP线程处于等待计算任务的状态。用户可以通过更好地安排OpenMP与MPI间任务的协作来进一步改进程序的性能。

  关于在协处理器上使用及调优OpenMP多线程程序的性能,读者可以参考Best Known Methods for Using OpenMP* on Intel® Many Integrated Core (Intel® MIC) Architecture.

Pour de plus amples informations sur les optimisations de compilation, consultez notre Avertissement concernant les optimisations.