并行与分布式程序设计
Flynn’s taxonomy
根据指令和数据能否同时执行, 将计算机系统分为四类:
- SISD (Single Instruction Single Data): 单指令, 单数据
- SIMD (Single Instruction Multiple Data): 单指令, 多数据
- MISD (Multiple Instruction Single Data): 多指令, 单数据
- MIMD (Multiple Instruction Multiple Data): 多指令, 多数据
SISD
- 在单一的数据流上, 指令被顺序的执行.
- 运行在这类计算机上的算法是完全串行的, 不存在任何并行.
- 传统的冯诺依曼体系结构的计算机就是SISD系统
SIMD
-
在个条数据流上执行同一个指令, 数据层面的并行.
-
将多个数据流分配给多个运算单元, 所有运算单元同时处理每一步, 执行相同的命令(被同一个控制单元控制)
- 没有被分配任务的运算单元空闲等待
- 提前执行完的元算单元也需要等待
- 运算单元没有指令的存储功能, 一次只能执行当时被分配的一个指令
-
SIMD系统的一个典型应用是向量计算, 向量中的所有数同时进行相同的算术运算
-
支持向量计算的处理器叫做向量处理器, 与传统只支持标量计算的处理不同, 向量处理器有以下特点:
- 向量寄存器: 能够存储有多个操作数组成的向量
- 向量化的功能单元: 同一个操作可以被应用到向量的每一个元素上
- 向量化的指令: 用来计算向量的运算方法
MISD
- 多个处理器由不同的控制单元控制, 在同一个数据流上分别执行不同的操作. 指令层面的并行
MIMD
- 包含多个完整独立的处理单元, 每个处理单元都有自己的控制单元和运算单元, 可以针对分配到的数据执行不同的任务
- 与SIMD的所有运算单元统一执行不同, MIMD的所有处理器没有统一的时钟, 每个处理器可以按照自己的节奏执行, 互不影响.
- 根据处理器和内存之间的访问关系, MIMD分为两类
- 共享内存系统
- 所有处理器通过一个互联网络和内存系统相连
- 每个处理器可以访问每一块内存
- 处理器之间不是直接通信, 而是通过共享数据进行隐式通信
- 通常包含一个或多个多核处理器
- 共享内存系统分为两类
- 一致存访问系统: 一般意义上的共享内存系统
- 非一致内存访问系统: 每个多核处理器单独与一块内存相连, 访问其余内存块时, 需要通过其余多核处理器, 访问速度较慢.
- 一致存访问系统: 一般意义上的共享内存系统
- 分布式内存系统
- 最常见的类型就是集群: 多个服务器互相连接形成
- 严格意义上来讲集群是一个混合系统, 每一个节点是一个共享内存系统, 多个节点相互连接形成分布式内存系统
- 共享内存系统
- SPMD (SIngle Program Multiple Data): SIMD中的一种分类
- 多线程控制, 但是每个处理器上拥有的都是相同的程序指令.
- 只有一份可执行代码, 通过条件转移等语句, 让该代码表现得好像在不同处理器上执行不同程序(实际上不同程序执行的都是同一个程序).
并行算法性能的评价指标
加速比
- 用来衡量使用并行方式解决问题所带来的性能提升. 加速比越大, 说明性能提升越多.
- 假设使用单个处理单元解决问题的时间是Ts(也就是最快的串行算法时间), 使用p个相同的处理单元解决这个问题的时间是Tp(并行算法的时间), 那么加速比S= T s T p \frac{Ts}{Tp} TpTs
- S=p : 线性加速比, 执行速度随着处理器数量的提升而加快, 也是理想加速比.
- S<p: 现实中常见的加速比
- S>p: 超线性加速比 (现实中存在)
- 如果一个问题的解决有多个不同的串行算法, Ts指的是其中最快的那一个. 比如串行冒泡排序150s, 快排30s, 并行冒泡40s, 加速比S=30/40.
Amdahl’s Law
除非一个串行程序的执行几乎全部都并行化, 否则不论多少可利用的核, 通过并行化产生的加速比都会是受限的.
- Amdahl 定律的推导
- 理想化条件
- 可并行部分为理想加速比
- 算法的时间只包括程序的运行时间不包括调度通信等额外开销
- 程序的串行算法时间Ts, 可并行化部分为 α \alpha α
- 并行化程序时间Tp=Ts * (1- α \alpha α) + Ts * α \alpha α / p
- 化简以后得S= T s T p \frac{Ts}{Tp} TpTs= 1 a p + 1 − a \frac{1}{\frac{a}{p}+1-a}
- 理想化条件