《片上互联网络》第二章 片上网络的系统架构接口

本章的四类计算机系统:

  • 基于共享存储的单芯片多处理器(Chip Multiprocessor,CMP)
  • 基于消息传递接口(Message Passing Interface,MPI)技术的多处理器系统。
  • 应用于移动消费市场的多处理器片上系统(Multiprocessor System on Chip,MPSoC)。
  • 现代的对称多处理器(Symmetric Multiprocessor, SMP)

不同架构的对比:

  1. SMP(Symmetric Mulitiprocessor)架构:又称UMA架构。规整部署多个相同的核,采用共享存储网络,即所有核都采用统一的地址空间,使用地址高位判断地址所属的物理插槽(socket)。多个核共享所有资源和权限,具有一致的地址访问延迟(UMA),由硬件或软件的锁解决资源征用问题。(资源共享瓶颈其导致扩展能力有限,尤其是内存资源,子系统常见2-4个核心)
  2. MPI(Message Passing interfaace)架构:程序员显示的对不同节点间的通信进行管理,在不同节点核地址空间之间传递数据。
  3. CMP(Chip Mulitiprocessor):和SMP类似,规整部署多个相同的核,通常具有统一的全局地址空间(共享存储),但是可以允许非一致的地址访问延迟(NUMA:Non-Uniform Memory Access)。在某些特例中,CMP也可以不采用共享存储结构。例如,在IBM Cell 架构中,处理器需要借助基于MPI的直接存储器访问(Direct MemoryAccess,DMA)(DMA控制器直接连接到系统总线,可以访问系统内存和其他外围设备。DMA允许设备在不经过CPU的干预的情况下,直接读写系统内存。)机制来显式地将数据传输到本地存储器。(IBM Cell Cell架构是异构的(heterogeneous),PPE是通用核心,SPE是精简的协处理核心。)
  4. MPSoC:一般由多个相互独立的子系统构成,这些子系统可以是处理器核或者成熟的加速器IP模块。MPSoC结构并不规整或对称,其架构通常针对应用场景具体设计的,多应用于嵌入式设备。
  5. 一种常见的策略是结合MPI和CMP技术,将统一的地址空间划分为若干个地址空间分区,每个地址空间分区对应若干个共享存储的节点,各个地址空间分区之间的数据交互通过IMP进行统一管理。

2.1 CMP系统中的共享存储网络 

2.1.1共享存储模型CMP的缓存一致性协议:

        在共享存储模型中,通信是伴随着读取和写入数据,以及指令访问而隐式(implicitly)产生的。存储层级结构(memory hierarchy)往往采用多级缓存结构(cache hierarchy)来提高共享存储系统的性能。缓存对外界是透明的,编程人员无须担心缓存的管理,这需要更复杂的系统设计来维护共享存储模型中的数据一致性等问题。

        下面展示这些被隐藏的缓存问题,图2-1展示了一个由64个节点组成的共享存储的CMP 架构。每个节点包含一个处理器核、私有的一级指令缓存(L1 Icache)和一级数据缓存(L1 Dcache)级缓存(L2 cache)。其中,二级缓存可能是私有的,也可能是共享的。三级缓存(L3 cache)通常作为一个整体,被片上的所有处理器共享。本地节点与片上其他组件之间的通信由处理器-网络接口(后文会解释)和路由器负责。

        缓存一致性协议采用“单写多读”(single-writer,multiple reader)规则,即对于共享数据,同一时刻一个缓存行(cacheline)最多只允许一个处理器对其进行写操作,而一个缓存行可以同时被多个处理器读取。

        共享存储多处理器通信需要完成三类任务:数据请求,数据响应和一致性请求。多处理器中有两类常用的缓存一致性协议:基于广播(broadcast)的协和基于目录(directory)的协议。

(a)基于广播的缓存一致性协议 

        图2-2 a展示了基于广播的协议中一次由缓存未命中(cache miss)引起的数据读请求,该过程分为三个阶段:

  1. 某处理器节点在访问数据时发生缓存未命中,并发送数据请求到相应的保序点(ordering point),图2-2(a)的示例中为内存控制器。
  2. 内存控制器将数据请求广播至所有片上节点。
  3. 拥有所请求数据副本的节点进行响应(实则更复杂,还要判断数据是否最新),将所请求数据发送至请求者节点。如果各节点的缓存中都没有数据,内存控制器将该数据由内存读取并发出数据响应。

        在基于广播的协议中,一致性请求会被发往所有的片上节点,从而导致了很高的带宽需求。相反地,数据响应是点对点通信,且对响应顺序没有要求。因此,广播系统可以采用两套物理网络来实现:一套互连网络用于实现有序一致性请求通信,另一套网络用于实现大带宽且无序的数据传输。此外,还可以采用多个虚拟通道(virtual channel)来保证一致性通信有序进行,一致性请求和数据响应分别在独立的虚拟通道中传送。 

(b)基于目录的协议

在基于目录的协议中,增加了目录节点(此节点非彼节点)组件,管理所有地址的缓存一致性信息 (包括该地址上的数据及其数据副本存在于哪些个节点中)。每个目录节点负责管理若干个地址,而每个地址只属于一个唯一的目录节点,这个唯一的目录节点称为该地址的目录基节点。图2-2(b)展示了基于目录的协议中一次由缓存未命中引起的数据读请求。该过程分为3个阶段。 

  1. 某处理器节点在访问某地址时发生缓存未命中,并将数据请求发送至该地址对应的目录基节点。
  2. 目录基节点根据该数据请求的地址,找到持有该数据的节点并发送请求消息。
  3. 持有该数据的节点发送数据响应至请求者节点。

在这个过程中,数据请求并不像基于广播的协议那样需要广播至所有的节点,而仅仅被播送给单个节点,从而降低了带宽需求,因此经常被选择部署在可扩展的系统设计中。目录的一致性状态信息保存在内存中,为了避免每次一致性请求都需要访问内存中的目录信息,通常会使用片上的目录缓存(directory cache)来存储最近访问过的目录信息。这样可以有效地降低目录访问的延迟。

2.1.2 共享存储CMP中缓存一致性协议对片上网络的要求 :

消息传送模式::单播(unicast),多播(multicast),广播(broadcast)。

消息长度:

举例内容

一致性请求消息;

不带数据的响应消息

地址信息和命令
数据传输消息地址和完整缓存行数据块(通常为64字节)

2.1.3 协议级死锁(protocol-level deadlock):

常见的消息:

  1. 请求类(Request)

    包含消息类型:数据载入(load)、数据保存(store)、数据更新(update)、数据写回(write-back)。
  2. 干涉类(Intervention)

    包含消息类型:由目录发出的请求,要求将已修改的数据发送给新的节点。
  3. 响应类(Response)

    包含消息类型:无效化确认、失败确认、数据消息等。

消息类之间的依赖和死锁 

  • 独立操作:同一类的消息通常是彼此独立的,即一个类的请求消息不会直接触发同类的其他请求消息。这种独立性有助于简化协议的设计,避免复杂的相互依赖性。
  • 资源依赖和死锁:当不同类的消息之间存在资源依赖时(例如,一个请求消息需要等待另一个响应消息,而该响应消息也依赖于另一个请求消息),就可能导致死锁。死锁是一种状态,其中两个或多个消息或进程相互等待对方释放资源,导致系统无法继续运行。

  • 避免死锁的策略:多虚拟通道技术

    虚拟通道是一种网络技术,允许多个逻辑通道在同一个物理通道上独立传输数据。通过为每个消息类分配单独的虚拟通道,不同类的消息在不同的虚拟通道中独立传输,确保即使一个虚拟通道被阻塞,其他虚拟通道仍然可以正常工作,这样就可以避免因资源依赖而导致的环路依赖,从而避免死锁。

2.1.4 多级缓存实现对网络性能的影响 

在本小节的讨论中,我们假设采用两级缓存结构。其中,一级缓存被分为指令缓存和数据缓存,二级缓存是最后一级缓存,统一地存储指令和数据。二级缓存可以是私有的也可以是共享的。

1.私有二级缓存:

        对于私有二级缓存机制,每个处理器本地拥有一个小规模的二级缓存。一级缓存未命中首先被发送到本地的私有二级缓存。如果所需数据已经存储在二级缓存中,则该访问命中(hit)。否则,该访问请求会被转发给保存有此数据的其他节点的二级缓存(可能是广播方法可能是目录方法),缓存不命中,则请求发送给内存。

        优缺点:降低了二级缓存命中的延迟,且可以将频繁访问的数据放在处理器本地,本地二级缓存命中率高,减少了不同节点缓存之间的通信量,缺点是共享数据会在多个节点的缓存中拥有副本,降低了片上存储资源的利用率,且由于私有缓存较小,增加了系统与内存之间的通信量。

        在图(b)的示例中,对地址A的加载请求在一级缓存和二级缓存中都发生了缓存未命中,因此该操作请求必须通过网络接口向外发送(步骤④),请求消息经由网络发送至内存控制器,内存控制器进而在内存中读取地址A的数据(步骤⑤),并经由网络将数据送回请求者节点(步骤⑥),在步骤⑥后,地址A的数据被依次更新到二级缓存和一级缓存,并最终到达处理器核。在这个示例中,对私有二级缓存未命中的处理需要两次网络传输和一次内存访问。

ps:步骤5省略描述了通过广播或目录方式在其他节点的私有二级缓存查找数据的过程,实际上,在二级缓存未命中后,需要通过基于广播的协议或基于目录的协议,首先查询是否有其他节点的缓存中持有此缓存行,而不是直接向内存控制器请求读取内存数据。本示例中将该过程进行了简化,旨在突出私有二级缓存机制的通信特点,以及对片上通信的影响。

a

2.公有二级缓存:

        对于共享二级缓存机制,每个处理器本地的二级缓存bank 共同组成了一个逻辑上的二级缓存。当一级缓存未命中时,会根据数据访问地址将数据请求直接发送给相应的二级缓存bank(注意,这个二级缓存bank不一定在节点本地)。如果该数据访问在二级缓存bank中仍然没有命中,则会被进一步发送给内存。

        优缺点:缓存总体有效利用率增大,但本地二级缓存命中率低

        路由器的注入/输出端口需要被二级缓存和一级缓存共享。(因为路由器的端口需要处理来自其他核心的缓存访问请求)。

共享二级缓存未命中处理流程:对地址A的数据读取发生了一级缓存未命中,由于地址A被映射到位于其他节点处的共享二级缓存bank中,该读取请求必须通过本地路由器发送到网络中(步骤③),并传送至对应的节点处(步骤④),在步骤5中,对地址A的读取请求在二级缓存中仍然没有命中,于是该读取请求必须再次通过路由器发送至网络中(步骤6),并传输到内存控制器以读取内存数据(步骤),内存控制器取得数据后,将数据通过网络传输返回给地址A对应的二级缓存bank 并更新,然后二级缓存bank再将数据经由网络发送回请求者节点(步骤8)。请求者节点接收到数据后,依次使用该数据更新本地的一级缓存和处理器核(步骤9)。在这个示例中,一级缓存未命中需要4次网络通信来完成数据速取操作。

 2.1.5 目录基节点和内存控制器的设计策略

 目录基节点:

目录基节点用于维护映射到它的地址的一致性信息,处理和维护对这些地址的有序访问,可能会发起对本槽的内存或其他插槽的内存访问或者对其他持有此数据的节点发送干涉消息(用来请求将已修改的数据发送给新节点)。

对于上述的共享二级缓存结构

        某地址所对应的目录基节点就是他所映射到的二级缓存bank。假设地址A的目录基节点是节点B,当地址A的数据被修改,节点B需要无效化所有其他节点所持有的地址A的副本,这时就需要由地址A对应的目录基节点(此目录节点位于物理节点A处)发送缓存无效化(cache invalidation)请求,将其他节点的一级缓存(注意二级缓存不需要,因为共享二级缓存没有多个副本)中所持有的地址A的缓存行无效化。

对于上述的私有二级缓存结构:
        目录基节点和节点并不需要一一对应。事实上,可以设计一个统一的集中目录,也可以由每个物理节点维护一部分目录信息。假设总共有个节点,那么可以在整个地址空间部署1到n个目录基节点。在某些基于广播的协议中,如 Opteron协议,也需要实现一个类似于目录基节点的保序点,用来统一地广播一致性请求。

内存控制器:

        在两级缓存结构中,二级缓存未命中必然涉及对其他节点缓存或内存的访问。这些访问请求经由片上网络发送给内存控制器。因此,在存储密集型的计算负载中,内存控制器的访问需求通常很高,会成为整个网络通信的热点(hot-spot)。

        内存控制器可以与处理器核和缓存共同部署在同一个节点中。在这种部署形态下,内存控制器将会共享缓存的网络注入/输出端口。图2-7(a)描绘的就是这种情况。在这类设计中,需要设计仲裁策略以协调内存控制器和本地缓存对网络注入带宽的使用。在另一类设计中,内存控制器可以作为一个独立节点被部署到网络中,这样就可以避免内存控制器与缓存竞争网络注入/输出带宽,如图(b)所示。在这种情况下,网络通信会更加独立,内存控制器可以使用全部的注入带宽。在目前的主流设计中,内存控制器通常会部署在芯片四周,从而尽可能缩短它与芯片引脚之间的距离。

2.1.6 未命中/事务状态保持器 

 图2-8展示了一种处理器-网络接口的可能的实现方式。当发生了缓存未命中时,系统会分配并初始化一个未命中状态保持寄存器(Miss Status Holding Register,MSHR)。例如,对于读取请求,MSHR将会被初始化为读挂起状态(readpendingstate),然后消息格式化与发送模块(message format and send block)会创建一条新的网络消息。该消息被格式化后包含以下内容:传输目的地地址(在基于目录的协议中,该地址是内存访问地址所对应的目录基节点所在位置)、请求的缓存行地址、消息类型(在本示例中,类型为read)。当一个响应消息通过网络送达消息接收模块(messagereceive block)后,MSHR 会将该响应消息与对应的未完成的请求进行匹配,最终完成这一次缓存未命中的处理。除此之外,消息接收模块还负责接收来自目录节点及其他处理器节点的请求消息,以进行不同节点的缓存之间的数据传输。这时,协议有限状态机将会处理该请求,格式化响应消息并将其发送回网络。

与此同时,内存-网络接口负责接收由处理器(其实是来自缓存)发送的内存请求消息,并启动响应。图2-9展示了该接口的功能。

2.2 消息传递机制 

        消息传递机制要求进程之间进行显式的通信,这些用户通信通过操作系统和库函数调用来实现。因此,编程人员必须编写互相匹配的消息发送和接收调用软件程序,以完成不同进程之间的数据传输。借助消息传递机制,可以实现任意多个协同工作的进程间的通信和同步。 

        在共享存储机制中,网络中和接收节点侧的消息存储对软件而言都是透明的,完全由硬件进行管理。在消息传递机制中,往往通过传输大块数据的方式来摊平由通信带来的开销和延迟。

        阻塞(即同步)消息传递要求消息发送者在发送消息后进入等待状态,直到接收者对该消息进行响应。尽管在概念上相对简单,但是阻塞消息传递必须仔细处理死锁问题。例如,两个进程分别执行了消息发送命令,然后进入等待状态。在这种情况下,两个进程均无法执行接收到的消息命令,进入死锁,如图2-3所示。非阻塞(即异步)消息传递允许发送者在发送消息后立即继续后续操作。这种策略避免了死锁带来的复杂性,但是,需要在接收侧引入额外的消息存储机制来暂时缓存接收到的消息,以供消息接收者在方便时进行处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值