1、第8章 多处理机张晨曦 刘依www.GotoS ,8.1 引言 8.2 对称式共享存储器系统结构 8.3 分布式共享存储器系统结构 8.4 同步 8.5 同时多线程 8.6 多处理机实例,8.1 引 言 1. 单处理机系统结构正在走向尽头? 2. 多处理机正起着越来越重要的作用。近两年来,我们已经开始进入多处理机将起主要作用的新时期。 期望:将来更加普及 问题: 如何发挥其潜在计算能力? (并行程序) 应用是否具有足够的并行性? 并行计算机应用软件已有了稳定的发展。 (尽管缓慢) 并行处理已经成为重要和主流的技术。 3.本章重点:中小规模的计算机(处理器的个数128) (多处理机设计的主流),
2、8.1 引 言,Flynn分类法SISD、SIMD、MISD、MIMD MIMD已成为通用多处理机系统结构的选择,原因: MIMD具有灵活性。 MIMD可以充分利用商品化微处理器在性能价格比方面的优势。计算机机群系统(cluster)是一类广泛被采用的MIMD计算机。,8.1.1 并行计算机系统结构的分类,8.1 引 言,根据系统中处理器个数的多少,可把现有的MIMD计算机分为两类: (每一类代表了一种存储器的结构和互连策略) 集中式共享存储器结构 动画 最多由几十个处理器构成。 通过大容量的Cache和总线互连使各处理器共享一个单独的物理存储器。 这类计算机有时被称为 SMP计算机(Symm
3、etric shared-memory MultiProcessor) UMA计算机(Uniform Memory Access),8.1 引 言,对称式共享存储器多处理机的基本结构,8.1 引 言,分布式存储器结构 动画 每个结点包含: 处理器 存储器 IO 互连网络接口 在许多情况下,分布式存储器结构优于集中式共享存储器结构。,8.1 引 言,8.1 引 言,分布式存储器结构的优点 如果大多数的访问是针对本结点的局部存储器,则可降低对存储器和互连网络的带宽要求。 对局部存储器的访问延迟低。 最主要的缺点 处理器之间的通信较为复杂,且各处理器之间访问延迟较大。 簇:超级结点 每个结点内包含个
4、数较少(例如28)的处理器; 处理器之间可采用另一种互连技术(例如总线)相互连接形成簇。,8.1 引 言,地址空间的组织方案(两种) 共享地址空间 物理上分离的多个存储器作为一个逻辑上共享的存储空间进行编址。 任何一个处理器可以访问该共享空间中的任何一个单元(如果它具有访问权),而且不同处理器上的同一个物理地址指向的是同一个存储单元。 这类机器的结构被称为分布式共享存储器结构(DSM: Distributed Shared-Memory)NUMA机器 (NUMA: Non-Uniform Memory Access),8.1.2 通信模型和存储器的结构模型,8.1 引 言,整个地址空间由多个独
5、立的地址空间构成,它们在逻辑上也是独立的,远程的处理器不能对其直接寻址。 每一个处理器-存储器模块实际上是一台单独的计算机 现在的这种机器多以集群的形式存在 两种通信机制 共享地址空间的机器 利用load和store指令中的地址隐含地进行数据通信。 多个地址空间的机器 通过处理器间显式地传递消息来完成。(消息传递多处理机),8.1 引 言,消息传递计算机通过传递消息来请求某些服务或传输数据,从而完成通信。 例如:一个处理器要对远程存储器上的数据进行访问或操作: 发送消息,请求传递数据或对数据进行操作;远程进程调用(RPC,Remote Process Call) 目的处理器接收到消息以后,执行
6、相应的操作或代替远程处理器进行访问,并发送一个应答消息将结果返回。 同步消息传递 请求处理器发送一个请求后一直要等到应答结果才继续运行。,8.1 引 言,异步消息传递 发送方不经请求就直接把数据送往数据接收方。 通信机制的性能指标(3个) 通信带宽理想状态下的通信带宽受限于处理器、存储器和互连网络的带宽。 通信延迟 理想状态下通信延迟应尽可能地小。 通信延迟发送开销跨越时间传输延迟接收开销 跨越时间:数字信号从发送方的线路端传送到接收方的线路端所经过的时间。 传输时间:全部的消息量除以线路带宽。,8.1 引 言,通信延迟的隐藏 如何才能较好地将通信和计算或多次通信之间重叠起来,以实现通信延迟的
7、隐藏。 通常的原则:只要可能就隐藏延迟。 通信延迟隐藏是一种提高性能的有效途径,但它对操作系统和编程者来讲增加了额外的负担。 不同通信机制的优点 共享存储器通信的主要优点 与常用的对称式多处理机使用的通信机制兼容。 易于编程,同时在简化编译器设计方面也占有优势。,8.1 引 言,当通信数据量较小时,通信开销较低,带宽利用较好。 通过硬件控制的Cache减少了远程通信的频度,减少了通信延迟以及对共享数据的访问冲突。 消息传递通信机制的主要优点 硬件较简单。 通信是显式的,因此更容易搞清楚何时发生通信以及通信开销是多少,以便编程者和编译程序设法减少通信开销。,8.1 引 言,可在支持上面任何一种通
8、信机制的硬件模型上建立所需的通信模式平台。 在共享存储器上支持消息传递相对简单。 在消息传递的硬件上支持共享存储器就困难得多。所有对共享存储器的访问均要求操作系统提供地址转换和存储保护功能,即将存储器访问转换为消息的发送和接收。,8.1 引 言,并行处理面临着两个重要的挑战 程序中的并行性有限 相对较高的通信开销,8.1.3 并行处理面临的挑战,系统加速比 =,8.1 引 言,第一个挑战 有限的并行性使机器要达到好的加速比十分困难。 例8.1 假设想用100个处理器达到80的加速比,求原计算程序中串行部分最多可占多大的比例?解 Amdahl定律为,由上式可得,并行比例0.9975,8.1 引
9、言,第二个挑战:多处理机中远程访问的延迟较大 在现有的计算机中,处理器之间的数据通信大约需要1001000个时钟周期。 主要取决于: 通信机制、互连网络的种类和计算机的规模 在几种不同的共享存储器并行计算机中远程访问一个字的典型延迟,8.1 引 言,8.1 引 言,例8.2 假设有一台32个处理器的多处理机,对远程存储器访问时间为400 ns。除了通信以外,假设所有其他访问均命中局部存储器。当发出一个远程请求时,本处理器挂起。处理器的时钟频率为1 GHz,如果指令基本的IPC为2(设所有访存均命中Cache),求在没有远程访问的情况下和有0.2%的指令需要远程访问的情况下,前者比后者快多少?,
10、8.1 引 言,解 没有远程访问时,机器的CPI为 1/基本IPC=1/2=0.5有0.2%远程访问的机器的实际CPI为 CPI基本CPI远程访问率远程访问开销0.50.2%远程访问开销远程访问开销为 远程访问时间/时钟周期时间400 ns/1 ns400个时钟周期 CPI0.50.2%4001.3因此在没有远程访问的情况下的计算机速度是有0.2%远程访问的计算机速度的1.3/0.5=2.6倍。,8.1 引 言,问题的解决 并行性不足: 采用并行性更好的算法 远程访问延迟的降低:靠系统结构支持和编程技术 在并行处理中,影响性能(负载平衡、同步和存储器访问延迟等)的关键因素常依赖于:应用程序的高
11、层特性如数据的分配,并行算法的结构以及在空间和时间上对数据的访问模式等。 依据应用特点可把多机工作负载大致分成两类: 单个程序在多处理机上的并行工作负载 多个程序在多处理机上的并行工作负载,8.1 引 言,并行程序的计算通信比率 反映并行程序性能的一个重要的度量:计算与通信的比率 计算通信比率随着处理数据规模的增大而增加;随着处理器数目的增加而降低。,多个处理器共享一个存储器。 当处理机规模较小时,这种计算机十分经济。教材中图8.1是这种计算机的一个简单示意图。 支持对共享数据和私有数据的Cache缓存私有数据供一个单独的处理器使用,而共享数据则是供多个处理器使用。共享数据进入Cache产生了
12、一个新的问题Cache的一致性问题,8.2 对称式共享存储器系统结构,8.2 对称式共享存储器系统结构,不一致产生的原因(Cache一致性问题) IO操作Cache中的内容可能与由IO子系统输入/输出形成的存储器对应部分的内容不同。 共享数据不同处理器的Cache都保存有对应存储器单元的内容。 例 两个处理器的读写,8.2.1 多处理机Cache一致性,8.2 对称式共享存储器系统结构,由两个处理器(A和B)读写引起的Cache一致性问题,8.2 对称式共享存储器系统结构,存储器的一致性(非正式定义)如果对某个数据项的任何读操作均可得到其最新写入的值,则认为这个存储系统是一致的。 存储系统行为
13、的两个不同方面 What: 读操作得到的是什么值 When: 什么时候才能将已写入的值返回给读操作 需要满足以下条件 处理器P对单元X进行一次写之后又对单元X进行读,读和写之间没有其他处理器对单元X进行写,则P读到的值总是前面写进去的值。,8.2 对称式共享存储器系统结构,处理器P对单元X进行写之后,另一处理器Q对单元X进行读,读和写之间无其他写,则Q读到的值应为P写进去的值。 对同一单元的写是顺序化的,即任意两个处理器对同一单元的两次写,从各个处理器的角度看来顺序都是相同的。(写顺序化 ) 在后面的讨论中,我们假设: 直到所有的处理器均看到了写的结果,这个写操作才算完成; 处理器的任何访存均
14、不能改变写的顺序。就是说,允许处理器对读进行重排序,但必须以程序规定的顺序进行写。,8.2 对称式共享存储器系统结构,在一致的多处理机中,Cache提供两种功能: 共享数据的迁移降低了对远程共享数据的访问延迟,也减少了对共享存储器带宽的要求。 共享数据的复制不仅降低了访存的延迟,也减少了访问共享数据所产生的冲突。一般情况下,小规模多处理机采用硬件的方法来实现Cache的一致性。,8.2.2 实现一致性的基本方案,8.2 对称式共享存储器系统结构,Cache一致性协议在多个处理器中用来维护一致性的协议。 关键:跟踪记录共享数据块的状态 两类协议(采用不同的共享数据状态跟踪技术) 目录法(dire
15、ctory)物理存储器中共享数据块的状态及相关信息均被保存在一个称为目录的地方。 监听法(snooping) 每个Cache除了包含物理存储器中块的数据副本之外,也保存着各个块的共享状态信息。,8.2 对称式共享存储器系统结构,Cache通常连在共享存储器的总线上,各个Cache控制器通过监听总线来判断它们是否有总线上请求的数据块。 两种更新协议(维持一致性要求) 写作废协议在处理器对某个数据项进行写入之前,保证它拥有对该数据项的唯一的访问权。(作废其他副本),8.2 对称式共享存储器系统结构,例 在写回Cache、监听总线的情况下,写作废协议的实现,8.2 对称式共享存储器系统结构,写更新协
16、议当一个处理器对某数据项进行写入时,通过广播使其他Cache中所有对应于该数据项的副本进行更新。例 在写回Cache、监听总线的情况下,写更新协议的实现。,8.2 对称式共享存储器系统结构,写更新和写作废协议性能上的差别主要来自: 在对同一个数据进行多次写操作而中间无读操作的情况下,写更新协议需进行多次写广播操作,而写作废协议只需一次作废操作。 在对同一Cache块的多个字进行写操作的情况下,写更新协议对于每一个写操作都要进行一次广播,而写作废协议仅在对该块的第一次写时进行作废操作即可。写作废是针对Cache块进行操作,而写更新则是针对字(或字节)进行。 考虑从一个处理器A进行写操作后到另一个
17、处理器B能读到该写入数据之间的延迟时间。写更新协议的延迟时间较小。,8.2 对称式共享存储器系统结构,小规模多处理机中实现写作废协议的关键 利用总线进行作废操作:把要作废的地址放到总线上 (一个放,多个读) 写操作的顺序性:由总线实现(获取总线控制权的顺序性) 写直达Cache:因为所有写的数据同时被写回主存,所以从主存中总可以取到最新的数据值。 对于写回Cache,得到数据的最新值会困难一些,因为最新值可能在某个Cache中,也可能在主存中。,8.2.3 监听协议及其实现,8.2 对称式共享存储器系统结构,在写回法Cache条件下的实现技术 Cache的标识(tag)用于实现监听。 作废一个
18、块只需将其有效位(valid)置为无效。 给每个Cache块加一个特殊的状态位。 状态: 共享(shared) 至少一个副本,clean 专有 (exclusive) 唯一副本,dirty Cache块的拥有者:拥有唯一的Cache块副本的处理器。,8.2 对称式共享存储器系统结构,在每个结点内嵌入一个Cache状态控制器。控制器根据来自处理器或总线的请求,改变所选择的数据块的状态。 因为每次总线操作均要检查Cache的地址标识,这可能会影响CPU对Cache的访问。可通过下列两种技术之一来减少影响 : 复制标志位 采用多级包容Cache (许多系统采用),存储器分布于各结点中,所有的结点通过
19、网络互连。访问可以是本地的,也可是远程的。 可以不支持Cache一致性:规定共享数据不进入Cache,仅私有数据才能保存在Cache中。 优点:所需的硬件支持很少(因为远程访问存取量仅是一个字(或双字)而不是一个Cache块)如何将支持Cache一致性的共享存储器模式扩展到可扩缩的大规模多处理机系统?,8.3 分布式共享存储器系统结构,8.3 分布式共享存储器系统结构,解决Cache一致性问题的关键: 寻找替代监听协议的一致性协议。(采用目录协议),8.3.1 基于目录的Cache一致性,目录协议 目录:一种专用的数据结构,用于记录可以进入Cache的每个数据块的状态、哪些处理器有该块的副本以
20、及是否修改过等信息。 分布式目录,8.3 分布式共享存储器系统结构,目录与存储器一起分布到各结点中,从而对于不同目录内容的访问可以在不同的结点进行。 特点:存储块的共享状态信息可以在唯一的一个固定单元中找到。这使一致性协议避免了广播操作。 对每个结点增加目录表后的分布式存储器多处理机的系统结构。,8.3 分布式共享存储器系统结构,8.3 分布式共享存储器系统结构,目录协议必须完成两种主要的操作: 处理读失效 处理对共享、干净(clean)块的写 一个共享块的写失效处理可用这两个操作组合而成。 目录必须跟踪记录每个Cache块的状态 存储块的状态有三种: 共享 在一个或多个处理器上具有这个块的副
21、本,且存储器中的值是最新的(所有Cache中的副本均相同)。 ,8.3 分布式共享存储器系统结构,未缓冲所有处理器的Cache都没有该块的副本。 专有仅有一个处理器上有该块的副本,且已对该块进行了写操作,而主存中的副本仍是旧的。这个处理器称为该块的拥有者。 由于写作废操作的需要,还必须记录哪些处理器有该块的副本。 方法:对每个主存块设置一个位向量 当该块被共享时,每个位指出与之对应的处理器是否有该块的副本。 当该块为专有时,可根据位向量来寻找其拥有者。,8.3 分布式共享存储器系统结构,假设:对于本地Cache中非“专有”状态Cache块的写入操作总会产生写失效,处理器封锁直到写操作完成。 一
22、个例子 本地结点、宿主结点以及远程结点的关系 本地结点:发出访问请求的结点 宿主结点:包含所访问的存储单元及其目录项的结点 远程结点可以和宿主结点是同一个结点,也可以不是同一个结点。,CPU,Cache,本地结点A,P,Cache,远程结点C,宿主结点B,(Home),副本,目录,存储器,宿主结点:存放有对应地址的存储器块和目录项的结点,K,8.3 分布式共享存储器系统结构,响应访问请求时,要将宿主结点中相应的值返回给请求结点。 数据写回在两种情况下发生: Cache中某个块被替换时必须写回到其宿主结点的存储器。 响应宿主结点发出的取数和取数/作废消息时也要写回。,8.3 分布式共享存储器系统
23、结构,总结:目录协议的基本点 在每个结点中增加了目录存储器用于存放目录。 存储器的每一块在目录中有对应的一项。 每一个目录项主要由两个字段构成: 状态:描述所对应的存储块的当前状态。 位向量:每一位对应于一个处理器,用于指出该处理器的Cache中是否有该存储块的副本。当处理器对某一块进行写操作时,只要根据位向量通知具有相应副本的处理器进行作废操作。 位向量中记录的处理器集合称为共享集合。,8.3 分布式共享存储器系统结构,在基于目录的协议中,目录承担了一致性协议操作的主要功能。 发往一个目录的消息会产生两种不同类型的动作: 更新目录状态 发送消息以完成所请求的操作 目录可能接收三种不同的请求:
24、 读失效 写失效 数据写回,8.3.2 目录协议及其实现,8.3 分布式共享存储器系统结构,当一个块处于未缓冲状态时,对该块发出的请求及目录的处理操作为: 读失效 将存储器数据送往请求方处理器,且该处理器成为该块的唯一共享结点,本块的状态变成共享。 写失效 将存储器数据送往请求方处理器,该块的状态变成专有,表示该块仅存在唯一的有效副本。 其共享集合仅包含该处理器,指出该处理器是其拥有者。,8.3 分布式共享存储器系统结构,当一个块处于共享状态时,其在存储器中的数据是当前最新的,对该块发出的请求及其处理操作为: 读失效 将存储器数据送往请求方处理器,并将其加入共享集合。 写失效 将数据送往请求方
25、处理器,对共享集合中所有的处理器发送写作废消息。 将共享集合改为仅含有该处理器,该块的状态变为专有。,8.3 分布式共享存储器系统结构,当某块处于专有状态时,该块的最新值保存在共享集合所指出的唯一处理器(拥有者)中。 有三种可能的目录请求: 读失效 将“取数据”的消息发往拥有者处理器,使该块的状态转变为共享。 将数据送回宿主结点写入存储器,进而把该数据送回请求方处理器,将请求方处理器加入共享集合。 此时共享集合中仍保留原拥有者处理器(因为它仍有一个可读的副本)。,8.3 分布式共享存储器系统结构,写失效 该块将有一个新的拥有者。 给旧的拥有者处理器发送消息,要求它将数据块送回宿主结点写入存储器
26、,然后再从该结点送给请求方处理器。 把请求处理器加入共享者集合,使之成为新的拥有者。该块的状态仍旧是专有。 数据写回 当一个块的拥有者处理器要从其Cache中把该块替换出去时,必须将该块写回其宿主结点的存储器中,从而使存储器中相应的块中存放的数据是最新的(宿主结点实际上成为拥有者),该块的状态变成非共享,其共享集合为空。,8.3 分布式共享存储器系统结构,对基于目录的Cache一致性的多种改进 有限映射目录 链式结构目录 基于目录的Cache一致性协议是完全由硬件实现的。此外,还可以用软硬结合的办法实现。,同步机制通常是在硬件提供的同步指令的基础上,通过用户级软件例程来建立的。,8.4 同 步
27、,8.4.1 基本硬件原语,在多处理机中实现同步,所需的主要功能是: 一组能以原子操作的方式读出并修改存储单元的硬件原语。它们能够自动读修改单元。 通常情况下,用户不直接使用基本的硬件原语,原语主要供系统程序员用来编制同步库函数。,8.4 同 步,典型操作:原子交换(atomic exchange) 功能:将一个存储单元的值和一个寄存器的值进行交换。建立一个锁,锁值: 0:表示开(可用) 1:表示已上锁(不可用) 处理器上锁时,将对应于该锁的存储单元的值与存放在某个寄存器中的1进行交换。如果返回值为0,存储单元的值此时已置换为1,防止了其他进程竞争该锁。 实现同步的关键:操作的原子性。,8.4
28、 同 步,测试并置定(test_and_set) 先测试一个存储单元的值,如果符合条件则修改其值。 读取并加1(fetch_and_increment) 它返回存储单元的值并自动增加该值。 使用指令对 LL(load linked或load locked)的取指令 SC(store conditional)的特殊存指令,8.4 同 步,指令顺序执行: 如果由LL指明的存储单元的内容在SC对其进行写之前已被其他指令改写过,则第二条指令SC执行失败。 如果在两条指令间进行切换也会导致SC执行失败。 SC将返回一个值来指出该指令操作是否成功: “1”:成功 “0”:不成功 LL则返回该存储单元初始值
29、。,8.4 同 步,例:实现对由R1指出的存储单元进行原子交换操作。try:OR R3, R4, R0 / R4中为交换值。把该值送入R3LL R2, 0(R1) / 把单元0(R1)中的值取到R2SC R3, 0(R1) / 若0(R1)中的值与R3中的值相 / 同,则置R3的值为1,否则置为0BEQZ R3, try / 存失败(R3的值为0)则转移MOV R4, R2 / 将取的值送往R4最终R4和由R1指向的单元值进行原子交换,在LL和SC之间如有别的处理器插入并修改了存储单元的值,SC将返回0并存入R3中,从而使这段程序再次执行。,8.4 同 步,LL/SC机制的一个优点:用来构造别
30、的同步原语 例如:构造原子操作fetch_and_increment:try: LL R2, 0(R1)DADDIU R2, R2, #1 SC R2, 0(R1) BEQZ R2, try 指令对的实现必须跟踪地址由LL指令指定一个寄存器,该寄存器存放着一个单元地址,这个寄存器常称为连接寄存器。,8.4 同 步,采用多处理机的一致性机制来实现旋转锁。 旋转锁处理器环绕一个锁不停地旋转而请求获得该锁。它适合于这样的场合:锁被占用的时间很少,在获得锁后加锁过程延迟很小。,8.4.2 用一致性实现锁,8.4 同 步,无Cache一致性机制在存储器中保存锁变量,处理器可以不断地通过一个原子操作请求使
31、用权。比如:利用原子交换操作,并通过测试返回值而知道锁的使用情况。释放锁的时候,处理器只需简单地将锁置为0。 例如,用原子交换操作对旋转锁进行加锁,R1中存放的是该旋转锁的地址。DADDIU R2, R0, #1lockit: EXCH R2, 0(R1)BNEZ R2, lockit,8.4 同 步,支持Cache一致性 将锁调入Cache,并通过一致性机制使锁值保持一致。 优点: 可使“环绕”的进程只对本地Cache中的锁(副本)进行操作,而不用在每次请求占用锁时都进行一次全局的存储器访问。 可利用访问锁时所具有的局部性,即处理器最近使用过的锁不久又会使用。(减少为获得锁而花费的时间),8
32、.4 同 步,改进旋转锁(获得第一条好处) 只对本地Cache中锁的副本进行读取和检测,直到发现该锁已经被释放。然后,该程序立即进行交换操作,去跟在其他处理器上的进程争用该锁变量。 修改后的旋转锁程序:lockit: LD R2, 0(R1) BNEZ R2, lockit DADDIU R2, R0, #1 EXCH R2, 0(R1) BNEZ R2, lockit 3个处理器利用原子交换争用旋转锁所进行的操作。,3个处理器利用原子交换争用旋转锁所进行的操作,8.4 同 步,LLSC原语的另一个优点:读写操作明显分开LL不产生总线数据传送,这使下面代码与使用经过优化交换的代码具有相同的特点
33、:lockit: LL R2, 0(R1) BNEZ R2, lockit DADDIU R2, R0, #1 SC R2, 0(R1) BEQZ R2, lockit 第一个分支形成环绕的循环体,第二个分支解决了两个处理器同时看到锁可用的情况下的争用问题。尽管旋转锁机制简单并且具有吸引力,但难以将它应用于处理器数量很多的情况。,8.4 同 步,简单旋转锁不能很好地适应可扩缩性。大规模多处理机中,若所有的处理器都同时争用同一个锁,则会导致大量的争用和通信开销。,8.4.3 同步性能问题,8.4 同 步,例8.3 假设某条总线上有10个处理器同时准备对同一变量加锁。如果每个总线事务处理(读失效或
34、写失效)的时间是100个时钟周期,而且忽略对已调入Cache中的锁进行读写的时间以及占用该锁的时间。(1)假设该锁在时间为0时被释放,并且所有处理器都在旋转等待该锁。问:所有10个处理器都获得该锁所需的总线事务数目是多少?(2)假设总线是非常公平的,在处理新请求之前,要先全部处理好已有的请求。并且各处理器的速度相同。问:处理10个请求大概需要多少时间?,8.4 同 步,解 当i个处理器争用锁的时候,它们都各自完成以下操作序列,每一个操作产生一个总线事务: 访问该锁的i个LL指令操作 试图占用该锁(并上锁)的i个SC指令操作 1个释放锁的存操作指令因此对于i个处理器来说,一个处理器获得该锁所要进
35、行的总线事务的个数为2i+1。由此可知,对n个处理器,总的总线事务个数为: 对于10个处理器来说,其总线事务数为120个,需要12000个时钟周期。,8.4 同 步,本例中问题的根源:锁的争用、对锁进行访问的串行性以及总线访问的延迟。 旋转锁的主要优点:总线开销或网络开销比较低,而且当一个锁被同一个处理器重用时具有很好的性能。 如何用旋转锁来实现一个常用的高级同步原语:栅栏 栅栏强制所有到达该栅栏的进程进行等待,直到全部的进程到达栅栏,然后释放全部的进程,从而形成同步。,8.4 同 步,栅栏的典型实现用两个旋转锁: 用来保护一个计数器,它记录已到达该栅栏的进程数; 用来封锁进程直至最后一个进程
36、到达该栅栏。 一种典型的实现其中: lock和unlock提供基本的旋转锁 变量count记录已到达栅栏的进程数 total规定了要到达栅栏的进程总数,8.4 同 步,lock(counterlock); /确保更新的原子性if(count=0)release=0; /第一个进程则重置releasecount=count+1; /到达进程数加1unlock(counterlock); /释放锁if(count=total) /进程全部到达count=0; /重置计数器release=1; /释放进程else /还有进程未到达spin(release=1); /等待别的进程到达,8.4 同 步,
37、对counterlock加锁保证增量操作的原子性。 release用来封锁进程直到最后一个进程到达栅栏。 spin(release=1)使进程等待直到全部的进程到达栅栏。 实际情况中会出现的问题可能反复使用一个栅栏,栅栏释放的进程运行一段后又会再次返回栅栏,这样有可能出现某个进程永远离不开栅栏的状况(它停在旋转操作上)。 一种解决方法当进程离开栅栏时进行计数(和到达时一样),在上次栅栏使用中的所有进程离开之前,不允许任何进程重用并初始化本栅栏。但这会明显增加栅栏的延迟和竞争。,8.4 同 步,另一种解决办法 采用sense_reversing栅栏,每个进程均使用一个私有变量local_sens
38、e,该变量初始化为1。 sense_reversing栅栏的代码。 优缺点:使用安全,但性能比较差。对于10个处理器来说,当同时进行栅栏操作时,如果忽略对Cache的访问时间以及其他非同步操作所需的时间,则其总线事务数为204个,如果每个总线事物需要100个时钟周期,则总共需要20400个时钟周期。,8.4 同 步,local_sense=! local_sense; /local-sense取反lock(counterlock); /确保更新的原子性count+; /到达进程数加1unlock(counterlock); /释放锁if(count=total) /进程全部到达count=0;
39、 /重置计数器release=local_sense; /释放进程else /还有进程未到达spin(release=local_sense);/等待信号,8.4 同 步,当竞争不激烈且同步操作较少时,我们主要关心的是一个同步原语操作的延迟。 即单个进程要花多长时间才完成一个同步操作。 基本的旋转锁操作可在两个总线周期内完成: 一个读锁 一个写锁 我们可用多种方法改进,使它在单个周期内完成操作。 同步操作最严重的问题:进程进行同步操作的顺序化。它极大地增加了同步操作的时间。,线程级并行性(Thread Level Parallelism,TLP) 线程是指具有自己的程序和数据的进程。它可以是一
40、个并行执行程序的一部分,也可以是一个独立的程序。 每个线程包含自己执行所需要的状态,包括指令、数据、程序计数器、寄存器状态等。 多线程使多个线程以重叠的方式共享单个处理器的功能单元。 硬件必须对较快地完成线程间的切换提供支持。 线程的切换应该比进程的切换高效得多。 进程的切换一般需要成百上千个处理器时钟周期。,8.5 同时多进程,8.5 同时多进程,实现多线程有两种主要的方法: 细粒度(fine-grained)多线程技术 在每条指令之间都能进行线程的切换,从而导致多个线程的交替执行。 通常以时间片轮转的方法实现这样的交替执行,在轮转的过程中跳过当时处于停顿的线程。 CPU必须在每个时钟周期都
41、能进行线程的切换。 主要优点:既能够隐藏由长时间停顿引起的吞吐率的损失,又能够隐藏由短时间停顿带来的损失。 主要缺点:减慢了每个独立线程的执行,8.5 同时多进程,粗粒度(coarse-grained)多线程技术 线程之间的切换只发生在时间较长的停顿出现时。例如:第二级Cache失效。 减少了切换次数,也不太会降低单个线程的执行速度 。 缺点:减少吞吐率损失的能力有限,特别是对于较短的停顿来说更是如此。 原因:由粗粒度多线程的流水线建立时间的开销造成的。由于实现粗粒度多线程的CPU只执行单个线程的指令,因此当发生停顿时,流水线必须排空或暂停。停顿后切换的新的线程在第一条指令执行完之前必须先填满
42、整个流水线。,8.5 同时多进程,同时多线程技术 Simultaneous MultiThreading,SMT 一种在多流出、动态调度的处理器上同时开发线程级并行和指令级并行的技术。 提出SMT的主要原因 现代多流出处理器通常含有多个并行的功能单元,而单个线程不能有效地利用这些功能单元。 通过寄存器重命名和动态调度机制,来自各个独立线程的多条指令可以同时流出,而不用考虑它们之间的相互依赖关系,其相互依赖关系将通过动态调度机制得以解决。,8.5.1 将线程级并行转换为指令级并行,8.5 同时多进程,一个超标量处理器在4种情况下的资源使用情况: 不支持多线程技术的超标量处理器 由于缺乏足够的指令
43、级并行而限制了流出槽的利用率 。 支持粗粒度多线程的超标量处理器 通过线程的切换部分隐藏了长时间停顿带来的开销,提高了硬件资源的利用率。 只有发生停顿时才进行线程切换,而且新线程还有个启动期,所以仍然可能有一些完全空闲的时钟周期。,8.5 同时多进程,超标量处理器中使用流出槽的4种方法,8.5 同时多进程,支持细粒度多线程的超标量处理器 线程的交替执行消除了完全空闲的时钟周期。 由于在每个时钟周期内只能流出一个线程的指令,ILP的限制导致了一些时钟周期中依然存在不少空闲流出槽。 支持同时多线程的超标量处理器 在同一个时钟周期中可以让多个线程使用流出槽。 理想情况下,流出槽的利用率只受限于多个线
44、程对资源的需求和可用资源间的不平衡 。,8.5 同时多进程,开发的基础: 动态调度的处理器已经具备了开发线程级并行所需的许多硬件设置。 动态调度超标量处理器有一组虚拟寄存器,可以用作各独立线程的寄存器组。 由于寄存器重命名机制给各寄存器提供了唯一的标识,多个线程的指令可以在数据路径上混合执行,而不会导致各线程之间源操作数和目的操作数的混乱。 多线程可以在一个乱序执行的处理器的基础上实现,只要为每个线程设置重命名表、分别设置各自的程序计数器并为多个线程提供指令确认的能力。,8.5 同时多进程,同时多线程只有在细粒度的实现方式下才有意义 细粒度调度方式会对单个线程的性能产生不利的影响可以通过指定优
45、先线程来减小这种影响,既能保持多线程在性能上的优势,又对单个线程的性能影响比较少。 多个线程的混合执行不可避免地会影响单个线程的执行速度,8.5.2 同时多线程处理器的设计,8.5 同时多进程,为提高单个线程的性能,应该为指定的优先线程尽可能多地向前取指(或许在分支指令的两条路径上都要向前取指)。 在分支预测失效和预取缓冲失效的情况下需要清空取指单元。但是这样限制了其他线程可用来调度的指令条数,从而减少了吞吐率。 所有的多线程处理器都必须在这里寻求一种折中方案。,8.5 同时多进程,只要一有可能,处理器就运行指定的优先线程。 从取指阶段开始就优先处理优先线程:只要优先线程的指令预取缓冲区未满,
46、就为它们优先取指。 只有当优先线程的缓冲区填满以后才为其他线程预取指令。 当有两个优先线程时,意味着需要并发预取两条指令流,这给取指部件和指令Cache都增添了复杂度。 指令流出单元也要优先考虑指定的优先线程,只有当优先线程停顿不能流出的时候才考虑其他线程。,8.5 同时多进程,设计同时多线程处理器时面临的其他主要问题: 需要设置更大的寄存器组,用来保存多个线程的现场。 不能影响时钟周期,特别是在关键路径上。如指令流出和指令完成: 指令流出时,有更多的候选指令需要考虑。 指令完成时,选择提交哪些指令可能会比较困难。 需要保证由于并发执行多个线程带来的Cache冲突和TLB冲突不会导致明显的性能
47、下降。,8.5 同时多进程,需要重视的两个实际情况: 在许多情况下,多线程所导致的潜在额外性能开销是很小的,简单的线程切换选择算法就足够好了。 目前的超标量处理器的效率是比较低的,还有很大的改进余地,即使增加一些开销也是值得的。,在超标量处理器上增添8个线程的同时多线程能力时获得的性能提高(单位:指令数/每拍),8.5.3 同时多线程处理器的性能,SMT与基本的超标量处理器在几个主要指标上的对比,8.5 同时多进程,两个特点 超标量处理器本身功能十分强大,它具有很大的一级Cache、二级Cache以及大量的功能单元。仅仅采用指令级并行,不可能利用全部的硬件性能,因此超标量处理器的设计者不可能不
48、考虑使用诸如同时多线程这样的技术来开发线程级并行。 同时多线程的能力也很强大,可以支持8个线程,并为两个线程同步取指。将超标量和同时多线程结合起来,在指令级并行基础上进一步开发线程级并行,可以获得显著的性能提高。,Origin 2000是一个分布共享存储器结构的大规模并行多处理机系统,采用超结点的模块结构,可以从1个处理器扩展到128个处理器。 Origin 2000采用超标量MIPS R10000处理器,运行UNIX的64位IRIX操作系统。 Origin是基于NUMA系统结构,8.6 多处理机实例,Origin系统结构,8.6 多处理机实例,每个结点可安装1个或2个MIPS R10000微
49、处理器、第二级高速缓存(L2 Cache)、主存储器、目录存储器及Hub等,Hub用于连接微处理器、存储器、IO和路由器等。 Origin存储器系统每个结点的主存储器容量: 4 GB 结点的Hub内含4个接口和交叉开关 存储器最大传输率为780 Mbps IO和路由器接口最大传输率:2780 Mbs(1.56Gbps) Origin的路由器有6个端口,用于连接结点或其他路由器。Origin的路由器和互连网络是ASIC芯片,通过芯片内部的交叉开关选择数据传送路径。,4处理器系统,两个结点互连的情况 Origin系统可由1128个处理器组成。,16处理器系统,由8结点构成的16处理器系统为了减少数据在路由器之间的传送延迟,加快传送速度,可将处于对角位置的路由器进行连接。,128处理器系统128处理器构成的Origin 2000系统由4个立方体组成,在立方体之间传送数据多经过了一级路由器。 在结点内部实现的是SMP(对称多处理器)结构,由于只有两个处理器,所以不存在SMP结构的总线瓶颈问题。 在结点之间实现的是大规模并行处理结构,但又解决了共享存储器问题。因此在Origin系统中,无论是访问存储器的时间还是结点间传送数据的带宽都很理想。,