4 1
第 3 版 · OCR 辅助 · 原书检索 · 文字用于定位,公式与图表请回原页核验 · 本次导入快照
### 4 1
35
### 3 0
8
18
6
节点号
主存块号
块内偏移
(b)主存地址划分
### 2 1
72
### 1 0
### 0 0
(c)节点72中的目录
图9.4 基于目录的CC-NUMA多处理器
从图9.4可以看出,在CC-NUMA多处理器系统中,每个 CPU 都通过局部总线与本地
存储器相连形成一个节点,每个CPU中有高速缓存,每个存储器中都有一个存放目录信息
的存储区。所有节点通过某种互连网络进行互连。
基于目录的CC-NUMA 多处理器结构的基本思想是,每个处理器采用一个目录来记录
本地存储器中每个主存块与高速缓存中 cache行的对应情况。每个主存块对应一个目录
项,目录项中有专门的一位有效位,表示对应的主存块是否在某个 cache行中,若该位为1,
第9章
321
<!-- page: 339 -->
计算机组成与系统结构(第3版)
322
则表示在 cache中,目录项中记录对应的 cache行所在的节点号;若该位为0,则说明不在
cache中。
图9.4所示的系统中共有256个节点,每个节点内的存储器大小为16MB,并且连续编
址,因此,该系统总的主存空间大小为256×16MB=4GB。通用计算机的存储器都采用字
节编址,因此,该系统的主存地址为32位,其中高8位为存储器号,即节点号,低24位为存
储器内地址。根据图9.4(b)中的主存地址划分,低6位为块内偏移,这里的“块”指主存与高
速缓存交换的主存块,因此主存块大小为64B,每个存储器占16MB/64B=218个主存块。因
此,每个节点对应的目录中有218个目录项,同时图9.4(b)所示的主存地址低24位被分为两
个字段,其中高18位为主存块号,它可以作为目录项的索引。
为了理解上述系统是如何工作的,现举一个例子。例如,假定在节点18中的CPU 执行
了一条 load指令。首先,在节点18中的MMU将load指令指出的虚拟地址转换为物理地
址,假设该物理地址为480000C8H,其高8位值为72,低24位值为200,说明该load指令将
读取节点72的存储器中200号单元开始的数据,因此,节点18中的MMU将不会到本地存
储器中取数,而是把请求消息通过互连网络发送到节点72。节点72接收到请求消息后,先
查看如图9.4(c)所示的节点72中的目录。因为主存地址中的主存块号为3,所以查看目录
项3,发现有效位为0,说明对应主存块不在任何cache行中,所以,节点72中的主存控制器
将存储器中的第3主存块读出并传送到节点18,同时将目录项3中的有效位置1,节点号置
为18,以表示对应主存块被高速缓存在节点18中。
如果load指令访问的物理地址为48000108H,则请求消息中的主存块号为4,因此查
看目录项4,发现有效位为1,节点号为35中,说明对应主存块已被高速缓存在节点35中。
此时,节点72中的主存控制器将目录项4中的节点号改为18,并向节点35发送一个消息,
指示节点35将高速缓存中的该主存块送到节点18并且使其自身高速缓存中对应的 cache
行无效。
由上面的例子可以看出,CC-NUMA虽然是一种共享存储器多处理器,但是,由于物理
存储器分布在不同节点上,因此在 load和 store指令进行存储访问的过程中还需要有很多
消息传递。
上述介绍的基于目录的CC-NUMA多处理器是一种简单处理方式,每个主存块只能被
高速缓存在一个节点中,显然这种方式会带来更多的网络通信开销。
9.2.3多处理器系统中的互连网络
除了上述介绍的用于UMA多处理器的单总线、交叉开关和多级交换网络互连方式以
外,在CC-NUMA多处理器中,每个CPU-存储器节点之间还可以有其他的网络互连方式。
图9.5中给出了几种常用的互连网络结构。图中用方块表示一个 CPU-存储器节点,用黑圆
点表示交换器。
在小型系统中,可以采用单一交换器的星形结构或不需要交换器的环形结构,如
图9.5(a)和图9.5(b)所示。若要构建大规模系统,则可以采用如图9.5(c)所示的网格结构
或其变种(如双凸面结构),也可以采用如图9.5(d)所示的立方体结构或其扩展结构(如超
立方体结构)。
<!-- page: 340 -->
并行处理系统
只口
口口口只
口P
尸
□-
O
口
口
口
(a)星形
尸
口
口
口
(b)环形
O-
□-
□-
O-
□
口
□
(c)网格
O
□
□
O
□
口
口
口
口
口
(d)立方体
口
口
图9.5 互连网络拓扑结构
9.2.4多核处理器和硬件多线程技术
纵观计算机的发展历史,日益提升计算性能是计算技术不断追求的目标和计算技术发
展的主要特征之一。为了提升单处理器计算机系统的性能,人们采用了多种技术手段,从扩
展字长、提高集成度、提升主频,到改进微架构,采用多种指令级并行(instruction-level
parallelism,ILP)技术等。
到2004年以前,上述这些技术手段和改进措施都能极大提高微处理器的计算性能。但
是,此后处理器的性能便不再像人们预期的那样继续提高。人们发现,随着集成度的不断提
高和处理器主频的不断提升,单核处理器的性能提升开始接近极限。首先,目前集成电路已
经达到了几纳米的极小尺度,然而,受到半导体器件制造工艺的限制,芯片集成度不可能无
限制提高。与此同时,根据芯片的功耗公式P=CV2f(其中,P是功耗;C是时钟跳变时门
电路电容,与集成度成正比;V是电压;f是主频),芯片的功耗与集成度成正比,与主频成正
比。集成度和主频的大幅度提升导致了功耗的快速增大,进一步导致了难以克服的处理器
散热问题。而指令级并行(ILP)技术也已经发展到了极限。2004年5月,Intel 处理器
Tejas 和 Jayhawk(4GHz)因无法解决散热问题,导致其发展计划最终遭到撤销,这标志着升
频技术时代的终结。
2005年,Intel公司宣布了微处理器技术的重大战略调整,即从2005年开始,放弃过去
不断追求单处理器性能提升的战略,转向以多核微处理器架构实现性能提升的思路。自此,
Intel 公司和其他微处理器制造商推出了许多多核架构,微处理器全面转入了多核计算技术
的时代。
1.多核处理器系统
多核计算的基本思路是:在一个CPU芯片中设计多个简单的处理器核(core),通过多
个核的并行计算来提高计算性能。因此基于一个 CPU 芯片可以实现一个多处理器系统。
基于多核芯片的处理器被称为片级多处理器(chip-level multiprocessors,CMP)。
自Intel公司在2006年推出双核的Pentium D处理器以来,已经出现了很多4核到12
核的多核处理器产品,如2007年Intel公司推出的主要用于个人计算机的4核Core 2 Quad
系列以及2008—2010年推出的 Core i5和i7系列。Intel公司在服务器市场也陆续推出了
Xeon E5系列 4~12 核处理器,以及 Xeon E7系列6~10 核处理器。
图8.4给出了型号为Core i7-965/975 Extreme Edition 的多核处理器的连接结构。从
图中可以看出,Intel Core i7芯片内含4个核,每个核是一个简单的处理器,包含寄存器组、
高速缓存(L1 cache 和 L2 cache)、TLB、MMU、指令预取部件和相应的指令执行功能部件,
第9章
323
<!-- page: 341 -->
计算机组成与系统结构(第3版)
324
能够独立执行指令序列。核与核之间通过QPI总线高速互连,并且所有核共享一个芯片内
的L3联合 cache和一个存储控制器,该存储控制器通过存储器总线与主存储器相连,所有
核共享主存储器。可见,从连接结构和软件角度来看,它与UMA多处理器系统没有什么
差别。
2.硬件多线程
硬件多线程(multi-threading)技术是一种共享单个处理器核内功能部件的技术。每个
线程相当于一个指令序列,用于指令执行的功能部件和高速缓存在每个核内仅有一套。为
了支持多线程并发执行,必须为每个线程提供单独的通用寄存器组和程序计数器等用于存
放现场信息的资源,并提供快速的线程切换机制。有3种多线程实现方式:细粒度多线程、
粗粒度多线程和同时多线程(simultaneous multithreading,SMT)。
细粒度多线程通过在多个线程之间轮流交叉执行指令的方式实现多线程。这种方式
下,处理器核能在每个时钟周期切换线程,例如,在时钟周期i,将线程1中的多条指令发射
到多个发射槽中执行;在时钟周期i+1,将线程2中的多条指令发射到多个发射槽中执行。
粗粒度多线程方式则仅在某个线程出现了较大开销的阻塞时才切换线程,例如,发生
L2 cache不命中的情况。这种方式下,当发生流水线阻塞时,必须将被阻塞的流水线冻结
或清空,新线程的指令开始执行前需要重填流水线,因此,线程切换的开销比细粒度多线
程大。
同时,多线程是上述两种多线程技术的变种,它利用多发射动态调度处理器核中更多的
功能部件,在实现指令级并行的同时,实现线程级并行,即它能在同一个时钟周期中,在不同
的发射槽中发射不同线程中的指令。Intel处理器中的超线程(hyper-threading)即为同时
多线程。
显然,多线程技术可以提高处理器核中的功能部件的利用率。例如,在一个超标量处理
器核中,如果不支持多线程而只有单个指令流的话,那么,在很多时候同时发射的指令条数
不能填满多个发射槽,导致发射槽中的功能部件空闲。而且,在指令执行过程中,因为指令
cache 缺失等情况而发生阻塞时,整个处理器核都处于空转状态。
不过,使用多核处理器或者硬件多线程也可能会带来新的性能干扰问题。对多核处理
器来说,不同的处理器核之间会共享LLC、内存带宽、1/O带宽等资源,而对于硬件多线程,
则同一个核心上的多个硬件线程之间还会共享超标量处理器中包括发射队列、ROB、访存
队列、分支预测器和L1 cache 等资源。当处理器核或线程的负载较高时,就会在这些资源
上产生竞争现象,竞争不到资源的处理器核或线程将会被阻塞而受到干扰,从而造成性能
下降。
在一些对性能稳定性要求较高的场合,可能会限制使用甚至关闭多核和硬件多线程技
术。例如,近年来的“双11”购物节,阿里巴巴在线购物的数据中心都会面临巨大的交易负
载,为了保证用户的交易体验,系统管理员都会提前制定严格的任务调度策略,避免将多个
交易线程调度到同一个处理器核上从而带来干扰;而在航空航天领域,计算机系统对实时性
的要求极高,美国联邦航空管理局曾在发布的白皮书中建议关闭机载计算机中的多核功能,
来保障系统的实时性。如何在提高资源利用率的情况下保障程序之间的性能不受干扰,是
目前体系结构发展的一个新的挑战。
<!-- page: 342 -->
并行处理系统
*9.2.5共享存储器的同步控制
早期处理器都是单核的,对于存储器访问指令来说,如果多条访存指令访问的是不同地
址中的数据,则可通过编译器的静态调度或在处理器执行指令时进行动态调度来改变访存
指令的顺序,以优化程序执行的性能。这种情况下,程序执行的结果不会发生错误。
但是,在多核处理器系统中,每个处理器核有一个或多个指令流(硬件多线程情况下)在
执行,由于不同处理器核共享同一个主存储器,因此,情况就会发生变化。如果同一段时间
内多个核都要访问共享存储器,那么,由于处理器核在执行程序时存在流水线阻塞、功能部
件冲突、指令顺序调度等各种随机情况,因而多个核的程序之间的访存顺序就存在不确定
性,从而造成执行结果的不确定。这种不确定性给软件开发造成困扰,给运行多核程序的系
统带来不稳定性,因此,在多核处理器系统中,必须有相应的同步控制机制。
1.存储器一致性模型
为了能够使上层软件在多核程序访问共享存储器时得到确切结果,指令集体系结构
(ISA)必须规定架构所用的存储器一致性模型(memory consistency model),并提供和该模
型相匹配的一套同步指令。而且,不管是使用高级语言编程的程序员,还是设计操作系统和
编译器的系统程序员,或是硬件设计者,都应该了解底层ISA架构中使用的存储器一致性
模型。
存储器一致性模型简称为存储器模型(memory model)。下面简单介绍一下3种有代
表性的存储器模型:顺序一致性模型(sequential consistency model)、宽松一致性模型
(relaxed consistency model)和释放一致性模型(release consistency model)。
1)顺序一致性模型
顺序一致性模型要求每个处理器核完全按照程序指定的顺序(program order)执行,即
使多条访存指令访问的地址不同,也不可以改变访存指令的执行顺序。从全局来看,每一条
store指令写人存储器的结果应该被系统中的所有处理器核同时观测到,即存储器每次只会
和一个处理器核连接,因此,对存储器的访问都应该是串行的。
假设系统中有两个处理器核,其中,核0上的程序包含了顺序为A1→A2→A3的3条
访存指令,核1上的程序包含了顺序为B1→B2→B3的3条访存指令,那么,若该系统采用
顺序一致性模型,其指令执行顺序就一定符合核0和核1各自程序指定的顺序,即可能的执
行顺序为A1→A2→A3→B1→B2→B3或 A1→B1→A2→B2→A3→B3或A1→A2→B1→
A3→B2→B3等。
顺序一致性模型比较简单和直观,但是,它严格限制了一个处理器核的访存指令执行顺
序,即使访问的不是同一个主存地址,也不允许改变访存指令的顺序,因而限制了处理器性
能优化措施的实施,从而影响整个系统的性能。在实际系统中顺序一致性模型很少使用,因
为强行使程序在一个处理器核上按程序指定顺序执行,大多数情况下是没有必要的。
2)宽松一致性模型
宽松一致性模型比顺序一致性要求更宽松,它允许改变一个处理器核内程序中对于不
同存储器地址的访存指令的执行顺序,因而程序运行性能更高。不过,因为多核处理器中不
同核上运行的程序共享存储器,在某些情况下,若不按照顺序执行访存指令,则程序执行结
果会发生错误。为了在某些必要的情况下保证访存指令的执行顺序,采用宽松一致性模型
第9章
325
<!-- page: 343 -->
计算机组成与系统结构(第3版)
326
的ISA需要提供特殊的存储器屏障(memory fence)指令,相当于设置一个同步点,以保证
在fence指令之前的访存指令执行的结果一定比fence之后的访存指令执行的结果先被观
测到,即在 fence之前的访存指令一定先执行完,才能执行fence之后的访存指令。
宽松一致性模型与存储器屏障指令的结合,使得多核处理器系统达到了性能和功能之
间的平衡。如果对访存顺序没有要求,利用宽松一致性模型可以实现较高的性能;在对访存
顺序有要求的场合,只要加一条存储器屏障指令就可以约束指令执行顺序。
3)释放一致性模型
上述宽松一致性模型系统中的存储器屏障指令在两个方向上都有限制,即要求 fence
之前的访存指令不能推迟到fence之后,而fence之后的访存指令不能提前到 fence 之前,
前、后都不能越过屏障。如果再放松要求,只限定一个方向的访存指令执行顺序,就是更加
宽松的释放一致性模型。
释放一致性模型采用获取-释放(acquire-release)机制来实现存储器访问的一致性,其
主要思想是:提供一种获取指令(acquire),用于拦截它之后的所有访存指令,即要求在它之
后的所有访存指令都在它之后才能执行;同时,还提供一种释放指令(release),用于拦截它
之前的所有访存指令,即要求在它之前的所有访存指令都必须在它之前执行完。
以下通过一个例子来说明上述存储器一致性模型该如何使用。考虑以下场景:核0将
一块数据写入存储器中的某个区域,然后通知核1读取此数据块。为此,程序员开发了一个
多核应用程序,主要实现思想如下:①核0和核1约定一个共享的全局变量作为同步标志,
全局变量在主存中分配一个存储单元,两个核都可以访问该存储单元,以设置或读取其值;
②核0完成了写数据块的操作后,就将一个“特殊的值”写入共享变量单元中,作为旗语;
③核1不断监测此共享变量的值,一旦检测到“特殊的值”,则认为可以安全地读取数据块。
因此,两个核上的程序可以各自抽象为以下操作序列。
核 0:写入数据块→设置旗语。
核1:监测旗语→检测到“特殊的值”→读取数据块。
显然,两个核上的上述操作功能都需要通过访存指令完成。为了能够准确实现所要求
的功能,核0的“写入数据块”和“设置旗语”的操作一定不能改变顺序;核1的“监测旗语”和
“读取数据块”的操作也一定不能改变顺序。
若在采用顺序一致性模型的多核系统中执行,显然没有任何问题,结果一定满足程序员
的要求。
若在采用宽松一致性模型的多核系统中执行,由于数据块所在的存储区和共享变量所
在的存储地址不同,若不用屏障指令,则编译器或处理器可能会进行指令顺序调度的优化操
作,使得程序最终执行的结果不满足程序员的预期。为此,需要在程序中插入屏障指令fence。
在采用宽松一致性模型的多核系统中,两个核上的程序可以各自抽象为以下操作序列。
核 0:写入数据块→fence指令→设置旗语。
核1:监测旗语→检测到“特殊的值”→fence 指令→读取数据块。
由于fence 指令能完全屏障其前、后访存指令的执行,因而上述两个程序的执行结果能
够满足程序员的预期。
如果将“fence指令”和“设置旗语”两个功能合起来变成一条“释放旗语”指令,该指令能
保证它前面的访存指令一定执行完;然后将“监测旗语”和“fence指令”合起来变成一条“获
<!-- page: 344 -->
并行处理系统
取旗语”指令,该指令能保证它后面的访存指令一定在它后面执行,那么就可以使用释放一
致性模型中的获取-释放机制,使上述两个核上的程序变成以下操作序列。
核0:写入数据块→释放旗语。
核1:获取旗语→获取旗语发现“特殊的值”→读取数据块。
显然,上述这种方式下,程序的执行结果也能满足程序员的预期,而且,由于“释放旗语”
和“获取旗语”指令比fence指令的限制更加宽松,因而程序性能更好。
以上介绍存储器一致性模型时,主要是针对多核处理器系统进行阐述的。实际上在共
享存储器的多处理器系统中也存在同样的问题。存储器一致性模型也不是仅有上述所提到
的3种,感兴趣的读者可以参看其他相关资料。
同样,在硬件多线程处理器中,针对不同处理器核中的多个线程共享主存储器的情况也
是一样的。例如,RISC-V架构文档中专门给出了硬件线程hart的定义,RISC-V架构明确
在不同hart之间使用宽松一致性模型,并在基础指令集RV321中提供了fence屏障指令,
用于约束数据访问指令的执行顺序。此外,RISC-V架构也针对事务处理和操作原子性需
要,提供了扩展的32 位架构原子操作指令集 RV32A,以及64位架构原子操作指令(+
RV64A),从而可以进一步支持释放一致性模型。
2.共享区域的加锁机制
在多核处理器系统的程序中,针对事务处理和操作原子性需求,经常需要对一个共享区
域“上锁”,以保证多个不同的处理器核能够互斥访问该共享区域。例如,假定有3个处理器
核 C0、C1和C2需要共享一个数据块,并且要求某一时刻只能有一个核独占访问此共享数
据块,要实现该功能可以采用以下的同步策略。
(1)定义一个共享的全局变量作为“锁”,该共享变量在存储器中分配一个存储单元,3
个核都可以访问该存储单元,并约定:若锁值为0,表示当前共享数据块空闲,即没有被任何
核独占;若锁值为1,表示当前共享数据块正在被某个核独占访问。
(2)当某个核独占共享数据块完成了相关操作后,便通过向锁中写入0,以立即释放数
据块。
(3)当某个核独占共享数据块时,其他两个核都会不断地读取锁值,并判断锁值是否为
0。一旦发现锁值为0,则立即向锁中写入1进行上锁,试图将共享数据块独占。
如果采用普通的装入(load)、存储(store)指令来实现上述同步策略,那么,在“执行load
指令读到锁值为0”以及“执行下一条store指令将锁值改写为1”这两条指令之间,可能被插
入了其他核的load指令读锁的操作,结果两个核读到的锁值都为0,于是,都认为自己可以
独占数据块,并都将锁值设置为1。显然,这与要求实现的功能不相符。
可以用两种方式解决上述“上锁”问题。一种是通过原子操作方式,另一种是通过互斥
操作方式。
1)原子操作方式
针对上述用普通的load/store指令会引起一个完整的“读锁-写锁”过程被打断的问题,
有些指令集体系结构(ISA)引入了原子操作指令。
例如,ARM指令集架构定义了原子交换(SWP)指令,该指令将存储单元中的值读出送
至结果寄存器,并将源寄存器的值写入同样的存储单元中,这样便实现了通用寄存器中的值
和存储单元中的值的交换,并且,在第一次读操作后,硬件便将该存储单元或对应的共享末
第9章
327
<!-- page: 345 -->
计算机组成与系统结构(第3版)
328
级 cache行锁定,直到将另一个通用寄存器的值写入存储单元或 cache 行后才解锁。这样,
在SWP指令执行过程中,若其他核访问该存储单元或 cache行,在解锁之前就会被阻塞,从
而保证了“读锁-写锁”过程不被打断。正是由于SWP指令的锁定要求,总线需要提供一个
控制信号来向cache或存储器传递这一需求,例如,在AHB总线和AXI总线中都有lock 信
号线以支持锁定功能传递需求。
RISC-V架构标准扩展指令集 RV32A中,提供了9条原子操作指令,其中,也有一条原
子交换指令amoswap,利用它可以实现“上锁”功能。下列 RISC-V程序段给出了利用原子
操作指令实现加锁功能的部分代码。
0: 00100293 li
t0,1
4: 0c55232f amoswap.w.aq
t1,t0,(aQ)
8:fe03lee3 bnez
t1,4
⋯⋯操作共享的数据块(临界区代码)⋯⋯
20:0a05202f amoswap.w.rl
x0,×0,(aO)
#初始化锁值
#尝试获取锁
#若没有成功,则继续尝试
#释放锁
上述代码中,锁值存放在寄存器a?所指出的存储单元中,指令“amoswap.w.aq t1,t0,
(aO)”的功能是将锁值M[R[a0]]送到结果寄存器t1中,同时将源寄存器t0中的内容写入
M[R[aO]],该指令具有“获取”属性(aq字段为1),能够拦截其后的所有访存指令,因此,临
界区中的对共享数据块进行操作的所有访问指令都不会提前到该指令之前执行。指令
“bnez tl,4”表示“如果读到的锁值不等于0,则转到地址为4的指令继续执行;否则执行后
面的指令”。
显然,实现上述加锁功能的核 C0、C1和C2中的代码都是一样的。如果C0独占数据
块,则C1和C2可能同时正好执行到指令“amoswap.w.aq t1,t0,(aO)”,因为该指令会将目
标存储单元或 cache行加锁,因而能够保证某一段时间内仅C1或C2执行该指令,并且该指
令执行过程中,能保证读锁和写锁是一个完整的原子操作,从而保证了一旦C0释放了锁,
那么C1和C2中至多只有一方能够获得锁,而不会发生C1和C2同时都获得锁的情况。某
个核一旦获得了锁,就可以进入临界区进行相关操作,结束后通过指令“amoswap.w.rl x?,
x?,(aO)”释放锁。该指令将0(x?的值)写入锁中,并设置“释放”屏障属性(rl字段为1),以
保证该指令之前的所有访存指令一定在它之前执行完。
原子操作除了解决上述“加锁”问题之外,还可以解决很多其他同步问题,感兴趣的读者
可以参看其他相关资料。
2)互斥操作方式
有些指令集架构采用另一种互斥操作指令来解决上锁问题。互斥操作指令有一对:互
斥读(load-exclusive)指令和互斥写(store-exclusive)指令。
互斥读指令的功能与普通的主存读(load)指令类似,都是从主存单元中取出数据送寄
存器;而互斥写指令的功能与普通的主存写(store)指令不同,它的写操作不一定能成功执
行,结果寄存器中会存放是否成功的标志信息。
为了能够判断互斥写指令是否成功执行了写主存的操作,需要在系统中实现一个“监测
器”,它会监测同一个核的一条互斥读和一条互斥写指令是否成对地先、后访问同一个主存
地址,并且在此期间是否没有来自任何核(或线程)的写主存的操作访问过该地址,且无任何
异常和中断发生。如果是,说明互斥写指令的写主存操作执行成功。
<!-- page: 346 -->
并行处理系统
为了让监测器知道是否是互斥读和互斥写指令的访存操作,总线中需要有将这两条指
令的访存与普通load/store指令的访存区别开来的信号线,例如,AHB总线和 AXI总线可
以使用上文提到的lock 信号线来进行区分,监测器可以从中得知处理器是否执行了互斥操
作指令。
RISC-V架构标准扩展指令集RV32A中,提供了两条互斥操作指令:load-reserved(lr.
w)和 store-conditional(sc,w)。下列 RISC-V程序段给出了利用互斥操作指令实现加锁操
作的部分代码。
0: 11
t0, 1
#初始化锁值
4: 1r.w
a3,(a0)
#读出锁值到a3寄存器
8:bne
a3,x0,4
#若读出的锁值不等于 0,则继续读
#尝试将1写入锁中,以获取锁
#若没有成功,则继续从读锁值开始
c: sc.w.aq
a3,t0,(aD)
10:bnez
a3,4
⋯⋯操作共享的数据块(临界区代码)⋯⋯
28:1r.w.rl
a3,(a0
#读出锁值
2c:sc.W.aq
a3,x0,(aO)
#尝试将 0写入锁中,以释放锁
#若没有成功,则继续尝试
30:bnez
a3,28
上述代码中,锁值存放在寄存器a0所指出的存储单元中,指令“sc.w.aq a3,t0,(aO)”
的功能是将源寄存器t?中的内容尝试写入M[R[a0]],若成功执行写操作,则将0存入结
果寄存器a3中,同时,该指令具有“获取”属性(aq字段为1),能够拦截其后的所有访存
指令。
指令“bnez a3,4”表示“如果a3寄存器内容不等于0,说明t0中的1没有成功写入
M[R[a0]],因而转到地址为4的指令继续执行;否则执行后面的指令。”
显然,实现上述加锁功能的核 C0、C1和C2中的代码都是一样的。如果 C0 独占数据
块,则C1和C2可能正好都执行前5条指令进行“读锁-写锁”操作。但C1和C2可能会交
错执行这些指令,导致C1和C2可能都刚好要执行“sc.w.aq a3,t0,(aO)”指令,以尝试获取
锁。不过,多线程硬件能保证总是有一条先被执行,系统中的“监测器”能保证先执行该指令
的核(或线程)获得锁,而另一个则不能成功写锁,从而保证了一旦C0释放了锁,那么C1和
C2中至多只有一方能够获得锁,而不会发生C1和C2 同时都获得锁的情况。临界区操作
结束后,通过将0(x0的值)成功写入锁中来释放锁,并在Ir指令中设置“释放”屏障属性
(rl字段为1),以保证Ir指令之前的所有访存指令一定在它之前执行完。
*9.3多计算机系统
多处理器系统由于共享同一个主存地址空间,所以其通信方式简单,一个进程或线程向
存储器中写的信息可以被其他进程或线程读取。但是,其连接的处理器规模不可能很大,因
此出现了不共享存储空间的多计算机系统。在多计算机系统中,每台计算机有各自独立的
存储地址空间和自己的存储器,根据所连接的计算机之间的耦合程度,分成集群和网格两种
多计算机系统。前者为采用局域网络连接的、通过消息传递进行通信的紧密耦合多计算机
系统,后者是采用广域网络连接的、通过互联网协议进行通信的松散耦合多计算机系统。
第9章
329
<!-- page: 347 -->
计算机组成与系统结构(第3版)
330
*9.3.1集群多计算机系统
集群是采用局域网络连接的、通过消息传递进行通信的紧耦合多计算机系统。许多大
型的应用,如数据库系统、文件服务器、Web服务器等,都适合采用集群系统。它具有更高
的可用性、更好的可靠性和容错性。
集群是通过将现成的普通计算机用高性能网卡连接而成的。因此,相对于多处理器系
统中的互连网络,集群的互连网络速度要慢得多。在多处理器系统中可以在纳秒数量级上
访问存储器,而在集群中,只能在微秒数量级上发送消息。从体积上来说,多处理器比集群
要小得多,多处理器通常在一个机箱中,而集群计算机通常在一个或多个房间中,所以,管理
一个多处理器系统相当于管理一台计算机,而管理一个具有N个节点的集群相当于管理N
个独立的节点,其管理开销相差很多。
1.集群的互连与网卡
集群中每个计算机节点内都有一块网卡,通过网卡将节点和交换机相连。图9.6是多
个节点之间通过网卡和交换机互相连接的示意图。
节点1
主存
CPU
用户
内核{
交换机
节点2
主存
CPU
主存
主存
CPU
CPU
网卡缓存
网卡
节点3
节点4
图9.6 集群中节点之间的连接
通常在互连网络中采用同步传输方式,一旦在网络上开始传输一个信息块,就会以恒定
的传输速率传输比特流,为此,在每个网卡中都设有一个缓冲区,如图9.6所示。对于发送
消息的节点来说,将消息缓存在其网卡中,使得在网线上传输的比特流不受发送节点中系统
总线上其他信息流(如 cache行读、磁盘DMA)的影响,以保证能连续将比特流传输到网络
传输线上。对于接收消息的节点来说,将消息缓存在其网卡中,使得在网线上传输的比特流
不受接收节点中系统总线上其他信息流的影响,以保证传输到节点中的信息块不会因为来
不及接收而丢失。
网卡中通常包含多个 DMA通道或专门的1/O处理器,主要用于提供可靠的比特流传
送、将信息块发送到多个目的地、压缩和解压缩、加密和解密等功能。其中每个 DMA通道
相当于一个 DMA控制器,能够控制完成在网卡缓冲区与主存之间的DMA传送。
2.集群的交换机制
在集群中的节点之间需要交换消息(message),有时消息也称为报文。一个消息可以
是一个字符串、一个图像文件、一封电子邮件等。如图9.6所示,在节点之间传输的消息从
一个节点内的用户空间,通过内核中的缓存,然后送到网卡缓冲区,再经过网络连线和交换
机被传送到另一个节点的网卡缓冲区,最后再通过目的节点的内核缓存被送到用户空间中。
<!-- page: 348 -->
并行处理系统
交换机主要有路由器和链路层交换机两类。每个交换机有若干端口,每个端口都是双
向的,包括输入和输出两个方向。例如,对于一个4端口交换机,它有4个输入端口和4个
输出端口。
交换机可以采用存储转发包交换(store-and-forward packet switching)和电路交换(circuit
switching)两种交换机制。有时将 packet 翻译成“分组”,因此,前者也简称为分组交换。
在采用分组交换机制的网络中,一个消息被划分成许多较小的信息块,这些信息块称为
“包”或“分组”。存储转发传输机制是指在交换机能够开始向输出链路传输该分组的第一比
特信息之前,必须接收到整个分组,因此,在其传输路径上的每个交换机的相应输入端口存
在一个转发时延T。若一个分组从节点1到达节点2需要经过3个交换机A、B、C,即一共
有4跳:节点1→A→B→C→节点2,假定每一跳的转发时延都为T,则传输时间至少为
4T。因为在网络中可能还有其他需要交换的分组,因此,某个交换机可能同时需要在同一
个输出端口存储转发多个分组。为了避免发生冲突,在分组交换机的每个输出端口都设置
了一个输出缓存,也称为输出队列。如果到达的分组需要通过输出端口进行传输,但发现该
端口正忙于传输其他分组,则到达的分组必须在输出缓存中等待。因此,分组交换方式下,
还存在输出缓存的排队时延。
在集群中多采用分组交换机制。虽然分组交换方式存在转发时延和排队时延,但是,因
为它将大的消息分解成小的分组进行传送,使得传输带宽可以被许多消息共享,而且更加灵
活、简单和有效,实现成本低。
3. Google 集群系统
Google公司为全世界的用户提供了在海量Web页面中进行信息检索的搜索引擎,该
系统不仅要及时响应大量用户同时提出的检索要求,还要定期抓取分散在世界各地的Web
网页中的信息并构建索引。可想而知,Google公司的搜索引擎系统需要构建一个面向大规
模数据处理的并行计算机系统。为了满足这种需要,Google公司在全世界设立了几十个数
据中心。一个数据中心造价高达几亿美元,耗电量达几十到上百兆瓦。数据中心多建于水
资源充沛和电能廉价之地。每个数据中心是一个由成千上万台普通PC组成的集群系统。
图9.7给出的是Google公司数据中心内部的集群系统。
图9.7 Google公司数据中心内部集群系统
第9章
331
<!-- page: 349 -->
计算机组成与系统结构(第3版)
一个典型的数据中心由几十个机架中的刀片式 PC通过以太网交换机互连而成。图 9.8
给出了一个典型的Google集群系统中机架的示意图。
332
集群
交换机
机架阵列
图9.8 Google 集群系统中机架的组成
图9.8 中左边是插入机架中的刀片式 PC示意图,中间是一个机架前视图,右边是机架
阵列与集群交换机。可以看出,机架由若干槽组成,可以在槽中插入刀片式PC,每个刀片式
PC高1RU(rack unit),机架插槽分上、下两部分,各有 20个插槽,因而可以插入40 台刀片
式PC。机架中部有一个小型以太网交换机,高度为4RU。每台刀片式 PC都是标准配置,
例如,可以内含8个处理器核、16GB主存和4个1TB磁盘。为了在一个机架中插入更多
PC,Google公司采用了一种双插槽机架,在1RU高的位置上提供了前、后两台配置完全相
同的插槽,可插入两台 PC,因此,机架的后视图与前视图完全相同。这样,一个机架就提供
了两列PC插槽,一共可容纳80台PC和两个交换机,两个交换机之间用1Gb/s接口互连。
为了便于散热,两列PC中间有一个3英寸的空隙,它就像一个“烟筒”一样,使得热风可以
通过机架顶部的风扇排出。
图9.9 给出了Google集群中机架之间的连接关系示意图。
机架
OC12
128×128
交换机
0C48
机架
机架
机架
机架
机架
机架
机架
机架
机架
机架
机架
机架
机架;
机架
机架
机架
机架
机架
机架
机架
机架
机架
机架
机架
机架
机架
机架
机架
机架
机架
机架
机架
机架
机架
机架
机架
机架
机架
机架
机架
机架
机架
机架
机架
机架;
机架
机架
机架
机架
机架
机架
机架
机架
机架
机架
机架
机架
机架
机架
机架[
机架
机架
机架
机架
机架
oC12
128×128
交换机
OC48
图9.9 Google集群机架连接示意
图9.9显示了64个机架通过两个128×128 以太网集群交换机互连的示意图。每个
128×128 以太网集群交换机可以处理128条1Gb的以太网线路。因为每个机架有两列 PC
和两个交换机,机架中的每个交换机都通过一条1Gb的以太网线路与128×128 以太网集
群交换机互连,因此,一个机架有两条1Gb网线与集群交换机互连。对于采用128×128 以