当前位置:文档之家› 并行编程模式

并行编程模式

并行程序的编程模型、运行环境、调试环境等都要比串行程序复杂得多。

提供良好的高性能计算开发环境,一直是学术界和工业界所追求的目标。

目前比较流行的高性能计算系统,大体可以分为两类:一类是共享内存系统(SMP),如IBM的P690,HP的SuperDome等,其特点是多个处理器拥有物理上共享的内存;一类是分布存储系统(DMP),如MPP和集群系统,其特点是系统由多个物理上分布的结点组成,每个结点拥有自己的内存,结点通过高速以太网或专用高速网络连接。

本文主要介绍这两类系统上的开发工具。

一、并行程序的开发模式
1. 共享内存模型
在共享内存模型中,一个并行程序由多个共享内存的并行任务组成,数据的交换通过隐含地使用共享数据来完成。

此编程模式一般仅需指定可以并行执行的循环,而不需考虑计算与数据如何划分,以及如何进行任务间通信,编译器会自动完成上述功能。

目前流行的共享内存模型开发标准是OpenMP。

OpenMP定义了一套编译指导语句,用于指定程序的并行性、数据的共享/私有等信息。

其目标是为SMP系统提供可移植、可扩展的开发接口。

OpenMP由OpenMP Architecture Review Board于1997年推出,现在已发展到2.0版。

OpenMP支持的编程语言包括Fortran、C和C++。

OpenMP得到了工业界的广泛支持,有大量的商业编译器和其他开发工具支持OpenMP的开发,如IBM、HP、Sun、SGI、Intel等硬件厂商均有支持OpenMP的编译器产品,另外还有一些第三方厂商的OpenMP编译器。

2. 消息传递模型
在消息传递模型中,一个并行程序由多个并行任务组成。

每个并行任务拥有自己的数据并对其进行计算操作。

任务之间数据的交换是通过显式的消息传递语句来完成的。

现在广泛使用的消息传递模型有两个:PVM和MPI。

PVM即Parallel Virtual Machine(并行虚拟机)与MPI即Message Passing Interface(消息传递界面)。

PVM与MPI所提供的功能大致相同,但两者的侧重点有所不同。

PVM强调在异构环境下的可移植性和互操作性,程序之间可以互相通信,并支持动态的资源管理和一定程度的容错;而MPI更强调性能,不同的MPI 实现之间缺乏互操作性,本身也不支持容错(可以通过专门的容错软件来支持容错)。

一般而言,使用MPI比较适合于开发MPP或同构集群上的并行应用,可以有较高的通信性能;而PVM更适合于异构的集群系统。

几乎所有的高性能计算系统都支持PVM和MPI。

3. HPF
HPF(High Performance Fortran)的思想与OpenMP类似,都是通过定义编译指导语句来帮助编译器生成并行代码。

HPF的目标系统与OpenMP不同,它支持DMP系统。

因此,除了指定并行性的编译指导语句外,HPF还指定数据划分的编译指导语句。

HPF与消息传递模型的不同之处则在于:HPF通过编译器来生成通信语句,不需要程序员手工编写。

HPF得到了工业界的广泛支持,如IBM、HP、Sun都有HPF编译器。

第三方产品则有PGI的PGHPF、APR的Forge xHPF等。

其不足是对于某些问题无法得到与手工编写的消息传递程序相同的性能。

4. 并行库
使用并行库开发高性能计算程序的基本思想是:用户不需要自己编写通用的并行算法代码,而由程序库提供并行算法,并对用户透明。

用户只需要根据自己的需求,调用相应的库函数,就可以编写出并行程序。

由于库函数的编写者一般经验丰富,而且库函数会采取较为优化的算法,并采用优化编译,使得库函数的执行效率很高。

对于大量使用通用计算算法的用户来说,使用并行库是一种高效的开发模式。

并行库的缺点是无法帮助那些需要自己书写非通用
并行算法的用户。

目前的并行库很多,包括PBLAS(Parallel Basic Linear Algebra Subroutines),以及建立在其基础上的LAPACK和ScaLAPACK,提供了一些线性代数问题的并行求解算法,如求特征值、最小二乘问题等。

LAPACK是为SMP系统优化的,ScaLAPACK是为DMP系统优化的。

大多数高性能计算系统都提供在本系统上优化的PBLAS、LAPACK、ScaLAPACK。

另一个著名的并行库是PETSc。

PETSc是一套基于MPI的数据结构和库函数,用于解决基于偏微分方程的典型科学计算问题。

另外,MATLAB是很常用的科学计算软件。

很多公司和研究机构也在进行并行化MATLAB的工作,如RTExpress。

5. 串行程序并行化
另一种并行程序的开发模式是将串行程序并行化。

此模式的优点在于,可以将现有的很多串行代码转换成并行代码。

并行化分为全自动并行化和交互式并行化两种模式。

全自动并行化的并行过程不需要人的干预,可以自动发现程序中可并行的部分,生成并行代码。

现在,高性能计算系统提供商的Fortran和C编译器大都能提供面向SMP系统的自动并行化的编译选项。

对于少数程序,全自动并行化编译器可以达到较好的效果;但对大多数程序来说,并行化的效果还不理想。

交互式并行化工具通过给用户提供程序中的有效信息,包括相关性分析结果、程序调用图、性能预测结果等帮助用户进行并行化工作,但是如何更好地结合用户和并行化工具的能力还需要进一步研究。

目前产品化的交互式并行化工具主要有APR的Forge,该系统支持Fortran77的并行化,并同时支持SMP系统和DMP系统。

二、开发工具
1. 调试器
调试是程序开发的重要部分,并行程序尤其难调试,更需要调试器的支持。

高性能计算系统中大多会带有并行调试器,如IBM的pdb(命令行方式)、pedb(Xwindow图形界面)、HP 的DDE(XWindow图形界面)和LaDebug(用于Alpha系统)、Sun的Prism等。

Etnus的TotalView是最著名的第三方并行调试器。

它提供对C、C++、Fortran程序的图形化符号调试,可以调试MPI、PVM、HPF、OpenMP程序,支持SGI、Sun、HP、IBM等几乎所有的高性能厂商的产品,还提供对Linux的支持。

KAI的Assure Thread Analyzer是一个支持OpenMP的程序正确性检测工具,用于自动发现程序中的常见错误。

它目前仅支持IA32和IA64上的Linux。

2. 性能分析和预测
程序性能分析(profiling)可以帮助用户找到程序中最费时的部分,从而集中精力进行改进和优化,是改进程序性能的有效手段。

传统的性能分析工具一般仅提供子程序级的性能分析,但对于高性能程序来说,对于循环程序的性能分析是必不可少的。

现有的大部分高性能计算系统中大都具有能够进行循环级性能分析的性能分析器,有些还提供了友好的用户界面,如Intel的VTune、IBM的Xprofiler等。

一些第三方厂商也提供性能分析工具,比如Pallas的Vampir,它支持从Linux PC到IBM、HP、Sun、SGI等几乎所有的高性能厂商的产品。

3.资源管理和负载平衡系统
严格地说,负载平衡系统是运行时环境,而不是开发环境,但对于开发者来说,了解负载平衡系统是有必要的。

某些高性能计算系统主要用于提供共享的多任务处理环境。

对于SMP系统来说,操作系统内置的任务调度器可以完成任务的调度功能。

对于DMP系统来说,需要专门的软件来进行任务调度,达到负载平衡。

负载平衡系统通过了解系统中各个结点的负载状况、计算能力、内存状况等,可以合理地分配任务的执行结点,必要时迁移现有的任务到其他结点,从而达
到提高系统吞吐量的作用。

著名的负载平衡系统包括Platform公司的LSF(Load Sharing Facility)和Veridian的PBS(Portable Batch System)。

这两个系统都支持多种操作系统和硬件平台,能够管理异构的集群系统。

另外开放源代码的OpenMosix主要支持Linux集群系统。

发展趋势
OpenMP将成为支持SMP系统编程的主要标准,将来的工作在于研究和开发更加有效的OpenMP编译器,以及更加强大友好的开发、调试工具。

MPI和PVM将仍然是DMP系统的主要标准。

并行库是很有前途的开发方式和研究方向,随着更多的并行程序库的出现,并行化编程会越来越容易。

程序自动并行化技术也能大大缩短并行程序的开发时间,但目前的技术即使对SMP系统也没有达到实用的水平,还需要技术上的突破。

网格计算是现在的热门话题,也是将来高性能计算的发展方向之一。

为网格计算制定标准,提供所需的开发环境和运行环境将是未来的发展方向。

相关主题