片上网络技术(Network-on-Chip)并不是一个全新的 “黑科技”,从发明至今已有二十余年的历史。随着 2018 年英特尔收购 NoC IP 供应商 Netspeed,以及 2019 年 Facebook 收购另一家 NoC 公司 Sonics,片上网络技术渐渐再次回归人们的视野。同时,就像之前文章里介绍的,主流 FPGA 公司也开始采用片上网络技术构建新一代 FPGA 芯片。
有关片上网络技术分两部分介绍:
第一部分:片上多核系统与片上网络的发展
第二部分:片上多核系统与互联子系统
接下来是正文:
片上多核系统与片上网络的发展概述
系统级芯片也被称为片上系统,是指在单个芯片内部实现大部分甚至完整的电子系统功能的一种芯片。这种芯片是高端电子系统的核心,随着集成电路工艺技术的发展也逐步向中低端电子系统发展。如今,很多诸如腕表、手环之类的可穿戴设备以及智能玩具等低端嵌入式设备也都以系统级芯片为核心来开展设计。可以说片上系统已经成为集成电路,尤其是数字集成电路的主要实现形式。
由于集成电路工艺在摩尔定律的驱使下飞速发展,单位面积上的晶体管数量不断增加。根据登纳德缩放比例(晶体管面积的缩小使得其所消耗的电压以及电流会以差不多相同的比例缩小。也就是说,如果晶体管的大小减半而时钟频率不变,该晶体管的功耗将会降至四分之一)。使用新的集成电路工艺可以让设计者可以大大地提高芯片的时钟频率,因为提高频率所带来的更多的功耗会与晶体管缩放减少的功耗抵消,芯片的性能可以依靠不断的提升时钟频率来获得提高(当然,也要配合架构设计的改进,例如利用增加的晶体管设计更多而且更为合理的高速缓存)。这样在芯片内部集成更多的晶体管的时候,提高芯片时钟频率成为了一个 “免费的午餐”。
而 2005 年前后,晶体管微缩到一定程度以后量子隧穿效应(指像电子等微观粒子能够穿入或穿越位势垒的量子行为)开始慢慢介入,使得晶体管漏电现象开始严重。漏电现象的出现打破了原先登纳德所提出的定律。单纯提高时钟频率将造成芯片功耗难以控制。功耗增大除了更费电不环保之外,带来的最大问题是增加的功耗会转化为热量。在微小的芯片面积上大量功耗密集堆积会导致温度急剧增加。如果散热做的不好,芯片的寿命将大大减少甚至变得不稳定。在这种情况下,提高芯片的时钟频率不再是免费的午餐。在没有解决晶体管漏电的问题之前,单纯的增加芯片的时钟频率因为随之而来的散热问题而变得不再现实。于是芯片研究商们开始纷纷停止高频芯片的研发,转而向低频多核的架构开始研究,用更多但频率更低的核心来替代一个高频率的核心。这种具备多个运算核心的片上系统就是片上多核系统。
近 10 年来片上多核系统一直是数字集成电路领域的热点,经过众多研究者的不断努力诞生了大量很有意义的研究成果。片上网络,本质上是为了解决片上多核系统中不同的核心之间,核心与非核心(Un-Core)硬件单元之间数据传输问题的一种 “片上通信” 方案。因此要理解清楚片上系统的发展脉络,必须要先从片上多核系统的发展入手。否则就会出现 “无的放矢” 和“盲人摸象”的问题。但由于片上多核系统的研究者背景和应用领域不同导致发展演进过程较为复杂而难以理解。2012 年本人及所在研究小组开始切入片上网络相关时,由于对于片上多核系统的理解不深,导致研究出现了诸多波折与困扰,导致在一年多的时间中整体研究徘徊不前。
为减少这一问题对于大家理解片上网络的影响,作为我们系列文章的开头,本文将首先总结片上多核系统的演进历史与现状。从而让大家理解出现片上网络这一技术背后的推动力,也可以看出片上网络多年来一直徘徊不前的原因。
片上多核系统发展的两条演进路线
第一款被大众所熟知的商用化片上多核系统是著名处理器芯片提供商之一的 AMD 公司面向个人电脑推出的 ATHLON X2 双核中央处理器 Central Processing Unit (CPU),该款 CPU 在商业上大获成功。此后商用化片上多核系统的研制开始进入高潮。2005 年 Intel 发布了 64 位双核处理器 Montecito[1],而 IBM 公司则发布了具有 9 个核心的 Cell 处理器[2]。此后的 10 年间,片上多核系统开始大量的被应用于各种信息基础设备,成为高性能电子设备的核心器件。
但实际上片上多核系统的研究开始于上个世纪 90 年代中期,在过去的 20 多年中片上多核系统架构一直处于不断发展和演进中。由于应用领域和研究人员的学术背景不同,片上多核系统的研究从一开始就有着明显的 “流派” 之分。随着研究的持续深入,片上多核系统出现了越来越多的技术分支。这不但让广大吃瓜群众难以辨识,对于很多刚接触片上多核系统研究的硕士生和低年级博士生而言,搞清楚这些技术分支的区别与联系也并不是一件轻松的工作。
简单来说,片上多核系统由于起源不同、应用领域不同以及研究者的学术背景不同等原因,发展出了不同的技术路线。上文提到的 Intel 公司发布的 Montecito 处理器[1]和 IBM 公司发布的 Cell 处理器[2]就代表了两种最主要的技术路线。
Montecito 处理器这一类片上多核系统源于 Symmetric Multi-Processing System (SMP) 系统,被称之为 Chip Multiprocessors (CMP)(国内一般翻译为单芯片多处理器),主要用于高性能通用计算领域。Cell 处理器这一类片上多核系统则由片上系统 Systemon-Chip (SoC) 演进而来,被称为 Multi-Processors System-on-Chip (MPSoC)。这类片上多核系统主要作为一种高端的嵌入式处理器被应用于通信、信号处理、多媒体处理等领域。为方便行文,后文中直接使用 CMP 和 MPSoC 来指代这两类处理器。
采用 CMP 架构的片上多核系统通常被应用于工作站、服务器、云计算平台等通用计算设备,所运行的主要应用通常是以科学计算、仿真模拟为代表的大数据量通用计算。这类片上多核系统大多采用数据并行的并行程序开发模式,以共享存储器的方式来交换数据。这样的好处在于开发难度较低、程序的通用性较好,可以借用类似于 OpenMP[3] 这样已经较为成熟的并行编程模型加以开发。又由于科学计算、仿真模拟这类应用的特点通常是数据量超大,但不同处理器上所运行的核心程序往往是相同的。因此采用共享存储的方式可以使得多个处理器核心可以很容易共享同一块虚拟地址空间,这使得同一程序可以很方便的同时运行在不同的核心上,也可以很方便的共享同一个操作系统或管理程序。
Hydra 处理器是 1996 年美国斯坦福大学研制集成了 4 个核心的处理器[4],它被认为是首款具备 CMP 性质的片上多核系统。
图 1 Hydra 处理器架构图,它被认为是首款具备 CMP 性质的片上多核系统
Hydra 处理器采用了四个 MIPS 处理核心,每个核心拥有私有的指令缓存(I-Cache)和数据缓存(D-Cache)。二级缓存为四个核心共享,通过核心自身的存储控制器(Memory Controller, MC)及一组总线与二级缓存(L2 Cache)、主存储器接口(Main Memory Interface)和输入输出总线接口(I/O Bus Interface)互连。由于片上的二级缓存为四个核心所共享,因此四个核心实质上在逻辑上具备单一的内存地址空间。这也使得共享同一个操作系统或管理程序成为可能。Hydra 处理器为后续 CMP 架构片上多核系统的发展奠定了基础,这一架构的片上多核系统在后续的演进过程中始终被 Hydra 处理器的初始设计所影响。
而 MPSoC 诞生初期的主要代表是一些集成了多个数字信号处理器 (Digital Signal Processor DSP) 和微处理器 (Microprocessor Unit MPU) 的专用芯片。这些芯片主要被应用于数字电视、多媒体播放器等信号处理设备。与追求高性能的通用计算不同,MPSoC 主要应用领域所面临的主要问题是计算的实时性。由于计算任务的确定性更强,使得 MPSoC 的设计者和使用者能够也必须要精确的划分任务并合理的分配任务以应对各种挑战。
图 2 所示的 Viper 处理器[5],即为最早的一批 MPSoC 之一。
图 2 Viper 处理器架构示意图,它是早期 MPSoC 的代表之一
从图 2 中可以看出,整个芯片可以被划分为两个相对独立的子系统。分别以 MIPS(PR3940)CPU 和 TriMedia(TM32)CPU 为核心。图左侧为以 MIPS(PR3940)CPU 为核心的子系统,这部分子系统的架构类似于一个通用的嵌入式 SoC 芯片,集成了如 UART、IEEE 1394 协议控制器之类的接口模块。图右侧为以 TriMedia(TM32)CPU 为核心,在这一子系统中集成了如 MPEG-2 视频解码器、视频输入处理器等多媒体处理单元,实质上构成了一个专用的多媒体处理器。因此可以很清楚的判断 Viper 处理器中以 MIPS(PR3940)CPU 为核心的子系统主要负责通用处理器控制和数据传输方面的功能,而以 MIPS(PR3940)CPU 为核心的子系统则主要负责多媒体信号处理。两个子系统相对独立,通过 Fast C-Bridge、MIPS C-Bridge 以及 C-Bridge 三个总线桥相互连接。
Viper 处理器的架构很清晰的体现了 MPSoC 的一些典型特点:按任务需求划分为若干独立的子系统,每个子系统完成一个专门的功能,子系统之间相对独立等。这种架构设计方法充分体现了嵌入式系统的特性,因而被后来的研究者所继承和发扬。
RAW[6]是一代具有划时代意义的片上多核系统。虽然它被发表于 1997 年,但它却奠定了今后 20 年采用片上网络互联的 CMP 的基本架构。
图 3 首次采用 Tile 结构和网络化互联的 CMP 架构芯片:RAW
RAW 是由美国麻省理工学院于 1997 年提出并流片验证(从这里也可以看出美国在于高端系统芯片领域的积累深厚,回想我们 1997 年的芯片设计水平也才刚刚进入到能把 EDA 工具流程用起来,开始做 ASIC 的水平。龙芯等一大批处理器芯片设计都要等到 2000 以后)。
RAW 微处理器架构采用了一种被称为 Tile(国内有国内文献有直译为瓦片,为避免歧义本文中均使用英文原文指代)的模块划分方式。这种划分方法把 CPU、私有 Cache(L1 Cache)、共享 Cache(L2 Cache)的一个 Bank(一直不知道这个该怎么翻译……)、网络接口(Network Interface NI) 等硬件资源构建为一个独立的 Tile。在不同的 Tile 在芯片规划的平面内按一定的规律整齐排列,Tile 和 Tile 之间通过 NoC 加以互联。这种采用 Tile 来划分和组织片上多核系统的方式优势在于每个核心比较规整,有利于芯片后端设计并具备较好的可扩展性。此后虽然有一些其它形式的核心划分与组织方式的论文发表,但基于 Tile 的划分与组织方式始终被绝对部分研究者(灌水者)所继承。
接下来看一看比较近的一点的 CMP 架构的片上多核系统,32 核心 SPARC M7 处理器[7]。发布于 2015 年的 ISSCC 上。
图 4 32 核心 SPARC M7 处理器逻辑结构图
该款处理器共有 32 个核心,每 4 个核心构成一个组(文章中称其为 SCC),总共 8 个组。每个组内部共享 L2 Cache,但其它组不能访问。L3 Cache 为全局共享 Cache,可以被所有的所有核心访问。L3 Cache 同样被划分为 8 个独立的 bank,和对应的每个组一起组成了一个完整的 Tile。
为了更有效的互联各个不同的 Tile,研究者为 SPARC M7 处理器设计了三套不同的片上网络。分别是采用环网(Ring)结构的请求网络(Request Network),采用广播(Broadcasting)结构的响应网络(Responses Network)以及采用网格(Mesh)结构的数据网络(Data Network)。不同的片上网络分别传送不同的控制信息和数据,从而使得访问 Cache 的效率能最大限度的提高。
片上网络成为 CMP 架构的片上多核系统内部互联的主流方式之后,片上缓存的组织方式也相应的发生了改变。在使用总线或交换结构的时代,CPU 访问不同 Cache Bank 的时间是基本保持一致的。但在使用片上网络作为内部互联以后,CPU 访问不同的 Cache Bank 的时间已经不可能保持一致了。因此一种被称为非均匀高速缓存体系结构 (Non-uniform Cache Architecture, NUCA) 的概念被提出。NUCA 是基于片上网络的 CMP 片上多核系统所必然要面临的问题,但对 NUMA 的研究也推动了基于片上网络的 CMP 片上多核系统向前持续演进。改进 NUMA 条件下 CMP 架构片上多核系统的访存效率,也成为提升 CMP 架构片上多核系统性能的主要途径。由于这部分内容涉及到较多存储体系结构方面的研究,在计算机系统结构的研究中属于另外一个领域。超出了本文甚至本系列文章所讨论的范围,因而在此不再进一步展开讨论。
当然,也不是所有的 CMP 架构的片上多核系统从此就走上了依靠 NoC 互联的道路。当核心数量不多的时候确实没有必要考虑使用 NoC。例如 AMD 的 Zen 就是没有依靠 NoC 而采用了一种叫 Core Complex (CCX) 的方式互联[8]。
图 5 采用 CCX 互联的 Zen,依然具备 CMP 架构的基本特征
从图 5 可以看出,Zen 虽然核心比较少,但仍然是典型的 CMP 架构。
谈了很久的 CMP,我们回头再来看一看 MPSoC。相比于 CMP 的规整、对称的架构,MPSoC 是由若干个独立的子系统构成的。图 6 是 Intel 在今年 ISSCC 上发布的面向机器人的 Robot SoC[9]。
图 6 面向机器人的 Robot SoC,典型的 MPSoC 架构
图 6 中有若干个子系统。左边第一个是以 X86 处理器为核心的实时子系统,主要负责对外接口通信与控制,所以和 SPI、I2C 等外设接口划分到一起了。Tensilica DSP 则是负责信号处理运算的一个子系统。有一个 Always on 子系统是常开的,主要负责音频方面的处理,应该是用于芯片的唤醒。还有路径规划硬件加速器、运动控制硬件加速器等一系列加速器以及由 X86 处理器配合 CNN 加速的应用子系统,用于实现人工智能算法。
图 7 是 Robot SoC[9]所实现的算法,可以看出是由多个独立任务构成的。这种形式的应用比较容易被划分为若干个独立子系统来实现。这也是 MPSoC 主要应用领域里的各种算法的基本特征。
图 7 Robot SoC 所需要实现的算法
如果芯片内部的子系统较多,关系复杂,当然也可以依靠 NoC 来互联。比如刚刚被收购的 sonics 公司就给了这么一个例子[10]。
图 8 Sonics 公司给出的高性能片上网络在 SoC 中的应用
可以看出,在 MPSoC 中有多个独立的子系统时,使用片上网络是一种必要的片上通信方式。
结语
最后,我们稍作总结:
片上多核系统是现在系统级集成电路的主要实现形式;
片上多核系统分为 CMP 和 MPSoC 两种架构;
CMP 主要用于通用计算,大多采用数据并行的并行程序开发模式,以共享存储器的方式来交换数据,通常以对称的 Tile 形式来组织芯片硬件结构;
MPSoC 主要用于嵌入式设备,大多是由多个相对独立的子系统构成,一般 “按需设计”,结构极不对称。
本次先谈到这里,下一篇会谈一下不同片上多核系统的互联需求。也讲一下片上多核系统的发展如何引导片上网络的发展的。
在第一部分我们已经阐述清楚了,片上多核系统分为 CMP 和 MPSoC 两种架构。CMP 架构的特点是采用共享存储来交换数据,换言之就是每一个核心其实是可以 “看见” 完整的地址空间的。而 MPSoC 则更像是多个独立的子系统在单个芯片上的集成,一般是“按需设计”,多个系统之间的存储空间一般相互不可见。
所以对于 CMP 而言,可以大致划分为 CPU / 处理单元和存储子系统两部分。整个系统运行的过程就是多个核心在一个共享的存储空间上运行多种程序。由于程序空间是共享的,因此程序可以在多个核心之间自由的调度,不同核心之间的数据交互也相对容易。对于数据交互的过程可以理解为 CPU / 处理器单元私有存储器与共享存储器之间的数据交换 / Cache Line 替换。
如果把这个过程抽象出来,那么可以看到下面这个图。
图 1 基于 NoC 的 CMP 架构多核片上系统逻辑抽象图
从图 1 可以看出 LLC(Last Level Cache)可以被分成多个 Bank,但在逻辑上是是一个完整的共享区域。而每个 Core 以及 L1 Cache 是相互独立的,可以看做在不同的核心上运行不同的程序或者进程。
不同层级存储器之间的数据交换过程如图 2 所示。
图 2 不同层级存储器之间的数据交换过程
从图 2 可以看出,整个数据交换过程与 Cache 的替换有关系。当发生 Cache Miss 以后,L1 会去 LLC 中取数据。而当 LLC 也 Miss 以后,会通过存储器控制器去片外的存储器(内存)中取数据。因此在程序运行的过程中,实际上会不断的发生由于上一级 Cache Miss 而产生的访存行为。而当由于 LLC 是共享的,因此每个核在运行是可以访问任意的 LLC 的。这就造成了一个访问冲突的问题。
如果我们是以总线来互联各个 Core 和 LLC,那么总线本身就成为了一个竞争性的资源。而如果我们用片上网络来互联 Core 和 LLC,会在很大程度上消解访问冲突。因此对于 CMP 架构的多核片上系统而言,采用 NoC 的目的就在于消解访问冲突。而且 NoC 上运行的流量很多也是由于 Cache 一致性协议而产生的。因此在 CMP 架构的多核片上系统中,通常把 NoC 和 Cache 协同在一起考虑设计与优化,被统称为 “Un-Core System”。
再仔细分析可以发现,采用 NoC 互联以后,存储器控制器会变成一个 “竞争性” 资源。LLC 各个 Bank 出现 Miss 以后都需要通过它来访问外部的片外存储器。所以为了提升访存带宽需要设计多个存储控制器并设计多个片上通道来传输数据。
图 3 CMP 架构的片上多核系统与接口 IP 互联方案[1]
从图 3[1]可以看出,在芯片中使用了四个 DDR2 的控制器。每个 DDR2 的控制器和不止一个片上网络节点连接。其它的如 PCIe 以太网控制器也是类似的接法。
总而言之,在 CMP 中由于存在大量共享资源,因此使用 NoC 实现片上互联的根本目的就是尽可能的消解、缓和共享资源的访问冲突。因此 NoC 需要考虑和这些资源一起作为 “Un-core System” 协同优化。
而 MPSoC 的互联就更像通过网络的形式实现多个子系统的互联。具体的抽象如下图所示:
图 4 基于 NoC 的 MPSoCP 架构多核片上系统逻辑抽象图
从图 4 中可以看出,采用片上网络互联的 MPSoC 每个处理单元(PE)是相对独立的子系统。一般情况下各个子系统之间的存储部分并不互通,没有一个共享的存储空间来存放共享数据和并行程序。各个子系统独立运作,分别执行不同的任务。一旦数据处理完毕,则通过网络发送到下一个需要继续处理的节点。
图 5 一个实际的基于 NoC 的 MPSoCP 架构多核片上系统案例[2]
如果图 4 还过于抽象的话,那图 5[2]就是一个具体的例子。这是一个用于无线通信的 MPSoC,具有多个独立工作的运算单元以及专用电路。每个单元内部是一个 DSP + 一个 RISC 处理器。通过对于这些 PE 进行编程,可以灵活的支持多种无线通信处理协议。而采用 NoC 的目的是提高互联的灵活性并降低互联的复杂度。
对于基于 NoC 的 MPSoCP 架构多核片上系统有一种设计方法,叫做基于任务图的映射方法。其本质上是把需要完成的大型系统分割成若干任务,并将任务之间的依赖关系和通信量表示为图的形式。设计 MPSoC 的过程,可以看成是把任务图中的任务分配到对应的处理单元上的过程。如图 6 所示。
图 6 映射的示意图
通过映射可以比较灵活的调整任务在系统中的位置,从而起到减少流量和冲突的作用。
在设计阶段实施,映射被称为静态映射。既任务和 PE 静态的对应,最终的产出是一个专门的 MPSoC 设计方案。相应的 NoC 也可以进行定制化的优化。而在运行阶段映射则被称为动态映射,这种映射假设各个模块都是通用的 PE。动态映射实际上在真实的应用中并不太常见,却是学术研究的 “常客”。因为通过这种方法可以实现“轻量级” 的研究,在不用太费劲的情况下就能得到一定的“研究成果”。
当然,现在的真是处理器中,CMP 和 MPSoC 两种架构实际上是共存的。因此 ARTERIS 实际上同时支持这两种形式的 NoC 互联融合,具体方案如图 7 所示。
图 7 ARTERIS 公司给出的融合两种架构需求的互联方案[3]
图 7 中 Ncore Cache Coherent Interconnect 是带 Cache 一致性协议的互联,可以看出这是一个很明显的 CMP 架构的子系统。而 FlexNoC Non-coherent Interconnect 则是用于互联多个独立的外围子系统或加速器系统的。