目前两种最重要的并行编程模型是数据并行和消息传递数据并行编程模型的编程级别比较高编程相对简单但它仅适用于数据并行问题消息传递编程模型的编程级别相对较低但消息传递编程模型可以有更广泛的应用范围。
数据并行即将相同的操作同时作用于不同的数据因此适合在SIMD及SPMD并行计算机上运行在向量机上通过数据并行求解问题的实践也说明数据并行是可以高效地解决一大类科学与工程计算问题的。
数据并行编程模型是一种较高层次上的模型它提供给编程者一个全局的地址空间一般这种形式的语言本身就提供并行执行的语义因此对于编程者来说只需要简单地指明执行什么样的并行操作和并行操作的对象就实现了数据并行的编程。
数据并行编程模型虽然可以解决一大类科学与工程计算问题但是对于非数据并行类的问题如果通过数据并行的方式来解决一般难以取得较高的效率数据并行不容易表达甚至无法表达其它形式的并行特征
并行程序是通过并行语言来表达的并行语言的产生主要有三种方式:
1 设计全新的并行语言;
2 扩展原来的串行语言的语法成分使它支持并行特征;
3 不改变串行语言仅为串行语言提供可调用的并行库。
并行编程模型除了数据并行和消息传递之外还有共享变量模型函数式模型等等但它们的应用都没有数据并行和消息传递那样普遍
并行语言的发展其实十分迅速并行语言的种类也非常多但真正使用起来并被广为接受的却寥寥无几,因此这里并没有介绍某一具体的并行语言而只是给出了并行语言产生的基本方法。对FORTRAN和C的扩充是最常见的并行语言产生方法,MPI并行程序设计就是和FORTRAN或C结合起来实现的。
分类:
并行算法是给定并行模型的一种具体明确的解决方法和步骤按照不同的划分方法。
并行算法设计
并行算法基本上是随着并行机的发展而发展的从本质上说不同的并行算法是根据问题类别的不同和并行机体系结构的特点产生出来的一个好的并行算法要既能很好地匹配并行计算机硬件体系结构的特点又能反映问题内在并行性。
对于机群计算有一个很重要的原则就是设法加大计算时间相对于通信时间的比重减少通信次数甚至以计算换通信。这是因为对于机群系统一次通信的开销要远远大于一次计算的开销。因此要尽可能降低通信的次数或将两次通信合并为一次通信。
基于同样的原因,机群计算的并行粒度不可能太小,因为这样会大大增加通信的开销。如果能够实现计算和通信的重叠,那将会更大地提高整个程序的执行效率,因此对于机群计算可以是数值或非数值的计算这些都不是影响性能的关键。也可以是同步、松同步或异步的但,以同步和松同步为主并行的粒度一般是大粒度或中粒度的一个好的算法一般应该呈现如下的计算模式:
图 5 没有考虑计算与通信的重叠若能够实现计算与通信的重叠那将是更理想的计算模式
图 6 是加入了计算和通信重叠技术后的SPMD并行算法的计算模式
对于MPMD并行算法各并行部分一般是异步执行的,而不是象SPMD那样的同步或松同步方式。因此只要能够大大降低通信次数增大计算相对于通信的比重,则该MPMD算法就可以取得较高的效率,图 7 给出了MPMD算法的一种比较合适的计算模式。
并行算法设计也是并行程序设计的前提没有好的并行算法就没有好的并行程序因此在并行程序设计之前必须首先考虑好并行算法该算法要能够将并行机和实际的问题很好地结合起来既能够充分利用并行机体系结构的特点又能够揭示问题内在的并行性