并行计算的概念是随着最近10年Hadoop的普及而逐渐进入国内互联网相关工业界的。但是他其实是一个很早很早就有的概念,因为计算机的诞生就是为了能快速做科学计算,为了提高计算效率,所以从计算机诞生的那一天开始,人们就开始研究这个领域。
如果你喜欢本博客,请点此查看本博客所有文章: http://www.cnblogs.com/xuanku/p/index.html
并行计算主要分成三类:
比特级并行计算
这一类主要是指提高总线带宽。从8位提高到16位的话,就能让效率提高一倍。
指令级并行计算
CPU内部流水(scala)并行处理。
任务级并行计算
这一类是本文重点描述的类型。提供相同数据或者不同数据在不同计算单元上的并行处理能力。
针对任务级并行计算,远在1966年,一个叫Michael.J.Flynn(1)的哥们按照当时计算机CPU的体系结构讲计算机分成了四类。后来人们把这个计算机分类的方法叫Flynn分类法(2)。
这个分类的方法到现在也是合适的:
在这四个分类里面,S代表Single,M代表Multiple, I代表Instruction, D代表Data。
SISD
单指令单数据。在CPU里面有一个CU(Control Unit),来从主存里获取一条指令流(IS,Instruction Stream),从一个地方获取数据(Data Stream),再发送给一个PU(Processing Unit)。
SIMD
单指令多数据。跟Hadoop的思想很类似,只是Hadoop的每个PU是一台机器或者一个槽位,Flynn当时提这个分类的时候指的是CPU中的一个计算单元,GPU就是一个典型的SIMD的处理器。
MISD
多指令但数据。他的存在只是为了让这个分类更完整而已,没有这种计算机或者实际需求。当然,有的学着将流水系统(scala)称之为MISD。
MIMD
多指令多数据。这个是最复杂的情况,也是并行计算里面研究比较多的一个分支。
在并行计算领域里面,一般不讲SISD和MISD,只研究SIMD和MIMD两个分类。
到现在的话,随着集群思想的发展,人们套用这四个分类,将I替换为P(Program)。比如Hadoop就是一个典型的SPMD的编程模型。
SIMD的并行计算机的研究是从上个世纪70年代一直到80年代中期。这是上个世纪70年代的主流研究方向。按照这个思路生产出来的计算机又叫向量处理机(Vector Processor/Array Processor)。
当时的代表机器有两款:
MIMD的研究从上个世纪80年代开始逐渐占据了主流,也取得了一系列卓越的成绩。在这个领域,主要分成了两个分支,一个分支主要研究体系结构,一个分支主要研究编程界面。前者偏硬件,旨在提高不同类型并行计算需求的计算效率;后者偏软件,旨在研究如何简化撰写并行计算代码的成本。
体系结构主要从如下三方面来了解:
典型的并行计算体系结构是按照计算单元和访存模式来分类的,网络连接另起篇章来描述。体系结构的主要分类如下:
SMP
Symmetric Multi-Processing。对称多处理器。多个计算单元公用内存,每个计算单元对主存的访问是平等的。现在典型的线上服务器都是采用SMP处理器的机器。
DSM
Distribute Shared Memory。跟SMP相反,处理器对主存访问是不公平的,对有的存储区域访问快,有的存储区域访问慢。但是逻辑上每个处理器看到的还是一个统一的地址空间,这样能保证编程模型相对简单。
Cluster
典型的是Hadoop集群, 采用典型的商用服务器(少核+少磁盘)+商用交换机, 每个服务器一个节点, 靠人海战术, 很多个节点放一起来并行工作。
Constellation
Cluster是小机器放一起, Constellation就是"复仇者联盟", 各个都是精英, 每个节点有甚至数以千计的CPU, 以及有很大的存储空间(可能是共享)。
MPP
跟集群类似, 只是这一类都是特殊情况特殊处理。网络会有自己专用的网络(往往是不计成本), 会运行自己专用的操作系统, 编译系统和作业管理系统。
这类专用的系统在高性能计算机排名中占据了大壁江山。
当前比较流行的并行编程环境主要分为三类:
消息传递(LogP)
支持大粒度的进程级并行, 所以具有很好的可移植性, 几乎支持所有主流的并行计算体系架构。但是因为数据必须通过消息传递来进行交互, 所以其编程难度是这几个编程模型中最复杂的, 也是上手成本最高的。
典型代表: MPI, PVM
MPI是当年为了统一不同的MPP厂家编程方式的不同而制定的工业标准, 其强调的是通信性能;
PVM不是一个库, 他为用户抽象成了一个大型操作系统。PVM内部将每个子任务称之为一个虚拟机, 各个虚拟机之间通过网络来传递数据, 他强调的是虚拟机的异构, 容错和可扩展性。相比而言, 性能没那么看重。
共享存储(PRAM)
只支持 SMP&DSM 的体系结构, 并行编程的难度较小, 但一般情况下, 并行性能不如消息传递的编程模型, 且移植性差。
典型代表: OpenMP
数据并行(BSP)
将数据拆成多份运行同样的程序, 并行编程的成本相对较低, 但并行效果一般, 以为他是一个松散同步的编程框架。
典型代表: HPF。Hadoop/Spark。