HPC系统实际上就是一个并行计算系统,很多初学者刚接触并行计算的时候会对MPI、OpenMPI和OpenMP产生非常大的疑惑,主要原因是对这几个概念本身理解的不清晰以及这几个缩写的字母确实是如此的近似。下面先通过一张图来看看MPI、OpenMPI和OpenMP的区别。
MPI(Message Passing Interface)是信息传递接口,是独立于语言的通信协议(标准),是一个库。MPI的实现有MPICH、MPI-1、MPI-2、OpenMPI、IntelMPI、platformMPI等等,OpenMPI(open Message Passing Interface)是MPI的一种实现,也是一种库项目。
OpenMP(Open Multiprocessing)是一种应用程序界面(即Application Program Interface),是一种并行的实现和方法,也可以认为是共享存储结构上的一种编程模型。
在当前的并行计算系统中,OpenMP和OpenMPI都是需要的(从上面的各自概念可以看出),OpenMP用于本地的并行计算(共享内存内存架构),支持目前所有平台上的程序共享内存式并行计算,它相当于是给出了一个让并行编程更加容易实现的模型,而OpenMPI则是用于机器之间的通信(分布式内存架构)。
从系统架构来看,目前的商用服务器大体可以分为三类,即对称多处理器结构SMP (SymmetricMulti-Processor) ,非一致存储访问结构 NUMA(Non-Uniform MemoryAccess) ,以及海量并行处理结构MPP(Massive ParallelProcessing) 。
它们的特征分别是共享存储型多处理机有两种模型,即均匀存储器存取(Uniform-Memory-Access,简称UMA)模型和非均匀存储器存取(Nonuniform-Memory-Access,简称NUMA)模型。而COMA和ccNUMA都是NUMA结构的改进。
SMP (SymmetricMulti-Processor)
SMP对称多处理系统内有许多紧耦合多处理器,在这样的系统中,所有的CPU共享全部资源,如总线,内存和I/O系统等,操作系统或管理数据库的复本只有一个,这种系统有一个最大的特点就是共享所有资源。多个CPU之间没有区别,平等地访问内存、外设、一个操作系统。操作系统管理着一个队列,每个处理器依次处理队列中的进程。如果两个处理器同时请求访问一个资源(例如同一段内存地址),由硬件、软件的锁机制去解决资源争用问题,SMP服务器CPU利用率状态如下。
所谓对称多处理器结构,是指服务器中多个CPU对称工作,无主次或从属关系。各CPU共享相同的物理内存,每个CPU访问内存中的任何地址所需时间是相同的,因此 SMP 也被称为一致存储器访问结构 (UMA:Uniform Memory Access) 。对 SMP 服务器进行扩展的方式包括增加内存、使用更快的 CPU 、增加 CPU 、扩充 I/O(槽口数与总线数) 以及添加更多的外部设备 (通常是磁盘存储) 。
SMP服务器的主要特征是共享,系统中所有资源(CPU 、内存、 I/O 等)都是共享的。也正是由于这种特征,导致了SMP 服务器的主要问题,那就是它的扩展能力非常有限。对于SMP服务器而言,每一个共享的环节都可能造成SMP服务器扩展时的瓶颈,而最受限制的则是内存。由于每个 CPU 必须通过相同的内存总线访问相同的内存资源,因此随着 CPU 数量的增加,内存访问冲突将迅速增加,最终会造成CPU资源的浪费。实验证明,SMP服务器CPU利用率最好的情况是2至4个CPU 。
NUMA(Non-UniformMemory Access)
NUMA技术可以把几十个 CPU( 甚至上百个 CPU) 组合在一个服务器内,弥补了SMP 在扩展能力上的限制,NUMA 服务器 CPU 模块结构如下。
NUMA服务器的基本特征是具有多个 CPU模块,每个CPU模块由多个CPU(如4个)组成,并且具有独立的本地内存、 I/O槽口等。由于其节点之间可以通过互联模块(如称为Crossbar Switch) 进行连接和信息交互,因此每个CPU可以访问整个系统的内存(这是NUMA系统与MPP系统的重要差别) 。显然,访问本地内存的速度将远远高于访问远地内存(系统内其它节点的内存)的速度,这也是非一致存储访问NUMA的由来。由于这个特点,为了更好地发挥系统性能,开发应用程序时需要尽量减少不同CPU模块之间的信息交互。
利用NUMA技术,可以较好地解决原来SMP系统的扩展问题,在一个物理服务器内可以支持上百个CPU。
但NUMA技术同样有一定缺陷,由于访问远地内存的延时远远超过本地内存,因此当CPU 数量增加时,系统性能无法线性增加。如HP公司发布Superdome服务器时,曾公布了它与HP其它UNIX服务器的相对性能值,结果发现,64路CPU的Superdome (NUMA结构)的相对性能值是20,而8路N4000( 共享的SMP结构)的相对性能值是6.3。从这个结果可以看到,8倍数量的CPU换来的只是3倍性能的提升。
MPP(MassiveParallel Processing)
MPP和NUMA有所不同, MPP提供了另外一种进行系统扩展的方式,它由多个 SMP 服务器通过一定的节点互联网络进行连接,协同工作,完成相同的任务,从用户的角度来看是一个服务器系统。其基本特征是由多个 SMP 服务器(每个 SMP 服务器称节点)通过节点互联网络连接而成,每个节点只访问自己的本地资源(内存、存储等),是一种完全无共享(Share Nothing) 结构,因而扩展能力最好,理论上其扩展无限制,目前的技术可实现 512 个节点互联,数千个CPU。
在MPP系统中,每个SMP节点也可以运行自己的操作系统、数据库等。但和NUMA不同的是,它不存在异地内存访问的问题。换言之,每个节点内的CPU不能访问另一个节点的内存。节点之间的信息交互是通过节点互联网络实现的,这个过程一般称为数据重分配(Data Redistribution) 。
但是MPP服务器需要一种复杂的机制来调度和平衡各个节点的负载和并行处理过程。目前一些基于MPP技术的服务器往往通过系统级软件(如数据库)来屏蔽这种复杂性。举例来说,Teradata就是基于MPP技术的一个关系数据库软件,基于此数据库来开发应用时,不管后台服务器由多少个节点组成,开发人员所面对的都是同一个数据库系统,而不需要考虑如何调度其中某几个节点的负载。
MPP大规模并行处理系统是由许多松耦合的处理单元组成的,要注意的是这里指的是处理单元而不是处理器。每个单元内的 CPU都有自己私有的资源,如总线,内存,硬盘等。在每个单元内都有操作系统和管理数据库的实例复本。这种结构最大的特点在于不共享资源。
NUMA、MPP和SMP之间性能的区别
NUMA的节点互联机制是在同一个物理服务器内部实现的,当某个CPU需要进行远地内存访问时,它必须等待,这也是NUMA服务器无法实现CPU增加时性能线性扩展。
MPP的节点互联机制是在不同的SMP服务器外部通过I/O实现的,每个节点只访问本地内存和存储,节点之间的信息交互与节点本身的处理是并行进行的。因此MPP在增加节点时性能基本上可以实现线性扩展。
SMP所有的CPU资源是共享的,因此完全实现线性扩展。
MPP、SMP和NUMA应用的区别
NUMA架构可以在一个物理服务器内集成许多CPU,使系统具有较高的事务处理能力,由于远地内存访问时延远长于本地内存访问,因此需要尽量减少不同 CPU模块之间的数据交互。显然,NUMA架构更适用于OLTP事务处理环境,当用于数据仓库环境时,由于大量复杂的数据处理必然导致大量的数据交互,将使CPU的利用率降低。
MPP系统不共享资源,因此对它而言,资源比SMP要多,当需要处理的事务达到一定规模时,MPP的效率要比SMP好。
由于MPP系统因为要在不同处理单元之间 传送信息,在通讯时间少的时候,那MPP系统可以充分发挥资源的优势,达到高效率。也就是说: 操作相互之间没有什么关系,处理单元之间需要进行的通信比较少,那采用MPP系统就要好。因此,MPP系统在决策支持和数据挖掘方面显示了优势。
MPP系统因为要在不同处理单元之间传送信息,所以它的效率要比SMP要差一点。在通讯时间多的时候,那MPP系统可以充分发挥资源的优势。因此当前使用的OTLP程序中,用户访问一个中心数据库,如果采用SMP系统结构,它的效率要比采用MPP结构要快得多。