目录
从本文开始,我们开始认识学习并行程序设计,本专栏主要对MPI并行程序设计进行介绍。
一、并行编程模型
并行编程非常重要的两种编程模型是数据并行和消息传递。
数据并行编程模型的编程级别较高,编程难度较简单,但仅适用于数据并行问题。相比之下,消息传递编程模型的编程级别较低,但是应用范围更加广泛。
1、数据并行
数据并行是将相同的操作同时作用于不同的数据,适合在SIMD(Single Instruction Multiple Data,单指令多数据)和SPMD(Single Program Multiple Data,单程序多数据)并行计算机上运行,同时在向量机上通过数据并行求解问题的实现也说明了数据并行是可以高效解决科学与工程计算问题的。
数据并行编程模型是一种较高层次上的模型,它为程序员提供了一个全局的地址空间,一般这种形式的语言自身提供并行执行的语义,对于程序员而言,只需简单地指明执行何种并行操作和操作的对象即可实现数据并行编程。例如数组运算,使得数组B和C的对应元素相加后赋给A,则通过语句
A=B+C(或其它表达式)
即可实现上述功能,使并行机对B、C的对应元素并行相加并将结果赋给A。因此数据并行的表达过程相对简洁,并不需要程序员关心计算机是如何执行该操作的。
数据并行编程模型虽然可以解决一部分科学工程计算问题,但对于非数据并行类的问题,如果利用数据并行的方式解决,无法取得理想的计算效率,数据并行难以表达其它形式的并行特征。
数据并行发展至今,高效的编译实现是其重要环节,有高效的编译器,数据并行程序便可以在共享内存和分布式内存计算机上取得较高的效率,这样可以提高并行程序的开发效率,提高并行程序的可移植性,进一步推广并行程序设计。
2、消息传递
消息传递是各个并行执行的部分之间通过传递消息来实现交换信息、协调步伐、控制执行。消息传递主要是面向分布式内存计算机,也可以适用于共享内存计算机。消息传递为程序员提供了更加灵活的控制手段和表达并行的方法,一些用数据并行方法难以表达的并行算法,都可以通过消息传递模型来实现,灵活性高,控制方式多样化。
消息传递模型一方面可以为程序员提供灵活性,另一方面能够将各个并行执行部分之间复杂的信息交换和协调、控制任务交给程序员,这也在一定程度上增加了程序员的负担,所以消息传递编程模型的编程级别低。虽然如此,消息传递的基本通信模式是简单清楚的,学习理解并不是特别困难,因此目前大量并行程序都是采取的消息传递编程模式。
表 数据并行和消息传递并行编程模型对比
对比内容 | 数据并行 | 消息传递 |
编程级别 | 高 | 低 |
适用的并行计算类型 | SIMD/SPMD | SIMD/MIMD/SPMD/MPMD |
执行效率 | 取决于编译器 | 高 |
地址空间 | 单一 | 多个 |
存储类型 | 共享内存 | 分布式或共享内存 |
通信实现 | 编译器负责 | 程序员负责 |
问题类 | 数据并行类问题 | 数据并行、任务并行 |
目前状况 | 缺乏高效的编译器支持 | 广泛使用 |
二、并行语言
并行程序是通过并行语言表达的,并行语言的产生主要有三种方式:
①设计全新的并行语言;
②扩展原有串行语言的语法成分,使其支持并行特征;
③不改变串行语言,仅为串行语言提供可调用的并行库。
对于第一种方式,设计一种全新语言的优点是可以完全摆脱串行语言的束缚,从语言成分上直接支持并行,这样可使并行程序编写更加自然方便,相应的程序也更容易在并行计算机上实现。但是由于并行计算至今还没有像串行计算那样有统一的冯·诺依曼模型可供遵循,因此并行计算机、并行模型、并行算法和并行语言的设计和开发千差万别,没有统一的标准,虽然有多种全新并行语言出现,但至今未出现一种新的并行语言成为普遍接受的标准,并且设计全新的语言实现起来难度大、工作量大。
对于第二种方式,对原有串行语言进行扩展,通过对串行语言进行标注,即对串行语言的并行扩充作为原来串行语言的注释,对于这样的并行程序,若采用原来的串行编译器编译,标注的扩充部分并不起作用,仍将该程序作为一般的串行程序处理,若使用扩充后的并行编译器编译,则该并行编译器就会根据标注的要求,将原来串行执行的部分转换为并行执行。对串行语言的并行扩充,相对于设计全新的并行语言,显然难度有所降低,但需要重新开发编译器,使他能够支持扩充的并行部分,一般地,这种新的编译器通常和运行时支持的并行库相结合。
对于第三种方式,仅为串行语言提供并行库,是一种对原来串行程序设计改动最小的并行化方法。这样,原有串行编译器也可以使用,不需要任何修改,程序员只需要在原来的串行程序中加入对并行库的调用,就可以实现并行程序设计。MPI就是这样的方式。
对于这三种并行语言的实现方法,目前最常使用的是第二种和第三种,尤其是第三种。
三、小结
并行编程模型除了数据并行和消息传递之外,还有共享变量模型、函数式模型等,但它们的应用都没有数据并行和消息传递普遍。并行语言的发展十分迅速,种类繁多,但真正使用广泛的却寥寥无几。MPI作为当前使用最广泛的将Fortran或C语言相结合的并行设计“语言”。
下一节我们将介绍“并行算法”基本情况。