当前位置:文档之家› 多处理机系统介绍(翻译)

多处理机系统介绍(翻译)

多处理机系统介绍随着用户计算需求的增长,多处理系统能够提供一个自然地、不断提高的升级途径。

只要核心的用户程序能够提供线程级并行,给系统添加处理器,或者将较小的系统替换为较大的、包含更多处理器的系统,都能给用户提供一个直接增加计算能力的途径。

其次,多处理机系统使系统供应商能够将单个微处理器的设计代价分摊到多种设计方案中,这些设计方案能够提供不同层次的性能和扩展能力。

最后,使用一致共享存储器的多处理机系统能够提供与分时共享的但处理机兼容的编程模式,便于用户使用以前已经存在的应用程序,也便于开发新的应用程序。

在这些系统中,硬件和操作系统软件综合起来提供给用户和程序员的功能界面,实际上是基于以下4点多处理机理想假设:完全共享存储器即系统中所有处理机对所有物理存储器的访问都是平等的。

单位延迟即所有的访存请求都能在一个周期内满足。

无竞争即一个处理机的访存不会受到另一个处理机访存的影响。

写的瞬间船舶即某个处理机写存储器导致的更新立刻对所有的处理机可见。

系统及处理机的设计者必须努力使系统尽量接近这些理想假设,从而满足用户对于性能和正确性的要求。

显然,在实现这些目标时,诸如造价以及可扩展性等因素起着重要作用,但是一个优秀的系统必须很好的满足这些假设。

完全共享存储器,单位延迟以及无竞争诸如图9.4所示,大多数提供一致存储器访问(UMA,Uniform Memory Access)的传统共享存储器多处理机系统使用一种“dancehall”的组织结构,一组存储器模块或者存储体通过交叉开关互联网络与另一组处理机连接起来,并且每个处理机通过交叉开关访问存储器的延迟是相通的。

这种方法的弊端在于交叉开关的价格,该价格会随着处理机和存储器的总数按平方增长,同时每次访存都必须穿过交叉开关,另一种方法是非一致存储访问(NUMA,Nonuniform Memory Access),许多系统供应商现在都按照这种方法构造系统,在这种方法中,处理机仍然通过一个交叉开关互联网络连接在一起,但是每个处理机有一个本地的存储器,它的访问延迟要低得多,在NUMA结构中,只有对远程存储器的访问才存在穿越交叉开关的延迟开销。

在UMA和NUMA系统中,与单处理机系统一样,都是通过cache来近似满足单位延迟的理想假设,cache能够同时满足对本地和远程存储器(NUMA)的访问,类似的,可以使用cache 对访存流量进行过滤减轻存储体之间的竞争。

因此,对于在单处理机系统中不可缺少的cache,在多处理机系统中同样非常有用,然而,cache的存在个处理存储器写操作带来了一定的困难,因为存储器写操作必须对其他处理机可见,或者传播给其他处理器机。

写操作的瞬时传播在一个分时共享的单处理机系统中,如果一个线程改写了存储器某个单元的值,该线程以及任何其他线程都会立刻查看新的值,因为这个值会存放在处理机的cache中。

遗憾的是,对于多处理机系统,不再具备这个立即可见的特性,因为对同一地址的访问可能有其他处理机发出,由于这些处理机有了自己的cache,可能包含同一cache行的私有副本,它们可能看不到其他处理机的更新。

例如,在图9.5(a)中,处理机P1向存储器地址A写入值1。

由于并没有一致性的支持,在P2的cache中,存储器地址A的副本并没有被更新,P2读取A将会得到以前的值0。

这就是经典的cache一致性问题。

要解决这一问题,系统必须提供cache 一致性协议,保证系统中所有的处理机能够察看到其他处理机的更新,这样每个处理机拥有一致的存储器视图。

实现cache一致性有两种基本的方法:更新协议和作废协议,我们将在后面的章节中简要的讨论这两个协议。

图9.5(b)和图9.5(c)分别对这两种协议进行了说明一致的共享存储器对于共享存储器的多处理机系统,一致的存储器视图很难实现。

但如果不能实现一致的视图,共享存储器程序的行为将不可预测,因为不同的处理机从存储器读到的值各不相同。

我们已经论述过,一致性问题是由于写操作不能立刻自动地传播给其他处理机的cache造成的。

有两类一致性协议可以保证写操作的结果对于其他处理机是可见的。

更新协议早期提出的多处理机系统采用一个相当直接的办法来维护cache一致性,在这些系统中,处理机的cache采用写直达策略,所有的写操作不仅写入执行写操作的处理机cache,同时也写入存储器。

这种协议如图9.5(b)所示,由于所有的处理机都连接在一条共享的总线上,这条总线还将所有的处理机与存储器相连,所以所有其他处理机可以在共享总线上监听新的值,并更新它们的数据副本(如果有这样的副本)。

这样就能够得到写直达的结果。

实际上,这种更新协议是基于广播写直达策略的,即每个处理机的每次写操作都是写直达,不仅写入存储器,还写入任何拥有这个数据副本的处理机cache。

显然,这种协议扩展性较差,仅限于数量较少的处理机,否则大量处理机的写直达流量会很快将存储器总线的可用带宽占用完。

可以对该协议进行简单的优化,对数据采取写回策略,即写操作只是将数据写入处理机的本地cache,当这一行被替换出cache时,才将结果写回存储器。

然而,在这样的协议中,任何对共享cache行(存在于任何其他处理机cache中的行)的写操作仍然需要在总线上广播,以使包含共享副本的处理机能更新它们的副本。

而且,一个远程读操作所读的行如果恰好是修改过的,那么在满足读请求之前,要将这一行先写回存储器。

遗憾的是,更新协议对于带宽的苛刻要求使得这种协议几乎消失,因此没有一个现代多处理机系统采用更新协议来维护cache一致性。

作废协议现代共享存储器多处理机系统都采用作废协议来维护cache一致性,作废协议的基本前提很简单:任何时候只允许一个处理机执行写操作(这样的协议经常称为single-writer协议)在该协议中,试图对cache中某一行写数据的处理机必须使该行成为系统中唯一有效的副本,而其他处理机cache中的副本都要作废掉(所以称为作废协议)。

该协议如图9.5(c)所示。

简单地说,处理机执行写之前,首先要检查系统中是否还存在其他副本。

如果有,处理机发出消息将其他副本作废。

然后,处理机向其私有(专用)副本中写入数据。

后续的、对同一行的写操作可以流水化,因为不需要检查是否存在其他副本。

和单处理机的协会cache一样,修改过的行知道被替换出去的时候才协会存储器。

然而,一致性协议必须记住存在这样一个修改过的副本,以防止其他处理机到存储器读取以前的值。

而且,还必须能够从处理机cache 中读出修改过的数据,以满足其他处理机对这个唯一副本的远程访问。

作废协议要求cache目录至少要为每行维护两个状态:修改(M)状态和作废(I)状态。

如果某一行处于作废状态,那么这一行的数据无效,必须从存储器中读取数据。

如果处于修改状态,处理机知道系统中没有别的副本(即本地的副本是专有副本),因此处理机能够对这一行进行读写。

注意,如果被替换出去的行处于修改状态,必须写回存储器,因为处理机可能对它进行了写操作。

简单的办法是在cache行的状态中加入一个dirty位,使得处理机能够区分哪些是处理机的专有行(通常称为E状态),哪些是专有并且修改过的行(M状态)。

Macintosh桌面系统使用的IBM/Motorola PowerPC G3处理器实现了这种作废协议。

注意,如果只有这三种状态(MEI),cache行不能同时出现在多个处理机中。

因此,需要解决这一问题,允许可读的副本能够出现在多个处理机的cache中。

多数作废协议还包括一个共享状态(S),这个状态表明,系统中可能存在多个可读的副本。

如果一个处理机要向处于S状态的cache行写数据,必须首先将这一行提升到M状态并作废其他远程的副本。

图9.6显示了一个简单的MESI一致性协议的状态表个转换图。

每一行代表4种状态(M,E,S或者I)中的一种,针对每种类型的总线事件,每一列总结了一致性控制器必须执行的动作。

引起cache行发生状态转换的事件包括本地访存(读或写)、远程访存(总线读、总线写或者总线状态生机)以及本地的cache行转换。

Cache目录或者标识阵列维护每一个cache 行的MESI状态。

注意,此时允许每个cache行在不同时刻可以具有不同的状态,并使包括私有数据的cache行保持为E状态或者M状态,而包含共享数据的行处于S状态并且可以同时存在于多个cache中。

MESI一致性协议支持single-writer并保证了一致性,同时还支持只读数据的共享,以及在发生本地写实,从专有状态(E)提升到修改状态(M)(不需要总显得状态升级消息)。

实现cache一致性维护cache一致性需要有一套记录cache行状态(即MESI)的机制,从而能够正确处理对这些行的访问。

保存一致性状态最方便的场所是在cache的标识存储器中,因为必须在cache 中对状态信息进行维护。

然而,cache行的本地一致性状态要对系统中其他处理机可见,以满足它们对这些行的访问。

因此,实现cache一致性时必须提供一种分布访问方式。

主要有两种实现方法:监听实现和目录实现。

监听实现实现一致性的最简单的方法是利用监听机制:在监听实现中,所有由一致性协议引起的片外地址事件(即作废协议中的cache失效和作废)将共享总线,这对系统中所有其他处理机都是可见的。

在规模较小的系统中,地址总线是电路共享的,当这些命令放到总线上时,每个处理机都能察看到所有其他处理机的命令。

更先进的点到点互联机制也能实现监听,它通过层次化的监听互联机制,将所有命令反映给所有的处理机。

为简单起见,我们将只讨论地址总线的机制。

在监听实现中,一致性协议规定了一个处理机是否响应总线命令以及如何响应总线命令。

例如,一个远程处理机对当前被修改过的cache行发出读请求,这将导致cache控制器将这一行从本地cache中直接传送给发出请求的处理机,也许还需要写回存储器,以这种方式请求将能够得到最新的副本。

同样,一个远程处理机对当前处于共享状态的行发出作废请求,将导致控制器更新目录表项并将这一行标记为作废。

这将防止本地处理机以后从cache中读取是小的数据。

监听实现的主要缺点在于可扩展性较差。

假设系统中每个处理机以一定的速率产生地址总线事务,可以看到,必须监听的输入地址总线事务直接和系统的处理机数目成正比。

也就是说,如果每个处理机每秒产生s0个总线事务(包括cache失效导致的读请求和对共享行写操作导致的作废请求),系统中有n个处理机,那么每个处理机每秒必须监听ns0个事务,每次监听都要查找本地的cache目录并判断处理机是否需要作出反应(参见图9.6),对于较大的n,查找总带宽是不可接受的,同样,对于将系统中的处理机连接在一起的互联网络,其带宽可能很快就被事务流量占用完。

相关主题