作者简介
甄建勇,高级架构师(某国际大厂),十年以上半导体从业经验。主要研究领域:CPU/GPU/NPU架构与微架构设计。感兴趣领域:经济学、心理学、哲学。
并行技术
在计算机体系结构的发展中,并行技术无疑是浓墨重彩的一笔。正是采用的各种各样的并行技术,才使计算机的性能得到了翻天覆地的变化,本小节就介绍一下计算机体系结构设计中常用的并行技术。
流水线
并行技术,大体可分为指令级并行,数据级并行,任务级并行三个层次。而流水线技术就是指令级并行技术中最早也是最成熟的技术。
流水线,这个概念最早并不是出现在计算机领域,而是在陶瓷工厂里。
1769年,英国人乔赛亚·韦奇伍德开办埃特鲁利亚陶瓷工厂,在场内实行精细的劳动分工,他把原来由一个人从头到尾完成的制陶流程分成几十道专门工序,分别由专人完成。这样一来,原来意义上的“制陶工”就不复存在了,存在的只是挖泥工、运泥工、扮土工、制坯工等等制陶工匠变成了制陶工场的工人,他们必须按固定的工作节奏劳动,服从统一的劳动管理。
根据上述资料可以明确看出韦奇伍德的这种工作方法已经完全可以定义成为“流水线”。另一说法是亨利·福特发明了流水线装配工艺,这一说法显然不够严谨,但亨利·福特的确在流水线在工业生产中的应用发挥了巨大作用。
计算机流水线是Intel首次在486芯片中开始使用的。流水线的工作方式就象工业生产上的装配流水线。在CPU中由5—6个不同功能的电路单元组成一条指令处理流水线,然后将一条X86指令分成5—6步后再由这些电路单元分别执行,这样就能实现在一个CPU时钟周期完成一条指令,因此提高CPU的运算速度。经典奔腾每条整数流水线都分为了四级或五级,即指令预取、译码、执行(访存)、写回结果。浮点流水线则一般会分为八级。
计算机流水线(Pipeline)技术是广泛应用于微处理芯片(CPU)中的一项关键技术,计算机流水线技术指的是对CPU内部的各条指令的执行方式的一种形容,要了解它,就必须先了解指令及其执行过程。
(1)计算机指令
计算机指令,就是告诉CPU要做什么事的一组特定的二进制集合。如果我们将CPU比喻成一个加工厂,那么,一条指令就好比一张订单,它引发了CPU加工厂的一系列动作,最后分别得到了运算结果和产品。那么,它们到底是怎样工作的呢?首先,要有一个接收订单的部门——CPU的取指令机构;其次,还要有完成订单的车间——CPU的执行指令机构。在工厂中,一张订单上的产品被分成了许多道工序,而指令亦在CPU中转换成了许多条对应的微操作,依次完成它们,就执行完了整条指令。
(2)执行指令
在低档的CPU中,指令的执行是串行的,简单地说,就是执行完了一条指令后、再执行下一条指令,好比我们上面提到的那个加工厂在创业之初,只有一间小车间及孤军奋战的老板,那么,当他接到一张订单之后,他必然忙于完成第1张订单,而没有能力去接第2张订单。这样接订单→完成订单→接订单→……取指令→执行指令→取指令→……是一个串行的过程。后来,老板发现接受订单不费太多时间,而且他还有了一个帮工,他们可以相互独立地工作,这样,老板就在完成上张订单产品的同时,接受下一张订单的订货。这表现在CPU上就是取指令机构与执行指令机构的分开,这样从CPU整体来看,CPU在执行上条指令的同时,又在并行地取下条指令。这在CPU技术上是一个质的飞跃,它使得CPU从串行工作变为并行工作,从而具有了流水线的雏型。
CPU在完成了上面这一步之后,剩下的就是如何提高并行处理能力的问题了,CPU的设计者们从加工厂的装配线得到启发,将一条指令的执行分解成了许多各不相同的多个工序-微指令,从而极大地简化了指令的复杂度,简化了逻辑设计,提高了速度。在具有流水线技术的CPU中,上条指令刚执行完第一道“工序”,马上第二条指令就加入了流水线中,开始执行。很明显,这种流水线技术要求有多个执行单元,这在X86芯片中均得到了实现。
通过上面的介绍,我们已经了解到什么是流水线技术,这虽不是一种创新,但在技术的实现上则是一大难关,是CPU设计者对计算机发展的一大贡献。
除了刚刚介绍的流水线,后来还出现了流水线的升级版-超流水线。那么,超流水线又是怎么回事呢?
超流水线(Super Pipeline)在本质上仍为一种流水线技术,但它做了以下的改进。
A.流水线条数从奔腾的两条增至三条,还有十一个独立的执行单元并行支持。
B.在执行中采取了无序执行(out-of-orderprocessing)技术。即当某条指令需要一些数据而未能立即执行完毕时,它将被剔出流水线并等待数据,CPU则马上执行下条指令,就好比在装配线上发现某件产品不太合格,而被淘汰,等待返工一个道理。这样,可以防止一条指令不能执行而影响了整个流水线的效率。
C.将指令划分成了更细的阶段,从而使逻辑设计、工序等等更为简化,提高了速度。在486芯片中,一条指令一般被划分为五个标准的部分,奔腾亦是如此。而在P6中,由于采用了近似于RISC的技术,一条指令被划分成了创纪录的十四个阶段。这极大地提高了流水线的速度。
乱序
一切艺术都来源于生活,计算机体系结构也不例外。所以,我们就举一个例子来说明乱序执行的产生原因和过程。
在生活中,我们经常遇到这样的事情。在餐厅吃早点时,会排很长的队,有的人买豆浆,有的人买米粥。如果豆浆是现成的还好,如果是“现磨豆浆”,如果严格采用上面的流水线技术,那就麻烦了,明明有很多人根本就不买“现磨豆浆”,也必须要等前面买的人买完才行。很显然,这种流水线就显得很愚笨,能不能让排在后面的不买“现磨豆浆”的人先买别的呢?如果允许,“乱序”就产生了。
对于CPU也是一样,如果把排队买早点的人比作一条一条的指令,把买米粥的人比作加法指令(单周期),把买“现磨豆浆”的人比作乘法指令或者更复杂的指令(多周期)。如果这两条指令不相关,那么完全可以让排在后面的加法指令先执行,以提高性能。
向量机SIMD
SIMD(SingleInstruction Multiple Data,单指令多数据流)是指,采用这种架构而设计的计算机,其指令能够复制多个操作数,并把这些操作数打包到大型寄存器中,各个执行单元以同步方式,在同一时间内执行同一条指令。
SIMD在性能上有其特有的优势。以加法指令为例,单指令单数据(SISD)的CPU对加法指令译码后,执行部件先访问内存,取得第一个操作数;之后再一次访问内存,取得第二个操作数;随后才能进行求和运算。而在SIMD型的CPU中,指令译码后几个执行部件同时访问内存,一次性获得所有操作数进行运算。这个特点使SIMD特别适合于多媒体应用等数据密集型运算。
同时多线程
SMT(同时多线程)技术是一种在多流出、动态调度的处理器上同时开发线程级并行和指令级并行的技术。
SMT的出现是有其背景的。首先,在微处理器中开发的指令级并行不断提高,进一步开发出更多的ILP越来越难。其次,在有些程序中可能开发ILP本来就很难。还有,程序中可能有很多自然存在的更高一级的并行(在线事务处理系统、科学计算)。
有了SMT的出现背景,要实现多线程还要有关键原理性基础。线程切换只需要几个时钟周期,最快可以每个时钟周期切换一次。而进程的切换一般需要成百上千个处理器时钟。
现代多流出处理器通常含有多个并行的功能单元,而单个线程不能有效利用这些功能单元。通过寄存器重命名和动态调度机制,来自各个独立线程的多条指令可以同时流出,而不用考虑它们之间的相互依赖关系,其相互依赖关系通过动态调度机制得以解决。
SMT一般可分为两类,细粒度多线程和粗粒度多线程
细粒度多线程的特点是,在没条指令之间都能进行线程的切换,从而使多个线程可以交替执行。通常以时间片轮转的方法实现这样的交替执行,轮转中跳过处于停顿的线程。CPU在每个时钟周期都能进行线程的切换。优点是,能够隐藏长时间和段时间停顿带来的损失。缺点是,减慢了每个独立线程的执行。
粗粒度多线程的特点是,切换至发生在时间较长的停顿出现时(如:第二级Cache失效)。优点是,减少了切换次数,也不会降低单个线程的执行速度。缺点是,减少吞吐率的能力有限,特别是对于较短的停顿来说更是如此。
任何事物都具有两面性,SMT在提高性能的同时也会带来一些问题。对于粗粒度多线程,其流水线建立时间的开销较大。粗粒度多线程的CPU只执行单个线程的指令,因此当发生停顿时,流水线必须排空或暂停。停顿后切换的新的线程在第一条指令执行完毕之前必须先填满整个流水线。此外,SMT也面临一些挑战,首先,保存多线程的现场需要设置更大的寄存器组,其次,SMT技术的采用不能影响时钟周期,特别是在关键路径上。SMT还需要保证由于并发执行多个线程带来的Cache冲突和TLB冲突不会导致明显的性能下降。
CMP
CMP是由美国斯坦福大学提出的,其思想是将大规模并行处理器中的SMP(对称多处理器)集成到同一芯片内,各个处理器并行执行不同的进程。与CMP比较, SMT处理器结构的灵活性比较突出。但是,当半导体工艺进入0.18微米以后,线延时已经超过了门延迟,要求微处理器的设计通过划分许多规模更小、局部性更好的基本单元结构来进行。相比之下,由于CMP结构已经被划分成多个处理器核来设计,每个核都比较简单,有利于优化设计,因此更有发展前途。目前,IBM 的Power 4芯片和Sun的 MAJC5200芯片都采用了CMP结构。多核处理器可以在处理器内部共享缓存,提高缓存利用率,同时简化多处理器系统设计的复杂度。
未来的主流应用需要处理器具备同时执行更多条指令的能力,但是从单一线程中已经不太可能提取更多的并行性,主要有以下两个方面的原因:一是不断增加的芯片面积提高了生产成本;二是设计和验证所花费的时间变得更长。在处理器结构上,更复杂化的设计也只能得到有限的性能提高。
对单一控制线程的依赖限制了多数应用可提取的并行性,而主流商业应用,如在线数据库事务处理(Online Database Transaction)与网络服务(如Web服务器)等,一般都具有较高的线程级并行性(TLP,Thread Level Parallelism)。为此,研究人员提出了两种新型体系结构:单芯片多处理器(CMP)与同时多线程处理器(Simultaneous Multithreading,SMT),这两种体系结构可以充分利用这些应用的指令级并行性和线程级并行性,从而显著提高了这些应用的性能。
从体系结构的角度看,SMT比CMP对处理器资源利用率要高,在克服线延迟影响方面更具优势。CMP相对SMT的最大优势还在于其模块化设计的简洁性。复制简单设计非常容易,指令调度也更加简单。同时SMT中多个线程对共享资源的争用也会影响其性能,而CMP对共享资源的争用要少得多,因此当应用的线程级并行性较高时,CMP性能一般要优于SMT。此外在设计上,更短的芯片连线使CMP比长导线集中式设计的SMT更容易提高芯片的运行频率,从而在一定程度上起到性能优化的效果。
总之,单芯片多处理器通过在一个芯片上集成多个微处理器核心来提高程序的并行性。每个微处理器核心实质上都是一个相对简单的单线程微处理器或者比较简单的多线程微处理器,这样多个微处理器核心就可以并行地执行程序代码,因而具有了较高的线程级并行性。由于CMP采用了相对简单的微处理器作为处理器核心,使得CMP具有高主频、设计和验证周期短、控制逻辑简单、扩展性好、易于实现、功耗低、通信延迟低等优点。此外,CMP还能充分利用不同应用的指令级并行和线程级并行,具有较高线程级并行性的应用如商业应用等可以很好地利用这种结构来提高性能。单芯片多处理器已经成为处理器体系结构发展的一个重要趋势。
2000年IBM、HP、Sun 推出了用于RISC的多核概念,并且成功推出了拥有双内核的HP PA8800和IBM Power4处理器。此类处理器已经成功应用不同领域的服务器产品中,像IBM eServer pSeries 690或HP 9000此类服务器上仍可以看到它们的身影。由于它们相当昂贵的,因此从来没得到广泛应用
2005年4月,Intel推出了第一款供个人使用的双核处理器,打开了处理器历史新的一页,从那之后,多核与众核处理器纷纷登场。
SMP
SMP(对称多处,Symmetrical Multi-Processing),是指在一个计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子系统以及总线结构。它是相对非对称多处理技术而言的、应用十分广泛的并行技术。
在这种架构中,一台电脑不再由单个CPU组成,而同时由多个处理器运行操作系统的单一复本,并共享内存和一台计算机的其他资源。虽然同时使用多个CPU,但是从管理的角度来看,它们的表现就像一台单机一样。系统将任务队列对称地分布于多个CPU之上,从而极大地提高了整个系统的数据处理能力。所有的处理器都可以平等地访问内存、I/O和外部中断。在对称多处理系统中,系统资源被系统中所有CPU共享,工作负载能够均匀地分配到所有可用处理器之上。
我们平时所说的双CPU系统,实际上是对称多处理系统中最常见的一种,通常称为"2路对称多处理",它在普通的商业、家庭应用之中并没有太多实际用途,但在专业制作,如3DMax Studio、Photoshop等软件应用中获得了非常良好的性能表现,是组建廉价工作站的良好伙伴。随着用户应用水平的提高,只使用单个的处理器确实已经很难满足实际应用的需求,因而各服务器厂商纷纷通过采用对称多处理系统来解决这一矛盾。在国内市场上这类机型的处理器一般以4个或8个为主,有少数是16个处理器。但是一般来讲,SMP结构的机器可扩展性较差,很难做到100个以上多处理器,常规的一般是8个到16个,不过这对于多数的用户来说已经够用了。这种机器的好处在于它的使用方式和微机或工作站的区别不大,编程的变化相对来说比较小,原来用微机工作站编写的程序如果要移植到SMP机器上使用,改动起来也相对比较容易。SMP结构的机型可用性比较差。因为4个或8个处理器共享一个操作系统和一个存储器,一旦操作系统出现了问题,整个机器就完全瘫痪掉了。而且由于这个机器的可扩展性较差,不容易保护用户的投资。但是这类机型技术比较成熟,相应的软件也比较多,因此现在国内市场上推出的并行机大量都是这一种。PC服务器中最常见的对称多处理系统通常采用2路、4路、6路或8路处理器。目前UNIX服务器可支持最多64个CPU的系统,如Sun公司的产品Enterprise 10000。SMP系统中最关键的技术是如何更好地解决多个处理器的相互通讯和协调问题。
局部性原理
局部性原理是除并行技术之外在计算机体系结构设计领域使用的最广泛的技术之一。可以这么说,在计算机系统中,局部性原理几乎无处不在。那么,什么事局部性原理呢?在回答这个问题之前,我们先看一个例子。
图1 局部性原理举例
假设你就是我,正在写一本关于计算机体系结构方面的书。台上一分钟,台下十年功。写书也不例外,要想写一本书,起码要先阅读上百本书或论文。这么多资料,你不可能实现把所有的资料都放在你面前,也不会每次只借一本书。实际的情况是,先去图书馆借你认为参考价值最大的一些资料,这些资料里面包含了你当前阶段可能需要参考的的部分内容,放在你的书桌上。这样在写书的过程中一旦需要什么查阅一些参考资料,首先会确认一下,你想要查阅的资料有没有在你借的资料里面,如果有的话,就不用去图书馆了。如果你开始了新的一章内容的编写,想查阅资料时,发现你之前借的那些资料里面没有相关内容,这时,你就必须去图书馆了。
在上面的例子中,如果把图书馆比作整个内存的话,那么,起到缓冲区作用的,你的书桌,也就相当于cache。显然,采用事先借一部分书的方法能显著减少你去图书馆的次数,当然,也不用把整个图书馆的书都借回来了。这里面内含的道理,就是所谓的局部性原理。
局部性原理(principle of locality),一般可分成两个方面,即时间局部性(temporal locality)和空间局部性(spatiallocality)。通俗的说,时间局部性指的是,如果一个数据被使用,那么这个数据在不久的一段时间里也很可能被使用。针对于上面的例子来说就是,如果你刚刚参考了一本书的话,那么这本书很可能在最近几天都会被你参考。空间吧局部性指的是,如果一个数据被使用,那么与这个数据地址相邻数据很有可能会很快被使用。针对于上面的例子来说就是,如果你借的一本书是在图书馆的某一个书架上,那么这个书架上与这本书相邻的书也很可能被你借走。
其实,局部性原理在计算机体系结构设计中应用很广泛。比如内存就可以看做是硬盘的缓冲区,cache就可以看做是内存的缓冲区,而CPU内部的通用寄存器又可以看做是cache的缓冲区。大家所熟知的MMU中的TLB也可以看做是缓冲页表项的缓冲区。
实质上,局部性原理可以认为是存储空间和存储访问速度之间的一种平衡机制。
计算机的评价
如何衡量一台计算机的优劣呢?一般包括三个主要方面,运算速度,成本,功耗。
首先,判断一台计算机优劣的第一个指标是其运算速度。有时候,超级计算机的运算速度是一个国家科技进步程度的重要标志。这或许也是我们国家花大力气搞超级计算机的原因吧,最近,我国研发的天河II号超级计算机摘得了世界上最快计算机的称号。此外,在需要大量计算的情况下,如果计算机的计算速度跟不上的话,就有可能失去意义。比如,天气预报工作,需要大量的复杂的计算,如果计算机太慢,等天气预报结果需要好几天才出来,那就叫天气后报了。所以,运算速度是衡量计算机优劣的一个重要指标,然而,影响计算机运算速度的因素有很多,既有体系结构,CPU主频,方面的因素,还有软件算法,编译系统等。
其次,成本是衡量计算机优劣的另外一个重要指标。随着计算机的不断普及,在满足一般性能需求的情况下,人们越来越关注计算机的价格。
最后,衡量一台计算机优劣的指标就是功耗。尤其是现在智能手机的大量普及,正是说明了这一点。试想,无论一个手机的性能有多好,配置有多高,如果这个手机的电池仅能使用10分钟,恐怕也没人会买。
其实,除了上述三个衡量计算机优劣的指标之外,在一些特殊情况下,还要考虑计算机的其它指标,比如使用寿命,安全性,可靠性等。以手机可靠性为例,咱们普通大众可以不用过于担心,如果某天咱们的手机坏了,大不了明天再买一个新的就是了。但是对于obama来说,手机的可靠性可是需要特别考虑了。以手机的安全性为例,默克尔的手机,可能就是对安全性考虑不周,才被美国监控的吧。
上面所述对计算机优劣的衡量只是一个定性的考量,其实,计算速度,成本,功耗,这三个方面都是有具体的量化标准的,相关的计算公式在“常用公式和定律”中可以找到。
精彩回顾
甄建勇:芯片架构方法学
甄建勇:五分钟搞定MMU
甄建勇:五分钟搞定Cache(上)
甄建勇:五分钟搞定Cache(下)
甄建勇:五分钟搞定计算机的前世今生