并行算法
一、并行算法
什么是并行算法? 它可理解为: 适合于在某类并行计算机上求解问题和处理数据的算法, 是一些可同时执行的诸进程的集合, 这些进程相互作用和协调作用, 从而达到对给定问题的求解。
二、并行计算机
并行处理就是把一个传统串行处理的任务分解开来, 并将其分配给多个处理器同时处理, 即在同一时间间隔内增加计算机的操作数量。为并行处理所设计的计算机称为并行计算机。
三、Flynn 分类法
它首先按指令流的重数将机器分为二类: SI ( SingleInstruction Stream)单指令流; MI (Multiple Instruction Stream)多指令流。
其次, 按操作数流的重数加以区分:SD (Single Data Stream)
单数据流;MD (Multiple Data Stream) 多数据流。这样, 就有4 种可能的组合, 即SISD,SIMD, MISD, MIMD。
-
SISD:SISD计算机代表如今使用的大多数串行计算机, 是单指令流对单数据流进行操作。
-
SIMDSIMD 计算机是所谓的阵列机, 它有许多个处理单元(PE) , 由同一个控制部件管理, 所有PE 都接收控制部件发送的相同指令, 对来自不同数据流的数据集合序列进行操作。
-
MISD:MISD 计算机从概念上讲, 则有多个PE, 接收不同的指令, 对相同数据进行操作, 一般认为MISD机目前尚无实际代表, 此类结构很少受到人们的注意。
-
MIMD:MIMD 计算机包括多处理机和多计算机两类, 它们都由可各自执行自己程序的多处理器组成。其中, 多处理机以各处理器共享公共存储器为特征, 而多计算机以各处理器经通信链路传递信息为特征。它们与SIMD计算机的根本区别在于:SIMD 机中每台处理器只能执行中央处理器的指令, 而MIMD机中每台处理器仅接受中央处理器分给它的任务, 它执行自己的指令, 所以可达到指令、任务并行。
四、并行计算机分类
根据Flynn 分类法, 通用的并行计算机分为SIMD机和MIMD机两大类, 它们是并行算法的物质基础。这两大类还可进一步细分,SIMD 模型可细分为基于共享存储的SIMD 模型和基于互连网络的SIMD模型;MIMD 模型主要可细分为基于共享存储的MIMD 模型和基于异步通信的互连网络模型。
4.1、SIMD 共享存储模型
SIMD 共享存储模型是假定有有限或无限个功能相同的处理器, 每个处理器拥有简单的算术运算和逻辑判断能力, 在理想的情况下假定存在一个容量无限大的共享存储器, 在任何时刻, 任意一个处理器均可通过共享存储器的共享单元同其它任何处理器互相交换数据。
由于实际情况是共享存储器的容量是有限的, 因此在同一时刻, 当多个处理器访问同一单元时就会发生冲突。根据模型解决冲突的能力,SIMD 共享存储模型又可进一步分为
(1) 不容许同时读和同时写。即每次只允许一个处理器读和写一个共享单元, 这种模型简记为SIMD-EREWPRAM。
(2) 容许同时读, 但不容许同时写。即每次允许多个处理器同时读一个共享单元的内容, 但每次只允许一个处理器向某个共享单元写内容, 这种计算模型简记为SIMD-CREW PRAM。
(3) 允许同时读和写。即每次容许任意多个处理器同时读和同时写同一个共享存储单元, 这种计算模型简记为SIMD-CRCWPRAM。
4.2、SIMD 互连网络模型
在SIMD 互连网络模型中, 每个处理器在控制器控制下或处于活动状态, 或处于不活动状态。活动状态的处理器都执行相同的指令, 处理器之间的数据交换是通过互联网络进行的。根据互连网络的连接方式,SIMD 互连网络模型又分为两类。一类是处理器-处理器之间直接互连(称为闺房式) 另一类是处理器-存储器之间直接互连(称为舞厅式) ,
4.3、MIMD共享存储模型
在共享存储的MIMD 计算模型中, 所有的处理器共享一个公共的存储器, 每个处理器各自完成自己的任务, 各处理器之间的通信是通过共享存储器中的全局变量来实现的。在这种模型上开发的算法称之为异步并行算法。
4.4、MIMD 互连网络模型
在基于互连网络的MIMD 计算模型中, 处理器之间不存在共享存储器, 每个处理器从各自存储器中存取指令和数据。各处理器之间用通信网络以信息方式交换数据。在此模型上设计的算法称为分布式算法。
在基于互连网络的模型中,由于数据分布存储,信息通过互连网络进行传递,因此算法与处理器互联的拓扑结构紧密相关,
五、一些常用的互连网络的拓扑结构
5.1. 一维线性连接
此连接方式是所有并行机中处理器之间一种最简单的互连方式。其中每个处理器只与其左右近邻相连(头尾处理器除外) ,
5.2.二维网孔连接
在此连接方式中处理器之间按二维阵列形式排列, 每个处理器仅与4 个相邻处理器(若有的话) 互连,
5.3. 超立方连接
对于N =2K个处理器, 可将其组织成一个k-维超立方连接。首先, 处理器按0 ,1 , 2 , ⋯ ,2K-1 依次编号, 然后, 处理器之间按下述方式连接: 处理器i 与处理器j 有线连接当且仅当i与j 的二进制表示中仅一位不同。下图给出了k =4 的四维超立方连接方式。
5.4. 树形连接方式
树形连接方式是利用二叉树这种常用的数据结构组织而成的。对于一棵有d 级( 编号由根至叶为0 到d -1 ) 的满二叉树, 每个结点表示一个处理器, 因此, 对于一个具有d级的树形连接方式, 共有n =2d- 1个处理器组成。在此结构中, 处理器的工作方式通常是: 叶子结点对数据进行计算, 而内部结点仅负责叶子结点间的通信及简单的逻辑运算。下图为出d =4 的树形连接结构。
5.5. 洗牌-交换连接方式
洗牌-交换是一类非常有用的互连结构。对于n =2k处理器, 将它们按0 ,1 , 2 , ⋯ , 2k - 1编号, 设处理器i的二进制表示为ik -1 , ik - 2 , ⋯ , i1 , i0 。
下面定义洗牌与交换二个连接函数:
SH ( ik - 1 ik -2 ⋯i0 ) =ik - 2 ik -3 ⋯i0 ik -1
EX ( ik - 1 ik -2 ⋯i1 i0 ) =ik - 1 ik -2 ⋯i1 i0
其中, i0 = 1- i0 。在此连接方式中, 处理器i 与二进制表示为ik -2 ik - 3 ⋯i0 ik -1 或ik -1 ik - 2 ⋯i1 i0的处理器相连。下图给出了n = 23的洗牌-交换连接结构, 其中实线表示EX 函数, 虚线表示SH 函数。
六、并行算法的复杂性
在SIMD 计算模型上的并行算法, 其复杂性是指, 在最坏情况下, 算法的运行时间T(n)和所需的处理机的数目P(n), 其中n 为问题的规模, 其复杂性度量是确定T(n)和P(n)的上界。
在MIMD 计算模型上, 对于基于共享存储的并行算法, 其复杂性度量与SIMD模型上的并行算法基本一致。
而对于异步通信的分布式计算模型,其算法复杂性衡量标准主要有两个,一个是在最坏情况下算法的运算时间, 另一个是在最坏情况下算法的通信复杂性,即在最坏情况下算法在整个执行期间所传送的消息总数目。在分析算法的运算时间时, 必须考虑通信时间, 由于处理机之间传递的消息到达目的地的时间通常不易确定。例如, 一则消息可能因通信链路被占用而需先等待。因此要想精确地分析算法的运算时间就变得非常困难。目前, 估计算法的运算时间都是假定邻接处理机之间的通信可在O(1)时间内完成这一假定基础上得出的, 不考虑信息的等待时间。在基于异步通信的分布式计算机模型中,并行算法复杂性是以通信复杂性为主要衡量标准,其次才是算法的运算时间。
七、并行算法的性能评价
7.1、并行算法的成本C(n)
并行算法的成本C(n) 定义为并行算法的运算时间T (n)与并行算法所需处理机数目P(n)的乘积, 即
C(n) = T(n)·P(n)
7.2、加速(又称加速比)Sp(n)
对一个求解问题, 令Ts(n)是最快的串行算法在最坏的情况下的运算时间, Tp(n) 是求解此问题的某一并行算法在最坏情况下的运算时间, 则此并行算法的加速Sp(n) 可定义为
Sp(n) = Ts(n)/Tp(n)
由定义可看出, 并行算法的加速反映了该算法的并行性对运算时间的改善程度。Sp(n)越大, 则并行算法越好。由于任何并行算法都能在一台串行机上模拟实现, 因此Tp(n)·P (n)≥Ts(n), 从而
1≤Sp(n)≤P(n)当Sp(n)= P(n) 时, 则具有这样加速比的并行算法为最优的并行算法。由于在通常情况下,一个问题不可能分解成P(n)个具有相同执行步数并且可以并行执行的子问题, 因此, 要达到Sp (n)=P(n)几乎是不可能的。
7.3、并行算法的效率Ep(n)
并行算法的效率可定义为算法的加速与处理机数目之比, 即
Ep(n) = Sp(n)/ P(n)
并行算法的加速不能反应处理机的利用率, 一个并行算法的加速可能很大, 但处理机的利用率却可能很低。并行算法的效率反映了在执行算法时处理机的利用情况。由于1≤Sp (n)≤P(n), 故0 <Ep(n)≤1
若一个并行算法的效率等于1 , 则说明在执行此算法的过程中每台处理机的能力得到了充分发挥。此时, Sp(n)=P(n), 因此, 此并行算法的串行模拟是求解问题的最佳串行算法。当然, 要达到Ep (n)= 1 几乎是不可能的。
八、并行算法设计
对于某一求解问题, 在设计并行算法时, 一般可采用3 种途径:
(1) 把已有的串行求解算法进行改造, 挖掘开发串行算法中固有的并行性, 使之适合于在并行计算机上运行。
(2) 从求解问题本身出发, 分析和改造求解问题中运算操作之间的相互关系和数据的相关性, 将问题划分成若干个能彼此并行执行的子问题。在此途径中, 应尽量采用一些像分治策略那样具有并行思想的设计策略。
(3) 借鉴和改造求解类似问题的并行算法, 产生求解本问题的并行算法。
在设计并行算法时, 要注意以下几点。
(1 ) 并行算法依赖于计算模型: 一个并行算法的性能在不同的计算模型上差别很大。这有时候是由于通信开销所致, 但有时候是由于别的因素所致。例如, 为了实现同步, 在MIMD计算模型上需要通过很费时间的软件来实现。因此,小粒度(同步之间执行很少步运算)算法不适合在MIMD共享存储模型上运行。
(2 ) 在存储分布模型上必须考虑通信成本: 在基于存储共享的计算模型上, 由于处理机之间的通信是通过全局共享存储变量完成的, 因此通信开销可忽略不计。在存储分布计算模型上, 数据通过互连网络从一个处理机传送到另一个处理机的开销可能很大( 须经很多中
间结点) , 因此, 有时候算法的通信复杂性比计算复杂性还要高, 也就是说, 通信所花费的时间比实际处理、变换所花费的时间还要长。
(3 ) 算法与数据的存储分布有关: 在互连网络计算模型中, 算法与数据分布密切相关,例如, 在单指令流的互连网络模型中, 数据存储分布的好坏直接影响算法的并行性; 在多指令流的互连网络模型中, 数据存储分布的好坏直接影响算法的通信开销。
九、并行算法描述
(1)
for each i1 , i2 , ⋯ , ik : P pardo …… endfor |
此语句表示编号为i1 , i2 , ⋯ , ik 的处理机, 若满足谓词P 为真, 则执行循环体的指令序列。要
用于描述SIMD 模型中的并行算法。
(2)
upon r eceiving M message from u do …… |
此语句表示执行结点一旦收到来自结点u的消息M后, 就执行相应的操作。
(3)
send M message to k |
此语句表示执行结点把信息M传送给k。