最近在参加IPCC竞赛,在和老师交流的过程中,发现自己对很多基本的概念,业界的名词并没有那么了解,由于一直在做数值分析这块的东西,很多之前学过的内容慢慢的都遗忘了,为了扩宽自己的知识面,最近在看一些科普性质的博客,将一些比较精华的部分摘了下来,以便自己温故而知新。
- 高性能计算的相关概念
高性能计算(High performance computing, 缩写HPC) 指通常使用很多处理器(作为单个机器的一部分)或者某一集群中组织的几台计算机(作为单个计 算资源操作)的计算系统和环境。有许多类型的HPC 系统,其范围从标准计算机的大型集群,到高度专用的硬件。大多数基于集群的HPC系统使用高性能网络互连,比如那些来自 InfiniBand 或 Myrinet 的网络互连。基本的网络拓扑和组织可以使用一个简单的总线拓扑,在性能很高的环境中,网状网络系统在主机之间提供较短的潜伏期,所以可改善总体网络性能和传输速率。高性能计算主要涉及微处理器、高性能计算机系统、高性能并行算法与应用等多个核心技术。
我们平时经常说几节点,几核,几进程,几线程,这里面的节点就是指某一集群中的某台或多台计算机,核便是指计算机中的处理器,现在一般都是多核处理器,即在一个处理器上集成多个运算核心,从而提高计算能力。进程是一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程,比如在Windows系统中,一个运行的xx.exe就是一个进程。进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享数据。 - 高性能计算的分类
高性能集群在计算过程中,各节点是协同工作的,它们分别处理大问题的一部分,并在处理中根据需要进行数据交换,各节点的处理结果都是最终结果的一部分。高性能集群的处理能力与集群的规模成正比,是集群内各节点处理能力之和,但这种集群一般没有高可用性。高性能计算的分类方法很多。 - 从并行任务间的关系分类
- 高吞吐计算(High-throughput Computing)
有一类高性能计算,可以把它分成若干可以并行的子任务,而且各个子任务彼此间没有什么关联。因为这种类型应用的一个共同特征是在海量数据上搜索某些特定模式,所以把这类计算称为高吞吐计算。所谓的Internet计算都属于这一类。按照Flynn的分类,高吞吐计算属于SIMD(Single Instruction/Multiple Data,单指令流-多数据流)的范畴。 - 分布计算(Distributed Computing)
另一类计算刚好和高吞吐计算相反,它们虽然可以给分成若干并行的子任务,但是子任务间联系很紧密,需要大量的数据交换。按照Flynn的分类,分布式的高性能计算属于MIMD(Multiple Instruction/Multiple Data,多指令流-多数据流)的范畴。
有许多类型的HPC 系统,其范围从标准计算机的大型集群,到高度专用的硬件。大多数基于集群的HPC系统使用高性能网络互连,基本的网络拓扑和组织可以使用一个简单的总线拓扑。HPC系统由计算、存储、网络、集群软件四部分组成。
- 从计算模型类型分类
从数据流和指令的角度把计算模型分为4类(费林分类法)
(1) 单指令单数据流 (SISD): 非并行计算的模型,典型例子就是单核 CPU,所有数据都被一个处理器顺次处理,某一时刻只能使用一个指令。
(2) 单指令多数据流 (SIMD): 指多个不同的数据同时被相同的执行、指令集或者算法处理, GPU的计算模型。
(3) 多指令单数据流 (MISD): 在同一个数据流上执行不同的指令。
(4) 多指令多数据流 (MIMD): 是多核CPU的计算模型。 - 高性能计算HPC系统技术特点
高性能计算HPC系统的主流处理器是X86处理器,操作系统是linux系统(包括Intel、AMD、NEC、Power、PowerPC、Sparc等)、构建方式采用刀片系统,互联网络使用IB和10GE。
HPC集群中计算节点一般分3种: MPI节点、胖节点、GPU加速节点。双路节点称为瘦节点(MPI节点),双路以上称为胖节点;胖节点配置大容量内存;集群中胖节点的数量要根据实际应用需求而定。
HPC的算法(或者算法中的部分满足,其他部分通过CPU协调)必须满足一下几点要求:
(1) 每个数据(数据包)都需要经过相同的流程来处理
(2) 数据之间并没有相关性,即数据的计算不依赖另外一些数据的计算结果
(3) 数据量庞大
注:
- 胖节点和瘦节点(MPI节点)区别
胖节点一般是在HPC领域的概念。在高性能计算中,有些任务可以进行多计算节点并行计算,比如用多节点的刀片机来进行。而有些任务不能进行并行计算,只能单一节点计算,这就用到了所谓胖节点,胖节点一般处理能力强,有强大的处理器和比普通节点更大的内存、网络来进行单一任务的计算,这种节点一般用四路或者八路服务器。通常把双路称为瘦节点,将多路称为胖节点。相对而言,双路服务器作为主流产品,其价格比较低,通常也就是几万元人民币,但是多路服务器价格相对高一些,通常需要几十万元。
对于瘦节点而言,需要很多节点共同来承担大的计算作业。它采用软件的方法,将作业分拆给多个瘦节点,对于系统而言,需要大量的性能来处理通信。如果采用胖节点,例如 HP ProLiant DL785 G6,它是一款采用AMD Opteron六核处理器的8路服务器,具有512G内存和11个PCI-e I/O插槽。它具有48个处理内核,笼统看就相当于原来的48个单路服务器,它所具有的处理能力是惊人的。作为一个整体,服务器8个处理器之间进行数据交换,其速度远远高于节点机,因而具有更高的处理效能。
胖节点也好,瘦节点也好,应该说,各有其适用的范围。以胖节点为例,它就适用于对内存、处理性能要求高的计算任务。其实,除了胖节点、瘦节点之外,还有厚节点和图形加速节点的分别。对于用户而言,应该根据业务计算的需要,来合理选择计算节点。 - x86
X86就是采用CISC(Complex Instruction Set Computer,复杂指令架构计算机)架构的处理器,其价格便宜、兼容性好、稳定性较差、安全性不算太高,主要用在中小企业之中。大多数CPU厂商(如AMD,Intel)生产的就是这种处理器,与采用RISC架构的PowerPC(如苹果电脑)不同。 - 在CISC处理器中,程序的各条指令是按顺序串行执行的,每条指令中的各个操作也是按顺序串行执行的。顺序执行的优点是控制简单,但计算机各部分的利用率不高,执行速度慢。
- 而RISC架构相对简单,它只要求硬件执行很有限且最常用的那部分指令,大部分复杂的操作则使用成熟的编译技术,由简单指令合成。主要用在中高档服务器中,特别是高档服务器全都采用RISC指令系统的CPU。
- x86和ARM的 区别
Intel x86使用复杂指令集(CISC),ARM使用精简指令集(RISC),属于这两种类中的各种架构之间最大的区别。具体来说,就是ARM追求低功耗,x86追求性能,X86无法做到 ARM的功耗,而ARM也无法做到X86的性能
x86服务器最大的特色在于可以兼容Windows操作系统,全部都采用了Intel的CPU。而Intel的x86服务器也可以分为两代,最初采用的 80x86系列在发布了产品80486后,Intel对该系列产品进行了重新命名并注册,这也就是现在Intel的Pentium系列,当然,这个系列在中国还有个更响亮的名字,即奔腾系列。
目前奔腾系列的CPU包括:Pentium、Pentium MMX、Pentium Pro、PII、PII Xeon(至强)、PIII、PIII Xeon、P4 Xeon、Celeron2(赛扬)等。
在PC领域,Intel的CPU一枝独秀。而在移动端呢?那就当属ARM了。ARM全称为Advanced RISC Machine,也就是进阶精简指令集机器。ARM是RISC微处理器的代表作之一,其广泛的在嵌入式系统设计中被使用。而且ARM处理器最大的特点在于节能,这也是其在移动通信领域无人能敌的原因之一。
ARM与X86大比拼
从几个方面比较ARM与X86架构Intel和ARM的处理器,除了最本质的复杂指令集(CISC)和精简指令集(RISC)的区别之外,下面我们再从以下几个方面对比下ARM和X86架构。
1、制造工艺ARM和Intel处理器的一大区别是ARM从来只是设计低功耗处理器,Intel的强项是设计超高性能的台式机和服务器处理器。
一直以来,Intel都是台式机的服务器行业的老大。然而进入移动行业时,Intel依然使用和台式机同样的复杂指令集架构,试图将其硬塞入给移动设备使用的体积较小的处理器中。但是Intel i7处理器平均发热率为45瓦。基于ARM的片上系统的发热率最大瞬间峰值大约是3瓦,约为Intel i7处理器的1/15。其最新的Atom系列处理器采用了跟ARM处理器类似的温度控制设计,为此Intel必须使用最新的22纳米制造工艺。
2、64位计算对于64位计算,ARM和Intel也有一些显著区别。Intel并没有开发64位版本的x86 指令集。64位的指令集名为x86-64(有时简称为x64),实际上是AMD设计开发的。Intel想做64位计算,它知道如果从自己的32位x86架构进化出64位架构,新架构效率会很低,于是它搞了一个新64位处理器项目名为IA64。由此制造出了Itanium系列处理器。
而 ARM在看到移动设备对64位计算的需求后,于2011年发布了ARMv8 64位架构,这是为了下一代ARM指令集架构工作若干年后的结晶。为了基于原有的原则和指令集,开发一个简明的64位架构,ARMv8使用了两种执行模式,AArch32和AArch64。顾名思义,一个运行32位代码,一个运行64位代码。ARM设计的巧妙之处,是处理器在运行中可以无缝地在两种模式间切换。这意味着64位指令的解码器是全新设计的,不用兼顾32位指令,而处理器依然可以向后兼容。
3、异构计算ARM的 big.LITTLE架构是一项Intel一时无法复制的创新。在big.LITTLE架构里,处理器可以是不同类型的。传统的双核或者四核处理器中包含同样的2个核或者4个核。一个双核Atom处理器中有两个一模一样的核,提供一样的性能,拥有相同的功耗。ARM通过big.LITTLE向移动设备推出了异构计算。这意味着处理器中的核可以有不同的性能和功耗。当设备正常运行时,使用低功耗核,而当你运行一款复杂的游戏时,使用的是高性能的核。
这是什么做到的呢?设计处理器的时候,要考虑大量的技术设计的采用与否,这些技术设计决定了处理器的性能以及功耗。在一条指令被解码并准备执行时,Intel和ARM的处理器都使用流水线,就是说解码的过程是并行的。
为了更快地执行指令,这些流水线可以被设计成允许指令们不按照程序的顺序被执行(乱序执行)。一些巧妙的逻辑结构可以判断下一条指令是否依赖于当前的指令执行的结果。Intel和ARM都提供乱序执行逻辑结构,可想而知,这种结构十分的复杂,复杂意味着更多的功耗。
那为什么反而ARM的比X86耗电少得多呢。这就和另外一个因素相关了,那就是设计。
设计又分为前端和后端设计,前端设计体现了处理器的构架,精简指令集和复杂指令集的区别是通过前端设计体现的。后端设计处理电压、时钟等问题,是耗电的直接因素。当然,其中任何一项都会使得时钟和电源所控制的模块无法工作。他们的区别在于,门控时钟的恢复时间较短,而电源控制的时间较长。此外,如果条单条指令使用多个模块的功能,在恢复功能的时候,并不是最慢的那个模块的时间,而可能是几个模块时间相加,因为这牵涉到一个上电次序的问题,也就是恢复工作时候模块间是有先后次序的,不遵照这个次序,就无法恢复。而遵照这个次序,就会使得总恢复时间很长。
所以在后端这块,可以得到一个结论,为了省电,可以关闭一些暂时不会用到的处理器模块。但是也不能轻易的关闭,否则一旦需要,恢复的话会让完成某个指令的时间会很长,总体性能显然降低。此外,子模块的门控时钟和电源开关通常是设计电路时就决定的,对于操作系统是透明的,无法通过软件来优化。
再来看前端。ARM的处理器有个特点,就是乱序执行能力不如X86。换句话说,就是用户在使用电脑的时候,他的操作是随机的,无法预测的,造成了指令也无法预测。X86为了增强对这种情况下的处理能力,加强了乱序指令的执行。此外,X86还增强了单核的多线程能力。这样做的缺点就是,无法很有效的关闭和恢复处理器子模块,因为一旦关闭,恢复起来就很慢,从而造成低性能。为了保持高性能,就不得不让大部分的模块都保持开启,并且时钟也保持切换。这样做的直接后果就是耗电高。而ARM的指令强在确定次序的执行,并且依靠多核而不是单核多线程来执行。这样容易保持子模块和时钟信号的关闭,显然就更省电