当前位置:文档之家› 多核处理器的发展前景和存在问题综述

多核处理器的发展前景和存在问题综述

多核处理器的发展前景和存在问题综述
多核处理器的发展前景和存在问题综述

多核处理器的发展前景和存在问题综述

目录

1.概述 (2)

2.处理器的发展趋势 (2)

从单核到多核 (3)

同构多处理器与异构多处理器 (3)

多核处理器发展面临的挑战 (4)

多核与多线程技术 (4)

3.多核处理器的高速缓存一致性问题 (4)

增强一致性的基本方案 (5)

目录式Proximity-aware 协议 (5)

4.多核加速串行程序的主要方法 (8)

并行编译器 (8)

推测多线程 (9)

基于线程的预执行机制 (9)

5. 总结 (10)

参考文献 (11)

1. 概述

在过去的几十年时间里,处理器的性能一直按照莫尔定律在发展。提高处理器性能的基本方法就是不断提升主频。从初期的几十MHz到不久前IBM的Power 6达到了,设计人员甚至想过提升到7G~8GHz。不过,进入2002年以来,CPU 提升主频的困难越来越大,因为主频的提升带来了散热和功耗的大幅增加等问题。在几年前,英特尔和AMD都调整了研究方向,开始研究在同一CPU中放置多个执行内核。

说到底,出现多核处理器的最根本原因是人们对计算能力永无止境的追求。尽管这些年来,处理器从来没有停止过前进的脚步,但每一次性能的突破,换来的只是对更高性能的需求,特别是在油气勘探、气象预报、虚拟现实、人工智能等高度依赖于计算能力的场合,对性能的渴求更加迫切。

既然单处理器的发展已经到了瓶颈,而多核将会引领以后处理器发展的潮流,那么我们就看看多核处理器带给我们什么样的性能提升,多核处理器要全面应用到各个领域所需解决的问题。

多核的好处非常明显。首先,由于是多个执行内核可以同时进行运算,因此可以显著提升计算能力,而每个内核的主频可以比以前低,因而总体功耗增加不大。其次,与多CPU相比,多核处理器采用与单CPU相同的硬件架构,用户在提升计算能力的同时无需进行任何硬件上的改变,这对用户来说非常方便。

然而,多核处理器要发挥它的作用必须要解决许多问题,不像CPU的频率提升,无论如何你都可以从中受益,要从多核处理器中受益,首先在设计多核处理器时,要注意不同核心之间的通信与数据的一致性,另外,在软件层次上也需要对多核进行改进,以充分利用多核的性能。

本文结合了几篇最新的多核方面的论文和一些网上评论,从处理器的发展趋势,前景以及存在的挑战几个方面介绍了多核的相关问题。文章第二部分主要介绍处理器的发展趋势,第三部分主要阐述多核的一个关键问题高速缓存一致性已经如何通过预取来提高带宽,第四部分主要阐述多核在提高串行程序性能方面的作用。

2. 处理器的发展趋势

从单核到多核

10年前的推出的Pentium系列处理器的时候,以微米的制程制造出来的100mhz左右的处理器,频率仅为10多瓦,如果按照理想的产品模型来计算,现在高达3G的奔腾D处理器功率也应该在十几瓦,可实际情况是,其功率已经达到了惊人的100瓦,这还只是普通的台式机所使用的CPU。同时,Intel以前也曾承认最近几年每代处理器架构,其晶体管数目以2~3倍的数量在增加,而性能提升不超过一倍,如果照此下去,继续增加晶体管数量来提高CPU的性能,每一代CPU的功率就要提高约50%。

从技术上来说,单核心处理器的已经不能满足日益增长的对性能的要求了,多核心处理器也便越来越受到大家的青睐。随着晶体管数量的增加,功率也会同比增加,性能却不能同比增加,可以说是得不偿失,但是如果我们把同样数量的处理器集合在一起,虽然功率仍会同比增加,性能却也能够同比增加,而且事实上,CPU并不都是满载运行的,我们可以通过技术,动态调整电压、频率,控制某一颗核心的开关,一般使用中,可以把功率降低,当工作负荷较大的时候,打开所有的核心,全负荷的投入工作,这种控制方法,能够让多核心处理器智能的“控制功率”[1]。

因此,为了在实际工作中能够获得更高性能的处理器,多核心处理器可能是我们唯一的选择,多核心也将取代单核心处理器,成为未来处理器发展的趋势。

多核处理器(Multi-core processor)是指在一块处理器芯片中集成两个或多个完整的计算引擎(内核)。多核处理器具有控制逻辑简单、高主频、低延迟、低功耗、设计和验证周期短等优点。

从单核(Single-core)到多核(Multi-core) ,不仅仅是处理器核心的数量的增多,对处理器体系架构,计算机整体架构,I/O到操作系统、应用软件提出巨大的挑战。

同构多处理器与异构多处理器

多核处理器的实质是在同一芯片中集成很多同样的处理核。这一方法降低了设计的复杂性,减小了处理节点,并成为多核处理器发展的一种趋势。

多核处理器从结构上可以分为同构(homogenous)和异构(Heterogeneous)。在同构多核结构中,每个核都是一样的,所处的地位相同;而在异构多核结构中,每个核不都是一样的,而且每个核完成的功能都不同,例如有主要处理计算的,有负责图形加速的(GPU—Graphic Processor Unit)等等。而在AMD收购ATI之后,AMD向异构多核架构设计迈出了第一步;而之后Intel公司在其Core 2 Duo处理器和主板上集成了GMA X3000图形加速器[2]也表明Intel也开始在异构多核方向进行探索和研究。

同构多核还是异构多核都有其各自的优势和缺点,具体选择哪一种体系结构还要取决于具体的需求和成本等其他外部因素。根据Amdahl定理,程序的加速比决定于串行部分的性能,所以,从理论上来看似乎异构微处理器的结构具有更好的性能[5],不过在实际设计中需要具体问题具体分析。

多核处理器发展面临的挑战

多核处理器发展面对的一个重要的挑战就是如何保持高速缓存的一致性(Cache Coherence)。

高速缓存的引入带来了输入输出操作的一致性问题,这是因为从高速缓存得到的存储器视图可能会与从输入输出子系统得到的存储器视图不同。在多核处理器中存在同样的问题,因为多个不同的处理器所保存的存储器视图是通过它们各自的高速缓存得到了,而它们各自的高速缓存之间的一致性是需要保持的。

多核处理器带来了体系结构上的挑战。由于计算机需要考虑到如何让现有软件有效运行,所以代码的兼容性成为重要问题。同时带来的问题还有以及怎么用有效的方式来表达并行性、存储器瓶颈和功耗的需求,以及当我们集成更多功能时如何做到芯片的容错设计等。

不过正是有了这些挑战,才会不断的推动多核技术不断向前发展,多核技术才会越来越成熟,应用越来越广泛。

多核与多线程技术

多线程就是把单个内核上最大的性能发挥出来,而多核是把整个系统运算能力发挥到极至[4]。在高性能处理器中,有很多性能本身其实没有被完全利用,而是被浪费了。有了多线程,就能够把每个单一处理器的所有性能充分加以利用,再加上,就能提升总体性能。所以多线程+多核技术在未来处理器发展中必定会扮演相当重要的角色。

3. 多核处理器的高速缓存一致性问题

随着core的数量在多处理器芯片上的不断增加,cache的一致性(cache coherence)很快的变成了一个影响多核性能的主要问题。采用何种Cache一致性模型和机制都将对CMP整体性能产生重要影响。在传统多处理器系统结构中广泛采用的Cache一致性模型有: 顺序一致性模型、弱一致性模型、释放一致性模型等。与之相关的Cache一致性机制主要有总线的侦听协议和基于目录的目录协议。目前的CMP系统大多采用基于总线的侦听协议。目前有一种新的基于目

录的目录协议(Proximity-aware directory-based coherence protocol[5])也被运用起来,之后会详细介绍。

高速缓存的一致性需要系统保存关于数据访问不同cache的可能的地址,从而系统可以当新的消费者(consumer)请求数据拷贝的时候找到数据,当有写内存操作发生时(这块内存是共享内存),系统可以通知cache去做写操作。

增强一致性的基本方案

多处理器和输入输出的一致性问题在很多情况下是类似的,但还是具有一些不同的特征,这些特征会影响相应的解决方案。输入输出中,很少出现一个数据有多个副本的情况—这是要尽量避免的,而多处理器系统中的情况恰恰相反,在多个处理器系统上运行的程序会要求在多个高速缓存中有同一个数据副本。支持高速缓存一致性的多处理器系统中,高速缓存提供共享数据的迁移和复制。

因为数据项何以迁入本地高速缓存并以透明的方式使用,所以一致性的高速缓存要提供数据迁移。这样不但能减少访问远程共享数据项的延迟,而且可以减少对共享内存的带宽要求。

因为高速缓存在本地为被同时读取的共享数据做了备份,所以一致性的高速缓存也要为这些数据提供复制。而副本可以减少访问延迟和读取共享数据时的竞争现象。支持这种迁移和复制对于访问共享数据的性能来说是至关重要的。因此,小规模多处理器系统并没有通过在软件中避免出现不连贯的现象解决这个问题,而是通过在硬件上引入一个协议维护高速缓存的一致性来解决该问题。

这个用于维护多个处理器一致性的协议成为高速缓存一致性协议(cache-coherence protocols)。实现告诉缓存一致性协议的关键在于跟踪所有共享数据块的状态。广泛采用的有两类协议,它们采用不同的技术跟踪共享数据:

(1). 目录式(Directory-based)–把物理存储块的共享状态存放在一个地点,称之为目录。

(2). 监听式(Snoop-based)–每个含有物理存储器中数据块副本的高速缓存还要保留该数据块共享状态的副本,但是并不集中的保存状态。高速缓存通常放在共享存储总线上,所以的高速缓存控制器对总线进行监听,来确定它们是否含有总线上请求的数据块副本。

目录式Proximity-aware 协议

目录协议在分布式共享内存(DSM – Distributed Shared Memory)多处理器中已经被建议使用。虽然目录协议已经在DSM中流行起来,但是它还没有在CMP总如何利用私有L2 cache得到很好的研究[5]。

Proximity-aware directory-based coherence protocol是一种目录式协议的实现方式(以下简称PAC)。PAC是基于一项观察得到的,当cache line[超高速缓冲存储器线(路)]可以在多级缓存中处于共享状态的情况下,那么cache的home node 将不会保证和线上保持一致。这种实现方式假设在芯片上的分布式目录的每个node上具有目录控制器和目录缓存。缓存目录状态就是要减少内存访问目录的日常开销[5]。PAC一致性,从另外一个方面来说,不需要知道共享者的数据映射的变更信息。

3.2.1PAC的体系结构:

这个体系结构是由一个16核的多处理器芯片组成,核的排列是一个4*4的网孔(tile)。每个tile具有一个core(该core有L1缓存), 一个L2缓存,一个目录控制器,一个目录缓存,一个网络开关,一个内存通道。目录内存和一般的程序内存都可以被芯片上的内存控制器来访问。每个内存通道都提供访问不同物理内存地址。图大致上表示了这种体系结构。

图具有16tile的多处理器芯片体系的基本结构

在PAC中,目录内存和一般的程序内存都可以被芯片上的内存控制器来访问。每个内存通道都提供访问不同物理内存地址。对于传统的多处理器来说,一种保持高速缓存一致性的协议的设计不应该与芯片的几何设计有出入,也就是说,对于给定的内存地址,node memory应该距离home node directory更近[5]。

对于一个传统的多处理器来说,从一个给定的节点到最近的一个节点和到最远的节点的延迟通常是由他们之间的factor相关,因为在大多数情况下,芯片外和板外的延迟都是可控制的。系统假设目录缓存的状态是由目录控制器来进行缓存的,目录所有的状态变化都是由DC(Directory Controller –目录控制器)自己来完成的,除非DC遇到了缺失[5]。目录缓存是组相连的,每个cache line负责维护内存状态的一致性。

3.2.2PAC协议基本内容

当L1 cache发生读缺失的时候:如果被请求的位置在requester的L2 cache 中,那么cache只需要简单的提供数据,不用在目录级别上做状态变化;如果发生L2缺失,那么这个请求就会被发送到home node(该home node是跟所求内存地址想关联的)。

当需要做写操作,而且发生了write miss时,当所请求的位置不在cache状态中,home node 可以立即满足请求(从L2缓存或者是内存)。如果数据块在共享的状态,那么所有的缓存副本都必须失效。对于弱连续性的处理器,home node 将会并行的发出一个唯一的数据回复给请求node, 然后等待从其他可能的共享者那里发回的无效的ACK;对于强连续性的处理器来说,home node 一直等到所有的共享者发出无效的ACK之后,才会回复给请求者,保证了数据块的所有权。

Proximity-aware coherence试图保证在CMP的任何位置都是正确的状态,一个读请求或者写请求都可以被满足,而且不需要在home node做off-chip的内存访问。延迟或者带宽取决于节点的空间位置和相关数据消息的大小以及控制信息的大小。

大致来说,PAC是这样工作的:

当Read Miss发生时,PAC的处理步骤是:

(1). 发送Read Request给Home node

(2). Home node 发现出现缺失,把request转发给最近的共享者

(3). 最近的这个共享者把数据发给Requester

(4). 最近的共享者发送一个ACK给Home node。

当Write Miss发生时,PAC的处理步骤:

(1). Requester发送Write Miss 请求给Home node

(2). Home node 发现出现缺失,home node 把请求转发给最近的共享者,同时发送失效信息给所有的共享者,然后这些共享者都返回了ACK给home node

(3). 最近的共享者把数据发送给Requester

(4). 最近的共享者发送ACK给home node。

Proximity-aware coherence包含了芯片多处理器设计的两个共识:

(1). on-chip cache访问,甚至是remote node,总是比off-chip内存访问要近

(2). 在有多个数据共享者的情况下,选择正确的资源给正确的请求者都可以减少latency和带宽。

Proximity-aware coherence的实现是很直白的,对于目前的基本系统机制的扩展是很安全的;不需要多余的存储设备的开销;而增加的目录信息和目录缓存控制器都不需要复杂的实现。

4. 多核加速串行程序的主要方法

当前主流的商用片上多核处理器主要针对多线程应用,提出多核结构的主要初衷也是如此,如果不采用特殊措施,串行程序很难从中受益。而大量的传统应用都是串行程序,基于兼容性的考虑,片上多核处理器必须支持它们的运行,即便是多线程应用,每个线程也是串行执行的。同时,由于在一个芯片上集成了多个处理器核,出于功耗和面积的考虑,处理器设计者往往倾向于采用结构相对简单的处理器核。以上种种有可能造成单处理器执行串行程序的速度比多核还要快。基于上述原因,在多核环境加速串行程序具有重要的研究意义和实际的应用需求。

多核加速串行程序主要有三种方法,包括并行编译器、推测多线程以及基于线程的预取机制等。

并行编译器

加快应用程序的执行速度是体系结构研究者的目标之一。超标量(SuperScalar)和VLIW通过挖掘细粒度并行(指令级并行,ILP)来达到加速应用程序的目的。这些技术在20世纪90年代得到空前的发展,然而人们逐渐感受到受限于这些技术狭小的继续发展空间。越来越多的研究者把希望寄托在挖掘粗粒度并行(线程级并行,TLP)上。传统的方法主要有两种:一种是程序员显式使用并行编程技术来开发应用程序,由于受限于现有的语言模型的局限性和求解问题的复杂度,这种方法没能得到大规模的推广;另一种就是依赖于并行编译器自动地将串行程序并行化。

串行程序并行化是并行处理领域研究的热点问题,也是高性能计算领域需要解决的问题之一。这个问题由来已久,然而始终未能得到很好的解决。传统

方法主要依靠并行编译器将串行程序编译成多个小的并行程序。比如斯坦福(Stanford)大学的SUIF编译器等[6]。因为要处理多个拆分后的小程序之间的依赖关系,同时要保持原有串行程序语义,导致编译器的策略非常保守,实际效果也不太理想。而且已有研究成果主要应用在科学计算,不能适应于如桌面应用、多媒体及服务器等更广泛的领域。

推测多线程

在传统并行编译中,编译器需要花费很大的精力来保证拟划分线程之间不存在数据依赖关系。然而实际情况是,编译时存在大量模糊依赖,尤其是在允许使用指针(如C程序)的情况下,编译器不得不采用保守策略来保证程序执行的正确性。这大大限制了串行程序可以挖掘的并发程度,也决定了并行编译器只能在狭窄范围使用。

为解决这些问题,人们提出串行程序推测并行化[7]。其关键思想是放松对编译器的限制,使其不再受限于保守的分析线程间的依赖关系(分为寄存器数据依赖即register dependence,以及访存数据依赖即memory dependence),对于模糊的或者说编译时不能静态确定的依赖关系,则先假定它们不存在(或存在部分的依赖关系,即实现partial speculative),根据一定的策略选择,比如循环叠代(loop iteration), 子程序调用(subroutine call)等,编译器(或硬件)在串行程序中选择可以推测并发执行的区域,将这些线程动态分布在不同的处理资源上并发执行。同时执行的多个线程中,只有一个是非推测(non-speculative)的,其余都是推测(speculative)的。只有非推测的线程才能影响体系结构的状态,其余的线程不能随意修改体系结构的状态直到他们成为非推测的状态为止。这就需要有相关的硬件机制来保存这些相关推测线程的状态和运行结果。由于编译器放松了对线程间数据依赖的限制,需要有硬件机制来监视实际线程运行的情况,一旦在运行过程中检测到与串行语义相冲突的事件(比如线程间发生RAW10冲突),就要将现有的执行作废并重新执行以保证原有的语义。后来随着值预测技术(value prediction)的发展[8,9],进一步打破了这种依赖关系的束缚,即便明确存在依赖,如果能准确地预测后继相关线程所需的输入值,就可以避免同步或预测未命中(Miss Speculation),进一步挖掘线程并发度,更大地加速应用程序的执行速度。研究结果表明,如果线程选择合理,采用合适的策略,推测并行能获得远远高于超标量获得的IPC,极大地提高了系统的性能。

基于线程的预执行机制

传统的并行编译器和推测并行化技术必须保证从单线程中派生出来的多线程执行的正确性,从而导致保守的线程生成策略和复杂的硬件机制。为了解决这

一问题,研究者提出了基于线程的执行机制。总体来讲,基于线程的预执行技术主要针对预取和转移猜测指令的预测。由于“内存壁垒(memory wall)11”一直是影响程序执行速度的重要因素,并且大量的应用程序是访存敏感的,因此大部分研究主要集中研究基于线程的预取技术。传统的硬件或软件预取,属于基于结果的预测技术,适合于具有规则访存行为的应用程序。而基于线程的预取技术利用空闲的多线程硬件资源,通过动态地执行地址预测代码进行预取,属于基于执行踪迹(trace)的预测技术,具有更高的预取准确率,不仅可以加速具有规则访存行为的应用程序,而且能够有效地加速访问模式不规则的应用。

研究者发现程序运行中大部分的访存失效操作都是由一小部分静态访存指令引起的。同时,这些指令有很好的时空局部性,重复执行的频率很高。我们称这样的访存指令操作为长延迟访存指令。更进一步,研究者通过分析动态的指令执行的踪迹发现,对于连续两个相邻的同一静态长延迟访存指令之间的指令执行序列,并不是所有指令都参与计算长延迟访存指令的地址。所以,计算长延迟访存指令地址的指令序列的长度很可能小于原程序的指令序列[5,10]。这意味着,该指令序列很可能运行得比原有线程快,从而提前计算出长延迟访存指令将要访问的内存地址。基于上述现象,研究者试图利用硬件收集指令执行的踪迹(trace),或是通过软件(如编译器或二进制分析工具)分析热点区域的代码,从中抽取计算目标长延迟访存指令的访存地址的指令序列。这样的指令序列就是预取线程。

预取线程和原有线程同时运行,由于预取线程一般可以看作是原有线程的“精简版本”,它往往比原有线程运行得快,因此预取线程负责提前计算原有线程的长延迟访存指令的访存地址,先于原有线程发出这些访存请求,并把执行结果提前反馈给原有线程以达到加速程序执行速度的目的。预取线程仅仅起到预取的作用,不能修改体系结构状态。如果预取线程成功预先执行了这些关键指令,这种情况能够达到加速效果;如预取线程没有预先执行关键指令或执行结果有错时,反而可能会降低原有线程的执行速度,但不会影响整个程序的正确性。所以,基于线程的预取机制可以使提高性能和保持正确性两个目标解耦,从而大大放松了划分并行线程时的诸多限制,这不仅能够有效地提升性能,而且降低了系统实现的复杂度。

5. 总结

总之,微处理器的发展正处在历史的转折点上。互连网的普及正在悄悄改变着计算机的应用模式,主频至上的处理器设计理念正在终结。而且由于晶体管技术的限制,功耗和发电量已经成为设计更高性能的处理器最大的障碍。在这种前

提下,多核处理器的出现是顺应历史潮流的。多核将成为未来很长一段时间里处理器的标准。

本文通过回顾了处理器发展历史和趋势,多核处理器要广泛应用所需解决的问题等几个方面全面阐述了多核处理器的优势和存在问题。相信今后几年,计算机界肯定能更加充分地利用多核的优势,提出更好的方法解决现存的问题,多核时代已经来临。

参考文献

[1] Jeff Parkhurst, John Darringer, Bill Grundmann: From Single Core to Multi-Core Preparing for

a new exponential. Nov. 2006 Proceedings of the 2006 IEEE/ACM international conference on Computer-aided design

[2] Perry H. Wang1, Jamison D. Collins1, Gautham N. Chinya1, Hong Jiang2, Xinmin Tian3, Milind Girkar3, Nick Y. Yang2, Guei-Yuan Lueh2, and Hong Wang1: EXOCHI: Architecture and Programming Environment for A Heterogeneous Multi-core Multithreaded System. Jun. 2007 ACM SIGPLAN Notices 卷次: 42 刊期: 6

[3]Orlando Moreira, Frederico Valente, Marco Bekooij: Scheduling multiple independent hard-real-time jobs on a heterogeneous multiprocessor. Sep. 2007 Proceedings of the 7th ACM & IEEE international conference on Embedded software

[4] Guangming Tan, Ninghui SunA, Guang R. Gao: Parallel Dynamic Programming Algorithm on

a Multi-core Architecture. Jun. 2007 Proceedings of the nineteenth annual ACM symposium on Parallel algorithms and architectures

[5] Jeffery A. Brown, Rakesh Kumar, Dean Tullsen: Proximity-Aware Directory-based Coherence for Multi-core Processor Architectures. Jun. 2007 Proceedings of the nineteenth annual ACM symposium on Parallel algorithms and architectures

[6] C. Zilles. Master/Slave Speculative Parallelization and Approximate Code. PhD thesis, Computer Sciences Department, University of Wisconsin-Madison, Aug. 2002.

[7] K. Olukotun, B. A. Nayfeh, L. Hammond, K. Wilson, and K. Chang. The Case for a Single-Chip Multiprocessor. In Proceedings of ASPLOS-VII, October 1996

[8] D. Tullsen, S. Eggers, and H. Levy. Simultaneous multithreading: Maximizing on-chip parallelism. In 22nd ISCA, pages 392-403, June 1995.

[9] A. Roth and G. Sohi. Speculative data-driven multithreading. In the 7th HPCA, Jan. 2004.

[10] Proceedings of the Fourth International Symposium on High-Performance Computer Architecture (HPCA-4), Las Vegas, NV, February 1998.

[11]Bratin Saha, Ali-Reza Adl-Tabatabai, Richard L. Hudson, Chi Cao Minh, Benjamin Hertzberg: McRT-STM: A High Performance Software Transactional Memory System for a Multi-Core Runtime. Mar. 2006 Proceedings of the eleventh ACM SIGPLAN symposium on Principles and practice of parallel programming

相关主题
文本预览
相关文档 最新文档