开发人员已经设计并实现了一些有趣的编程模型,有助于开发并行应用程序,最流行的就是用于共享内存编程的OpenMP和用于分布式内存编程的MPI。
OpenMP是一种工业标准的API设计规范,是由Sun、HP、IBM和Intel等多家顶级计算机厂商和软件开发商联手推出的,其目的在于为软件开发人员提供一种通用的规范,使其可以很方便地设计新并行应用程序或修改及并行化现有串行应用程序,从而利用配置了多处理器计算系统的共享内存。可移植性也是OpenMP的主要目标之一,使用OpenMP开发的并行应用程序源代码可由支持OpenMP的任何编译器编译,且编译好的二进制代码可在目标硬件平台上运行,以获得出色的并行性能。
最流行的本地编程语言Fortran和C/C++都支持OpenMP。左图给出了分别以C/C++和Fortran编写的简单OpenMP程序示例。在本例中,将y数组加到x数组这一循环迭代操作,是以并行方式执行的。源代码中的编译指示、指令和编程API调用表示了OpenMP的结构。OpenMP 的结构允许程序员指定并行区域、同步和数据作用域属性,它还支持用于指定运行时配置的环境变量,例如,环境变量OMP_NUM_THREADS指定了运行时所使用的工作线程的数量。
由于OpenMP编程模型专用于单一进程,因此其可伸缩性最终要受到一台计算机中处理器(线程)数量的限制。可伸缩性还会受编程逻辑复杂程度和编程风格的限制。当前的OpenMP语义尚不够灵活,无法处理某些应用程序。例如,当前的OpenMP规范仅允许在并行区域内创建有限的动态线程。
MPI(Message Passing Interface,消息传递接口)是一种工业标准的API规范,专为在多处理器计算机和计算机集群上获得高性能计算而设计,该标准是由大量计算机供应商和软件开发商共同设计的。有多种来自不同研究机构和厂商的MPI实现,其中最流行的一种就是MPICH,MPICH常用作为特定平台或互连而优化的MPI实现的编码基础。MPI实现依然在不断发展。MPI-1支持一些关键特性,如点到点及与通信设备的集群消息通信。一条消息中可包含基本数据类型或派生(用户定义的)数据类型的MPI数据,它还支持互连拓扑。MPI-2则提供许多高级通信特性,如远程内存访问和单端通信等,还支持动态进程创建、管理和并行I/O。
总体而言,MPI为计算机集群上的并行应用程序提供了一个出色的解决方案,但对于许多开发人员来说,MPI也是一种困难的编程模型,因为MPI的通信延迟时间较长,所以必须合理分割程序的核心逻辑,以使分布成本更为合理。分析及划分应用程序问题,并将问题映射到分布式进程集合中,绝对不是一项可靠直觉完成的任务,因为许多MPI进程之间的交互作用都相当复杂,因此即便选用了恰当的工具,调试并调整运行在大量节点上的MPI应用程序也极具挑战性。MPI的性能取决于底层硬件平台和互连,在某些极端的情况下,MPI应用程序的性能可能会受到繁重的互连流量的影响。另外一个严重的问题就是大规模MPI应用程序的可靠性。对于许多MPI实现而言,只要单一计算节点发生故障,无法正确响应,MPI程序就会停止工作。(本文内容由Sun软件架构师 Liang T·Chen和微软软件架构师Herb Sutter提供)
网友评论