鲲鹏CPU架构分析1:高性能处理器的存储器组织与片上互联
1.多核系统的存储结构
2.多核处理器的cache一致性
3.UMA架构与NUMA架构
4.多核处理器的核间通信机制
鲲鹏CPU架构分析1:高性能处理器的存储器组织与片上互联
(戴志涛、大何)
为了使处理器的处理能力得到充分发挥,存储系统必须能够提供与处理器性能相匹配的存储器带宽。
因此,处理器与主存储器之间的速度差距一直是处理器结构设计中必须考虑的问题。由于处理器内的核心数目增多,并且各核心采用共享存储器结构进行信息交互,对主存的访问需求进一步增加,在单处理器时代面临的存储墙问题依然存在,而且问题更加严重。
故必须针对多核处理器进行相应的存储结构设计,并解决好存储系统的效率问题。
1.多核系统的存储结构
目前的存储系统设计仍然采用存储器分级的方式解决存储速度问题,高性能的处理器采用二级甚至三级cache提高存储系统的等效访问速度,并且处理器片内的cache容量尽可能增大。但多核系统中的存储系统设计必须平衡系统整体性能、功耗、成本、运行效率等诸多因素。
因此,在多核处理器设计时,必须评估共享cache和私有cache孰优孰劣、需要在芯片内设置几级Cache等因素,cache的大小也是需要考虑的重要问题。
根据多核处理器内的cache配置情况,可以把多核处理器的组织结构分成以下四种,如图1所示。
- 片内私有L1 cache结构:简单的多核计算机的cache结构由L1和L2两级组成。处理器片内的多个核各自有自己私有的L1 cache,一般被划分为指令L1(L1-I)cache和数据L1(L1-D)cache。而多核共享的L2 cache则存在于处理器芯片之外。
- 片内私有L2 cache结构:处理器片内的多个核仍然保留自己私有的指令L1 cache和数据L1 cache,但L2 cache被移至处理器片内,且L2 cache为各个核私有。多核共享处理器芯片之外的主存。
- 片内共享L2 cache结构:结构与片内私有L2 cache的多核结构相似,都是片上两级cache结构。不同之处在于处理器片内的私有L2 cache变为多核共享L2 cache。多核仍然共享处理器芯片之外的主存。对处理器的每个核而言,片内私有L2 cache的访问速度更高。但在处理器片内使用共享的L2 cache取代各个核私有的L2 cache能够获得系统整体性能的提升。
- 片内共享L3 cache结构:随着处理器芯片上的可用存储器资源的增长,高性能的处理器甚至把L3 cache也从处理器片外移至片内。在片内私有L2 cache结构的基础上增加片内多核共享L3 cache使存储系统的性能有了较大提高。下图给出了这种结构的示意。
图1 多核处理器的存储组织
2.多核处理器的cache一致性
在多核系统设计时必须考虑多级cache的一致性(cache coherency)问题。
对内存的基本操作包括读操作和写操作。cache一致性问题产生的原因是:在一个处理器系统中,不同的cache和主存空间中可能存放着同一个数据的多个副本,在写操作时,这些副本存在着潜在的不一致的可能性。
在单处理器系统中,cache一致性问题主要表现为在内存写操作过程中如何保持各级cache中的数据副本和主存内容的一致,即使有I/O通道共享cache,也可以通过全写法或写回法较好地解决cache一致性问题。
而在多核系统中,多个核都能够对内存进行写操作,而cache级数更多,同一数据的多个副本可能同时存放在多个cache存储器中,某个核的私有cache又只能被该核自身访问。即使采用全写法,也只能维持一个cache和主存之间的一致性,不能自动更新其他处理器核的私有cache中的相同副本。这些因素无疑加大了cache一致性问题的复杂度,同时又影响着多核系统的存储系统整体设计。
维护cache一致性的关键在于跟踪每一个cache块的状态,并根据处理器的读写操作及总线上的相应事件及时更新cache块的状态。
一般来说,导致多核处理器系统中cache内容不一致的原因如下:
可写数据的共享:某个处理器采用全写法或写回法修改某一个数据块时,会引起其他处理器的cache中同一副本的不一致。
I/O活动:如果I/O设备直接连接在系统总线上,I/O活动也会导致cache不一致。
核间线程迁移:核间线程迁移就是把一个尚未执行完的线程调度到另一个空闲的处理器核中去执行。为提高整个系统的效率,有的系统允许线程核间迁移,使系统负载平衡。但这有可能引起cache的不一致。
对于I/O活动和核间线程迁移而导致的cache不一致,可以分别通过禁止I/O通道与处理器共享cache以及禁止核间线程迁移来简单解决。因而多处理器中的cache一致性问题主要是针对可写数据的共享。
在多核系统中,cache一致性可以使用软件或者硬件维护。
软件方法采取的手段是“预防”。在使用软件方式维护cache一致性时,处理器需要提供专门的显式cache操作指令,如cache块拷贝、cache回收和使cache失效等指令,让程序员或编译器分析源程序的逻辑结构和数据相关性,判断可能出现的cache一致性问题,利用这些指令维护cache一致性。软件维护cache一致性的优点是硬件开销小,缺点是在多数情况下对系统性能有较大影响,而且需要程序员的介入。
由于引入cache的主要目的是提升存储器的等效访问速度,故多数情况下cache一致性由硬件维护。硬件方法采取的手段是“通过硬件发现和解决所发生的cache一致性问题”。不同的处理器系统使用不同的cache一致性协议维护cache一致性。cache一致性协议维护一个有限状态机,并根据存储器读写指令或者总线上的操作进行状态转移并完成相应cache块的操作,以维护cache一致性。
目前,大多数多核处理器采用总线侦听(bus snooping)协议,也有的系统采用目录(directory)协议解决多级cache的一致性问题。目录协议在全局的角度统一监管不同cache的状态;而在总线侦听方式中,每个cache分别管理自身cache块的状态,并通过广播操作实现不同cache间的状态同步。
3.UMA架构与NUMA架构
可以根据处理器对内存储器的访问方式将共享存储器方式的计算机系统分为两大类,即统一内存访问(Uniform Memory Access,UMA)架构和非统一内存访问(Non Uniform Menory Access,NUMA)架构。
UMA是SMP计算机采用的存储器架构,因此SMP系统有时也被称为UMA架构系统。如图2所示,在SMP架构下,系统中的每个处理器核地位相同,其看到的存储器和共享硬件也都是相同的。在UMA架构的多处理器系统中,所有的处理器都访问一个统一的存储器空间,这些存储器往往以多通道的方式组织。在UMA架构下,所有的内存访问都被传递到相同的共享内存总线上,不同的处理器访问存储器的延迟时间相同,任何一个进程或线程都可以被分配到任何一个处理器上运行。每台处理器还可以配备私有的cache,外围设备也可以通过某种形式共享。因而UMA架构可以在操作系统的支持下达到非常好的负载均衡效果,让整个系统的性能、吞吐量有较大提升。
但从存储器访问的角度看,SMP架构的缺点是可伸缩性较差。这是因为多个核使用相同的总线访问内存,随着处理器核数的增加,总线将成为系统性能提升的瓶颈。因而UMA架构只适用于处理器核数量相对较少的情况,不适用于系统中配置数十个甚至数百个处理器核的情况。
图2 SMP处理器的UMA组织示意
而NUMA架构则属于分布式共享存储(Distributed Shared Memory,DSM)架构,存储器分布在不同节点上。NUMA架构通过限制任何一条内存总线上的处理器核数量并依靠高速互连通道连接各个节点,从而缓解了各个处理器核竞争共享内存总线造成的访问瓶颈的影响。
在NUMA架构中,每个处理器与本地存储器单元(local memory unit)距离更短,而与远程存储器(remote memory,其它处理器所属的本地存储器)距离更长。因此,处理器访问本地存储器的存储器延迟(memory latency)比访问远程存储器更短。也即,NUMA架构的系统中存储器访问周期是不固定的,取决于被访问存储器的物理位置。
图3 NUMA架构示意
从图3所示的NUMA存储器组织架构中可以看到,不同 NUMA域内的处理器核访问同一个物理位置的存储器的延迟时间不同。系统内的存储器访问延时从高到低依次为:跨CPU访存、不跨CPU但跨NUMA域访存、NUMA域内访存。因此,在应用程序运行时应尽可能避免跨NUMA域访问存储器,这可以通过设置线程的CPU亲和性(affinity)来实现。
NUMA架构既可以保持SMP架构的单一操作系统、简便的应用程序编程模式及易于管理的特点,又可以有效地扩充系统的规模。NUMA架构能够为处理器访问本地存储器单元提供高速互连机制,同时为处理器访问远程存储器单元提供较为经济但延迟时间更高的连接通道,因而NUMA架构的系统通常比UMA架构的系统更加经济且性能更强大。
在NUMA架构中,有一种类型的应用特别普遍的系统,即缓存一致性非统一内存访问(Cache Coherent Non-Uniform Memory Access,CC-NUMA)系统。缓存一致性问题是由于多个处理器共享同一个存储空间而引起的,而CC-NUMA是指通过专门的硬件保持cache中的数据和共享内存中的数据的一致性,不需要软件来保持多个数据副本之间的一致性。当某个存储单元的内容被某个处理器改写后,系统可以很快地通过专用硬件部件发现并通知其他各个处理器。因此。在CC-NUMA系统中,分布式内存储器被连接为单一内存空间,多个处理器可以在单一操作系统下使用在SMP架构中一样的方式完全在硬件层次实现管理。无论CC-NUMA计算机内部有多少个处理器,对用户而言系统都可以被看作是一台计算机。
4.多核处理器的核间通信机制
多核处理器片内的多个处理器核虽然各自执行各自的代码,但是处理器核之间需要进行数据的共享和同步,因此多核处理器硬件结构必须支持高效的核间通信,片上通信结构的性能也将直接影响处理器的性能。
当前主流的片上通信方式有三种:总线共享cache结构、交叉开关互连结构和片上网络结构。
- 总线共享cache结构
总线共享cache结构是指多核处理器核共享L2 cache或L3 cache,片上处理器核、输入输出端口以及主存储器接口通过连接各处理器核的总线进行通信。
这种方式的优点是结构简单、易于设计实现、通信速度高,但缺点是总线结构的可扩展性较差,只适用于核心数较少的情况。
斯坦福大学研制的Hydra处理器、英特尔公司开发的酷睿(Core)处理器、IBM公司开发的POWER4处理器和POWER5处理器等早期的多核处理器很多采用总线共享结构。
- 交叉开关互连结构
传统的总线结构采用分时复用的工作模式,因而在同一总线上同时只能进行一个相互通信的过程。而交叉开关(crossbar switch)结构则能够有效提高数据交换的带宽。
交叉开关是在传统电话交换机中沿用数十年的经典技术,它可以按照任意的次序把输入线路和输出线路连接起来。图4所示为连接8个处理器核和8个内存模块的交叉开关结构。
图左侧的每条水平线和每条垂直线的交点都是可控的交叉节点,可以根据控制信号的状态打开或闭合。闭合状态的交叉节点使其连接的垂直线和水平线处于连通状态。图中黑色实心节点处于闭合状态,空心节点处于打开状态,图右侧显示了放大的节点示意图。图中显示有三个开关处于闭合状态,这意味着同时可以有三个处理器核分别与不同的存储器模块进行信息交互。
交叉开关网络是一种无阻塞的网络,因而这种架构不会因为网络本身的限制导致处理器核无法与内存模块建立连接。只要不存在存储器模块本身的冲突,图4所示的8×8交叉开关结构最多可以同时支持八个连接。
与总线结构相比,交叉开关的优势是数据通道多、访问带宽更大,但缺点是交叉开关结构占用的片上面积也较大,因为n×n的交叉开关需要n2个交叉节点。而且随着核心数的增加,交叉开关结构的性能也会下降。因此这种方式也只适用中等规模的系统。
AMD公司的速龙(Athlon)X2双核处理器就是采用交叉开关来控制核心与外部通信的典型实例。
图4 连接8个处理器核和8个内存模块的交叉开关结构
- 片上网络结构
片上网络(Network on a Chip,NoC;On-chip Network)技术借鉴了并行计算机的互联网络结构,在单芯片上集成大量的计算资源以及连接这些资源的片上通信网络。每个处理器核心具有独立的处理单元及其私有的cache,并通过片上通信网络连接在一起,处理器核之间采用消息通信机制,用路由和分组交换技术替代传统的片上总线来完成通信任务,从而解决由总线互连所带来的各种瓶颈问题。
片上网络与传统分布式计算机网络有很多相似之处,但限于片上资源有限,设计时要考虑更多的开销限制,针对延时、功耗、面积等性能指标进行优化设计,为实现高性能片上系统提供高效的通信支持。
片上网络可以采用多种拓扑结构,如环形拓扑、网状拓扑、树状拓扑等。图5显示了一种常用的二维网状网络(2D Mesh)片上网络结构。片上网络包括计算子系统和通信子系统两部分。计算子系统由处理单元(Processing Element,PE)构成,完成计算任务,PE可以是处理器核心,也可以是各种专用功能的硬件部件或存储器阵列等。通信子系统由交换(switch)节点(图中缩写为“S”)及节点间的互连线路组成,负责连接PE,实现计算资源之间的高速通信。通信节点及其间的互连线路所构成的网络就是片上通信网络。在图示的二维网状网络结构中,每个PE与一个交换节点相连,而每个交换节点则与四个相邻的交换节点和一个PE相连,交换节点实现路由功能,并作为每个相邻的PE的网络接口。
与总线结构和交叉开关互连结构相比,片上网络可以连接更多的计算节点,可靠性高,可扩展性强,功耗也更低。因此片上网络被认为是更加理想的大规模多核处理器核间互连技术。这种结构的缺点是硬件结构复杂,且软件改动较大。
图5 二维网状网络片上网络结构
这三种互连结构还可以相互融合,例如在整体结构上采用片上网络方式,而在局部选择总线或交叉开关结构,以实现性能与复杂度的平衡。