[并行与分布式程序设计] Flynn分类法 和 并行算法的评价指标

并行与分布式程序设计

  • Flynn's taxonomy
    • SISD
    • SIMD
    • MISD
    • MIMD
  • 并行算法性能的评价指标
    • 加速比
    • Amdahl's Law
    • 效率
    • 可扩展性
      • 三级目录

Flynn’s taxonomy

根据指令和数据能否同时执行, 将计算机系统分为四类:

  1. SISD (Single Instruction Single Data): 单指令, 单数据
  2. SIMD (Single Instruction Multiple Data): 单指令, 多数据
  3. MISD (Multiple Instruction Single Data): 多指令, 单数据
  4. MIMD (Multiple Instruction Multiple Data): 多指令, 多数据

SISD

  • 在单一的数据流上, 指令被顺序的执行.
  • 运行在这类计算机上的算法是完全串行的, 不存在任何并行.
  • 传统的冯诺依曼体系结构的计算机就是SISD系统

SIMD

  • 在个条数据流上执行同一个指令, 数据层面的并行.

  • 将多个数据流分配给多个运算单元, 所有运算单元同时处理每一步, 执行相同的命令(被同一个控制单元控制)

    • 没有被分配任务的运算单元空闲等待
    • 提前执行完的元算单元也需要等待
    • 运算单元没有指令的存储功能, 一次只能执行当时被分配的一个指令
      [并行与分布式程序设计] Flynn分类法 和 并行算法的评价指标_第1张图片
  • SIMD系统的一个典型应用是向量计算, 向量中的所有数同时进行相同的算术运算

  • 支持向量计算的处理器叫做向量处理器, 与传统只支持标量计算的处理不同, 向量处理器有以下特点:

    • 向量寄存器: 能够存储有多个操作数组成的向量
    • 向量化的功能单元: 同一个操作可以被应用到向量的每一个元素上
    • 向量化的指令: 用来计算向量的运算方法

MISD

  • 多个处理器由不同的控制单元控制, 在同一个数据流上分别执行不同的操作. 指令层面的并行

MIMD

  • 包含多个完整独立的处理单元, 每个处理单元都有自己的控制单元和运算单元, 可以针对分配到的数据执行不同的任务
  • 与SIMD的所有运算单元统一执行不同, MIMD的所有处理器没有统一的时钟, 每个处理器可以按照自己的节奏执行, 互不影响.
  • 根据处理器和内存之间的访问关系, MIMD分为两类
    • 共享内存系统
      • 所有处理器通过一个互联网络和内存系统相连
      • 每个处理器可以访问每一块内存
      • 处理器之间不是直接通信, 而是通过共享数据进行隐式通信
      • 通常包含一个或多个多核处理器
      • 共享内存系统分为两类
        • 一致存访问系统: 一般意义上的共享内存系统
          [并行与分布式程序设计] Flynn分类法 和 并行算法的评价指标_第2张图片
        • 非一致内存访问系统: 每个多核处理器单独与一块内存相连, 访问其余内存块时, 需要通过其余多核处理器, 访问速度较慢.
          [并行与分布式程序设计] Flynn分类法 和 并行算法的评价指标_第3张图片
    • 分布式内存系统
      • 最常见的类型就是集群: 多个服务器互相连接形成
      • 严格意义上来讲集群是一个混合系统, 每一个节点是一个共享内存系统, 多个节点相互连接形成分布式内存系统
        [并行与分布式程序设计] Flynn分类法 和 并行算法的评价指标_第4张图片
  • SPMD (SIngle Program Multiple Data): SIMD中的一种分类
    • 多线程控制, 但是每个处理器上拥有的都是相同的程序指令.
    • 只有一份可执行代码, 通过条件转移等语句, 让该代码表现得好像在不同处理器上执行不同程序(实际上不同程序执行的都是同一个程序).

并行算法性能的评价指标

加速比

  • 用来衡量使用并行方式解决问题所带来的性能提升. 加速比越大, 说明性能提升越多.
  • 假设使用单个处理单元解决问题的时间是Ts(也就是最快的串行算法时间), 使用p个相同的处理单元解决这个问题的时间是Tp(并行算法的时间), 那么加速比S= T s T p \frac{Ts}{Tp} TpTs
    • S=p : 线性加速比, 执行速度随着处理器数量的提升而加快, 也是理想加速比.
    • S
    • 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} pa+1a1
      • 无论处理器数量p如何增大, 加速比S上限为 1 1 − a \frac{1}{1-a} 1a1

效率

  • 理想状况下, 并行系统如果有p个处理单元, 那么它能提供的加速比为p, 但是现实中这几乎不可能办到, 因为处理单元空转和通讯通常会浪费一些时间. 效率通常是用于评价处理器在执行任务时是否被充分利用的性能指标
  • E= S p \frac{S}{p} pS= T s p ∗ T p \frac{Ts}{p*Tp} pTpTs= 1 a + p ∗ ( 1 − a ) \frac{1}{a+p*(1-a)} a+p(1a)1 (虽然amdahl定律是理想加速比的情况下推导出来的, 但是理想加速比仅针对可并行化部分, 但对于整体来说, 因为 α \alpha α ≠ \neq = 1, 所以依然可以看作是实际加速比, 而效率正是用来衡量实际情况下处理器的利用率的)
  • 为什么要引入效率这个评价指标
    • 因为加速比只是衡量了并行所带来的性能提升, 但是并行算法在不同的硬件环境上所带来的提升是不一样的, 只知道加速比并不能知道该并行算法的适用环境, 比如一个在p=2的系统上加速比6的并行算法, 到了p=4的系统上加速比只为7, 虽然核数提升了一倍, 但是加速比却只提升了1. 因此效率和加速比两个指标共同评价, 可以知道在特定环境下并行算法所能带来的性能提升, 可以根据实际情况选择适合的并行算法.

可扩展性

假设某并行程序在核数为p, 输入规模为n情况下, 其效率为E. 现增加核数p, 如果可以在增大规模p的情况下, 使其效率E可以一直保持不变, 则称程序时可扩展的

  • 强可扩展的: 保持规模不变时, 效率并不随着核数的增加而降低. (理想情况线性加速比, 效率始终为1)
    弱可扩展的: 问题以一定规模增大, 效率并不随着核数的增加而降低

(自己的理解, 还有待检验)

  • 根据公式S= T s T p \frac{Ts}{Tp} TpTs= 1 a p + 1 − a \frac{1}{\frac{a}{p}+1-a} pa+1a1和E= 1 a + p ∗ ( 1 − a ) \frac{1}{a+p*(1-a)} a+p(1a)1, 在p增大的情况下, S增大, E是会变小的 (因为处理器变多了, 每个处理器分配的任务也就变少了, 利用率自然就低了), 要想保持E不变, 就要改变 α \alpha α

  • 假设p增大m(m>0), α \alpha α改变t(t为实数), E= 1 a + p ∗ ( 1 − a ) \frac{1}{a+p*(1-a)} a+p(1a)1= 1 a + t + ( p + m ) ∗ ( 1 − a − t ) \frac{1}{a+t+(p+m)*(1-a-t)} a+t+(p+m)(1at)1= 1 a + p ∗ ( 1 − a ) + m − m ∗ α − t ∗ ( m + p − 1 ) \frac{1}{a+p*(1-a)+m-m*\alpha-t*(m+p-1)} a+p(1a)+mmαt(m+p1)1

    • E若保持不变, 则 m − m ∗ α − t ∗ ( m + p − 1 ) = 0 m-m*\alpha-t*(m+p-1) = 0 mmαt(m+p1)=0, t= 1 − α ( 1 + p − 1 m ) \frac{1-\alpha}{(1+\frac{p-1}{m})} (1+mp1)1α > 0, 所以需要增大并行化部分的比例 α \alpha α.
    • 如果扩大规模可以使得并行化部分的比例增大t, 那么该并行程序则是可扩展的, 效率可以保持不变
    • 如果扩大规模并不能使的并行化部分的比例增大t, 那么该并行程序则是不可扩展的, 效率会有所降低
      • 如果按照原并行化比例 扩大规模则扩大后的并行比例仍然为 α \alpha α, 效率降低
      • 只有按照> α \alpha α的并行比例 来扩大规模才有可能使得扩大之后的并行比例增加t, 使得效率不变.
        [并行与分布式程序设计] Flynn分类法 和 并行算法的评价指标_第5张图片
  • 可扩展性的现实意义: 我们的并行算法可能在实验环境下, 有很好的效率, 但是以后应用到生产中, 输入规模增大的时候, 我们希望仍然能保持这么好的效率, 就要考虑这个算法的可扩展性.

  • 可扩展性的作用:

  1. 度量并行系统性能的方法之一
  2. 度量并行体系结构在不同系统规模下的并行处理能力
  3. 度量并行算法内在的并行性
  4. 利用系统规模和问题规模已知的并行系统性能来预测规模增大后的性能
    [并行与分布式程序设计] Flynn分类法 和 并行算法的评价指标_第6张图片

三级目录

你可能感兴趣的:(并行与分布式程序设计,并行计算,simd,mimd)