转载

并行计算知识科普

简介

并行计算的概念是随着最近10年Hadoop的普及而逐渐进入国内互联网相关工业界的。但是他其实是一个很早很早就有的概念,因为计算机的诞生就是为了能快速做科学计算,为了提高计算效率,所以从计算机诞生的那一天开始,人们就开始研究这个领域。

如果你喜欢本博客,请点此查看本博客所有文章: http://www.cnblogs.com/xuanku/p/index.html

并行计算主要分成三类:

  1. 比特级并行计算

    这一类主要是指提高总线带宽。从8位提高到16位的话,就能让效率提高一倍。

  2. 指令级并行计算

    CPU内部流水(scala)并行处理。

  3. 任务级并行计算

    这一类是本文重点描述的类型。提供相同数据或者不同数据在不同计算单元上的并行处理能力。

针对任务级并行计算,远在1966年,一个叫Michael.J.Flynn(1)的哥们按照当时计算机CPU的体系结构讲计算机分成了四类。后来人们把这个计算机分类的方法叫Flynn分类法(2)。

这个分类的方法到现在也是合适的:

在这四个分类里面,S代表Single,M代表Multiple, I代表Instruction, D代表Data。

  1. SISD

    单指令单数据。在CPU里面有一个CU(Control Unit),来从主存里获取一条指令流(IS,Instruction Stream),从一个地方获取数据(Data Stream),再发送给一个PU(Processing Unit)。

  2. SIMD

    单指令多数据。跟Hadoop的思想很类似,只是Hadoop的每个PU是一台机器或者一个槽位,Flynn当时提这个分类的时候指的是CPU中的一个计算单元,GPU就是一个典型的SIMD的处理器。

  3. MISD

    多指令但数据。他的存在只是为了让这个分类更完整而已,没有这种计算机或者实际需求。当然,有的学着将流水系统(scala)称之为MISD。

  4. MIMD

    多指令多数据。这个是最复杂的情况,也是并行计算里面研究比较多的一个分支。

在并行计算领域里面,一般不讲SISD和MISD,只研究SIMD和MIMD两个分类。

到现在的话,随着集群思想的发展,人们套用这四个分类,将I替换为P(Program)。比如Hadoop就是一个典型的SPMD的编程模型。

SIMD

SIMD的并行计算机的研究是从上个世纪70年代一直到80年代中期。这是上个世纪70年代的主流研究方向。按照这个思路生产出来的计算机又叫向量处理机(Vector Processor/Array Processor)。

当时的代表机器有两款:

  1. CDC公司的STAR-100
  2. cray公司的cray-1

MIMD

MIMD的研究从上个世纪80年代开始逐渐占据了主流,也取得了一系列卓越的成绩。在这个领域,主要分成了两个分支,一个分支主要研究体系结构,一个分支主要研究编程界面。前者偏硬件,旨在提高不同类型并行计算需求的计算效率;后者偏软件,旨在研究如何简化撰写并行计算代码的成本。

体系结构

体系结构主要从如下三方面来了解:

  1. 计算单元
  2. 访存模式
  3. 网络连接

典型的并行计算体系结构是按照计算单元和访存模式来分类的,网络连接另起篇章来描述。体系结构的主要分类如下:

  1. SMP

    Symmetric Multi-Processing。对称多处理器。多个计算单元公用内存,每个计算单元对主存的访问是平等的。现在典型的线上服务器都是采用SMP处理器的机器。

  2. DSM

    Distribute Shared Memory。跟SMP相反,处理器对主存访问是不公平的,对有的存储区域访问快,有的存储区域访问慢。但是逻辑上每个处理器看到的还是一个统一的地址空间,这样能保证编程模型相对简单。

  3. Cluster

    典型的是Hadoop集群, 采用典型的商用服务器(少核+少磁盘)+商用交换机, 每个服务器一个节点, 靠人海战术, 很多个节点放一起来并行工作。

  4. Constellation

    Cluster是小机器放一起, Constellation就是"复仇者联盟", 各个都是精英, 每个节点有甚至数以千计的CPU, 以及有很大的存储空间(可能是共享)。

  5. MPP

    跟集群类似, 只是这一类都是特殊情况特殊处理。网络会有自己专用的网络(往往是不计成本), 会运行自己专用的操作系统, 编译系统和作业管理系统。

    这类专用的系统在高性能计算机排名中占据了大壁江山。

编程模型

当前比较流行的并行编程环境主要分为三类:

  1. 消息传递(LogP)

    支持大粒度的进程级并行, 所以具有很好的可移植性, 几乎支持所有主流的并行计算体系架构。但是因为数据必须通过消息传递来进行交互, 所以其编程难度是这几个编程模型中最复杂的, 也是上手成本最高的。

    典型代表: MPI, PVM

    MPI是当年为了统一不同的MPP厂家编程方式的不同而制定的工业标准, 其强调的是通信性能;

    PVM不是一个库, 他为用户抽象成了一个大型操作系统。PVM内部将每个子任务称之为一个虚拟机, 各个虚拟机之间通过网络来传递数据, 他强调的是虚拟机的异构, 容错和可扩展性。相比而言, 性能没那么看重。

  2. 共享存储(PRAM)

    只支持 SMP&DSM 的体系结构, 并行编程的难度较小, 但一般情况下, 并行性能不如消息传递的编程模型, 且移植性差。

    典型代表: OpenMP

  3. 数据并行(BSP)

    将数据拆成多份运行同样的程序, 并行编程的成本相对较低, 但并行效果一般, 以为他是一个松散同步的编程框架。

    典型代表: HPF。Hadoop/Spark。

参考

  1. Michael.J.Flynn http://arith.stanford.edu/~flynn/
  2. Flynn's taxonomy http://en.wikipedia.org/wiki/Flynn%27s_taxonomy
  3. 并行计算导论 http://pan.baidu.com/disk/home#path=%252Fcloud_doc%252Fknowledge%252Fcomputer_science%252Farch%252Fcomputing
  4. MPI vs PVM. http://wenku.baidu.com/link?url=FLzT76PC4yfGxmGdWUiODHzRubvyuYkBru5WIG52h7wvlQBS39W-TX6BUgetecrBp5bkfXQ7CuTbFUKGUszX0D3Zkq3RSDoqO3AXUDZB21G
  5. Linux高性能集群计算. http://docs.babel.baidu.com/doc/cd621946-dfc2-4346-82c4-aa6d86c3ddce
正文到此结束
Loading...