http://zhifeiding.github.io 2024-03-11T14:47:30+00:00 dzhf21@hotmail.com AI Accelerator | All processors aspire to be general purpose http://zhifeiding.github.io/programming/history/2024/03/08/AI-Accelerator-All-Processors-aspire-to-be-general-purpose/ 2024-03-08T00:00:00+00:00 http://zhifeiding.github.io/programming/history/2024/03/08/AI-Accelerator-All-Processors-aspire-to-be-general-purpose 前言

一花独放不是春,百花齐放春满园

相比通用计算的百花凋零,AI加速计算可谓千帆竞发,百舸争流。既有Groq TSP超大核空间计算,Graphcore IPU众核存内计算,SambaNova RDU可重构数据流计算,也有百度昆仑和华为昇腾采用通用计算结合矩阵加速方案,还有Alibaba的CNN专用加速器含光800;当然,也少不了Intel,从用于HPC的Xeon Phi,独立GPU,到Nervana NNP和Habana Gaudi,无不在彰显财大气粗同时透漏出内心的迷茫。

各种架构层出不穷,令人眼花缭乱,目不暇接,固然是行业繁荣的标志;但是作为从业者,能够从众多加速器设计中获取核心思想,提升自身水平,无疑是最重要的,须知

乱花渐欲迷人眼,浅草才能没马蹄

概述

本文主要关注数据中心AI加速器,至于端侧的AI加速器,由于应用场景限制,在设计思路上有所不同。 0.png

  • 含光800是Alibaba在2020年推出的专门针对CNN推理的加速器,在ResNet-50上实现了每秒78563次Inference,成为一时榜首。不过随着AI模型的迅速发展,这种专用的加速器在数据中心的场景下,越发显示出其缺点,即对CNN优化的有多好,对其他模型性能就有多差。
  • 百度昆仑系列采用常见的通用计算核加矩阵加速器,这种方案在实现上比较简单,也比较容易随着工艺而扩展来提升性能;因而迭代也比较快,目前已经从Kunlun 1发展到Kunlun 2了,Kunlun 3有传闻2024年初会量产。
  • 华为的昇腾系列采用达芬奇架构,也是通用计算核加矩阵加速器,只不过矩阵加速器与通用计算核紧耦合,有单独的指令集。这种方案利用了华为自身通用计算处理器的设计能力,在软件使用上也相对方便一些。
  • Groq的TSP最近由于大模型的火热,也改名成LPU,不过名字变了,东西还是那个东西。上面可以贴的标签很多,从流水线上可以看成是一个巨大的单核处理器;从计算方式上看,是SIMD阵列;从编程模型上,属于数据流空间计算;从存储结构看,又是近存计算。但是,标签再多,TSP的软件编程上必定是非常不友好的。当然,Groq好像并不直接卖硬件,而是提供AI计算服务,这样复杂性都是自己消化了,好像商业上也没什么问题。
  • SambaNova的RDU系列在架构上是采用SIMD近存计算的数据流加速器,芯片内分成几个小的Tile,每个Tile和Groq的TSP其实比较相似。编译器承担比较多的调度工作。
  • Graphcore的IPU系列采用近存众核数据流计算方式,芯片本身也只有片上存储,不过后面开发了一款交换芯片,可以为计算芯片提供DDR内存。
  • Intel在AI加速方面则是多点开花,主打一个不知所措
    • 首先是Xeon Phi,采用x86众核方案对向量计算加速。这个最开始是和NVIDIA的GPGPU在HPC领域竞争的,在天河超算中也有使用。后来由于美国禁令,这条产品线也就没有了。结合最近几年美国在半导体产业上的禁令,不得不说,美国这些禁令才是国内半导体发展第一推动力。
    • 之后是收购的Nervana的NNP加速器,专门用于矩阵加速,不过其用于推理和训练的产品居然使用不同架构,也不怪Intel后期也放弃了Nervana的产品。
    • Habana的Gaudi系列采用向量计算和矩阵计算的加速器方案,在纵向和横向扩展能力上比较好,也是目前Intel主推加速方案。不过从Intel的路线图上看,后期也会被合并到Intel Xe GPU架构里,前景也不佳。

总而言之,国内AI加速器架构设计上还是相对保守和传统的,这与国内当前的体系结构和设计能力还是匹配的。而国外的架构设计思路上则更加天马行空,不再拘泥于传统成熟的体系结构;在创新性上远超国内,这些和国外在通用计算和体系结构上深厚积累是息息相关的。

本文组织形式如下:

  • 第一节介绍Alibaba的hanguang 800,了解其专用架构
  • 第二节介绍Baidu的Kunlun系列,主要是Kunlun 1和Kunlun 2
  • 第三节介绍Huawei的Ascend系列和Davinci架构
  • 第四节介绍Groq的TSP架构,编程模型及系统扩展
  • 第五节介绍SambaNova的RDU系列,主要是SN10
  • 第六节介绍Graphcore的IPU系列,包括架构,编程模型和系统扩展
  • 第七节则介绍Intel的AI加速解决方案,包括Xeon Phi,Nervana的NNP和Habana的Gaudi
  • 文章最后列出了相应参考文献

Alibaba

Alibaba在2020年推出了专门针对CNN推理的加速器含光800,其ResNet-50推理性能远超当时各类AI加速器,如下图所示: 1.png

HanGuang800

含光800采用台积电12nm工艺,面积709mm^2,TDP功耗280W,工作频率700MHz。下图展示了含光800的物理版图: 2.png 含光800包含4个用环形总线连接的核,一个命令处理器CP(Command Processor),PCIE gen4 X16;每个核由张量引擎TE(Tensor Engine),池化引擎PE(Pooling Engine),存储引擎ME(Memory Engine),指令缓冲IB和SEQ,常值缓冲CB等组成;一共192MB Local Memory (LM),每个核48MB的LM。下图展示了含光800架构框图: 3.png 张量引擎tensor engine(TE)主要负责对来自LM的张量数据进行卷积,矩阵乘加,量化,归一化等操作,并将结果写回LM。下图展示了卷积映射到TE的示意图: 4.png TE支持通过稀疏化,减枝和量化来对模型进行压缩,减少存储和计算需求;矩阵计算支持INT8/INT16,向量计算支持FP24(1sign.8exp.15man)。 5.png

池化引擎Pooling Engine(PE)对数据进行池化,插值等操作,并将结果写到LM;主要由下列功能单元组成:

  • POOL单元 负责POOLs, ROIs操作,以及ROI_align_2
  • INTP单元 负责插值,以及ROI_align_1
  • Scale/Bias单元 负责缩放/偏置操作,以及fp19和fp16/bf16/int8/int16数据格式的转换
  • 输出缓冲Output Buffer 负责输出结果的缓冲 6.png 存储引擎ME(Memory Engine)负责张量复制,reshape,矩阵转置等数据操作,以及对LM的管理;分别使用2048位输入输出接口和环形总线连接。ME的架构示意图如下所示: 7.png 片上一共192MB的SRAM,每个核48MB,分成两个Block,每个Block由16块384KB的SRAM组成。下图展示了LM的分布示意图: 8.png

    编程模型

    主机将模型的缩放/偏置等常量,权重,和模型操作等数据和指令分别通过PCIE 4.0发送到对应的CB, LM和IB存储空间;之后含光800里的CP对IB里的指令进行译码并执行,同时主机通过PCIE 4.0将新的数据传输到LM,将计算出的结果写回到主机,完成流水操作,直到计算结束。 9.png 含光800是专用的指令集,类似 CISC,融合不同的操作,操作数是张量级别的粗粒度数据;3 个计算引擎之间的同步发采用指令中的嵌入式位,硬件进行依赖性检查。 10.png

    Baidu

    百度的AI加速器始于2010年基于FPGA的SDA(Software Define Accelerator)项目,为了适应多种业务,2017年发布XPU(X procesor unit),最后2019年正式从FPGA转向ASIC,开始Kunlun项目。具体发展历史如下图所示: 11.png

Kunlun 1

Kunlun 1采用三星14nm工艺,面积504mm^2,工作频率0.9GHz-1.1GHz, TDP功耗150W;2个HBM,一共16GB,提供512GB/s带宽;和主机接口采用PCIE 4.0 x8;提供512TOPS的INT8计算性能。下图展示了Kunlun 1的物理版图: 12.png Kunlun 1有两个计算单元,每个单元有专用的8GB HBM,提供256GB/s的带宽,和16MB片上共享存储SRAM,4个XPU-SDNN(Software defined neural network),4个XPU-Cluster。两个单元使用NoC连接,带宽256GB/s,相当于一个HBM的带宽。XPU-SDNN主要负责矩阵计算,而XPU-Cluster则提供标量和向量计算能力。下图展示了Kunlun架构框图: 13.png XPU-SDNN针对大尺寸张量的运算进行了高度优化,如矩阵乘法、卷积、去卷积、激活和逐元素运算,主要由MAC阵列组成;从Buffer_A和Buffer_B读取操作数,经过MAC阵列和激活之后结果会被写到Buffer-C。XPU-SDNN架构框图如下所示: 14.png

XPU-cluster由16个计算单元和本地存储(Local Memory)组成,计算单元分为标量单元和向量单元。标量单元可以支持常见的标量指令,主要负责标量及向量的访存地址计算,以及特殊功能单元(SFU)指令,如log、exp、sqrt、div和pow。向量单元支持256位的数据宽度。下图展示了XPU-cluster的架构框图: 15.png

编程模型

Kunlun 1存储模型可以抽象成由计算核心和本地存储LM组成的Cluster,每个Cluster有一个共享存储SM,Cluster还可以直接访问HBM,作为GM。 16.png 百度昆仑的软件栈分为两个主要组件:

  • XTDK 包含一个C/C++编译器,XPU C/C++编译器支持数据并行编程模型,使用前缀关键字来声明函数或变量在硬件中的位置。XPU C/C++允许指针操作和内联汇编直接控制硬件。XDNN是一个优化的运算符库,具有高级数学计算,如BLAS。用户可以直接调用XDNN中定义的API来执行任务。
  • XTCL是一个AOT/JIT张量编译器,能够在XTDK中驱动XPU C++编译器。所有支持的框架都可以提供子图或将预训练的模型文件导出到XTCL中。 17.png

Kunlun 2

Kunlun 2信息比较少,应该是2021年发布,采用台积电7nm工艺,相比Kunlun 1,在INT8上都是256TOPS,主要是提升FP16,从之前的64FLOPS升级到128FLOPS;从HBM替换为GDDR6,存储容量最大可达32GB;增加片间互联接口K-Link,一共4个,可提供200GB/s的总带宽;另外就是增加了Video Codec,提供了视频编解码能力;使用ARM 8核来做系统管理。Kunlun 2整体架构框图如下: 18.png Kunlun 2主要功能模块如下:

  • XPU-SDNN(Software Defined Neura Network engine)软件定义神经网络引擎,是用来处理张量运算,通过软件编程,能灵活实现卷积,矩阵计算,激活等操作
  • XPU-Cluster是通用计算核,用来处理标量和向量计算,支持SIMD指令。每个XPU-Cluster 有64个XPU Core,每个XPU Core有8KB的本地存储Local Memory。另外,每个Cluster还有256KB的共享存储Shared Memory
  • Video Codec提供视频编解码、图像预处理功能,提供最高108路的解码和27路的编码能力
  • K-Link片间互联,一共4个,提供200GB/s 总带宽

下图展示了XPU-Cluster的整体架构框图: 19.png

系统扩展

8个Kunlun 2芯片利用4个K-Link接口进行互联,组成的系统节点之间带宽是不平衡的;每个Kunlun 2芯片通过PCIe和CPU连接。如下图所示: 20.png

编程模型

Kunlun 2的存储模型和Kunlun 1类似,分别由Register, Local Memory, Shared Memory, Global Memory等组成,具体如下所示: 21.png Kunlun 2支持多核并行计算,类似CUDA,使用前缀来标识代码执行的硬件;kernel描述XPU上的计算程序;host端通过设置kernel函数的执行参数并发起执行。调用过程如下图所示: 22.png 下面展示了执行ReLu的代码:

int main()(
	///...
	float* data_xpu = nullptr; 
	// 在设备上分配空间
	xpu_malloc(&data_xpu, len * sizeof(float));
	// 输入拷贝到设备端
	xpu_memcpy(data_xpu, data_cpu len * sizeof(float) XPU_HOST_TO_DEVICE);
	// 在设备上运行relu,启动8个 cluster,每个 cluster 64个核
	relu_xpu<<<864>>>(data_xpulen);
	// 获取输出,释放设备空间
	xpu_memcpy(data_cpu data_xpu, len * sizeof(float)XPU_DEVICE_TO_HOST);
	xpu_free(data_xpu);
}

/// relu.xpu
__global__ void relu_xpu(float* data, int n) {
	int tid = core_id() * cluster_num() + cluster_id();
	int nthreads = cluster_num() * core_num();
	const int bufsize = 1024;
	_local__ float buffer[bufsize];
	// 根据tid进行数据划分
	for (int i = tid * bufsize; i < n; i= nthreads * bufsize)
		// 显式搬运数据到Local Memory 上
		GM2LM(data + ibufferbufsize * sizeof(float));
		// 计算
		for (int j=0;j< bufsize; j++) {
			buffer[j] = buffer[j] > 0 ? buffer[j] :0;
		}
		// 显式写回到 Global Memory
		LM2GM(buffer,data + i, bufsize * sizeof(float))
	}
}

Huawei

昇腾910(Ascend 910) 是华为2019年发布产品,计算部分采用达芬奇架构。

Ascend 910

昇腾910采用chiplet方案,一共8个die,4个HBM,2个dummy die,1个soc die,一个NIMBUS die;其中两个dummy die用来保持芯片整体机械应力平衡; 四个HBM总带宽为 1.2TB/s;昇腾910整体布局如下图所示: 23.png 不同die的面积如下所示: 24.png 其中soc die主要用来计算,采用台积电7nm工艺,面积456mm^2,可以提供512TOPS的INT8性能;soc die的物理规划如下所示: 25.png

SoC die包含 32 个 Ascend-Max 内核、16 个 Arm V8 TaiShan CPU 内核和 CPU LLC、视频编解码器(Digital Vision Pre-Processor),支持128路的全高清视频解码,以及一个连接上述组件的片上网络 (NoC)。NoC采用4x6的mesh拓扑,以提供统一且可扩展的通信网络;两个相邻节点之间的链路工作频率为 2GHz,数据位宽为 1024 位,可以提供256GB/S 的带宽。NoC不使用缓冲,减少 NoC 的面积开销。SoC die和Nimbus die架构框图如下所示: 26.png

DaVinci

DaVinci核由三种计算单元、多级片上存储器和相应的加载/存储单元、指令管理单元等组成;DaVinci核是异构架构,结合了标量、向量和张量计算单元;总线接口单元(BIU)在昇腾内核和外部组件之间传输数据/指令;DaVinci架构框图如下所示: 27.png 下表列出了三种计算单元支持的典型操作: 28.png

  • 标量计算单元主要负责地址等标量计算
  • 向量计算单元可以进行归一化,激活等计算;向量单元还负责数据精度转换,例如 int32、fp16 和 int8 之间的量化和解量化操作;向量单元还可以实现 fp32 操作
  • 张量计算单元主要是矩阵计算,包括卷积,全连接,矩阵乘等;张量计算中矩阵的典型尺寸为 16 x 16 x 16。因此,张量计算单元配备了 4096 个乘法器和 4096 个累加器。矩阵计算中的每个操作数被重复使用 16 次。因此,与向量单元相比,将操作数加载到张量单元的能耗降低到 1/16

DaVinci核包括多个缓冲区,分成不同层次。L0 缓冲区专用于张量计算单元,分成三个单独的 L0 缓冲区,分别是缓冲区 A L0、缓冲区 B L0 和缓冲区 C L0。它们分别用于保存输入特征数据、权重和输出特征数据。缓冲区 A L0 和缓冲区 B L0 中的数据从 L1 缓冲区加载。L0 缓冲区和 L1 缓冲区之间的通信由内存传输引擎MTE(Memory Transfer Engine) 管理。MTE 中有几个功能模块:

  • decomp 模块借助零值压缩的算法来解压缩稀疏网络的数据
  • img2col 模块用于将卷积转换成矩阵乘法
  • trans 模块用于矩阵转置

缓冲区 C L0 中的输出结果可以由向量单元处理(例如归一化或激活)。向量单元的输出结果被分配到统一缓冲区Unified Buffer中,该缓冲区与标量单元共享。数据存储在 L1 缓冲区中,指令存储在指令缓存中。指令执行流程如下:

  • 指令首先由PSQ (Program Sequence Queue) 排序
  • 根据指令类型,分别分发到三个队列,即多维数据集队列(cube queue)、向量队列和 MTE 队列
  • 指令分别由相应的计算单元处理

由于三个计算单元和 MTE 并行工作,因此需要显式同步来确保不同执行单元之间的数据依赖关系。下图展示了相应流程,PSQ 不断向不同的单元发送指令,这些指令可以并行处理,直到遇到显式同步信号(屏障);屏障由编译器或程序员生成。 29.png

系统扩展

每台昇腾910服务器包含8个昇腾910芯片,并分为两组;组内连接基于高速缓存一致性网络HCCS (high-speed cache coherence network),提供30GB/S带宽 。两个组使用 PCI-E 总线相互通信,提供32GB/S带宽。整体形成hyper cube mesh网络拓扑。多台昇腾910服务器可以通过fat-tree的网络拓扑组织成一个集群。下图展示了一个 2048 节点的集群,可以提供512 Peta FLOPS的 fp16 总计算能力,包含 256 台服务器,服务器之间的链路带宽为 100Gbps。 30.png

编程模型

PyTorch、TensorFlow、MindSpore等DNN模型开发框架位于顶端,输出“Graph”,表示算法中的粗粒度关系。然后,在图引擎的帮助下,“Graph”被转换为“Stream”,由几个按顺序排列的“Task”组成。“Streams”/“Tasks”可以直接从Operator Lib调用,也可以由程序员借助Operator Engine用不同级别的语言描述。TBE(Tensor Boost Engine)DSL(Domain Specific Language)是用Level-3编程模型开发的,称为数学编程级别,针对不了解硬件知识的用户。借助编译器,可以从 TBE DSL 描述中自动生成实例“Tasks”。程序员还可以在并行/内核级别(2 级)编程模型中开发实例“Task”,类似于 GPU 的 CUDA 或 OpenCL,并引入了张量迭代器核 TIK(Tensor Iterator Kernel)接口,可以使用 Python 进行并行编程。专用的编译器技术“Auto Tiling”,用于将大任务切割以适应 Ascend 架构。在强化学习算法的帮助下,该技术通过智能搜索合法的映射空间,为程序提供最佳的tiling和调度。编程模型的最低级别(级别 1)是 C 编程,也称为 CCE-C(Cube-based Compute En­gine)。在此级别中,每个体系结构的所有设计细节都暴露给程序员。程序员可以嵌入类似汇编的代码。整体结构如下所示: 31.png

Groq

2016 年,Google TPU 架构师 Jonathan Ross 和 TPU 团队的其他成员创立了 Groq,Groq 采用了一种全新的架构来加速神经网络,称为软件定义的横向扩展张量流式多处理器(Software-Defined Scale-out Tensor Streaming Multi-Processor)。传统GPGPU使用一个轻量的可编程核并复制数十次或数百次,而Groq设计的TSP(Tensor Streaming Processor)是一个有数百个功能单元的单一的巨大的处理器,这种方法大大降低了指令解码开销。TSP(Tensor Streaming Processor)硬件是确定性的,但实际的吞吐量取决于编译器能否完成最佳调度。尽管TSP架构在某些方面简化了编译器调度任务的难度,但软件仍然必须协调 144 宽的VLIW执行单元,而每个VLIW有 320B的 SIMD 单元。因此,充分利用TSP庞大的MAC阵列来计算各种大小的张量是非常有挑战的。下图展示了TSP和many-core架构的区别: 32.png

TSP

TSP芯片包括一个PCI Express Gen4 x16 接口,用于连接主机处理器。Groq 提供在 x86 主机处理器上运行的软件,用于将神经网络程序和数据下载到 TSP;然后,加速器可以自主执行模型并将结果返回给主机。TSP片上一共220MB 的 SRAM,没有DRAM控制器和接口。TSP 芯片采用 14nm工艺,面积725mm2,包含 268 亿个晶体管。物理版图如下图所示: 33.png TSP 芯片一共有 20 个superlane,存储和计算单元在芯片上大致均匀分布(不包括 I/O);指令控制只需要 3% 的芯片面积。芯片包含一个额外未使用的superlane,占4% 的芯片面积,可以替换存在制造缺陷的superlane; 这种冗余功能提高了芯片的良率。每个周期可以完成400,000 次整数乘法累加 (MAC) 操作; 同时还可以处理浮点数据,因此可以兼顾推理和训练。TSP一共有16个C2C模块,提供发送和接收原语,支持芯片间320 B向量传输。每个C2C链路带宽为30 Gbps,总片外带宽为 16 ×4 ×30Gb/s,×2 个方向 = 3.84 Tb/s 的片外互联带宽。

Groq的指令在处理器中流动,不同的时间在不同的单元中执行。如下图所示,指令首先流入Superlane 0 的功能单元并执行。在下一个周期中,指令进入Superlane 1 并执行,而 Superlane 0 执行第二组指令。该架构简化了设计和布线,消除了同步需求,并且易于扩展。在superlane中,每个时钟周期,数据水平流动,符合神经网络计算数据流,并且简化了路由。存储器嵌入在功能单元中,可以提供高带宽数据源,从而无需外部存储器。整体架构类似异构功能单元的脉动阵列,但数据只能水平移动,而指令垂直移动。TSP没有缓存、分支预测等逻辑,执行是完全确定性的,但给编译器带来了沉重的负担,编译器必须理解指令流和数据流来优化功能单元利用率。编译器必须安排所有数据移动,管理内存和功能单元,甚至手动取指。Groq宣称其编译器已经实现了类似于 Nvidia GPU 的利用率,并且将进一步改进。 34.png

Superlane

整个 TSP 执行单个指令流,因此可以把它当作是一个巨大的处理器内核。但它实际上是一个 144 宽的 VLIW 架构,每个周期发出一条指令来控制superlane。如下图所示: 35.png TSP的superlane实际上是两组镜像功能单元,Groq称为east hemisphere和west hemisphere。每个功能单元都包含多个接受指令的子单元。superlane左右对称,分成 16 个通道,每个通道的宽度为 8 位。数据从东向西和从西向东流动。 36.png 一个superlane主要由 VXM(Vector eXecute Module), MXM(Matrix Multiply Engines), SXM(Switch eXecution Module) ,MEM 组成:

  • VXM(Vector eXecute Module) 中间的向量单元每条通道包含 16 个 ALU。每个 ALU 都可以使用数据流里对齐的四个字节组作为操作数来执行 32 位计算。ALU除了通常的算术和逻辑运算外,还可以执行整数和浮点格式转换。VXM还执行常见的归一化函数 ReLU 和 tanh 以及幂和平方根,允许构建自己的归一化函数 37.png
  • MXM(Matrix Multiply Engines) 矩阵单元包含 320 个 MAC,分成 20 个超级单元supercell。每个 MAC 单元有两个 8 位权重寄存器和两个 32 位累加器。在每个周期,存储的权重值和数据流中的一对激活值相乘。每个 16x16 的超级单元可以在一个周期内计算一个整数部分和,并在 20 个周期内计算一个完整的 320 个元素点积。MAC 单元可以执行单个 FP16,但需要两个周期,相对于 INT8 操作,吞吐量降低了 75%。每个hemisphere有 320x320 个 MAC 单元,每个周期产生 409,600 个 INT8 操作或 102,400 个 FP16 操作。TSP 在每个方向上使用所有 32 个数据流,可以在不到 40 个周期的时间内加载所有 409,600 个权重寄存器。下图MXM框图显示了在阵列侧面加载的激活和权重,以及 INT32 或 FP32 结果从内边缘流回 38.png
  • SXM(Switch eXecution Module) 开关单元可以对张量数据进行reshape,以更好地适应计算单元。例如,它可以在通道之间对数据流旋转或转置。该单元可以复制字节以填充向量或将任何向量元素置零。开关单元是唯一可以在superlane之间通信的单元。每个单元都有两组通道可以将数据向上或向下(北/南)移动到相邻的superlane 39.png
  • MEM 每个存储单元包含 5.5MB 的 SRAM,分为 44 个切片(组),每个切片 128KB。存储单元每个周期可以执行两个 16 字节读和两个 16 字节写(访问不同的bank),允许在东西两个方向上跨superlane的所有通道提供和接收数据。将 20 个superlane组合在一起,每个hemisphere有 110MB 的 SRAM。SRAM使用ECC进行保护,提高稳定性 40.png

存储结构

整个TSP系统的内存层次结构可以 Rank-5 张量来寻址,[Device, Hemisphere, Slice, Bank, Address Offset],形状为 [N, 2, 44, 2, 4096]。 41.png 存储单元还需要存储 VLIW 指令,其宽度为 2,304 (144x16) 字节。取指占用不到的10%的SRAM总带宽。指令被解码并加载到队列中,并且允许程序预取。为了减小代码大小,可以使用REPEAT N 指令将前一条指令重复 N 次。由于 NOP 是最常见的指令,因此程序可以指定它持续 N 个周期。

流寄存器位于功能单元之间,通过编号来标识它们在superlane内的位置,如下图所示: 42.png 流寄存器文件 (SRF) 用来保存操作数和结果,45 个 SRF 横跨 superlane,用于片上数据传输 43.png

编程模型

从程序员的角度来看,数据被组织成流,这些流在物理上由每个通道一个字节(320 字节)组成。该架构支持 32 条东向数据流和 32 条西向数据流。每个数据流在每个周期中自动沿其指定方向前进,每个通道移动 32 个字节。指令对来自不同流的数据进行操作。例如,ADD S1、S2、S3 将数据流S1 中的每个值与数据流S2 中的相应值相加,并将结果存储在数据流S3 中。因此,每个功能单元没有固定的 32 个寄存器,而是对 32 个移动的值进行操作。每个superlane包括 16 条通道。每条指令同时在所有 16 条通道上执行,下一个周期然后在下一个superlane上执行,依此类推。在 20 个周期内,每条指令可以在 20 个superlane的所有 320 个通道上执行完成,因此它实际上变成了一个具有 20 个周期流水线的 320B的 SIMD 操作。由于架构缺少寄存器文件,因此编译器必须确保数据流在指定时间可供功能单元使用。通道结构针对 INT8 数据进行了优化,但可以通过组合数据流提供对其他操作数(INT16、INT32、FP16 或 FP32)的支持。这种方法使编译器能够对所有数据类型的 320 个元素的向量进行操作。为了简化硬件,更宽的数据类型必须沿自然对齐的边界分配给相邻数据流(例如,S0、S1、S2、S3)。为了实现高可靠性,superlane内部16 条通道上应用了 9 位纠错码 (ECC),可以纠正大部分错误,同时会记录并报告给主机软件。下图展示了superlane内的指令交错执行和数据流: 44.png 由于确定性网络设计,硬件不允许反压,因为会破坏网络的确定性操作。取而代之的是,软件需要考虑每个物理链路通道上的信道带宽和延迟,来显式调度向量以确保不会使发送端溢出或接收端下溢。具体来说,当张量在网络中逐跳流动时,使用每个 TSP 上的本地 SRAM 作为中间缓冲;向量作为流控制单元 (flit)。由于网络路径是完全确定的并且接收 TSP 可以立即将向量发送到下一跳,因此可以使用虚拟直通 (virtual cut through) 流控来调度由一个或多个向量flit组成的张量。每个 TSP 都使用生产者-消费者流编程模型(producer-consumer stream programming model)进行编程,该模型允许将功能单元链接在一起。TSP 的功能单元被组织为 320 个元素的 SIMD指令执行,这些指令执行由20 个tile组成,每个tile对数据执行 16 路 SIMD 计算。各功能单元支持指令如下所示: 45.png 虽然单个 TSP指令执行是确定性的,但 TSP 之间的 C2C 可能会引入非确定性,包括:

  • 链路延迟变化 - 需要准确估计链路延迟
  • TSP 之间没有全局同步时钟 - 需要全局时钟
  • 时钟漂移 - 补偿时钟漂移

因此,在多TSP组成的系统中,需要硬件和软件支持来确保多个 TSP 之间的同步通信。将单芯片 TSP 扩展到多芯片分布式系统时,可以有效地共享全局 SRAM,TSP不使用互斥锁来保证对全局存储的原子访问,而是在特定时间使用明确的发送或接收指令进行通信,以保证程序的正确性。为了实现这种可预测的行为,TSP 软硬件接口公开了所有架构上可见的状态(所有 SRAM 和流寄存器),以便静态计算图可以表示为一系列依赖关系,这些依赖关系对所有通信的张量到达时间制定了截止时间。这些依赖关系表示为有向无环图 DAG(directed acyclic graph),以便显式地调度通信流量。下表显示了支持跨多个节点实现确定性的指令。 46.png 多 TSP 系统依赖于三种机制来建立和保持同步:

  • 每个 TSP的硬件对齐计数器,这些计数器每 256 个周期进行交换以保持全局共识时间
  • 初始对齐程序,利用链接确保每个 TSP 同时开始执行指令
  • 运行时重同步,用于补偿长时间计算的单个 TSP 时钟漂移

    系统扩展

    横向扩展多 TSP 系统的网络拓扑选择低网径、直连、软件调度的Dragonfly。当从单个 GroqChip 扩展到 GroqNode 和 GroqRack 时,RealScale 支持的性能和延迟如下所示: 47.png GroqNode 由8个TSP芯片全连接组成,如下所示。每个 TSP 的互联带宽分为 7 个本地链路和 4 个全局链路。7 个本地链路用于同一 SMP 一致性域中的 8 个 TSP 间的全连接,并且可以与节点中的其他 TSP 同步通信。 48.png GroqNode节点内每个 TSP 的所有全局链路都可以组合在一起,以创建一个GroqRack。同时,将GroqNode节点作为具有32个端口的虚拟路由器,可以作为横向扩展的基本单位。 49.png 在 GroqRack 架构中,每个GroqNode节点都连接到架构中的其他每个节点,单个 GropRack 是dragonfly拓扑,任何节点都可以当作备用节点。每个GroqNode节点都是全连接的。GroqRack如下图所示: 50.png GropRack 由9个节点组成,每个节点有8个 TSP,通过每个 TSP 的4个全局链路相互连接,总共 32 × 9 = 288 个全局链路端口: 51.png 将GroqNode节点作为具有 32 个端口的虚拟路由器,TSP 系统所有节点间全连接,实现3-hop网络,可以扩展到多达 33 个节点,总共 33×8 = 264 个 TSP,并实现最小路由。 GropRack 由9个节点组成,每个节点有8个 TSP,通过每个 TSP 的4个全局链路相互连接,总共 32 × 9 = 288 个全局链路端口。为了扩展到更大的系统,我们可以将机架用作本地分组,并分出 288 个端口的一半,以使用144 个端口将每个机架中的9个节点进行双重连接。其余 144 个端口用于连接到系统中的其他机架。因此,最大配置的系统中最多提供 145 个机架,145 个机架×72 个(每个机架的 TSP),总共提供 10,440 个 TSP,使用最小路由且最多5-hop(源机架中两个,一个全局跃点, 两个在目标机架中)。

少于 16 个 TSP 的小型系统可以利用节点内丰富的链路提供高带宽通信,而多达数百个 TSP 的大型系统全局(bisection)带宽约 50 GB/s;随着系统规模增长到 264 TSP 以上,每个 TSP 端点的可用全局带宽约为 14 GB/秒。如下图所示, 52.png

SambaNova

SambaNova Systems 成立于 2017 年,产品主要特点是可重构数据流单元RDU(Reconfigurable Dataflow Unit)。主要产品包括:

  • 2019年发布的SN10,使用台积电7nm工艺制造,一共400亿晶体管
  • 2022年推出的SN30,采用台积电7nm工艺制造,一共860亿晶体管
  • 2023年推出的SN40L,采用台积电5nm工艺制造,一共1020亿晶体管,使用chiplet,包含两个计算芯片

SN10

SN10 RDU使用TSMC 7nm工艺制造,一共400亿晶体管,包含4个tile,是由可编程互连的大量计算和内存单元组成,软件可以配置成独立工作或者组合成更大的tile;每个tile由160个PCU(Pattern Compute Unit)和160个PMU(Pattern Memory Unit)组成;由可编程的SWN(switch network)进行互联;片上一共300MB的SRAM,6个3200MHz的DDR4通道,提供最多1.5TB的存储。下图展示了SN10的物理版图: 53.png Tile可以以组合模式或独立模式工作:

  • 组合模式 相邻tile组合以形成一个更大tile来服务一个应用程序
  • 独立模式 每个tile独立控制,允许在不同的tile上同时运行不同的应用程序

下图展示了SN10和tile的整体架构: 54.png PCU(Pattern Compute Unit) 是RDU上可编程的计算引擎,可以支持FP32, BF16, INT32, INT16;主要功能模块包括:

  • 可配置的多级流水SIMD运算单元
  • 可编程的计数器链,负责处理循环
  • Header,为SIMD提供操作数
  • Tail,提供特殊函数(exponent, sigmoid)的加速 55.png PMU(Pattern Memory Unit) 是RDU上的分布式存储,主要组成部分包括:
  • 分成不同的bank的SRAM阵列,提供并发读写能力
  • 一个标量运算单元,负责地址计算
  • 两个数据对齐单元(Data Align),可以加速矩阵转置 56.png SWN是片上可编程的互联网络,分为数据和控制互连网络:
  • 数据互联网络的路由可以由硬件和软件控制,软件可以覆盖硬件的路由规则,可编程路由表允许软件在并发的点对点和多播时提高带宽利用率。标量和向量数据网络也是分别独立的
  • 控制互联网络可以由软件在不同功能单元之间路由单独的控制位来管理程序 57.png AGCU(Address Generation and Coalescing Unit) 是IO子系统接口,包括DDR以及PCIe。包含两个功能单元:
  • AGU(Address Generation Unit) 负责存储加载操作,包含一个标量运算单元
  • CU(Coalescing Unit) 负责虚拟内存管理以及对DDR通道的交织访问,同时支持RDU之间通信 58.png

系统扩展

2个RDU组成一个SN10-2模块,4个SN10-2和一个host组成一个SN10-8系统。因为RDU本身缺少片间互联,所以都是使用PCIe,基于Ethernet进行互联。4个SN10-8可以组成一个Rack,即32个RDU SN10芯片。

编程模型

SN10 RDU使用SambaFlow软件栈来进行编程,SambaFlow使用编译器将使用类似Pytorch描述的模型转化成计算图,并映射到硬件的数据流。下图展示了SambaFlow的组成: 59.png 下面展示了Softmax()的计算数据流以及其在SN10的PMU和PCU上的映射以及SWN的路由控制: 60.png 下面展示了LayerNorm的计算数据流及其在SN10上的流水线: 61.png 下面展示了LayerNorm的计算数据流及其在SN10上融合一些操作的流水线,可以减少存储和计算资源: 62.png 下面展示了LayerNorm的计算数据流及其在SN10上融合一些操作同时分时复用计算和存储的流水线,可以进一步减少存储和计算资源: 63.png

SN30 & SN40L

SN30和SN40L的相关信息没有公开,不过可以推测架构本身修改不太大。目前看到信息包括:

  • SN30还是台积电7nm工艺,2022年推出,860亿晶体管,SRAM增加到640MB,1TB的DDR,688TFLOPS的BF16性能;芯片采用chiplet,包含2个计算芯片
  • SN40L采用更先进工艺,台积电5nm,计算单元增加到1040个,SRAM增加到520MB,支持64GB的HBM,1.5TB的DDR5

Graphcore IPU

Graphcore是一家成立于2016年的英国公司,AI芯片为IPU(Intelligent Processing Unit)。IPU基于高度并行的架构,在混合精度浮点数据上提供了非常高的浮点性能,支持单精度浮点或半精度浮点。目前产品分别是

  • 2018年推出的Colossus Mk1,采用台积电16nm工艺,216亿晶体管,是一款测试芯片,主要用来验证架构可行性
  • 2020年推出的GC200 “Colossus Mk2”,采用台积电7nm工艺,593亿晶体管
  • 2022年推出的Bow IPU,采用台积电7nm工艺,并使用Wafer-to-Wafer来给计算芯片供电

Colossus Mk1

Colossus Mk1 IPU采用台积电16nm工艺,216亿晶体管;包含1,216个tile,304M的片上SRAM;tile由一个计算核IPU-Core和 256 KB 的本地存储组成;每个IPU-Core支持6个线程,IPU一共支持6x1216=7296个线程;每个IPU还包含10个IPU-Link接口,用于IPU处理器之间实现低延迟、高吞吐量的通信。另外,IPU包含两个PCIe Gen4 x16,用于主机通信。整体架构如下所示: 64.png

Colossus Mk2

Graphcore Colossus Mk2 GC200 IPU采用台积电 7nm 工艺,面积 823mm^2,一共 594 亿晶体管。IPU包含1,472个IPU-Tile,并能够执行8,832个独立的并行计算线程。片上一共897MB的SRAM。有250 TFLOPS的在FP16计算能力。IPU物理规划版图如下所示: 65.png IPU能够将所有算术运算保持在16位格式,从而降低内存需求,降低读写功耗并减少算术逻辑功耗。每个处理器核都可以生成指定噪声的随机数种子,支持概率或进化策略模型。整体架构和MK1比较类似,每个IPU除了1,472个IPU-Tile,还包含10个IPU-Link接口,用于IPU处理器之间实现低延迟、高吞吐量的通信,提供320GB/s的带宽。另外,IPU包含两个PCIe Gen4 x16,用于主机通信。整体架构如下所示: 66.png 每个tile由一个多线程处理器和624 KB 的 SRAM本地存储组成,多线程处理器支持32位指令,最多双发射,2个执行单元:

  • MAIN 负责控制流,整型和地址计算以及存储加载操作
  • AUX 负责浮点算术运算,向量和矩阵运算,超越函数(ln, log2 , logistic, tanh),随机数生成等

多线程处理器的结构如下所示: 67.png 每个IPU tile维护6个常驻执行上下文,并将它们多路复用到共享资源上,从而隐藏指令延迟(依赖关系、内存访问和分支延迟),减少相应的流水线停顿,并增加聚合吞吐量。每个tile线程通过静态round-robin方式轮换。因此,整个IPU支持6×1,472 = 8,832个线程。为了获得最大占用率,程序需要实例化尽可能多的线程。

每个 tile 有 624 KB 的 SRAM,1,472个tile总共897 MB的SRAM。每个tile都使用一个连续的无符号 21 位地址空间,从地址 0x0 开始。实际上,真实可用内存从地址 0x4C000 开始,到 0xE7FFF 结束。下图展示了地址空间: 68.png 片上内存分为两个区域,每个区域由几个 64 位宽的bank组成。不同的bank支持并发访问,而对同一bank的多次访问必须是串行的。所有加载和存储地址必须自然对齐,且只能访问本tile的片上内存:

  • 区域 1 中的bank是交织的,地址的第 3 位从交替的奇数和偶数bank中选择 64 位。交织允许同时访问两个 64 位对齐的地址。因此,通过读取来自两个不同bank的连续字,一条指令可以执行 128 位加载
  • 区域 0是非交织,指令只能从区域 0 获取

IPU中的内存由tile本地存储和Streaming Memory组成,通过Exchange-Memory访问Streaming Memory。Streaming Memory由多个 DDR 存储器芯片组成。tile无法直接执行加载和存储指令访问Streaming Memory。下图展示了IPU的存储结构: 69.png 显式数据移动指令通过使用IPU交换互联网络,可以将数据在同一IPU的不同tile上的存储之间以及Streaming Memory 和tile本地存储之间移动。在执行数据移动指令之前,所有tile必须同步,保证所有tile都已完成执行其计算任务,并已准备好进行数据交换。

系统扩展

每个IPU-Machine M2000包含四个 Colossus Mk2 GC200 IPU处理器,提供 1 petaFLOP 的 AI 计算能力,有 3.6GB 处理器内存和256GB 的Streaming Memory。机架级IPU-POD64包括16个内置于标准19英寸机架中的IPU-Machine M2000。通过IPU-Fabric,IPU-Machine可以构建横向扩展的IPU-POD数据中心解决方案,最多扩展到64,000个IPU,提供16 ExaFlops的AI 计算能力。下图展示了IPU-Machine M2000连接拓扑: 70.png 下图展示了IPU-Machine M2000的前视图: 71.png

IPU-Machine M2000系统包括一个Graphcore GC4000 IPU网关芯片,提供2.8 Tbps带宽。为了和数据中心网络保持兼容,IPU-Fabric使用标准铜缆或光纤OSFP连接器,将IPU连接在机架上下。在较大的配置中,IPU-POD之间的通信使用以太网隧道技术来保持吞吐量,同时允许使用标准QSFP互连和100Gb以太网交换机。在整个系统中,IPU-Fabric使用3D环形拓扑结构。下图展示了IPU-Fabric的3D 环形拓扑结构: 72.png

编程模型

主机将代码加载到一个或多个IPU上,然后IPU执行代码。IPU有两种模式:supervisor 和worker。

  • 最多有一个线程可以在 supervisor 模式下运行,而在 supervisor 模式下运行的线程可以生成在worker下的线程。supervisor 线程负责运行控制tile的程序,是IPU上运行的应用的主程序。
  • 在worker模式运行的任务完成后将退出。worker线程执行时,supervisor线程将挂起;当worker线程任务完成并释放线程时,supervisor线程将恢复。

处理器固定顺序逐条执行线程指令,每个线程以round-robin方式轮流。大多数指令需要一个计算周期才能执行完成,处理器指令集是专为机器学习和人工智能设计,包含:

  • 控制流指令, 包括跳转、条件等。每个处理器上的控制流独立于其他处理器上的控制流
  • 内存访问指令
  • 整数和浮点算术运算指令 浮点指令包括单精度(32 位)和半精度(16 位)浮点运算。浮点运算可以支持大小为 2、4 和 8 的小向量。此外,每个tile上都有一个累积矩阵乘积单元(AMP 单元),每个周期最多可以执行 64 次乘法累加运算
  • 超越函数指令 例如指数函数
  • 随机数生成指令 随机数生成器还连接到浮点单元,以便在执行浮点运算时在硬件中启用随机舍入

当程序在IPU上执行时,IPU内的tile在交换数据和对其本地数据执行计算之间交替。IPU使用bulk-synchronous parallel(BSP)执行模型,其中任务的执行被拆分为不同的step,如下所示,每个step包括以下阶段:

  • 本地tile计算
  • 全局跨tile同步
  • 数据交换 73.png 硬件全局同步,片上需要大概150 个周期,芯片之间 15ns/hop。在计算阶段,所有tile都并行执行,对其本地数据进行操作。每个tile完成执行后,会启动一个同步过程,以便与其他tile同步。当所有tile都达到这一点时,所有tile都将同步完成,IPU进入交换阶段,在tile之间复制数据。具体过程如下所示: 74.png 在交换阶段之后,重复该过程:tile进入新的计算阶段,使用其本地数据和交换期间收到的新数据执行计算。程序继续执行一系列此类步骤,在交换和计算阶段之间交替进行。从时间轴上看,我们可以看到每个tile重复执行同步、交换和计算的顺序,如图所示: 75.png 上述编程模型是在Poplar graph library(libpoplar) 中实现,提供了用于构建和运行IPU程序的API,并执行必要的编译以在IPU设备上运行程序。程序在一组用户可配置的IPU上运行,并在编译程序之前选择,并且在程序执行过程中不能改变。tile上执行的线程称为 vertices,所有线程称为 compute sets 。相关概念如下所示: 76.png

Bow IPU

BOW IPU第一个使用台积电Wafer-on-Wafer 3D 技术的芯片,Wafer-on-Wafer可以在芯片之间提供更高的带宽,并被用于优化电源效率,并在晶圆级别改善 Colossus 架构的供电效率。BOW IPU中的Wafer-on-Wafer,将两个晶圆键合在一起以产生一个新的3D芯片:

  • 一个用于AI处理的晶圆,在架构上与GC200 IPU处理器兼容,有1,472个独立的IPU-tile,能够运行超过8,800个线程,具有900MB的处理器内存
  • 一个用于供电的晶圆,通过在供电芯片中增加深沟槽电容器,并紧挨着处理内核和存储器,能够更有效地供电,使性能提高 40%,每个处理器可提供 350 TFLOPS 的 AI 计算能力

Bow-2000 IPU类似IPU-M2000,有四个Bow IPU和260 GB的内存,可提供1.4 PetaFLOPS的AI计算性能;并可以作为Bow Pod系统的基本单元,从四个 Bow-2000 和一个主机组成的 Bow Pod16,到8 个 Bow-2000 和一个主机组成的 Bow Pod32,再到 Bow Pod64,Bow Pod256 和 Bow Pod1024。Bow-2000与现有的IPU-POD系统完全向后兼容,其高速、低延迟的IPU-Fabric和灵活的1U外形尺寸都保持不变;IPU-Fabric由用于直接连接IPU的IPU-Link和用于通过IPU网关连接IPU机器机架的GW-Link组成。Bow-2000 IPU和Bow Pod如下所示: 77.png 78.png

Intel

Intel在并行计算和AI领域大致发展历史如下:

  • 从2007年开始,Intel就计划开发独立显卡项目Larrabe, 试图打破软硬件的隔阂,使用同样架构来做图形和并行计算。但是随后项目就被取消。后续的Xeon Phi系列加速器(天河-2超算中心使用)是在Larrabe上长出来的,但是随着美国的禁令,Intel在2017年就停止了相关产品的开发
  • 2016年,英特尔宣布以 3.5 亿美元收购收购Nervana,并推出了NNP-T(Nervana Neural Network Processor for Training)和NNP-I(Nervana Neural Network Processor for Inference)加速器芯片,但是在2020年宣布停止相关产品的开发,采用Habana加速方案
  • 2019年,英特尔宣布以 20 亿美元收购总部位于以色列的 AI 创业公司 Habana Labs,并推出了Gaudi 2和Gaudi 3加速器芯片,但是2023年,Intel路线图显示后续Gaudi系列加速器会和Intel Max系列GPU合并
  • 2017年,Intel重启独立显卡计划,推出Xe系列GPU

Xeon Phi

英特尔于 2007 年正式宣布推出 Larrabee;但是Larrabee 无法与NVIDIA和AMD提供的高端硬件相匹配,英特尔最终搁置了其 GPU 野心。随后将 Larrabee 改名为Xeon Phi,用于HPC,主要产品如下:

  • Knights Ferry(KNF),2010年推出并交付给HPC开发人员,采用Intel 45nm工艺,面积684mm^2,23亿晶体管;Knights Ferry 是Larrabee GPGPU实现产品,并没有被设计为商业产品
  • Knights Corner,2012年发布,采用Intel 22nm工艺,面积720mm^2,50亿晶体管;并重新命名为Xeon Phi
  • Knights Landing,2014年发布,采用Intel 14nm工艺,面积683mm^2,80亿晶体管
  • Knights Mill,2017年发布,采用Intel 14nm工艺,面积826mm^2,542亿晶体管;由于美国禁令,并未实际部署

2013 年 1 月,德克萨斯州奥斯汀的德克萨斯高级计算中心宣布了 Stampede 超级计算机,这是Xeon Phi的首次大规模部署,在 6400 个计算节点中使用了6880 个Xeon Phi,性能达到近 10PFLOPS。2013 年 6 月,中国超级计算机“天河二号”成为世界上最快的超级计算机,并一直保持到 2015 年底。 它由 32,000 个 Intel Xeon E5-2692 2.2GHz 12C Ivy Bridge 处理器和 48,000 个 Xeon Phi 协处理器提供支持,性能超过 33PFLOP。

Larrabee

Larrabee 架构使用顺序执行CPU,基于x86 扩展指令集,包括 64 位指令,宽向量处理操作和一些专用标量指令。GPU 上一些固定硬件功能例如光栅化和后着色器混合等,在 Larrabee 中都是软件执行;但是纹理过滤与 GPU 一样,还是固定硬件逻辑实现;,但是CPU更灵活,支持子程序和页面错误。Larrabee 整体架构框图如下: 79.png

Larrabee CPU核源自奔腾处理器,顺序执行,支持四个线程。Larrabee CPU核架构框图如下所示:

  • L1 指令缓存大小为 32KB,L1 数据缓存大小为 32KB。环形网络将L2缓存和CPU核互联,L2缓存负责缓存一致性。
  • Larrabee 的全局L2缓存被分割成单独的本地子集,每个 CPU 核一个,256KB。每个 CPU 都可以直接访问自己的本地 L2 缓存子集,CPU 核读取和写入的数据存储在其 L2 缓存子集中,并在必要时从其他子集刷新。
  • Larrabee 支持四个线程,每个线程有单独的寄存器。线程切换涵盖了编译器无法在不停顿的情况下调度代码的情况,以及无法提前将数据预提取到 L1 缓存时从 L2 缓存加载到 L1 缓存的部分延迟。当在同一核心上运行的多个线程使用相同的数据集(例如将三角形渲染到同一图块)时,缓存使用更高效。

80.png

Larrabee 主要计算单元是 16-wide向量处理单元VPU,负责执行整数、单精度浮点和双精度浮点指令。VPU 及其寄存器的面积约为 CPU 核面积的三分之一。VPU 支持三操作数指令,并支持旋转寄存器输入以及存储器输入上的数字转换和复制。下图展示了VPU的架构框图: 81.png

VPU选择了 16-wide来平衡计算密度和向量单元利用率。分析表明,如果 16 个通道一次处理 16 个单独的像素,典型像素着色器的利用率为 88%。Nvidia GeForce 8 以类似的方式运行,其标量 SIMD 处理器组织成 32 个一组,执行相同的指令。主要区别在于,在 Larrabee 中,循环控制、缓存管理等操作是与 VPU 并行运行的代码,而不是作为固定功能逻辑实现。

Larrabee VPU 指令允许最多三个源操作数,其中一个可以直接来自 L1 缓存。如果数据已预取到缓存中,则 L1 缓存实际上是一个扩展寄存器文件。从缓存中读取的8 位 uint、16 位 sint 或16 位浮点数据可以转换为 32 位浮点或 32 位整数,而不会损失性能,这种方式增加了可以存储在缓存中的数据量,并且还减少了对单独数据转换指令的需求。之后将寄存器和存储器中的数据与 VPU 中的处理通道对齐。寄存器数据可以通过多种方式进行旋转,例如支持矩阵乘法。内存中的数据可以跨 VPU 通道复制。这是图形和非图形并行数据处理中的常见操作,可显著提高缓存效率。VPU 支持处理整数和浮点数据的各种指令。指令集提供标准算术运算(包括融合乘加)和标准逻辑运算(包括从像素中提取非字节对齐字段的指令)。这些指令从寄存器或存储器中读取操作数并将结果写入向量寄存器。加载和存储指令支持浮点值与大多数 GPU 上不太常见或更复杂的数据格式之间的转换,使用单独的指令处理这些数据格式转换可以节省大量面积和功耗,同时降低性能成本。

VPU 指令集还支持gather和scatter,即从非连续地址加载和存储。不是从单个地址加载 16 个宽的向量,而是从另一个向量寄存器中指定的最多 16 个不同地址加载或存储 16 个元素;这种方式可以并行运行 16 个着色器实例。gather和scatter的速度受缓存的限制,缓存通常每个周期只访问一行缓存。但是,许多任务具有高度一致的访问模式,因此执行所需的时间远少于 16 个周期。Larrabee VPU指令可以由掩码寄存器预测,每个向量通道有一个位。掩码寄存器控制向量寄存器或存储器的哪些部分被写入,哪些部分保持不变。例如,通过设置掩码寄存器,然后执行if 和 else 子句,根据掩码寄存器来控制是否写入结果,可以将标量 if-then-else 控制结构映射到 VPU。如果掩码寄存器全是零或全是 1,则可以完全跳过子句。这减少了分支错误预测惩罚,并为编译器的指令调度器提供了自由。VPU 还使用这些掩码来打包加载和存储指令,从而顺序访问内存中的数据。

Larrabee 使用双向环形网络对CPU核、L2 缓存和其他逻辑进行互联。当扩展到超过 16 个核时,使用多个短环。每个环的数据宽度为 512 位。在消息注入网络之前路由决策已经确定,例如,每个代理都可以在偶数时钟上接受来自一个方向的消息,在奇数时钟上接受来自另一个方向的消息。这种方式简化了路由逻辑,并且一旦消息进入网络就不需要存储,以非常低的成本实现高带宽和最小的争用。每个核可以并行访问自己的 L2 缓存子集,而无需与其他核通信。但是,在 L2 缓存中分配新行之前,环形网络会检查数据共享,以保持数据一致性。处理器间网络还为 L2 缓存提供访问内存的路径。

编程模型

Larrabee天然支持x86上各种编程模型,包括POSIX线程和OpenMP等。

Knights Ferry

Knights Ferry通过标PCI Express 作为协处理器和主机连接。Knights Ferry由 32 个 Pentium (P54C)通用核组成,运行频率为1.2GHz,可以执行 64 位标量指令和 512 位向量指令(每个向量指令 16 个单精度或 8 个双精度浮点值)。每个核可以执行四个硬件线程,使用round-robin进行调度,以便在每个周期中选择下一个指令流。Knights Ferry 使用每核32 KB的L1缓存(指令和数据各32KB)和256 KB的L2缓存的典型缓存结构。共享的 L2 缓存总共为 8 MB(32 个核),使用高带宽环形总线实现片上通信。内存支持1,800 MHz的GDDR5,提供125 GB /s带宽。下图展示了Knights Ferry的物理版图: 82.png

Knights Corner

Knights Corner采用Intel 22nm工艺,集成了 61 个 Pentium P54CS, 主频 1.2GHz。下图展示了 Knights Corner物理版图: 83.png CPU核,GDDR和PCIe通过环形总线互联,如下所示: 84.png CPU核是双发射顺序执行,支持四个硬件线程,增加了对 64 位指令的支持,和512 位宽 SIMD向量处理单元VPU;每个核 64K的L1 缓存(32K 指令和32K 数据), 512K的L2 缓存;每个核有 4 个执行单元(VPU、FXU 和 2 个整数单元)。CPU核架构框图如下所示: 85.png

Knights Landing

Knights Landing是一个标准的独立处理器,可以启动现成的操作系统。KNL提供三种产品类型:KNL自启动处理器、带集成结构的KNL自启动处理器,以及作为KNC后续产品的KNL PCIe协处理器卡。KNL CPU 包含 38 个物理tile,最多使用 36 个,剩下的两个用于提升良率。下图展示了KNL的物理版图: 86.png 每个tile包含两个核、每个核两个向量处理单元 (VPU) 以及两个核共享的 1 MB 的L2缓存。CPU核是源自 Intel Atom (基于 Silvermont 微架构)的全新双发射乱序核,每个核 4 个线程;KNL 推出了新的高级向量扩展指令集 AVX-512,提供 512 位宽的向量指令和更多的向量寄存器。KNL 引入了一种新的 2D 缓存一致性mesh互联,用于连接tile、内存控制器、I/O 控制器和其他逻辑;支持MESIF(modified, exclusive, shared, invalid, forward)缓存一致性协议; 采用分布式标签目录来维护 L2 缓存一致性。每个tile都包含一个home agent,保存分布式标记目录的一部分,并用作tile和互联网络之间的连接点。下图展示了KNL整体架构框图: 87.png KNL 有两种类型的存储器:多通道 DRAM (MCDRAM) 和DDR存储器。

  • MCDRAM 是 16 GB 高带宽存储器,包括 8 个器件(每个器件 2 GB),集成在封装上,并通过专有的I/O 连接到 KNL 芯片。8 个 MCDRAM 提供450 GB/s 带宽。
  • KNL 有两个内存控制器,一共 6 个 DDR4 通道,运行频率2,400 MHz,提供90 GBps 的总带宽。每个通道最多可以支持一个内存 DIMM,一共384 GB的总 DDR 内存容量。

两种类型的内存以三种内存模式呈现给用户:

  • 缓存模式 其中 MCDRAM 作为DDR 的缓存
  • 扁平模式 其中 MCDRAM 被视为与 DDR 相同的地址空间中的标准内存
  • 混合模式 其中 MCDRAM 的一部分是缓存,其余部分作为标准内存

KNL 中的三种内存模式在启动时通过 BIOS 进行选择。MCDRAM 内存提供满足大型计算能力所需的高带宽,而 DDR 提供在 KNL 上运行整个应用程序及所有必要的支持软件所需的大容量内存。

KNL 一共有 36 个 PCIe Gen3 通道,分为两个 x16 通道和一个 x4 通道;还有四通道DMI(Direct Media Interface),可连接到南桥芯片,支持自启动系统所需的功能。

片上mesh互连网络基于环形架构,一共有四个并行网络,每个都提供不同类型的数据包(例如,命令、数据和响应),并针对 KNL 流量和协议进行了高度优化。mesh可以提供超过 700 GBps 的总聚合带宽。使用 YX 路由规则,消息在注入点和转弯时与网格上的现有流量进行仲裁,mesh上的现有流量具有更高的优先级。静态 YX 路由有助于减少死锁情况,从而简化协议。在 Y 方向上每一个hop需要一个时钟,在 X 方向上需要两个时钟。mesh支持三种集群操作模式,在启动时从BIOS中选择,可提供不同级别的地址亲和力,以提高整体性能。这些集群模式通过降低协议流在芯片上遍历的距离来降低延迟并提高带宽。

  • All-to-all 模式 此模式在tile、目录和内存之间没有任何关联,是最通用的模式,对软件的内存配置没有特定要求,但它的性能通常低于其他集群模式。
  • 象限模式 此模式将 KNL 芯片划分为四个虚拟象限,每个虚拟象限提供目录和内存之间的亲和力。tile与目录或内存之间没有关联性,也就是说,来自任何tile的请求都可以访问任何目录。但是,该目录将仅访问其自身象限中的内存。此集群模式需要对称内存(即两个 DDR 内存控制器上的总容量相同)。它提供比全对全模式更好的延迟,并且对软件支持是透明的。
  • Sub-NUMA clustering(SNC) 此模式通过将tile与目录和内存关联来进一步扩展象限模式。在此模式下,KNL 芯片被划分并作为两个或四个非一致性内存访问 (NUMA) 域公开给操作系统。对于 NUMA 优化的软件,tile、目录和内存之间将存在关联性,也就是说,来自tile的请求将访问其集群中的目录,而该目录又将访问该集群中的内存控制器。此集群模式在所有模式中具有最低的延迟,尤其是在加载操作下,因为大多数流量将包含在本地集群中。要使软件利用此模式的性能,它必须经过 NUMA 优化,也就是说,需要在运行它的同一 NUMA 群集中分配内存。

CPU核大致分为五个单元:前端单元FEU( front-end unit)、分配单元、整数执行单元IEU(integer execution unit)、内存执行单元MEU(memory execution unit)和VPU。下图为CPU核的框图: 88.png

  • *前端单元 CPU核的 FEU 包括一个 32 KB 指令缓存 (IL1) 和一个 48 项的指令 TLB。如果命中,指令缓存每个周期最多可以提供 16 个字节。然后,被发送到一个两宽的解码器。大多数指令被解码为单个微操作,但一些产生更多微操作的复杂指令由双宽微序列器引擎(micro sequencer engine)处理。取指方向由 gskew 分支预测器提供。解码后的微操作被放入 32 项的指令队列中。
  • 分配单元 分配单元每个周期从指令队列中读取两个微操作,分配微操作所需的必要流水线资源,例如重排序缓冲 (ROB)(72)、重命名缓冲 (72)、存储数据缓冲 (16)、gather-scatter表 (4) 和保留站。还负责重命名寄存器。重命名缓冲区存储正在进行的微操作的结果,直到它们退休,此时结果将传输到架构寄存器文件。在分配单元之后,微操作根据类型将发送到三个执行单元之一(IEU、MEU 或 VPU)。一些微操作可能会被发送到多个执行单元。例如,内存地址作为操作数的 Add 指令将发送到 MEU 以读取内存,然后发送到 IEU 以执行 Add 操作。
  • 整数执行单元IEU IEU 执行整数运算,使用通用寄存器 R0 到 R15 。CPU核中有两个 IEU。每个 IEU 包含一个 12 项的保留站,每个周期发出一个微操作。整数保留站的调度完全乱序。大多数操作单周期完成,并且两个 IEU 都支持。但少数有三个或五个周期的延迟(例如,“乘法”),并且仅有一个 IEU 支持。
  • 内存执行单元MEU MEU 执行内存操作,并在指令缓存未命中和指令 TLB 未命中时发出读请求。每个周期MEU 可以执行两个存储或加载内存操作。内存操作从 12 项的内存保留站按顺序发出,无序执行和完成。未成功完成的操作将分配到回收缓冲区(recycle buffer)中,并在冲突条件解决后重新发射到 MEU流水线。已完成的加载指令将保留在内存排序队列(memory ordering queue)中,直到退休。存储指令在地址转换后保留在存储缓冲区(store buffer)中,可以将数据转发到依赖的加载指令。存储指令按程序顺序每个周期一个提交到内存中。L1 micro TLB采用8 路组相联,一共64项;L2 数据TLB也是8路组相联,256项。数据 TLB 还包含一个用于 2 MB 页面的 8 路, 128 项的表和一个用于 1 GB 页面的全相联的 16 项的表。L1 数据缓存8 路组关联,32 KB,写回、非阻塞,支持两个512 位读和一个 512 位写,整数的加载到使用延迟为 4 个周期,浮点的加载使用延迟为 5 个周期。L1 硬件预取器监控内存地址模式,并向 L2 缓存发出数据预取请求,提前读入缓存行。MEU 包含专门的逻辑,可以有效地处理gather-scatter 指令。单个 gather-scatter 指令可以访问多个内存位置。这些多重访问是在非常接近 L1 缓存流水线的地方完成的。这允许最大限度地利用两个内存流水线,同时在核心的其余部分(例如 FEU、分配单元、保留站和重排序缓冲区)消耗最少的资源中。
  • 向量处理单元 VPU VPU 是 KNL 的向量和浮点执行单元,支持 x87、MMX、SSE(Streaming SIMD Extension)、AVX 和 AVX512 指令以及整数除法。每个核两个 VPU,这些 VPU 大多是对称的,每个 VPU 每个周期可以执行一条 AVX-512 指令,两个 VPU 每个周期提供 64 个单精度或 32 个双精度浮点运算的峰值性能。其中一个 VPU 经过扩展,可支持过时浮点指令,例如 x87、MMX 以及字节和字 SSE 指令子集。每个 VPU 有一个 20 项的浮点保留站,每个周期无序发出一个指令。

浮点保留站与 IEU 和 MEU 保留站的不同之处在于,为了减小大小,不保存源数据; 浮点微运算从浮点保留站发出后,从浮点重命名缓冲区和浮点寄存器文件中读取其源数据,与整数和内存指令相比,在保留站和执行之间额外花费一个周期周期。大多数浮点算术运算的延迟为 6 个周期,而其余运算的延迟为 2 或 3 个周期。VPU 还支持 KNL 中引入的超越函数和倒数指令,向量冲突检测指令。

在 KNL tile上,两个核共享一个 1 MB,16 路关联的统一 L2 缓存。总线接口单元 (BIU) 维护tile内一致性,还充当本地共享 L2 缓存管理单元。L2 缓存中的行保持在 MESIF 状态之一。每个内核使用专用请求接口向 BIU 发出请求。可缓存请求查找 L2 标签以进行命中、未命中和缓存状态评估,而其他请求则直接绕过缓存,由目标缓存/home代理提供服务。KNL 实现了独特的缓存拓扑,以最大程度地减少缓存一致性维护流量。首先,L2 缓存包括 L1数据缓存,但不包括 L1指令缓存。读入 L1指令缓存的行会填充 L2 缓存,但当这些行被逐出时,相应的 L1指令缓存行不会失效。这避免了由于热 IL1/冷 L2 场景而导致的失效,在这种情况下,由于不活跃而从 L2 缓存中逐出相应的行而导致L1指令缓存中处于活跃状态的行失效。其次,L2 缓存每行存储“存在”位,以跟踪哪些在 L1数据缓存中被活跃使用。此信息用来过滤对包含的L1数据缓存的缓存侦查 。它还考虑了 L2 受害者选举算法,以最大程度地减少对正在使用的缓存行的逐出。BIU 还包含一个 L2 硬件预取器,根据来自核的请求进行训练,支持 48 个独立的预取流。一旦检测到向前或向后稳定的请求,就会向该流中的按步进连续缓存行发出预取请求。 89.png KNL 核支持四个硬件上下文或线程。CPU核内资源可以动态分区、共享或复制,并且流水线由线程选择器控制。目的是最大限度地提高活动线程的资源利用率。一般而言,线程在执行 haltmonitor wait (mwait) 指令后变为非活月状态;否则,它们被视为活月状态。根据活跃线程的数量定义了三种线程模式:

  • 单线程模式 只有一个线程处于活跃状态(任意一个),可以使用全部的 ROB
  • 双线程模式 任意两个线程处于活动状态,每个线程使用32项的ROB
  • 四线程模式 任意三个或所有四个线程处于活动状态,每个线程使用18项的ROB

除了 ROB 之外,包括重命名缓冲区、保留站、存储数据缓冲区、指令队列和gather-scatter 表都会动态分配。包括缓存、TLB、大多数 MEU 结构、分支预测器和硬件预取器表等共享资源不强制分区,尽管某些结构具有少量每个线程的保留条目以避免死锁。线程以先到先得的方式获取共享资源。除了缓存(缓存行不区分线程)之外,共享结构中的特定条目仅由单个线程拥有。 复制的结构被限制在最低限度。在复制结构中,每个线程都有其专用结构,当线程变为非活跃状态时,该结构不会被移除。这些结构包括重命名表、体系结构寄存器和其他控制寄存器。CPU核流水线在多个点上有线程选择器,以最大限度地提高流水线的利用率和吞吐量,并保持线程之间的公平性。它们主要存在于流水线的有序部分。线程选择器会考虑流水线中资源的可用性,并尝试做出明智的选择。重要的线程选择器位于 FEU、分配单元、退休流水线和 MEU 保留站中。无序部件与线程无关,并根据准备情况执行指令。

Nervana

NNP-T是2019年推出的一款AI训练加速器,而NNP-I则是一款AI推理加速器;两者采用不同架构,导致软件不兼容。应该也是Intel放弃相关技术的主要原因。

NNP-T

NNP-T采用台积电16nm FF+工艺,有270亿个晶体管,680平方毫米,频率1.1GHz,TDP为150~250W;下图展示了NNP-T的物理版图: 90.png NNP-T包含24个张量处理器TPC(Tensor Processing Core),每个TPC有2.5MB的scratchpad memory,一共60MB片上存储SRAM;4个8GB的HBM2-2400内存,提供1.22TBps带宽;4个用于片间互联的ICL接口;一个PCIe 4 x16接口;每个张量处理单元(TPC)都有一个微控制器uController,用于控制协处理器的运算,允许自定义指令触发微控制器中的子程序以执行特定操作。下图展示了NNP-T的架构框图: 91.png

每个 TPC 有2 个32x32矩阵乘法核Matrix Multiply Core,支持BF16的矩阵乘法,其他操作支持FP32 和 BF16,包括非 GEMM 的向量运算。张量处理核TPC有可以同时读取和写入的双端口SRAM,以及一个可以从内存中读取数据并使用卷积滤波器进行转换以进行矩阵乘法的卷积引擎(Convolution Engine)。数学运算发生在矩阵乘法核Matrix Multiply Core中,流水线支持乘法前的预操作,然后对最终结果进行多次操作。矩阵乘法核同时输出前操作和后操作的结果,可以最大程度地减少通过计算流水线进行连续数据移动的需要。 92.png

TPC 连接到片上网络,该网络由双向 2D mesh组成,每个方向为 1.3TBps带宽,TPC 之间有单独的总线来移动数据,可以在不访问 HBM2 存储器子系统的情况下将数据移出芯片。这缓解了神经网络密集的读操作常见拥塞点,每次读操作需要多次访问 HBM会产生内存瓶颈,阻止内核得到充分利用。每个 TPC 有四条高速总线,其中两条专用于 HBM2 存储器,另外两条负责与其他 TPC 的通信。 93.png

系统扩展

NNP-T一共有16 个 112Gbps Serdes, 分成4个接口,总双向带宽为 3.58Tbps;4个NNP-T全连接组成一个基本节点,并提供4个对外互联接口;节点之间组成环形拓扑,可以扩展到支持1024个NNP-T。如下所示: 94.png

NNP-I

NNP-I采用Intel 10nm工艺,主要面向推理工作,可以安装在标准 M.2 设备上,然后将其插入主板上的标准 M.2 端口,可以卸载推理密集型,将CPU用于一般计算任务。NNP-I基于10nm Ice Lake 芯片,删除了两个CPU核和图形引擎,增加了 12 个推理计算引擎ICE (Inference Compute Engine)。ICE 加速器之间基于硬件同步,与 Sunny Cove 微架构的两个 IA 核共享一致性总线和 24MB 的 L3 缓存。IA 核是标准的 Ice Lake 核,支持 AVX-512 和 VNNI 指令,可加速卷积神经网络。有两个LPDDR4X内存控制器,提供 4.2 GT/s (68 GB/s) 的带宽,并支持带内 ECC。支持PCIe 4 x4/x8。 95.png每个ICE单元有4MB的SRAM,以帮助减少芯片内数据移动。深度学习计算网格(Deep Learning Compute Grid)是一个张量引擎,每周期可完成4K MAC运算,支持 FP16 和 INT8,也可以支持 INT4、2 和 1,但是不支持 bfloat16;和SRAM以及VP6 DSP通过数据和控制总线互联。DSP用于向量计算,支持 INT8、16、32 和 FP16 的宽 VLIW;Ice Lake 核可以使用 VNNI 运行其他代码。下图展示了ICE单元架构框图: 96.png

L3 缓存被分解成 8 个 3MB 的切片,在 IA 核和 ICE 单元之间共享。对于ICE,存储结构一共分成4层。下图左侧量化了每一层移动数据的延迟影响,以 DRAM 到 DL Compute Grid 的数据传输设置为基线,从 L3 缓存访问的速度比 DRAM 快 10 倍,而 DL Compute Grid中的数据则快了 1000 倍。 97.png Xeon CPU和NNP-I结合起来,可以根据不同计算类型进行分层,Xeon处理器运行高精度的通用任务,而神经网络计算则卸载到NNP-I中,并在NNP-I里进一步细分,如下所示: 98.png Nervana NNP-I采用 M.2 外形或 PCI Express 卡,分别提供不同的功耗和性能,如下所示: 99.png

Habana

Habana目前一共5款芯片,其中Gaudi, Gaudi2, Gaudi3用于数据中心的深度学习训练,Goya和Greco则用于推理。Gaudi3是2024年推出产品,采用台积电5nm工艺。

Gaudi

Gaudi 基于张量处理核 TPC(Tensor Processing Core) 的可扩展架构,有八个 TPC 2.0。TPC 1.0是在 Goya 推理处理器中引入的。下图显示了 Gaudi 架构框图: 100.png TPC 2.0 是 VLIW4 SIMD 处理器,支持 2048 位 SIMD 操作,每个周期TPC可以执行 64 个浮点数/INT32 操作、128 个 INT16 操作或 256 个 INT8 操作其指令集和硬件是为深度学习训练而定制的;支持GEMM 操作,张量寻址,随机数生成以及特殊函数。 TPC 支持FP32、BF16、INT32、INT16、INT8、UINT32、UINT16 和 UINT8数据类型。Gaudi 存储架构包括片上 SRAM 和每个 TPC 中的本地存储,以及四个 HBM2 器件,提供 32 GB 的容量。PCIe接口提供主机接口,支持3.0代和4.0代模式。有20 对 56Gbps PAM4 SerDes,可配置为 10 个 100Gb Ethernet、20 个 50Gb/25Gb Ethernet或两者之间的任意组合,提供了纵向扩展和横向扩展的能力;2 Tb/s 的双向带宽,支持 RDMA over Converged Ethernet (RoCE v2)。

编程模型

TPC 使用称为 TPC-C 的 C 语言进行编程,TPC-C 是 C99 的扩展,增加了向量数据类型,可利用 SIMD 功能;有许多专用功能来加速 DNN 操作,例如:

  • 基于张量的内存访问
  • 特殊功能函数
  • 随机数生成
  • 类似于MME的多种数据类型

TPC 程序由两部分组成:

  • TPC代码 TPC 处理器执行的 ISA,实现kernel函数
  • 主机代码 主机上执行,负责程序在 TPC之间切割

TPC 处理器有四个执行槽:

  • 加载槽 - 从内存加载、移动和设置值。
  • SPU 槽 - 执行标量运算。
  • VPU 槽 - 执行向量运算。
  • 存储槽 - 到内存的存储、移动和设置值。

TPC 的流水线是通用体系结构。每条指令都有一个预定义的延迟,大部分需要四个周期的延迟。TPC 核中的所有指令都可以预测。每个 VLIW 槽都以不同的方式预测:

  • SPU 和存储槽仅支持标量预测。
  • VPU 和 加载槽可以由单个标量值或位数组来预测,从而屏蔽特定向量元素的。预测通过内部函数向 TPC-C 程序员公开。

TPC 处理器有四个内存空间,:

  • 标量本地存储 大小为 1 KB,允许在对齐的 4 字节块中读取/写入
  • 向量本地内存 大小为 80 KB,如果程序使用 tanh、sin 或 cos 等特殊功能,则只有 16 KB 可用。允许以对齐的 128/256 字节块读取/写入此内存
  • 全局内存 全局内存使用名为 tensors 的专用访问器进行访问
  • 配置空间 TPC 配置空间包含成功执行程序所需的一组定义,例如张量描述符、程序二进制位置等

本地内存与程序执行一致,每个 TPC 处理器都有自己的本地内存实例。每个 TPC 只能访问自己的本地副本。也就是说,TPC A 无法访问 TPC B 本地内存。本地存储器可以在每个周期中读取或写入,没有带宽限制。本地内存在编译时通过定义带有 ___local___ 地址空间限定符的全局变量进行静态分配。

全局内存与程序执行不一致。这意味着程序在执行先写后读操作时必须发出原子信号量操作,以保证在读回之前读取操作结果是可见的。平均每四个周期可以从全局内存加载或写入 2,048 位向量。 __global__地址空间限定符将指针追加到全局内存。

系统扩展

Gaudi 利用卓越的开放标准网络技术进行横向扩展。每个 Gaudi 芯片有 10 个标准 100Gbit Ethernet端口(或 20 个 50 GbE/25 GbE 端口)。将网络直接集成到 AI 处理器芯片中,可以创建一个没有带宽瓶颈的灵活系统。通过将多个 Gaudi 芯片与以太网交换相结合,可以在 8、16、32、64、128、1K、2K、8K 和更多 Gaudi 芯片上分配训练。由于 Gaudi 使用现成的以太网,因此可以使用许多不同的系统和网络配置。

HLS-1 包含 8 个 HL-205 OCP 加速模块 (OAM) 夹层卡和双 PCIe 交换机。Gaudi 芯片在主板上全连接,每个 Gaudi 使用7个 100GbE 端口。 101.png HLS-1H 包含四个 HL-205 OCP 加速器模块 (OAM) 夹层卡,专为大规模横向扩展而构建。大规模横向扩展支持使用现成的外部标准以太网交换机在任何规模的 Gaudi 处理器集群中训练大型模型。下图显示了包含四个 Gaudi HL-205 卡及其接口的 HLS-1H 系统。接口是 2x16 PCIe Gen4 ,可连接到外部主机服务器,以及 40x 100Gb 以太网链路(使用 10 个 QSFP-DD 连接器)。外部以太网链路可以连接到任何交换层次结构。 102.png 下图是 Gaudi 系统的另一个示例,每个 Gaudi 的 10 个 100G 端口连接到 128x100G 以太网交换机,这种情况下,以太网交换机将连接到具有 10x100G 端口的聚合结构。 103.png 下图显示一种机架配置,其中六个 Gaudi HLS-1,一共 48 个 Gaudi 。每个 Gaudi HLS-1通过 8 个 2x100GbE连接到单个以太网交换机,该交换机可以进一步连接到其他机架进行横向扩展。 104.png

下图是基于 HLS-1H 的 POD 示例图,由 32 个 HLS-1H 系统组成,每个HLS-1H系统 4 个卡,一共 128 个 HL-205 Gaudi卡,用于在数据中心进行大规模横向扩展。每张卡有 10 个 100Gb/s 链路,每个系统有 10 个 400Gb/s 的 QSFP-DD 端口。10 个标准以太网交换机 (32 个 QSFP-DD) 可连接32 个 HLS-1H 系统, 128 个 Gaudi 处理器组成全连接非阻塞的 CLOS 网络拓扑。 105.png

下图展示了高端 2K Gaudi 系统连接拓扑,8 Gaudi组成的服务器和64 端口以太网交换机连接。每个此类交换机都连接到由 8 个 256x100GbE 交换机构建的聚合网络,形成 Clos 网络拓扑。Gaudi 芯片之间只有三个网络跃点。 106.png

Gaudi 2

Gaudi2 包括两个计算引擎——矩阵乘法引擎MME (Matrix Multiplication Engine) 和完全可编程的张量处理器核TPC (Tensor Processor Core) 。MME 负责执行矩阵乘法,包括全连接层、卷积等运算,而 TPC则是为深度学习运算量身定制的 VLIW SIMD 处理器,用于加速其他运算。除了 MME 和 TPC,Gaudi2 还有与转置引擎相结合的DMA ,用于高效、动态的张量形状转换,以及从 Gaudi2 内存子系统读取和写入非连续多维张量。Gaudi2 有 24 x 100 Gbps RoCE V2 RDMA NIC,提供 2.4 TB 的网络带宽,可直接路由或通过标准以太网交换实现Gaudi2之间的通信。Gaudi2 内存子系统包括 96 GB 的 HBM2E 内存,可提供 2.45 TB/秒的带宽,此外还有 48 MB 的本地 SRAM。Gaudi2针对视觉应用,集成了多媒体解码器,可以支持HEVC、H.264、VP9 和 JPEG格式。下图展示了Gaudi2的架构框图: 107.png Gaudi2 支持FP32、TF32、BF16、FP16 和 FP8(E4M3 和 E5M2)等深度学习常用数据类型;在 MME 中,累加器支持 FP32。Gaudi2 集成了 Habana 的第四代张量处理器核TPC。TPC 是一种通用 VLIW 处理器,宽度为 256B SIMD,支持 FP32、BF16、FP16,FP8(E4M3 和 E5M2),以及 INT32、INT16 和 INT8 数据类型。

系统扩展

HLBA-225 包括 8 个英特尔 Gaudi2 夹层卡,这些夹层卡的 21 个 NIC在 PCB 上被动互连,并组成非阻塞的全连接网络拓扑;3 个 NIC 连接到6 个板载 QSFP-DD 连接器, 用于横向扩展;网络拓扑如下所示: 108.png

Goya

Goya是用于推理的加速器,采用异构计算架构,主要包括TPC、GEMM 和 DMA等功能模块,使用50MB共享SRAM并发工作;张量处理器核TPC是第一代,采用VLIW SIMD 向量架构,支持FP32、INT32、INT16、INT8、UINT32、UINT16、UINT8混合精度;支持DDR4和PCIe 4;Goya架构框图如下所示: 109.png

Greco

Greco是第二代推理加速器,为了提高推理速度和效率,Greco 在片上集成了多媒体解码、编码和后处理功能,支持 HEVC、H.264、JPEG 和 P-JPEG 等媒体格式。Greco 支持Bfloat16、FP16 和 INT4等数据格式。Greco 支持 16GB LPDDR5 内存,片上 SRAM 从 50 MB 增加到 128 MB。Greco 从 Goya 双插槽 PCIe 卡减少到单插槽、半高、半长 (HHHL) PCIe Gen 4 x8 接口,使客户能够将服务器中的卡数量增加一倍。

参考文献

  1. Y. Jiao, L. Han and X. Long, “Hanguang 800 NPU – The Ultimate AI Inference Solution for Data Centers,” 2020 IEEE Hot Chips 32 Symposium (HCS), Palo Alto, CA, USA, 2020, pp. 1-29, doi: 10.1109/HCS49909.2020.9220619.
  2. J. Ouyang et al., “Baidu Kunlun An AI processor for diversified workloads,” 2020 IEEE Hot Chips 32 Symposium (HCS), Palo Alto, CA, USA, 2020, pp. 1-18, doi: 10.1109/HCS49909.2020.9220641.
  3. J. Ouyang, X. Du, Y. Ma and J. Liu, “3.3 Kunlun: A 14nm High-Performance AI Processor for Diversified Workloads,” 2021 IEEE International Solid-State Circuits Conference (ISSCC), San Francisco, CA, USA, 2021, pp. 50-51, doi: 10.1109/ISSCC42613.2021.9366056.
  4. Zeng, J., Kou, M., Yao, H., 2022. KunlunTVM: A Compilation Framework for Kunlun Chip Supporting Both Training and Inference, in: Proceedings of the Great Lakes Symposium on VLSI 2022. Presented at the GLSVLSI ’22: Great Lakes Symposium on VLSI 2022, ACM, Irvine CA USA, pp. 299–304. https://doi.org/10.1145/3526241.3530316
  5. 百度技术沙龙, n.d. 昆仑芯硬件架构:新一代自研架构XPU-R_哔哩哔哩_bilibili [WWW Document]. URL https://www.bilibili.com/video/BV1CZ4y1q7yJ/ .
  6. H. Liao, J. Tu, J. Xia and X. Zhou, “DaVinci: A Scalable Architecture for Neural Network Computing,” 2019 IEEE Hot Chips 31 Symposium (HCS), Cupertino, CA, USA, 2019, pp. 1-44, doi: 10.1109/HOTCHIPS.2019.8875654.
  7. Liao, H., Tu, J., Xia, J., Liu, H., Zhou, X., Yuan, H., Hu, Y., 2021. Ascend: a Scalable and Unified Architecture for Ubiquitous Deep Neural Network Computing : Industry Track Paper, in: 2021 IEEE International Symposium on High-Performance Computer Architecture (HPCA). Presented at the 2021 IEEE International Symposium on High-Performance Computer Architecture (HPCA), IEEE, Seoul, Korea (South), pp. 789–801. https://doi.org/10.1109/HPCA51647.2021.00071
  8. Gwennap, L., 2020. GROQ ROCKS NEURAL NETWORKS.
  9. Abts, D., Ross, J., Sparling, J., Wong-VanHaren, M., Baker, M., Hawkins, T., Bell, A., Thompson, J., Kahsai, T., Kimmell, G., Hwang, J., Leslie-Hurd, R., Bye, M., Creswick, E.R., Boyd, M., Venigalla, M., Laforge, E., Purdy, J., Kamath, P., Maheshwari, D., Beidler, M., Rosseel, G., Ahmad, O., Gagarin, G., Czekalski, R., Rane, A., Parmar, S., Werner, J., Sproch, J., Macias, A., Kurtz, B., 2020. Think Fast: A Tensor Streaming Processor (TSP) for Accelerating Deep Learning Workloads, in: 2020 ACM/IEEE 47th Annual International Symposium on Computer Architecture (ISCA). Presented at the 2020 ACM/IEEE 47th Annual International Symposium on Computer Architecture (ISCA), IEEE, Valencia, Spain, pp. 145–158. https://doi.org/10.1109/ISCA45697.2020.00023
  10. Abts, D., Kimmell, G., Ling, A., Kim, J., Boyd, M., Bitar, A., Parmar, S., Ahmed, I., DiCecco, R., Han, D., Thompson, J., Bye, M., Hwang, J., Fowers, J., Lillian, P., Murthy, A., Mehtabuddin, E., Tekur, C., Sohmers, T., Kang, K., Maresh, S., Ross, J., 2022. A software-defined tensor streaming multiprocessor for large-scale machine learning, in: Proceedings of the 49th Annual International Symposium on Computer Architecture. Presented at the ISCA ’22: The 49th Annual International Symposium on Computer Architecture, ACM, New York New York, pp. 567–580. https://doi.org/10.1145/3470496.3527405
  11. D. Abts et al., “The Groq Software-defined Scale-out Tensor Streaming Multiprocessor : From chips-to-systems architectural overview,” 2022 IEEE Hot Chips 34 Symposium (HCS), Cupertino, CA, USA, 2022, pp. 1-69, doi: 10.1109/HCS55958.2022.9895630.
  12. R. Prabhakar and S. Jairath, “SambaNova SN10 RDU:Accelerating Software 2.0 with Dataflow,” 2021 IEEE Hot Chips 33 Symposium (HCS), Palo Alto, CA, USA, 2021, pp. 1-37, doi: 10.1109/HCS52781.2021.9567250.
  13. Seiler, L., Carmean, D., Sprangle, E., Forsyth, T., Abrash, M., Dubey, P., Junkins, S., Lake, A., Sugerman, J., Cavin, R., Espasa, R., Grochowski, E., Juan, T., Hanrahan, P., 2008. Larrabee: a many-core x86 architecture for visual computing. ACM Trans. Graph. 27, 1–15. https://doi.org/10.1145/1360612.1360617
  14. Sodani, A., Gramunt, R., Corbal, J., Kim, H.-S., Vinod, K., Chinthamani, S., Hutsell, S., Agarwal, R., Liu, Y.-C., 2016. Knights Landing: Second-Generation Intel Xeon Phi Product. IEEE Micro 36, 34–46. https://doi.org/10.1109/MM.2016.25
  15. A. Sodani, “Knights landing (KNL): 2nd Generation Intel® Xeon Phi processor,” 2015 IEEE Hot Chips 27 Symposium (HCS), Cupertino, CA, USA, 2015, pp. 1-24, doi: 10.1109/HOTCHIPS.2015.7477467.
  16. Reinders, J., n.d. Knights Landing – An Overview for Developers.
  17. Reinders, J., n.d. Your Path to Knights Landing.
  18. A. Yang, “Deep Learning Training At Scale Spring Crest Deep Learning Accelerator (Intel® Nervana™ NNP-T),” 2019 IEEE Hot Chips 31 Symposium (HCS), Cupertino, CA, USA, 2019, pp. 1-20, doi: 10.1109/HOTCHIPS.2019.8875643.
  19. O. Wechsler, M. Behar and B. Daga, “Spring Hill (NNP-I 1000) Intel’s Data Center Inference Chip,” 2019 IEEE Hot Chips 31 Symposium (HCS), Cupertino, CA, USA, 2019, pp. 1-12, doi: 10.1109/HOTCHIPS.2019.8875671.
  20. Intel Habana WhitePaper
    1. E. Medina, “[Habana Labs presentation],” 2019 IEEE Hot Chips 31 Symposium (HCS), Cupertino, CA, USA, 2019, pp. 1-29, doi: 10.1109/HOTCHIPS.2019.8875670.
  21. M. Emani et al., “Accelerating Scientific Applications With SambaNova Reconfigurable Dataflow Architecture,” in Computing in Science & Engineering, vol. 23, no. 2, pp. 114-119, 1 March-April 2021, doi: 10.1109/MCSE.2021.3057203.
  22. R. Prabhakar, S. Jairath and J. L. Shin, “SambaNova SN10 RDU: A 7nm Dataflow Architecture to Accelerate Software 2.0,” 2022 IEEE International Solid-State Circuits Conference (ISSCC), San Francisco, CA, USA, 2022, pp. 350-352, doi: 10.1109/ISSCC42614.2022.9731612.
  23. S. Knowles, “Graphcore,” 2021 IEEE Hot Chips 33 Symposium (HCS), Palo Alto, CA, USA, 2021, pp. 1-25, doi: 10.1109/HCS52781.2021.9567075.
  24. J. Moe, K. Pogorelov, D. T. Schroeder and J. Langguth, “Implementing Spatio-Temporal Graph Convolutional Networks on Graphcore IPUs,” 2022 IEEE International Parallel and Distributed Processing Symposium Workshops (IPDPSW), Lyon, France, 2022, pp. 45-54, doi: 10.1109/IPDPSW55747.2022.00016.
  25. Jia, Z., Tillman, B., Maggioni, M., Scarpazza, D.P., 2019. Dissecting the Graphcore IPU Architecture via Microbenchmarking.
]]>
NVLink-NVSwitch-DGX | The interconnection of AI Era http://zhifeiding.github.io/programming/history/2024/02/25/NVLink-NVSwitch-DGX-the-interconnection-of-AI-Era/ 2024-02-25T00:00:00+00:00 http://zhifeiding.github.io/programming/history/2024/02/25/NVLink-NVSwitch-DGX-the-interconnection-of-AI-Era 前言

随着AI发展,其对内存容量和计算性能的飞速增长,计算的主角从CPU转移到AI加速器,同时AI加速器系统的扩展性也越来越重要,而其中的关键就是片间互联以及网络拓扑的选择。NVIDIA的芯片互联设计始于2016年随Pascal一起推出的NVLink互联接口;2018年在DGX-2中使用的NVSwitch芯片则显示了NVIDIA对系统扩展能力的进一步加强;而DGX系统则是对NVLink和NVSwitch进行扩展的大规模集群;而收购Mellanox,则揭示了传统数据中心网络和高性能计算网络(HPC)之间的融合趋势。NVIDIA对片间互联以及计算网络这些技术上的演进伴随着AI计算对片间互联,系统网络的需求;同时,这些技术曾经也是CPU组建大型SMP和高性能计算网络使用过的技术。通过分析NVLink,NVSwitch和DGX的历史和现状,可以看出计算和网络发展趋势,提供AI加速器系统未来可能发展方向。

概述

NVLink是NVIDIA在2016年推出的Tesla P100和Pascal GP100 GPU上使用的高速互联技术,称为NVLink1;2017年的Tesla V100则使用了NVLink2;2020年的A100搭配NVLink3,提高了单个lane的速率,在保持同样带宽下减少了lane数量;2022年的H100推出了NVLink4,继续提供单个lane的速率,同时减少lane数量。NVLink整体发展情况如下所示: 0.png NVSwitch 是一种 GPU 桥接设备,可提供DGX系统所需的 NVLink 交叉网络。NVSwitch目前发展到第三代,如下所示:

  • 2018年V100 DGX-2出现的NVSwitch 1.0
  • 2020年A100 DGX的NVSwitch 2.0
  • 2022年H100 DGX的NVSwitch 3.0 1.png DGX系统则是采用NVLink和NVSwitch进行互连和扩展的计算系统,下图展示了DGX系统的内存容量变化: 2.png

本文组织形式如下:

  • 第一节介绍NVLink,从NVLink 1到NVLink 4,以及NVLink-C2C
  • 第二节介绍NVSwitch,从NVSwitch 1.0到NVSwitch 3.0
  • 第三节介绍DGX系统
  • 文章最后列出了主要参考文献

NVLINK

NVLINK1

NVLink 是 NVIDIA 用于 GPU 加速计算的新型高速互连技术。它显著提高了 GPU 到 GPU 通信以及 GPU 对系统内存的访问的性能。高性能计算集群的节点中通常使用多个GPU,比较常见的配置是每个节点通常最多有 8 个 GPU,因此,在多处理系统中,强大的互连非常重要。NVLink 旨在为 GPU 创建一个片间互连,该互连将提供比 PCI Express Gen 3 (PCIe) 高得多的带宽,并与 GPU ISA 兼容以支持共享内存多线程任务。使用带 NVLink 的 GPU,应用程序既可以在本地内存上运行,也可以在相连的另一个 GPU 的内存上执行,并且保持内存操作的正确(例如,为 Pascal 的原子操作提供完全支持)。

NVLINK拓扑

NVLink支持多种拓扑结构,不同的拓扑可以针对不同的应用进行优化。下面主要讨论以下 NVLink 配置:

  • GPU-to-GPU NVLink连接
  • CPU-to-GPU NVLink连接

GPU-to-GPU NVLink连接

下图显示了8个 GPU 组成的混合立方体网格(Hybrid Cube Mesh),其中包括两个使用NVLink完全连接的四边形 GPU网络,四边形之间由NVLink 进行连接,每个四边形中的 GPU 直接通过 PCIe 连接到各自的 CPU。通过使用单独的 NVLink 来连接两个四边形,减轻了到每个 CPU 的 PCIe 上行链路的带宽压力,同样避免了通过系统内存和 CPU 间链路的数据传输。 3.png

GPU-to-GPU NVLink连接

虽然 NVLink 主要用于将多个 NVIDIA Tesla P100 加速器连接在一起,但它也可以用作 CPU 到 GPU 的互连。例如,Tesla P100 加速器可以通过 NVIDIA NVLink 技术连接到 IBM 的 POWER8。POWER8 支持四个 NVLink。

  • 下图显示了单个 GPU连接到支持 NVLink 的 CPU 。在这种情况下,GPU 可以以高达 160 GB/秒的双向带宽访问系统内存,比 PCIe 的可用带宽高 5 倍。 4.png
  • 下图显示了CPU使用NVLink 连接两个GPU 。每个 GPU 上的其余两个链路用于点对点通信。 5.png

NVLINK接口

NVLink接口由三层组成:

  • 物理层Physical Layer (PL)
  • 数据链路层Data Link Layer (DL)
  • 传输层Transaction Layer (TL)

协议使用可变长度的数据包,其数据包大小范围从 1(例如简单的读请求命令)到 18(带有地址扩展的 256B 数据的写请求)不等。下图显示了 NVLink 物理层 (PHY)、数据链路层 (DL)、传输层 (TL)和层和链路: 6.png

NVHS

NVLink 使用 NVIDIA 的高速信号技术 (NVHS)

  • 每个信号对以 20 Gbit/s 的速度差分发送数据
  • 每个方向的八个差分对组合成一个链路
    • 单个链路的原始双向带宽为 40 GB/s。信号采用 NRZ(Non-Return to-Zero)
    • 该链路为直流耦合,差分阻抗为 85 欧姆
    • 链路可以容忍极性反转和通道反转,以支持有效的 PCB 布线
  • 在芯片上,数据使用 128 位 Flit(流量控制单位)以 1.25GHz 数据速率从 PHY(physical level circuit)发送到 NVLink 控制器
  • NVHS使用嵌入式时钟。在接收器上,恢复的时钟用于接收传入数据

NVLINK物理层

PL 与 PHY 连接,并将接收到的数据传送到数据链路层,主要负责:

  • deskew 八个通道
  • framing 计算每个数据包的开头
  • scrambling/descrambling 确保足够的位转换密度以支持时钟恢复
  • 极性反转
  • 通道反转

NVLINK数据链路层

数据链路层主要负责数据包在链路上的可靠传输,并将数据发送到事务层 (TL):

  • 传输的数据包使用 25 位 循环冗余校验CRC(Cyclic Redundancy Check)进行保护
  • 传输的数据包存储在重放缓冲区中,直到链路另一端的接收方确认 (ACK) 为止
    • 如果 DL 在传入数据包上检测到 CRC 错误,则不会发送 ACK,并准备接收重新传输的数据
    • 同时,在没有 ACK 的情况下,发送器超时并从重放缓冲区启动数据重传
    • 仅当数据包被确认时,数据包才会从重放缓冲区中移除
    • 25 位 CRC 允许在任何通道上检测多达 5 个随机位错误或多达 25 位突发错误。CRC 是根据当前包头和上一个有效负载(如果有)计算的
  • DL 还负责链路启动和维护

NVLINK传输层

传输层主要处理:

  • 同步
  • 链路流量控制
  • 虚拟通道
  • 将多个链路聚合在一起,以在处理器之间提供非常高的通信带宽

NVLink 数据包的长度从单个 128 位 flit 到最多 18 个 128 位 flit 不等,以支持 256 字节传输。NVLink传输至少包括一个请求和一个响应(post操作没有响应数据包)以及可选的地址扩展 (AE) flit、字节使能(BE) flit和 0 到 16 个数据有效负载flit。

请求头 flit 包括

  • 25 位 CRC
  • 83 位传输层字段,包含请求类型、地址、流量控制信用和标签标识符
  • 20 位数据链路 (DL) 层字段,包括确认标识符、数据包长度信息和应用程序编号标记。

地址扩展 AE flit 包含请求之间相对静态的信息(sticky bits)、特定于命令的信息或更改命令类型默认值的信息。静态信息在更改时传输,并存储在接收端,以便用于非 AE 数据包。

字节使能BE flit 用于写命令或原子命令,128 个使能位表示要写入的数据字节,最多 128 个字节。BE 不能用于 256 字节传输。

下图展示了有请求头 flit、地址扩展AE flit、字节使能BE flit 和 数据flit 的写传输的数据包。 7.png

设计的 CRC 允许在最大传输数据包中检测 5 个随机位的错误,或者在单个差分对上检测多达 25 个顺序位错误。数据包存储在重放缓冲区中。每个数据包都有一个序列 ID。当数据包没有CRC错误时,会返回确认信息。如果发送端指定时间内未收到确认信息,则启动重放序列,并重新传输错误的数据包和所有后续数据包。

数据包长度是可变的,长度信息作为 DL 字段的一部分进行传递。由于包头包含数据包长度信息,而协议不包含帧符号,因此在解析数据包的其余部分之前,必须检查覆盖包头的CRC。不需要针对包头和数据的单独的CRC字段,而是根据包头和前一个数据进行计算。如下图所示,序列 ID 为 1:4 的 flit 与前一个包头相关联,即 flit 0 中的 64 字节读响应。flit 5 中读请求的 CRC 是按 flits 1:5 计算的,而 64 字节写请求 (flit 6) 的 CRC 是仅根据 flit 6 计算的,因为之前没有有效数据。flit 7:10 将被flit 11 中的 CRC 覆盖(未显示)。如果在 flit 11 中没有准备好的请求或响应,则会传达与空传输关联的 CRC。 8.png

在 GPU 架构里,NVLink 控制器通过另一个称为高速集线器 (HSHUB) 的模块与 GPU 内部进行通信。HSHUB 可以直接访问 GPU 内部crossbar和其他系统模块,例如以 NVLink 峰值速率将数据移入和移出 GPU的高速复制引擎 (HSCE)。下图显示了 NVLink 与 HSHUB 和 GP100 GPU 中一些模块的关系。 9.png

与 Pascal 上的 NVLink 相比,V100 上的 NVLink 将信号速率从 20 Gb/s提高到 25 Gb/s。每个链路在每个方向提供 25 GB/秒的带宽。并且链路数从 4 个增加到 6 个,将支持的 GPU NVLink 总带宽提升到 300 GB/s。NVLink 2 允许CPU 直接对GPU 的 HBM2 内存进行加载/存储/原子访问。新增加功能包括:

  • 结合新的 CPU 主控功能,NVLink 支持缓存一致性操作,允许从图形内存读取的数据存储在 CPU 的缓存中
  • NVLink 2 增加了对由 GPU 或 CPU 发起的原子访问的支持。虽然 P100 支持对等的 GPU 原子访问,但不支持通过 NVLink 发送 GPU 原子访问并在目标 CPU 上完成
  • 通过支持地址转换服务 (ATS),GPU 可以直接访问 CPU 的页表
  • 增加链路层低功耗模式,可在链路未大量使用时节省功耗

在 A100 GPU 中实现的NVLink 3和NVSwitch 显著增强了多 GPU 的可扩展性、性能和可靠性。由于每个 GPU 和交换机的支持的链路更多,NVLink 3 提供了更高的 GPU-GPU 通信带宽,并改进了错误检测和恢复功能。NVLink 3在每个方向上使用四个差分对(通道)来创建单个链路,在每个方向上提供 25 GB/s的有效带宽,NVLink 3的数据速率为每对 50 Gbit/s,几乎是 V100 中 25.78 Gbits/s 速率的两倍。单个 A100 NVLink 在每个方向上提供 25 GB/秒的带宽,与 V100 类似,但与 V100 相比,每个链路仅使用一半的信号对数。A100 中的链路总数增加到 12 个,而 V100 中为 6 个,总带宽为 600GB/s,而 V100 为 300 GB/s。

NVLink 是 NVIDIA 高带宽、高能效、低延迟、无损的 GPU 到 GPU 互连,包括弹性功能,例如链路级错误检测和数据包重传机制,以确保数据的成功传输。NVLink 4 在 H100 GPU 中实现,与 NVIDIA A100 中使用的之前的NVLink 3相比,可提供 1.5 倍的通信带宽。H100 GPU中一共18个NVLink 4链路,总带宽900 GB/s,用于多 GPU I/O 和共享内存访问。NVLink 4在每个方向上仅使用两个高速差分对来形成单个链路,在每个方向上提供 25 GB/秒的有效带宽。

NVIDIA NVLink-C2C 是 NVIDIA 的用于Grace Hopper 超级芯片的内存一致性、高带宽和低延迟的互连,提供高达 900GB/s的总带宽。

NVLink-C2C 内存一致性可提高开发人员的工作效率、性能和 GPU 可访问的内存容量。CPU 和 GPU 线程现在可以并发和透明地访问 CPU 和 GPU的内存,让开发人员能够集中精力在算法上,而不是显式内存管理。内存一致性允许开发人员只传输他们需要的数据,而不是将整个页面进行迁移。通过支持CPU 和 GPU 原子操作可以实现CPU和GPU 的线程间的轻量级原语。

具有地址转换服务 (ATS) 的 NVLink-C2C 可以允许NVIDIA Hopper DMA 引擎加速跨主机和设备批量分页内存的传输。 NVLink-C2C 允许应用程序能够超额订阅 GPU 的内存,并以高带宽直接利用 NVIDIA Grace CPU 的内存。每个 Grace Hopper 超级芯片具有高达 480GB 的 LPDDR5X CPU 内存,GPU 可以直接访问。结合 NVIDIA NVLink Switch,在 最多 256 个 NVLink 连接的 GPU组成的DGX GH200 上运行的所有 GPU 线程可以访问高达 144TB 的内存。

NVSwitch

NVSwitch 1.0

NVSwitch 是一款 NVLink 交换机芯片,采用TSMC 12FFN工艺,一共20亿晶体管,面积106 mm^2;每个交换机有 18 个 NVLink 端口。在内部是一个全连接的 18 x 18 交叉网络。任何端口都能以50 GB/s 与任何其他端口通信,总聚合带宽为 900 GB/s。提供PCIe进行管理,配置缓冲区分配,使用基于软件的清理的钩子来处理表损坏和错误情况,以及部分复位和队列排空等。每个端口每个方向带宽 25 GB/s。交叉网络是非阻塞的,允许所有端口以完整的 NVLink 带宽与所有其他端口通信。下图展示了NVSwitch的物理版图: 10.png 在高带宽下,数据完整性至关重要。NVLink 本身使用循环冗余编码 (CRC) 进行保护,以检测错误并重传。NVSwitch 的数据路径、路由和状态结构使用纠错码ECC (error-correcting code) 进行保护。NVSwitch 还支持最终hop地址保真度检查以及缓冲区溢出和下溢检查。为了安全起见,NVSwitch 的路由表由NVIDIA fabric manager索引和控制,通过限制应用程序访问范围来提供保护。NVLink 数据包里携带物理地址。下图展示了NVSwitch的架构框图: 11.png

下图展示了16 个 GPU 都以相同的方式连接到 NVSwitch 芯片的拓扑示意图: 12.png 一个基板上的所有 8 个 GPU 都通过单个 NVLink 连接到所有 6 个 NVSwitche。每个 NVSwitch 上的八个端口用于与另一个基板通信。同一个基板上的 8 个 GPU 中的每一个都能以 300 GB/s 的全带宽与同一基板上的任何其他 GPU 进行通信,而只经过一个NVSwitch的延迟。每个 GPU 还可以以全带宽与另一个基板上的任何 GPU 进行通信,而只需要经过两个NVSwitch延迟。基板之间的双向带宽为 2.4 TB/s(48 个链路,每个方向 25 GB/s)。但是NVIDIA DGX-2 平台仅使用每个交换机的 16 个可用端口。

NVSwitch 2.0

NVSwitch 2.0比之前的版本快两倍,应用在NVIDIA DGX-2 系统。六个 NVSwitch 和NVLink 3 的组合使单个 GPU 到 GPU 的通信达到 600 GB/s 的峰值,能提供双向4.8 TB/s的总带宽。 13.png

NVSwitch 3.0

NVSwitch 3.0采用TSMC 4N工艺,251亿晶体管,面积294mm2,提供 64 个NVLink 4链路端口,支持3.2TB/s 全双工带宽。总交换机吞吐量从上一代的 7.2 Tbits/s 增加到 13.6 Tbits/s。下图展示了NVSwitch 3.0的物理规划版图: 14.png NVSwitch 3.0还提供多播和 NVIDIA SHARP in-network reduction硬件集群通信加速,包括all_gatherreduce_scatterbroadcast atomics。与在 A100 上使用 NVIDIA Collective Communications Library (NCCL) 相比,多播和in-network reduction可提供高达 2 倍的吞吐量增益,同时显著降低小数据集群通信的延迟。NVSwitch 集群通信加速显著降低了 SM 上用于集群通信的负担。

NVSwitch 3.0的物理 电气接口(PHY) 与 400 Gbps Ethernet和 InfiniBand 兼容。管理控制器支持连接OSFP(Octal Small Formfactor Pluggable)模块,每个笼子有四个 NVLink。使用定制固件,可以支持有源线缆。还添加了额外的前向纠错FEC(forward error correction)模式,以增强 NVLink 网络的性能和可靠性。

NVSwitch 3.0使用 50 Gbaud PAM4 信令,每个差分对的带宽为 100 Gbps,可在 64 个 NVLink 端口(每个 NVLink x2)上提供 3.2 TB/s 的全双工带宽。

NVSwitch 3.0包括许多用于 SHARP 加速的新硬件模块:

  • SHARP控制器,可以并行管理多达 128 个 SHARP 组
  • 复用 NVIDIA Hopper 架构中的 SHARP 算术逻辑单元(ALU),支持逻辑、最小/最大、加法等多种运算和格式(有符号、无符号整数、FP16、FP32、FP64、BF16), 提供高达 400 GFLOPS 的 FP32 吞吐量
  • 使用嵌入式SRAM支持SHARP计算

NVSwitch 3.0增加的NVLink 相关模块包括: ▪ 安全处理器,保护数据和芯片配置免受攻击 ▪ 分区功能,将端口子集隔离到单独的 NVLink 网络中 ▪ 管理控制器现在还可以处理连接的 OSFP 电缆 ▪ 扩展遥测以支持 InfiniBand 式监视

下图展示了NVSwitch 3.0的逻辑框图: 15.png

DGX

DGX-1 P100

DGX-1 有 8 个 Tesla P100 GPU 加速器,通过 NVLink组成hybrid cube-mesh网络拓扑。DGX-1 与双路 Intel Xeon CPU 和四个 100 Gb InfiniBand 网络接口卡共同组成深度学习训练系统。

DGX-1系统架构

DGX-1 是专为高吞吐量和高互连带宽而设计的深度学习系统,可最大限度地提高神经网络训练性能。系统的核心是:

  • 由 8 个 Tesla P100 GPU 通过NVLink 组成的hybrid cube-mesh网络拓扑
  • 两个 CPU,用于启动、存储管理和协调深度学习框架

DGX-1 内置于3U(three-rack-unit) 机箱中,可提供电源、冷却、网络、多系统互连和 SSD 文件系统缓存。下图显示了 DGX-1 系统组件: 16.png Tesla P100 的页面迁移引擎(Page Migration Engine)允许在 GPU 和主机大容量内存之间高带宽、低开销的共享数据。为了扩展到多节点高性能集群,DGX-1 通过 InfiniBand (IB) 网络提供系统到系统高带宽连接。

DGX-1网络拓扑

DGX-1 的 NVLink 网络拓扑设计旨在优化许多因素,包括各种点对点和集合通信可实现的带宽,拓扑结构的灵活性,以及GPU 的性能。hybrid cube-mesh网络拓扑可以认为是:

  • 一个立方体,立方体的角是 GPU,所有 12 条边都通过 NVLink 连接,六个面中的两个也通过对角线连接
  • 也可以被认为是单个 NVLink 连接的两个交织环 17.png

    DGX-1网络

    最新使用多系统扩展的计算工作负载,尤其是深度学习,为了发挥 GPU 性能,需要提供系统内部和系统之间的 GPU 的通信。除了用于 GPU 内部高速通信的 NVLink 外,DGX-1 还使用 Mellanox ConnectX-4 EDR InfiniBand 端口提供系统间通信。 在 DGX-1 中配置的InfiniBand 标准 EDR IB 提供:

  • 对于每个端口,8 个数据通道提供 25 Gb/s 或 200 Gb/s 的带宽(4 个输入通道 (100 Gb/s) 和 4 个输出通道 (100 Gb/s))
  • 低延迟通信和内置集合通信原语,可加速跨多个系统的大型计算
  • 支持高性能网络拓扑,可同时在多个系统之间以最小的冲突传输数据
  • NVIDIA GPUDirect RDMA 使用InfiniBand,在多个系统的 GPU 之间直接传输数据

DGX-1 配置了四个 EDR IB 端口,可提供 800 Gb/s带宽(400 Gb/s输入和 400 Gb/s 输出),可用于构建 DGX-1 系统的高速集群。四个 EDR IB 端口可平衡节点内和节点间带宽,在某些情况下,这些带宽可以被节点间通信完全占用。在大型多系统集群中与以太网等经典网络技术相比,InfiniBand 能提供 20 倍的带宽和 低4 倍的延迟。DGX-1 多系统集群使用基于fat tree的网络拓扑,提供系统间的可预测、无争用的路由通信:

  • fat tree是一种树状结构的网络拓扑,其叶子上的系统通过多个交换机连接到中央顶级交换机 
  • fat tree中的每一级有相同数量的链路,提供相等的带宽
  • fat tree拓扑结构确保了计算和深度学习应用中常见的all-to-all或all-gather集合通信的最高bisection bandwidth和最低延迟 18.png

DGX-1性能

下图显示了使用 Microsoft Cognitive Toolkit、TensorFlow 和 Torch 的 ResNet-50 和 ResNet-152 深度神经网络在不同硬件系统上的速度比较: 19.png 这张图说明:

  1. 在深度学习训练方面,DGX-1 比上一代 NVIDIA Tesla M40 GPU 吞吐量高得多
  2. DGX-1 的性能明显高于使用 PCIe 互连的 8 个 Tesla P100 GPU 的系统

DGX-1 V100

NVIDIA DGX-1 是专为深度学习设计的高吞吐量和高互连带宽的系统,可最大限度地提高神经网络训练性能。该系统的核心是由 8 个 Tesla V100 GPU 通过NVLink组成的hybrid cube-mesh网络拓扑。除了 8 个 GPU 之外,DGX-1 还包括两个 CPU,用于启动、存储管理和深度学习框架协调。DGX-1 内置于3U机箱中,可提供电源、冷却、网络、多系统互连和 SSD 文件系统缓存。

DGX-1 系统架构

DGX-1 配置了以太网和 InfiniBand (IB) 网络接口。两个 10 Gb 以太网接口提供系统的远程访问能力。为了连接多个 DGX-1 系统,每个系统都有四个高带宽、低延迟的 EDR IB(Extended Data Rate InfiniBand)端口,提供 800 Gb/s 的双向通信。DGX-1 系统里每两个 GPU 共享一个 IB 端口。此外,DGX-1 EDR IB 与 NVIDIA GPUDirect RDMA兼容,能够将数据直接从一个系统中的 GPU 内存传输到另一个系统中的 GPU 内存,而无需涉及 CPU 或系统内存。 20.png

DGX-1网络拓扑

8 个GPU 组成的hybrid cube-mesh网络可以看作是使用NVLink 连接的三个交织的双向环。以这种方式处理拓扑可确保除all-to-all之外的集合通信的性能在很大程度上是等效的。 21.png 22.png 深度学习训练时 GPU 间传输使用这三个不同的双向环。每个 Volta GPU有6个NVLink,每个环连接所有八个 GPU。通过这种方法,reduction和broadcast可以以超过 130 GB/s 的速度执行,而在前几代硬件上使用 PCIe 的速度为 10 GB/s。这种性能对于实现深度学习训练的高扩展性至关重要。

DGX-1网络

除了用于 GPU 内部高速通信的 NVLink 外,DGX-1 还使用 Mellanox ConnectX-4 EDR 100Gb InfiniBand 端口提供系统间极低延迟和高带宽的通信,以减少瓶颈。在 DGX-1 中配置的最新 InfiniBand 标准 EDR IB 提供:

  • 四个 EDR IB 端口,为每个 DGX-1 系统提供 400 Gb/s 输入和 400 Gb/s 输出带宽
  • 低延迟通信和内置集合通信原语,可加速跨多个系统的大型计算
  • 支持高性能网络拓扑,可同时在多个系统之间以最小的冲突传输数据
  • NVIDIA GPUDirect RDMA 使用InfiniBand,在多个系统的 GPU 之间直接传输数据

DGX-1 配置了四个 EDR IB 端口,提供 800 Gb/s 的双向总带宽,可用于构建 DGX-1 系统的高速集群。四个 EDR IB 端口可平衡节点内和节点间带宽,在某些情况下,节点间通信可以完全利用这些带宽。与以太网等经典网络技术相比,即使在大型多系统集群中,InfiniBand 也能提供 20 倍的带宽和 4 倍的更低延迟。 23.png 从应用程序的角度来看,GPUDirect RDMA,独特的 NVLink 和 IB 网络设计使任何 GPU 核能够以最小的开销、延迟和争用直接访问网络中任何其他 GPU 的内存。

下图展示了 124 个DGX-1组成的系统,每个一级交换机支持 4 个 DGX-1 系统,最多可配置 32 个一级交换机和 16 个二级交换机,最多支持 128 个系统: 24.png 使用的fat-tree拓扑结构可扩展到具有更多交换机的更大配置,同时仍保持 InfiniBand 的高性能。为了扩大规模,将添加第三级交换机,或者将控制器级 IB 交换机用于 2 级交换机。

DGX-1性能

与 Tesla P100 GPU 相比,Tesla V100 GPU 提供了更高的性能。

  • V100 的 FP32 CUDA 核增加了 40%
  • 它还增加了新的 Tensor Core,可以为混合精度矩阵乘法和累加提供高达 8 倍的吞吐量,这是深度神经网络中的核心计算
  • Tesla V100 还具有更高的峰值内存带宽和更快的第二代 NVLink 互连

下图展示了在不同框架训练 ResNet-50 卷积神经网络性能上,与使用上一代 NVIDIA Tesla P100 GPU 的 DGX-1 相比,使用 V100 GPU 的 DGX-1 实现了更高的吞吐量。 25.png 下表展示了DGX-1 P100和DGX-1 V00两者对比: 26.png

NCCL

NVIDIA Collective Communication Library(NCCL,发音为“Nickel”)是一个拓扑感知的多 GPU 集合通信库,可以轻松集成到应用程序中。NCCL最初是作为一个开源研究项目开发的,它被设计为轻量级的,并且仅依赖于常见的C++和CUDA库。NCCL 可以部署在单进程或多进程应用程序中,透明地处理所需的进程间通信。任何具有使用 MPI 集合如broadcast, reduce, gather, scatter, all-gather, all-reduce, 或all-to-all经验的人都会熟悉NCCL API 。 有许多方法可以有效地实现集合通信。但是,高效的实现必须考虑处理器之间互连的拓扑结构。为了说明这一点,请考虑从 GPU0 向下图中 PCIe 树拓扑中的所有其他 GPU 广播数据。 27.png 为了优化Broadcast带宽,更好的方法是将 PCIe 树形拓扑视为一个环,如下图所示。然后,将数据分成小块通过环从 GPU0 中继到 GPU3 来执行Broadcast。有趣的是,只要选择了正确的环形顺序,环形算法也能为几乎所有标准集合操作提供近乎最佳的带宽,即使应用于树状PCIe拓扑也是如此。为了提供最大带宽,NCCL 实现了环式集合通信算法,并在后台隐式地将 GPU 索引到最佳环形顺序中。这为应用程序提供了出色的性能,同时使开发人员不必担心特定的硬件配置。 28.png

DGX-2 V100

DGX-2 单个系统包含 16 个 NVIDIA Tesla V100 32 GB GPU ,两个 24 核 Xeon CPU,1.5 TB DDR4 DRAM 内存和 30 TB NVMe 存储,可提供 2 petaFLOPS 的性能,所有GPU都使用NVLink通过 NVSwitch连接。NVSwitch 有18 个NVLink端口,每个基板上都有六个 NVSwitch 芯片,可以与另一个基板通信。如下图所示: 29.png 与两个 DGX -1(通过 InfiniBand 连接)相比,NVSwitch连接16 个 GPU组成的 DGX-2 可以提供更高的带宽和更低的延迟。 30.png

DGX A100

DGX A100 具有 5 petaFLOPS 的 AI 性能,在所有 AI 工作负载上都表现出色。具体配置如下所示: 31.png

DGX系统架构

下图显示了 NVIDIA DGX A100 系统中主要组件的分解图: 32.png

DGX网络拓扑

下图展示了DGX A100 系统网络拓扑: 33.png DGX A100 系统包含6个NVSwitch 2.0,每个 A100 GPU 使用 12 个 NVLink 与 6 个 NVSwitch 进行互联通信,因此每个 GPU 到每个交换机都有两条链路。

DGX网络

除了用于 GPU 内部高速通信的 NVLink 外,DGX A100 还有 8 个单端口 Mellanox ConnectX-6 200Gb/s HDR InfiniBand 端口(也可配置为 200Gb/s 以太网端口),提供 3.2 Tb/s 的峰值带宽,可用于构建 基于DGX A100 系统(如 NVIDIA DGX SuperPOD)的高速集群。可以使用 Mellanox ConnectX-6 ,通过RDMA来进行GPU间数据传输。DGX A100 在 IO 卡和 GPU 之间建立了一对一的连接,每个 GPU 都可以直接与外部通信,而不会阻止其他 GPU 的网络访问。Mellanox ConnectX-6 I/O 卡可配置为 HDR InfiniBand 或 200Gb/s 以太网,因此 NVIDIA DGX A100 可以使用低延迟、高带宽 InfiniBand 或RDMA over Converged Ethernet(RoCE)与其他节点集群一起运行 HPC 和 AI 任务。DGX A100 包括一个额外的双端口 ConnectX-6 卡,可用于高速连接到外部存储器。

DGX A100 多系统集群使用基于fat tree拓扑的网络,利用先进的 Mellanox 自适应路由和Sharp集合,提供从系统间良好路由、可预测、无争用的通信。

DGX性能

DGX A100 在深度学习训练和推理方面相比DGX-1 V100或CPU提供更高性能,如下图所示: 34.png

NVIDIA DGX SuperPOD

NVIDIA DGX SuperPOD是由DGX A100 组成的集群系统,包括:

  • 140 个 DGX A100 系统
  • 1,120 个 NVIDIA A100 GPU
  • 170 个 Mellanox Quantum 200G InfiniBand 交换机
  • 15Km光缆
  • 4PB 高性能存储

具体硬件参数如下: 35.png

DGX SuperPod架构

DGX SuperPOD 的基本单元是 SU,单个 SU由 20 个 DGX A100 系统组成,算力 48 PFLOPS。DGX A100 系统具有 8 个用于计算流量的 HDR (200 Gbps) InfiniBand 主机通道适配器HCA(host channel adapters)。每对 GPU 都有一对关联的 HCA。为了实现最高效的网络,有八个网络平面,每个平面一个叶交换机和 一个HCA,一共使用 8 个叶交换机进行连接。这些平面通过主干交换机在网络的第二层互连。每个SU都具有完整的bisection bandwidth,以确保最大的应用灵活性。每个 SU 都有一个专用的管理机架,叶交换机集中放置在管理机架中。

DGX SuperPOD 的其他设备(例如二级主干交换机或管理服务器)可能位于 SU 管理机架的空白空间或单独的机架中,具体取决于数据中心布局。

DGX SuperPod网络架构

DGX SuperPOD 有四个网络:

  • 计算网络 每个 DGX A100 系统通过单独的网络平面连接8 个 NVIDIA HDR 200 Gb/s ConnectX-6 HCA
  • 存储网络 通过 CPU 连接的两个双端口 ConnectX-6 HCA,每个提供一个端口
  • 带内管理 使用 DGX A100 系统上的两个 100 Gbps 端口连接到专用以太网交换机
  • 带外管理 每个 DGX A100 系统上的基板管理控制器(BMC)端口连接到其他以太网交换机

下图展示了DGX A100系统的各类网络接口: 36.png

DGX SuperPod计算网络

计算网络设计最大限度地提高 AI 任务的典型通信流量的性能,并在发生硬件故障时提供冗余,最大限度地降低成本。

DGX SuperPod计算网络里使用到的InfiniBand 交换机分为以下几类:

  • 叶交换机(leaf switch) 每个 SU 有 8 个叶交换机。SU 中的 DGX A100 系统连接到每个叶交换机,每个系统中所有相同的 HCA 都连接到同一个叶交换机
  • 脊柱组SG(Spine group) 10 个 QM8790 交换机组成 SG,用于优化网络。由于每个 DGX A100 系统有 8 个 InfiniBand 模块,因此需要 8 个 SG
  • 核心组CG (Core group) 14 个 QM8790 交换机组成 CG,用于连接 SG。140 个节点需要两个 CG

每个 SU 的第一个叶交换机连接到 SG1 中的每个交换机,每个 SU 的第二个枝叶交换机连接到 SG2 中的每个交换机,依此类推。需要第三层交换才能完成fat-tree拓扑:

  • 每个 SG 里奇数交换机连接到CG1
  • 每个 SG 里偶数交换机连接到CG2

下图展示了140 节点 DGX SuperPOD 的计算拓扑结构: 37.png 下图展示了80 节点 DGX SuperPOD 的计算拓扑结构: 38.png

DGX SuperPod存储网络

存储网络采用 InfiniBand 网络以提供高带宽支持。因为DGX SuperPOD 的每个节点的 I/O 必须超过 40 GBps,而InfiniBand为存储网络提供了高带宽和高级网络管理功能(如拥塞控制和自适应路由)。 39.png

带内管理网络InBand Management Network

带内以太网网络具有以下几个重要功能:

  • 连接管理集群的所有服务
  • 允许访问主文件系统和存储池
  • 为集群内服务(如 Slurm)以及与集群外部的其他服务(如 NGC 注册表、代码仓库和数据源)提供连接 40.png

带外管理网络Out-of-Band Management Network

带外以太网网络用于通过 BMC 进行系统管理,并提供连接以管理所有网络设备。带外管理对于群集的运行至关重要,它提供了低使用率路径,可确保管理流量不会与其他群集服务冲突。

带外以太网交换机的上行链路可以连接到带内叶交换机,也可以连接到客户的带外网络。所有以太网交换机都通过串行连接连接到数据中心的现有控制台服务器。发生网络故障时这些连接提供了与交换机连接的最后手段。

DGX H100

NVIDIA DGX H100 是基于最新 NVIDIA H100 Tensor Core GPU 的 DGX 系统,包含:

  • 8 个 NVIDIA H100 Tensor Core GPU,具有 640GB 总 GPU 内存
  • 4 个NVIDIA NVSwitch 3.0
  • 18 个 NVLink 网络 OSFP
  • 由 72 个 NVLink 提供 3.6 TB/s 的全双工 NVLink 网络带宽
  • 8 个 NVIDIA ConnectX-7 以太网/InfiniBand 端口
  • 2 个双端口 BlueField-3 DPU
  • 2 个Sapphire Rapids CPU
  • 支持 PCIe Gen 5

在 DGX H100 中,每个 H100 Tensor Core GPU 连接到所有NVSwitch 3.0,流量通过四个不同的交换机平面发送,从而实现链路的聚合,以实现系统中 GPU 之间的all-to-all带宽。 41.png

DGX H100 SuperPod

DGX H100 SuperPOD由DGX H100作为基本单元组成:

  • 有8个计算机架,每个机架有四台 DGX H100
  • 共有 32 个 DGX H100 节点,包含 256 个 NVIDIA H100 Tensor Core GPU
  • 提供高达 1 exaflop 的峰值性能

NVLink 网络提供了256 个 GPU间 57.6 TB/s 的bisection带宽 。此外,32 个 DGX里的 ConnectX-7 和关联的 InfiniBand 交换机提供了 25.6 TB/s 的全双工带宽,可在 Pod 内使用或横向扩展多个 SuperPOD。

结合新的 NVLINK 网络拓扑和NVSwitch 3.0,NVIDIA 能够构建高带宽的大规模 NVLink 交换网络。节点通过 NVLink 交换机模块中的第二级 NVSwitch 连接在一起,这些模块位于计算节点外部,并将多个节点连接在一起。NVLink 交换机系统最多支持 256 个 GPU。连接的节点可以提供 57.6 TB 的all-to-all 带宽,并可以提供1 exaFLOP FP8 稀疏性能。

下图显示了基于 A100 和 H100 的 32 个节点、256 个 GPU DGX SuperPOD 的比较。基于 H100 的 SuperPOD 内DGX 节点使用新的 NVLink 交换机来互连。 42.png NVLink 网络互连采用 2:1 锥形fat tree拓扑结构,可将bisection带宽惊人地增加 9 倍(例如,用于all-to-all交换),并且与上一代 InfiniBand 系统相比,all-reduce吞吐量增加了 4.5 倍。DGX H100 SuperPOD的 NVLINK 交换机系统作为可选项。

Grace Hopper Superchip

NVIDIA Grace Hopper Superchip架构通过内存一致性的NVLink-C2C将 NVIDIA Hopper GPU与 NVIDIA Grace CPU 的结合在一起,组合成单个超级芯片,并支持新的 NVIDIA NVLink 交换机系统。下图展示了NVIDIA Grace Hopper 超级芯片逻辑框图: 43.png NVLink-C2C 是NVIDIA 内存一致性、高带宽和低延迟的超级芯片互连。它是 Grace Hopper 超级芯片的核心,可提供高达 900 GB/s 的总带宽。NVLink-C2C 内存一致性可提高开发人员的工作效率和性能,并使 GPU 能够访问大量内存。CPU 和 GPU 线程现在可以同时透明地访问 CPU 和 GPU 驻留的内存,开发人员能够专注于算法,而不是显式内存管理。

内存一致性可以仅传输所需的数据,而不是将整个页面迁移到 GPU 或从 GPU 迁移整个页面;还可以通过 CPU 和 GPU 的原子操作,提供跨 GPU 和 CPU 线程轻量级同步原语。NVLink-C2C支持ATS(Address Translation Services)NVIDIA Hopper DMA引擎可以利用ATS来加速主机和设备之间可分页内存的批量传输。

NVLink-C2C 使应用程序能够超额订阅 GPU 的内存,并以高带宽直接访问 NVIDIA Grace CPU 的内存。每个 Grace Hopper 超级芯片的CPU有512 GB的 LPDDR5X 内存 。结合 NVIDIA NVLink 交换机系统,在多达 256 个通过NVLink 连接的 GPU 上运行的所有 GPU 线程现在都可以在高带宽下访问高达 150 TB 的内存。NVLink 4 支持使用直接加载、存储和原子操作访问对端内存,使加速应用程序能够更轻松地解决更大的问题。

NVIDIA Grace Hopper 超级芯片的主要特性如下:

  • NVIDIA Grace CPU:
    • 72 个 Arm Neoverse V2 内核,每个内核支持Armv9.0-A ISA 和 4×128 位 SIMD 单元
    • 117 MB 的 L3 缓存
    • 512 GB 的LPDDR5X内存,提供高达 546 GB/s 的内存带宽
    • 64 个 PCIe Gen5 通道
    • NVIDIA SCF(Scalable Coherency Fabric) 片上互联和分布式缓存,带宽 3.2 TB/s
    • 单个 CPU NUMA 节点,提高开发人员的工作效率
  • NVIDIA Hopper GPU:
    • 144 个 SM,配备第四代 Tensor Core、Transformer Engine、DPX
    • 96 GB 的 HBM3 内存,提供 3000 GB/s 的速度
    • 60 MB 二级缓存
    • NVLink 4 和 PCIe 5
  • NVIDIA NVLink-C2C:
    • 提供Grace CPU 和 Hopper GPU 之间的硬件一致性互连
    • 900 GB/s 的总带宽,450 GB/s/dir
    • 扩展 GPU 内存功能,Hopper GPU 能够将所有 CPU 内存作为 GPU 内存进行寻址。每个 Hopper GPU 可以在超级芯片可访问 608 GB 的内存
  • NVIDIA NVLink 交换机系统:
    • 使用 NVLink 4 连接 256 个 NVIDIA Grace Hopper 超级芯片
    • 每个NVLink 连接的 Hopper GPU 都可以寻址网络中所有超级芯片的HBM3 和 LPDDR5X 内存,一共150 TB 的 GPU 可寻址内存

NVIDIA GH200 Grace Hopper 超级芯片配备96GB HBM3 内存,提供 4TB/s 的内存带宽。而新一代 NVIDIA GH200 Grace 有 144GB 的 HBM3e,提供4.9TB/s带宽。NVIDIA Grace Hopper 中的 HBM 与 CPU 通过 NVLink-C2C相结合, 可以为 GPU 提供高达 624GB 的快速存取内存。

NVIDIA Grace CPU有72 Arm Neoverse V2 CPU,可提供领先的每线程性能,同时提供更高的能效比; 480GB 的LPDDR5X内存支持500GB/s带宽;片内一致性互联可提供3.2TB/s 的带宽,可支持CPU核、内存、IO 和 NVLink-C2C带宽需求。

NVIDIA Hopper 是第九代 NVIDIA 数据中心 GPU,线程块集群(Thread Block Clusters)和线程块重配置(Thread Block Reconfiguration)可改善数据在空间和时间上的局部性,并结合新的异步执行引擎,使应用程序高效使用计算单元。

NVIDIA 开发了两个平台来满足不同的客户需求:

  • NVIDIA MGX GH200 单个节点624GB 的内存,可以运行各种工作负载;当与 NVIDIA 网络解决方案(Connect-X7、Spectrum-X 和 BlueField-3 DPU)结合使用时,使用传统的 HPC/AI 集群网络架构,易于管理和部署
  • NVIDIA DGX GH200 通过NVLink 连接的256个 GPU的所有线程能够以900GB/s 的总带宽、450GB/s 的all-reduce带宽和 115.2TB/s 的bisection带宽访问144TB 的内存

NVIDIA MGX 采用 InfiniBand 网络,每个节点包含一个 Grace Hopper 超级芯片和一个或多个 PCIe 设备,如 NVMe 固态硬盘和 BlueField-3 DPU、NVIDIA ConnectX-7 NIC 或 OEM 定义的 I/O。NDR400 InfiniBand NIC 利用16 个 PCIe Gen 5 通道,可提供100GB/s 的总带宽。 44.png NVIDIA DGX GH200则采用NVSwitch交换网络, 每个 Hopper GPU 能够以 900GB/s 的总带宽与 NVLink网络中的任何其他 GPU 进行通信。NVLink TLB 使单个 GPU 能够寻址所有 NVLink 连接的内存,即NVLink 连接的 256 个节点系统的144TB内存。一个 Pod 中最多可使用 NVLink 连接 256 个超级芯片,InfiniBand NIC 和交换机将多个超级芯片 Pod 连接在一起。NVLink-C2C 和 NVLink 交换机系统在 NVLink 网络内的所有超级芯片之间提供硬件一致性。 45.png

编程模型

NVIDIA 为 CUDA 平台提供下列语言支持: • ISO C++ • ISO Fortran • Python

以及基于指示的编程模型,例如: • OpenACC • OpenMP • CUDA C++ • CUDA Fortran
46.png

DGX GH200

NVIDIA Grace Hopper 超级芯片和 NVLink 交换机系统是 NVIDIA DGX GH200 架构的构建块。NVIDIA Grace Hopper 超级芯片使用 NVIDIA NVLink-C2C 结合了 Grace 和 Hopper 架构,以提供 CPU + GPU 一致性内存模型。NVLink 交换机系统采用 NVLink 4技术,将 NVLink 连接扩展到超级芯片之间,以创建无缝、高带宽、多 GPU 系统。

NVIDIA DGX GH200 中的每个 NVIDIA Grace Hopper 超级芯片有 480 GB LPDDR5 CPU 内存,每 GB 功耗只有DDR5的八分之一;96 GB 的HBM3。NVIDIA Grace CPU 和 Hopper GPU通过NVLink-C2C 互连,提供比 PCIe Gen5 高 7 倍的带宽,功耗仅为 PCIe Gen5 的五分之一。

NVLink 交换机系统形成一个两级、无阻塞、fat-tree拓扑的NVLink网络,对系统中256 个 Grace Hopper 超级芯片提供全连接。DGX GH200 中的每个 GPU 都可以以 900 GBps 的速度访问其他 GPU 的内存和所有 NVIDIA Grace CPU 的内存。托管 Grace Hopper 超级芯片的计算基板使用用于 NVLink 结构第一层的定制电缆线束连接到 NVLink 交换机系统。LinkX 电缆扩展了 NVLink 结构第二层的连接。下图展示了使用NVSwitch对256 个 GPU 进行互联组成的 NVIDIA DGX GH200的NVLink网络拓扑 47.png 在 DGX GH200 系统中,GPU 线程可以通过NVLink page table来访问等NVLink 网络中其他 Grace Hopper 超级芯片的HBM3和LPDDR5X。NVIDIA Magnum IO加速库则针对256 个 GPU的系统优化了 GPU 通信。DGX GH200 中的每个 Grace Hopper 超级芯片适配一个 NVIDIA ConnectX-7网络适配器和一个 NVIDIA BlueField-3 NIC;DGX GH200提供128 TBps 的bisection带宽和 230.4 TFLOPS 的 NVIDIA SHARP 网内计算性能,可加速 AI 中常用的集合操作;通过减少集合操作的通信开销,使 NVLink 网络系统的有效带宽翻倍。

可以通过ConnectX-7 互连多个 DGX GH200 系统扩展到 256 个以上GPU。而BlueField-3 DPU 则可支持虚拟私有云,使组织能够在安全的多租户环境中运行应用程序。

参考文献

  1. NVIDIA DGX-1: The Fastest Deep Learning System [WWW Document], 2017. . NVIDIA Technical Blog. URL https://developer.nvidia.com/blog/dgx-1-fastest-deep-learning-system/
  2. Announcing NVIDIA DGX GH200: The First 100 Terabyte GPU Memory System [WWW Document], 2023. . NVIDIA Technical Blog. URL https://developer.nvidia.com/blog/announcing-nvidia-dgx-gh200-first-100-terabyte-gpu-memory-system/
  3. NVIDIA Grace Hopper Superchip Architecture In-Depth NVIDIA Technical Blog [WWW Document], n.d. URL https://developer.nvidia.com/blog/nvidia-grace-hopper-superchip-architecture-in-depth/
  4. NVIDIA Ampere Architecture In-Depth [WWW Document], 2020. . NVIDIA Technical Blog. URL https://developer.nvidia.com/blog/nvidia-ampere-architecture-in-depth/
  5. Defining AI Innovation with NVIDIA DGX A100 [WWW Document], 2020. . NVIDIA Technical Blog. URL https://developer.nvidia.com/blog/defining-ai-innovation-with-dgx-a100/
  6. NVSwitch Accelerates NVIDIA DGX-2 NVIDIA Technical Blog [WWW Document], n.d. URL https://developer.nvidia.com/blog/nvswitch-accelerates-nvidia-dgx2/
  7. dgx1-v100-system-architecture-whitepaper
  8. NVIDIA GH200 Grace Hopper Superchip Architecture
  9. A. Ishii and R. Wells, “The Nvlink-Network Switch: Nvidia’s Switch Chip for High Communication-Bandwidth Superpods,” 2022 IEEE Hot Chips 34 Symposium (HCS), Cupertino, CA, USA, 2022, pp. 1-23, doi: 10.1109/HCS55958.2022.9895480.
  10. Y. Wei et al., “9.3 NVLink-C2C: A Coherent Off Package Chip-to-Chip Interconnect with 40Gbps/pin Single-ended Signaling,” 2023 IEEE International Solid-State Circuits Conference (ISSCC), San Francisco, CA, USA, 2023, pp. 160-162, doi: 10.1109/ISSCC42615.2023.10067395.
  11. D. Foley and J. Danskin, “Ultra-Performance Pascal GPU and NVLink Interconnect,” in IEEE Micro, vol. 37, no. 2, pp. 7-17, Mar.-Apr. 2017, doi: 10.1109/MM.2017.37.
]]>
from DianNao to Cambricon|The evolution of AI Accelerator http://zhifeiding.github.io/programming/history/2024/01/31/from-DianNao-to-Cambricon-The-Evolution-of-AI-Accelerator/ 2024-01-31T00:00:00+00:00 http://zhifeiding.github.io/programming/history/2024/01/31/from-DianNao-to-Cambricon-The-Evolution-of-AI-Accelerator 前言

从2012年AlexNet引发的AI热潮,到今天已经过去10多年了,AI仍然是当前最火热的话题。寒武纪的前身是DianNao学术项目,起源于2012年的神经网络加速器,可以说是随着AI技术一起发展。因此,了解DianNao项目如何从最开始的DianNao神经网络专用架构,演进到通用的Cambricon指令集和加速器。这一演进历史也可以看着是AI加速器的进化之路,不仅是了解AI这10多年发展的一个窗口,更有助我们自己设计AI加速器和指令集。

概述

DianNao项目的目标是面向机器学习研究加速器架构。本项目是中科院计算所的陈云霁教授和法国Inria的Olivier Temam间的一个学术合作项目,双方为此设立了联合实验室。Temam教授和陈教授的合作始于DianNao, DianNao在ISCA-2012加速器的基础上增加了局部存储,使其可以捕捉深度神经网路的数据局部性并由此克服内存带宽的限制。DianNao加速器的设计发表于ASPLOS-2014,获得了该会议的最佳论文奖。

DaDianNaoDianNao家族的第二个加速器,是DianNao的多片版本,有两个主要的设计目标:一是揭示神经网络层的可分特性使得加速器可具备极好的可扩展性,二是聚集足够多的片上存储来将整个机器学习模型都放在片上,从而克服内存带宽的限制。这个被称为DaDianNao的设计发表在MICRO-2014上,获得了该会议的最佳论文奖。

ShiDianNaoDianNao家族的第三个加速器,为了克服嵌入式应用中内存带宽限制,通过加速器和传感器的直连来绕过内存,发表于2015年的ISCA上。

PuDianNaoDianNao家族的第四个加速器,拓展至多种机器学习算法,因为这些算法多具有类似的运算操作,发表于ASPLOS-2015。

陈云霁教授和中科院计算所团队为一大类神经网络加速器设计了一套名为Cambricon的指令集。该指令集发表于ISCA-2016,在该会议的同行评议中获得了最高分。

本文通过系统性回顾整个DianNao系列加速器,试图通过DianNao系列加速器发展的历史脉络,来展现最近10年AI计算架构的变迁,技术的演进,进而窥见计算技术发展的未来。

本文组织形式如下:

  • 第一章介绍DianNao解决的问题,硬件架构,存储结构以及编程模型
  • 第二章介绍DaDianNao面向的问题,硬件架构,存储结构以及编程模型
  • 第三章介绍ShiDianNao解决的问题,硬件架构,存储结构以及编程模型
  • 第四章介绍PuDianNao面向的问题,硬件架构,存储结构以及编程模型
  • 第五章介绍Cambricon指令集,加速器原型硬件架构,存储结构以及编程模型
  • 文章最后列出了主要的参考文献

DianNao

神经网络结构

DianNao是面向机器学习的加速器架构,所以,在介绍具体硬件架构之前,需要先了解要解决的问题;对于DianNao,解决问题局限在采用神经网络的机器学习算法。通常,这些神经网络算法由很多层组成,这些层按顺序独立执行;每层包括几个特征映射子层,分别称为输入特征映射和输出特征映射。总体而言,主要有三种层,卷积层,池化层和分类层。如下图所示: Pasted image 20240126161408.png

  • 卷积层(Convolutional layers) 卷积层主要是在输入层上应用一个或多个filters;因此,输入和输出特征层之间的连接是局部的,而非全连接;一般后面会使用一个非线性函数处理输出
  • 池化层(Pooling layers) 又称作下采样,主要是用于在输入数据里聚焦信息;通常会导致特征映射的维度减少
  • 分类层(Classifier layers) 在很深的神经网络结构里,卷积层和池化层一般交织组成主要结构,而最后通常是一个分类层。和卷积层类似,一般会使用一个非线性函数处理输出,通常是sigmoid, 比如 $f (x) = \frac{1}{1+e^{−x}}$ ; 和卷积层或池化层不同的是,分类层通常会在所有特征映射里聚焦信息

硬件架构

DianNao采用65nm工艺,设计了一个3.02mm2,功耗485mW的加速器,运行在0.98GHz,每秒可完成452GOP;相比2GHZ,128位的SIMD处理器,加速器快了117.87倍,而且功耗降低了21.08倍;下图展示了加速器的物理版图: Pasted image 20240126155426.png

加速器主要由下列三部分组成:

  • NBin 存储输入神经元的输入缓冲
  • NBout 存储输出神经元的输出缓冲
  • SB 存储权重的缓冲
  • NFU(Neural Functional Unit) 计算单元
  • CP 控制逻辑

整体架构框图如下所示: Pasted image 20240126160529.png NFU流水线由3部分组成,分别是NFU-1,NFU-2和NFU-3;其中

  • NFU-1 主要对应分类层和卷积层,由256个16位截位乘法器组成;
  • NFU-2 由16个加法树组成,每个加法树包含15个加法器,也对应分类层和卷积层,如果池化层使用平均池化也会使用;另外还有一个主要用于池化层的16输入的移位器和最大比较器;
  • NFU-3 则有16个16位截位乘法器和16个加法器,主要用于分类层和卷积层,池化层也可能会用到

对于分类层和卷积层,NFU-1和NFU-2每个周期都会激活,每周期可以完成256 + 16 × 15 = 496个定点操作;而在每层操作最后,NFU-3可能会激活,同时NFU-1和NFU-2继续处理剩下的数据,所以短时间内可以实现每周期496 + 2 × 16 = 528个操作。

NFU主要核心是将一个层分解到16x16的计算模块上,主要需要用到tiling,具体可以参考编程模型里的伪代码。

NFU-3里sigmoid函数使用插值算法,同时使用一块RAM存储16段系数;因此,可以通过更新RAM里的系数来调整实现的函数。

存储

加速器采用scratchpad来作为存储结构,而不是通常的缓存,因为scratchpad可以通过软件实现局部性复用,而免去缓存带来的复杂性。DianNao将存储分成三块:NBin, NBout和SB;分开存储的目的主要是降低功耗和减少数据存储的冲突;存储结构上有如下这些特性:

  • DMA 为了利用空间局部性,每个缓冲都实现了一个DMA;DMA请求通过指令方式发射到NBin,这些请求会被对应缓冲里的FIFO接收,当DMA完成上一个存储请求之后会按顺序处理FIFO里剩下的请求;这种方式允许提前加载缓冲来避免长时间的延迟。NBin和SB同时充当了预加载缓冲和复用缓冲,所以使用了双口SRAM。
  • NBin数据复用 所有的输入层数据都被分割成NBin大小的块,通过将NBin实现成环形缓冲,可以实现数据的复用。硬件实现上只需要更新寄存器的索引,而不需要实际移动数据。
  • NBin数据转置 卷积层和池化层在数据结构上有冲突,卷积层需要所有维度的数据来计算输出,而池化层则针对每一个维度计算;因此,当操作池化层从NBin里加载数据时会对数据进行转置操作之后送到NFU。
  • 部分和专用寄存器 NBin里数据计算出部分和之后,不是写回到内存,而是保存到NFU-2里的专用寄存器,从而不必将部分和移除NFU流水线,减少功耗。
  • 复用NBout NBout只在最后用来保存输出到内存的数据,因此,只要最后结果没有计算出来,NBout一直处于空闲状态;所以,可以利用NBout来保存部分和。NBout不仅需要和NFU-3以及 内存连接,还需要连接NFU-2;NBout里的数据可以加载到NFU-2里的专用寄存器,这些寄存器也可以保存到NBout。

编程模型

由于DianNao里存储结构和计算单元的限制,对原始的计算必须采用切片(tiling)才能适配到加速器上,下面分别展示了卷积层,池化层和分类层采用切片之后的伪代码。 卷积层伪代码,包括对空间局部性的优化:

for (int yy = 0; yy ¡ Nyin; yy += Ty) {
	for (int xx = 0; xx ¡ Nxin; xx += Tx) {
		for (int nnn = 0; nnn ¡ Nn; nnn += Tnn) {
			// — Original code — (excluding nn, ii loops)
			int yout = 0;
			for (int y = yy; y < yy + Ty; y += sy) { // tiling for y;
				int xout = 0;
				for (int x = xx; x < xx + Tx; x += sx) { // tiling for x;
					for (int nn = nnn; nn < nnn + Tnn; nn += Tn) {
						for (int n = nn; n < nn + Tn; n++)
							sum[n] = 0;
						// sliding window;
						for (int ky = 0; ky < Ky; ky++)
							for (int kx = 0; kx < Kx; kx++)
								for (int ii = 0; ii < Ni; ii += Ti)
									for (int n = nn; n < nn + Tn; n++)
										for (int i = ii; i < ii + Ti; i++)
											// version with shared kernels
											sum[n] += synapse[ky][kx][n][i] * neuron[ky + y][kx + x][i];
											// version with private kernels
											sum[n] += synapse[yout][xout][ky][kx][n][i]} * neuron[ky + y][kx + x][i];
						for (int n = nn; n < nn + Tn; n++)
							neuron[yout][xout][n] = non linear transform(sum[n]);
					}
					xout++;
				}
				yout++;
			}
		}
	}
}

池化层伪代码,包括对空间局部性的优化:

for (int yy = 0; yy ¡ Nyin; yy += Ty) {
	for (int xx = 0; xx ¡ Nxin; xx += Tx) {
		for (int iii = 0; iii ¡ Ni; iii += Tii) {
			// — Original code — (excluding ii loop)
			int yout = 0;
			for (int y = yy; y < yy + Ty; y += sy) {
				int xout = 0;
				for (int x = xx; x < xx + Tx; x += sx) {
					for (int ii = iii; ii < iii + Tii; ii += Ti) {
						for (int i = ii; i < ii + Ti; i++)
							value[i] = 0;
						for (int ky = 0; ky < Ky; ky++) {
							for (int kx = 0; kx < Kx; kx++) {
								for (int i = ii; i < ii + Ti; i++)
									// version with average pooling;
									value[i] += neuron[ky + y][kx + x][i];
									// version with max pooling;
									value[i] = max(value[i], neuron[ky + y][kx + x][i]);
							}
						}
					}
				}
				// for average pooling;
				neuron[xout][yout][i] = value[i] / (Kx * Ky);
				xout++;
			}
			yout++;
		}
	}
}

分类层伪代码,包括对空间局部性的优化:

for (int nnn = 0; nnn ¡ Nn; nnn += Tnn) { // tiling for output neurons;
	for (int iii = 0; iii ¡ Ni; iii += Tii) { // tiling for input neurons;
		for (int nn = nnn; nn ¡ nnn + Tnn; nn += Tn) {
			for (int n = nn; n ¡ nn + Tn; n++)
				sum[n] = 0;
			for (int ii = iii; ii ¡ iii + Tii; ii += Ti)
				// — Original code
				for (int n = nn; n < nn + Tn; n++)
					for (int i = ii; i < ii + Ti; i++)
						sum[n] += synapse[n][i] * neuron[i];
			for (int n = nn; n < nn + Tn; n++)
				neuron[n] = sigmoid(sum[n]);
		}
	}
}

每一层都被分解成一系列的指令来执行;大致上,一个指令对应于分类层和卷积层伪代码里的循环ii,i和n;池化层里的循环ii,i。指令保存在CP里的SRAM里,并驱动三个缓冲里的DMA和NFU执行。硬件上,这些指令实际是一个可配置的状态机完成的。每个指令有五个槽,分别对应CP,三个缓冲和NFU,具体格式如下所示: Pasted image 20240129111628.png 对于DianNao,只有三种主要类型的代码,所以针对三个层,实现了专门的代码生成器,而不是编译器。下面以一个分类层生成的代码为例说明 Pasted image 20240129111733.png NBin一共2KB,分成64行,每行可以存储16个16位数据;而一共有8192个16位数据,即16KB,所以需要对数据按照2KB来分片。第一个指令里NBin是LOAD (从内存加载数据), 并且标记为复用;接下来一个指令里NBin是READ,因为数据保存在环形缓冲里,并且也标记为复用,因为数据切片成8份; 同时,这两条指令的NFU-2输出是NBout,所以NBout里是WRITE;而NFU-2的操作是RESET;最后,当最后一个分片数据加载完之后,NBout被设置为STORE,将256个输出通过DMA写回到内存。

加速器支持单个图像或批处理,生成代码里只有CP值会变化。

DaDianNao

为了支持日益扩大的神经网络模型,DaDianNao是一个支持扩展到64个节点的加速器架构,相比GPU,可以实现450.65倍提速,而减少150.31倍功耗。

神经网络结构

DianNao一样,DaDianNao也是针对神经网络的加速器;不过相比DianNao,除了卷积层,池化层和分类层,DaDianNao增加了一个局部响应归一化层。DaDianNao针对的神经网络结构如下所示: Pasted image 20240129140721.png

硬件架构

DaDianNao每个节点采用28nm工艺,面积30.16 mm2,运行在606MHz,包括4MB的eDRAM和16个tile;每个tile面积1.89 mm2,包括4个1024x4096的eDRAM bank,一共2MB。具体物理规划版图如下所示: Pasted image 20240129151142.png

DaDianNao由一系列的节点以mesh拓扑结构组成,而单个节点则包括16个tile,2个中间的eDRAM bank,以及fat-tree互联;而一个tile则包括一个NFU, 4个eDRAM banks以及和中间eDRAM banks连接的输入输出接口。节点和Tile结构如下所示: Pasted image 20240129155955.png 节点内互联采用wormhole路由,有5个接口(东南西北四个接口和一个设备接口),每个接口有8个虚拟通道,每个虚拟通道队列有5项;路由一共4个流水阶段:路由计算(RC),虚拟通道分配(VA),交换分配(SA),和交换传输(ST)。 每个NFU能同时处理16x16个操作,因此,每周期只需要从eDRAM读取16 × 16 × 16 = 4096位数据;每个Tile里的eDRAM分成4个4096位宽的eDRAM来补偿eDRAM需要刷新的缺陷。16个tile使用fat-tree拓扑进行互联,输入数据会广播到每个tile,而每个tile输出则通过互联汇总到中间的eDRAM。

tile内部NFU和DianNao差别不是太大,也是分成三个阶段,主要差异来自于NBout的组织方式,具体架构框图如下所示: Pasted image 20240129160314.png NFU流水线针对推理和训练,以及不同的神经网络层,需要不同的配置,每个硬件模块都支持16位的输入和32位的输出。NFU可以分解成:

  • 加法模块 可以配置成256个输入, 16个输出的加法树或 256个并行加法器
  • 乘法模块 256并行乘法器
  • 最大值模块 16个并行最大值操作
  • 变换模块 分成两个独立子模块,可以完成16个分段线性插值;插值的系数保存在2个16项的SRAM里,可以通过修改系数来实现不同的变换函数和偏置

除了上述流水线和硬件模块的需要配置之外,还需要根据不同的数据移动方式来对tile进行配置。比如,对于分类层,输入可能来自中间的eDRAM,也可能来自于tile内部的NBin和NBout(都是16KB的SRAM),甚至是临时值;对于反向传播,NFU必须将更新后的权重输出写到tile内部eDRAM。下图展示了NFU分别配置成CONV, LRN, POOL和CLASS神经网络层: Pasted image 20240205102343.png

节点之间互联采用HT(HyperTransport) 2.0,HT2.0物理层在28nm工艺面积是5.635mm × 0.5575mm;节点互联拓扑采用2D mesh,每个方向HT 2.0接口是16组差分信号(16组输入,16组输出),运行在1.6GHz;HT接口和中间eDRAM之间连接是128位宽,有深度4的FIFO;每个HT能提供6.4GB/s带宽,节点间延迟80ns。

存储

DaDianNao架构既要做训练,又要做推理,为了较少数据移动,tile里eDRAM用来存储权重。eDRAM相比SRAM,面积更小,和DRAM相比,功耗更低;但是缺点是延迟比SRAM大,而且需要定期刷新。为了能够给NFU每周期提供数据,tile里的eDRAM组织成4个bank,数据交织使用;中间eDRAM分成两个bank,一个用于输入神经元,一个用于输出神经元。对于神经网络模型而言,即使很多tile和节点组成的系统,所有NFU里的输出神经元还是偏少的,因此,对于广播到每个tile的输入神经元,会在同样硬件上计算多个输出神经元。中间值会存储在tile内部eDRAM里,只有所有输入神经元都计算完,得到的输出神经元才会通过互联存储到中间eDRAM。对于一个节点,有如下这些存储单元:

  • 16KB的NBin,采用SRAM,每个tile一个,用来存储NFU计算输入
  • 16KB的NBout,采用SRAM,每个tile一个,用来存储NFU计算的输出
  • 2MB的eDRAM,tile内部分成4个bank,存储权重
  • 4MB的eDRAM,节点中间,分成两个bank,一个用于输入神经元,一个用于输出神经元

编程模型

DaDianNao只需要进行配置,并提供相应数据;输入数据在节点之间进行分区,并存储在节点中间的eDRAM里;神经网络的配置则是由代码生成器生成的指令序列。指令格式如下所示: Pasted image 20240129163743.png 下面是分类层 (Ni = 4096, No = 4096, 4节点)指令序列: Pasted image 20240129163810.png 数据被分割成多个256位的数据块,每个数据块包含256/16 = 16个神经元;每个节点分配4096/16/4 = 64个数据块,每个tile分配64/16 = 4个数据块,所以每个节点需要4个指令; 前面三个指令会从中间eDRAM给所有tile分发数据,同时从tile内部eDRAM里读取权重,然后将计算部分和写入到NBout;最后一个指令时,每个tile内部NFU会计算出最终的和,并进行变换计算,最后将结果写回到中间eDRAM。 这些节点指令会将相应的控制发送到每个tile,一个节点或tile指令对一套连续的输入数据完成同一层的计算;因为同一个指令的输入数据是连续的,因此指令里只需要使用开始地址,步长和迭代次数。 另外,不同节点以同样速度处理几乎相同的数据量,DaDianNao采用了computing-and forwarding的通信模式,即一个节点一旦完成计算,就可以马上处理新输入的数据;所以不需要全局同步或屏障指令。

ShiDianNao

ShiDianNao是一个CNN加速器,放置在CMOS或CCD传感器旁边。在许多应用中,例如智能手机、安全、自动驾驶汽车,图像直接来自CMOS或CCD传感器。图像由CMOS/CCD传感器采集,发送到DRAM,然后由CPU/GPU获取以进行识别处理。CNN加速器的小尺寸使其可以将其提升到传感器旁边,并且仅将识别过程的几个输出字节(通常是图像类别)发送到DRAM或主机处理器,从而几乎完全消除了对存储器的访问。下图展示了ShiDianNao的应用场景: Pasted image 20240129165759.png

硬件架构

ShiDianNao在硬件上一共有8 × 8 (64)个PEs,64 KB的NBin, 64 KB的NBout, 128 KB的SB, 和32 KB的IB; 工艺65nm,面积4.86mm^2,功耗320mw,运行在1GHz,提供194GOP/s算力;下图展示了ShiDianNao的物理规划版图: Pasted image 20240129170118.png 加速器主要由下列部分组成:

  • 存储输入神经元的NBin
  • 存储输出神经元的NBout
  • 存储权重的SB
  • 计算单元
    • NFU 主要负责神经元乘,加和比较操作
    • 算术单元ALU 主要负责激活函数计算
  • 指令缓冲和译码单元IB

计算单元采用16位定点,可以有效减少硬件开销,同时不会对神经网络精度产生影响。在65nm工艺下,16位定点乘法器相比32位浮点乘法器,面积小6.1倍,同时功耗少7.33倍。NFU可以从NBin/NBout和SB里同时读取权重和输入数据,并分发到不同PE;PE内部包含存储单元,可以完成PE之间的数据传输;当PE完成计算之后,NFU从PE收集数据并发送到NBin/NBout或ALU。ShiDianNao整体架构框图如下所示: Pasted image 20240129171434.png

NFU

ShiDianNao主要处理图像数据,所以NFU和DianNao上相比,为2D数据处理进行了优化。NFU由8x8个PE(Processing Element)组成2D mesh拓扑,可以高效处理2D数据。直接映射Kx × Ky个PEs (Kx × Ky核函数)来计算一个输出,受限于和函数大小不能有效的利用PE,并且会导致共享数据逻辑变得复杂;因此,ShiDianNao将一个输出神经元映射到一个PE,采用时分复用PE来对输入数据进行计算并输出神经元。下图展示了NFU的微架构框图: Pasted image 20240129171629.png

PE

对于卷积层,分类层,归一化层等,每个PE每周期可以完成一个乘加运算;PE有3个输入:一个接收控制信息,一个从SB读取权重,一个从NBin/NBout,右边PE或下边的PE读取输入数据;2个输出,一个将计算结果写入NBout/NBin; 一个用来将输入数据传输到相邻的PE。对于CNN神经网络层,每个PE会持续的累积计算输出,直到当前计算完之后才会计算下一个输出。下图展示了一个PE内部的微架构框图: Pasted image 20240129171649.png 对于CNN网络,不同的PE计算的输出需要的输入数据有一部分时重叠的,如果每个PE都从NBin/NBout里读取数据,需要的带宽会比较大;因此为了支持数据复用,每个PE可以将自己保存的输入数据发送到左边和下边的PE;每个PE有两个FIFO,分别是FIFO-H和FIFO-V,可以临时存储输入数据;FIFO-H可以存储来自NBin/NBout和右边PE的数据,并发送到左边的PE;FIFO-V可以存储来自NBin/NBout和上面PE的数据,并发送给下面的PE。

ALU

NFU并不能完成CNN网络里所有计算,因此NFU之外有一个ALU,可以完成平均池化和归一化层需要除法,和tanh(),sigmoid()等卷积和池化需要的非线性激活函数。非线性激活函数采用分段线性插值实现,插值需要的线段系数提前保存在寄存器。

NB控制器

NB控制器可以支持NFU里数据复用和计算,对于NBin/NBout,控制器支持6个读模式和一个写模式。下图展示了NB控制器的微架构框图: Pasted image 20240130134518.png 一共2 × Py个bank,每个bank宽度Px × 2 bytes,支持的6个读模式如下: a. 读多个banks (#0 到 #Py − 1) b. 读多个banks (#Py 到 #2Py − 1) c. 读一个bank d. 读一个神经元 e. 按指定步长读取神经元 f. 每个bank读一个神经元 (#0到 #Py − 1 或#Py 到 #2Py − 1)

下图展示了上面6种读模式示意图: Pasted image 20240130140005.png 不用的神经网络层需要使用不同的读模式:

  • 对于卷积层,使用模式a或模式b从NBin的#0 到#Py − 1或#Py 到#2Py − 1 读取输入数据;如果卷积窗口步长大于1,则使用模式e;使用模式c从NB里读取一个bank数据;模式f从NB的#Py 到#2Py − 1 或 #0 到#Py − 1 每个banks读取一个数据
  • 对于池化层,和卷积层类似,也可以使用模式a, b, c, e, 或f
  • 对于归一化层,会被分解成类似卷积层的子层,所以也可以使用模式a, b, c, e, 或f
  • 对于分类层,使用模式d加载同一个输入数据

NB控制器的写模式比较直接,在CNN神经网络模型里,一旦一个PE计算出了输出数据,结果会临时保存在NB控制器的寄存器阵列里;当Px × Py个PEs里计算结果都出来之后, NB控制器马上将结果写到NBout。Px × Py输出数据组织成Py行,每一行Px × 2位, 刚好是一个NB bank。当当输出数据处在2kPx, . . . , ((2k + 1)Px − 1)行 (k = 0, 1, . . . )时,数据会被写到NB的第一个Py bank;否则写到第二个Py banks。具体映射如下所示: Pasted image 20240130144144.png

存储结构

ShiDianNao片上存储一共288 KB SRAM,可以同时存储一个CNN网络的所有数据和相关的指令,不需要片外存储。片上存储分为3个缓冲:NBin,NBout和SB,不同缓冲可以使用不同的位宽,减少时间和功耗。NBin用来存储输入数据,NBout存储输出数据,当所有输出数据计算完成之后,NBin和NBout功能交换,之前输出作为下一层的输入,每一个有 2 × Py 个banks;SB存储权重,一共Py个bank。

编程模型

为了较少配置硬件的指令需要的SRAM空间,ShiDianNao采用了2层的HFSM(Hierarchical Finite State Machine)来控制加速器的执行流。第一层状态机的状态描述加速器处理的任务,比如神经网络层类型,ALU执行操作等;每一个第一层状态相关联的有几个第二层状态,用来描述具体操作;比如和卷积层状态相关联的包括加载输入输出数据。HFSM状态机如下所示: Pasted image 20240130145033.png 使用61位长度的指令来表示HFSM状态和相应参数,执行5万个周期的CNN网络只需要1KB的指令存储空间。

PuDianNao

PuDianNao, 可以对包括k-means, k-nearest neighbors, 朴素贝叶斯(naive bayes), 支持向量机(support vector machine), 线性回归(linear regression), 分类树(classification tree), 和深度神经网络(deep neural network)在内的7种机器学习进行加速。机器学习算法一般通过使用的数学模型(线性或非线性),学习方式(监督学习或无监督学习),训练算法(最大后验估计或梯度下降)等进行区分。但是从计算机体系结构上看,机器学习算法可以根据分解的计算原语和数据临近性来分类。通过对上述7种机器学习算法从计算原语和数据临近性上分析,PuDianNao在架构上,采用一个通用的ALU来执行一般操作,而对最耗时的操作卸载到专用硬件执行,实现了对多种机器学习算法的加速。

硬件架构

PuDianNao采用65nm工艺,面积3.51mm^2,功耗596 mW,运行在1GHz,算力1056 GOP/s;相比NVIDIA K20M GPU (28nm工艺), PuDianNao速度上快了1.20倍,功耗降低128.41倍。下图展示了PuDianNao的物理版图: Pasted image 20240131104942.png PuDianNao主要由功能单元FUs(Functional Units), 3个数据缓冲(HotBuf, ColdBuf,和OutputBuf), 指令缓冲(InstBuf), 控制模块(CM)和一个DMA组成。下图展示了PuDianNao的架构框图: Pasted image 20240131105625.png 功能单元FUs是加速器计算单元,每个FU由两部分组成,机器学习功能单元MLU(Machine Learning functional Unit )和算数逻辑单元ALU(Arithmetic Logic Unit );PuDianNao一共有16个FUs。

MLU支持机器学习里常见的几种计算原语,包括点乘(LR, SVM, 和DNN), 距离计算(k-NN和k-Means), 计数(ID3和NB), 排序(k-NN 和 k-Means), 非线性函数 (sigmoid 和 tanh) 等。下图展示了MLU微架构框图: Pasted image 20240131105654.png MLU分成6个流水线阶段,分别是Counter, Adder, Multiplier, Adder tree, Acc和Misc。每个MLU包含16+16+15+1+1=49个加法器,分别来自Counter, Adde, Adder tree, Acc和Misc阶段;以及16+1=17 个乘法器, 来自于Multiplier和Misc阶段。 因此,一共可以实现16 × (49 + 17) × 1 = 1056 Gop/s算力。

  • Counter阶段 每对输入都会送到一个与门或比较器,然后结果会进行累加;累加器输出结果直接写到输出缓冲。主要用来加速朴素贝叶斯和分类树里的计数操作;如果不需要进行计数,则可以直接旁路该阶段。
  • Adder阶段 支持机器学习里常见的向量加法,计算结果可以写到输出缓冲或者送到下一个流水阶段;如果不需要,则可以直接旁路该阶段。
  • Multiplier阶段 支持机器学习里常见的向量乘法,输入数据可以来自上一个Adder阶段,或者输入缓冲;计算结果可以写到输出缓冲或者送到下一个流水阶段。
  • Adder tree阶段Multiplier阶段的计算结果进行求和,两者结合可以完成LR, SVM, 和DNN等机器学习里常见的点乘运算;如果输入数据维度超过加法树大小,则计算结果是部分和,最终和会在下一个Acc 阶段进行计算;计算出最后结果之后, Acc 阶段计算结果可以写到输出缓冲或者送到下一个流水阶段。
  • Misc阶段 包括线性插值模块和k-sorter模块,计算结果写到输出缓冲
    • 线性插值模块 可以通过插值表完成机器学习里sigmoid和tanh等非线性函数近似计算
    • k-sorter模块 可以从来查找Acc 阶段输出结果里的K个最小值

为了减小面积和功耗,Adder, Multiplier, 和Adder tree阶段都是16位浮点运算;对于Counter, Acc, 和Misc阶段,为了避免溢出,采用32位浮点。

对于机器学习里一些计算类型,比如除,条件赋值等MLU不支持的操作,会在FU里的ALU里执行。ALU里包括加法器,乘法器和除法器,以及32位和16位浮点之间转换逻辑。另外,为了支持分类树需要的对数运算,ALU可以采用泰勒展开进行近似计算。

存储结构

对机器学习算法里数据局部性的分析,切片可以提高数据的局部性;另外,根据数据复用的距离,可以分成2到3类。因此,PuDianNao设计了三种片上存储:

  • HotBuf 8KB的单口SRAM,存储复用距离最近的数据
  • ColdBuf 16KB的单口SRAM,存储复用距离相对比较长的数据
  • OutputBuf 8KB的双口SRAM,存储输出数据或临时数据

之所以拆分成三个片上存储,除了考虑数据局部性之外,还有加载不同数据时位宽不一样。三个片上存储都使用同一个DMA。

编程模型

加速器内部控制模块负责从InstBuf里取指,译码,并将指令分发到所有FUs;所有FUs同步执行一样的操作。指令格式如下所示: Pasted image 20240131110613.png 每个指令分成5个槽,CM, HotBuf, ColdBuf, OutputBuf, 和FU;不同的机器学习算法通过代码生成器来生成对应的指令。

下面表格提供了生成的 k-Means 代码的示例: Pasted image 20240131110649.png 每个实例中的特征数为 f = 16,质心数为 k = 1024,测试实例数为 N = 65536。质心将存储在 HotBuf (8KB) 中,测试实例将存储在 ColdBuf (16KB) 中。为了隐藏DMA 内存访问,我们以乒乓球方式利用 HotBuf 和 ColdBuf。具体来说,在第一个指令中,加速器通过 DMA 从内存中加载 128 个质心 (4KB) 和 256 个测试实例 (8KB),它们分别占据了 HofBuf 和 ColdBuf 的一半。然后,加速器计算加载的质心和测试实例之间的距离。同时,另外 256 个测试实例被加载到 ColdBuf 的另一半,这些实例将由第二条指令使用。在第二条指令中,第一条指令中加载的 128 个质心将被复用,这些质心是从 HotBuf 读取的。当处理完 128 个质心和所有 65536 个测试实例之间的距离计算时(在第 256 条指令之后),将加载一个由 128 个质心组成的新块(在第 257 条指令中)。重复该过程,直到完成所有质心和测试实例之间的距离计算。

Cambricon

由于AI模型的飞速发展,专用硬件很难适配新出现的算法;因此,通过借鉴RISC的指令集的设计原则:

  • 通过将描述神经网络的复杂指令分解成更短,更简单的指令,可以扩大加速器的应用范围;当有新的模型出现时,用户可以使用这些底层的,简单的指令来组装出新模型需要的计算
  • 简单和短的指令可以减少设计和验证的风险,以及译码逻辑的功耗和面积

为了设计出针对神经网络的简洁,灵活,高效的指令集,分析了不同神经网络的计算和存储访问模式,得出了几条设计原则:

  • 数据级并行 在大多数神经网络技术中,神经元和突触数据被组织为层,然后以统一/对称的方式进行操作。使用向量或矩阵来挖掘数据并行比使用传统的标量指令来挖掘指令级并行更高效
  • 向量和矩阵指令 尽管有许多线性代数库(例如,BLAS库)成功地涵盖了广泛的科学计算应用,但对于神经网络,这些代数库中定义的基本运算不一定是有效和高效的选择(有些甚至是多余的)。更重要的是,神经网络有许多常见的操作,而这些操作是传统线性代数库所未涵盖的。例如,BLAS库不支持向量的元素指数计算,也不支持突触初始化、dropout和受限玻尔兹曼机 (RBM)中的随机向量生成。因此,我们必须定制一组小而具有代表性的向量/矩阵指令,而不是简单地从现有的线性代数库中重新实现向量/矩阵运算。神经网络可以自然地分解为标量、向量和矩阵运算,ISA设计必须有效地利用潜在的数据级并行性和数据局部性。
  • 使用片上Scratchpad Memory 神经网络通常需要对矢量/矩阵数据进行密集、连续和可变长度的访问,因此使用固定宽度,且高功耗的向量寄存器文件不是最优选择。使用片上scratchpad memory代替向量寄存器文件,为每次数据访问提供了灵活的数据宽度。因为神经网络中的突触数据通常很大且很少重用,片上scratchpad memory是神经网络中数据级并行性的高效选择

为此,开发了一个新的神经网络加速器的指令集,叫做Cambricon。Cambricon 是一种存储加载架构,其指令均为 64 位,并包含 64 个用于标量的 32 位通用寄存器 (GPR),主要用于控制和寻址目的。为了支持对向量/矩阵数据的密集、连续、可变长度的访问,并且减少面积/功耗开销,Cambricon 不使用向量寄存器文件,而是将数据保存在片上scratchpad memory。与性能受寄存器文件宽度限制的SIMD不同,Cambricon有效地支持更大和可变的数据宽度,因为片上scratchpad memory可以很容易做的比寄存器文件更宽。

针对十种具有代表性的模型(MLP、CNN、RNN、LSTM、Autoencoder 、Sparse Autoencoder、BM、RBM、SOM、HNN),Cambricon 的代码密度比MIPS高13.38 倍、x86(9.86 倍)和 GPGPU(6.41 倍)。与DaDianNao(只能支持3种NN技术)相比,基于Cambricon的加速器原型带来的延迟、功耗和面积开销(分别为4.5%/4.4%/1.6%)很小。

硬件架构

Cambricon原型加速器采用65nm工艺,面积 56.24mm^2,功耗1.695 W,运行在1GHz。下图是Cambricon原型加速器的物理版图: Pasted image 20240131161228.png Cambricon原型加速器一共7级流水线,取指(fetch), 译码decoding, 发射issuing, 读寄存器register reading, 执行execution, 写回writing back, 和完成committing。 具体架构框图如下所示: Pasted image 20240131155241.png 取指和译码之后,指令进入一共顺序发射队列;当标量寄存器文件里的操作数准备好之后(标量或者向量和矩阵的地址和大小),根据指令类型不同,会被发射到不同的执行单元。

  • 控制指令和标量计算/逻辑操作指令 这些指令被发射到标量单元直接执行,当结果写回到标量寄存器文件后,这些指令可以按序从reorder buffer里完成。
  • 数据传输指令,向量/矩阵计算指令和向量逻辑指令 这些指令可能会访问L1缓存或scratchpad memories, 因此会被发射到地址生成单元AGU(Address Generation Unit);并且需要在顺序内存队列(in-order memory queue)里解决和前面指令可能的内存依赖关系。之后标量数据存储加载指令会发送到L1缓存;向量的数据传输,计算和逻辑运算指令会被发送到向量功能单元; 而矩阵的数据传输,计算指令会被发送到矩阵功能单元。执行完成之后,指令可以从内存队列里退休,并按序从reorder buffer里完成。

向量功能单元有32个16位的加法器,32个16位的乘法器和64KB的scratchpad memory。 矩阵单元则包括1024个乘法器和1024个加法器,为了避免物理上的布线困难和搬运数据导致功耗,乘法器和加法器被分成32个单独的计算模块。每个计算模块有24KB的scratchpad。32个计算模块通过H-tree连接,可以广播数据到所有计算模块并收集输出数据。

存储结构

在Cambricon原型加速器里,存在发射队列,内存队列,reorder buffer,L1缓存,以及scratchpad memory。发射队列和scratchpad memory大小如下所示: Pasted image 20240131160737.png 为了高效访问scratchpad memories, 向量和矩阵功能单元都集成了3个DMA,每一个分别对应向量和矩阵指令里的输入和输出。另外,scratchpad memory还带有一个IO DMA。为了解决4个DMA并发的读写请求,使用地址的低两位将scratchpad memory分成4个bank,并将4个bank通过crossbar和4个DMA相连。这样避免了使用昂贵的多端口向量寄存器文件,并可以使用scratchpad memory支持灵活的数据位宽。下图展示了矩阵功能单元里的scratchpad memory的结构框图: Pasted image 20240131160635.png

编程模型

Cambricon包含四种类型的指令:计算指令、逻辑指令、控制指令和数据传输指令。尽管不同的指令的有效位数可能不同,但指令长度固定为 64 位,以便内存对齐和简化加载/存储/解码逻辑的设计。Cambricon支持的指令集如下所示: Pasted image 20240131153032.png

  • 控制指令 Cambricon有两个控制指令,跳转和条件分支。跳转指令通过立即数或 GPR指定偏移量,并将该值和程序计数器 (PC)相加。除了偏移量之外,条件分支指令还要指定条件(存储在 GPR 中),分支目标(PC + {偏移量} 或 PC +1)通过条件和零之间的比较来确定。 Pasted image 20240131153349.png

  • 数据传输指令 Cambricon的数据传输指令支持可变数据大小,以便灵活地支持矩阵和向量计算/逻辑指令。具体来说,这些指令可以将可变大小的数据块(由数据传输指令中的数据宽度操作数指定)从主存储器加载/存储到片上Scratchpad Memory,或者在片上Scratchpad Memory和标量 GPR 之间移动数据。下图是向量加载指令 (VLOAD) ,可以将 V_size 大小的向量从主存储器加载到向量Scratchpad Memory; 其中,主存储器中的源地址是GPR中保存的基址和立即数之和。Vector STORE(VSTORE)、Matrix LOAD(MLOAD)和Matrix STORE(MSTORE)指令的格式与VLOAD相似。 Pasted image 20240131153723.png
  • 矩阵-多向量指令 MMV(Matrix-Mult-Vector) 矩阵-多向量指令 (MMV里,Reg0 指定向量输出 (Vout_addr) 的scratchpad memory内存地址; Reg1 指定向量输出的大小 (Vout_size); Reg2、Reg3 和 Reg4 分别指定矩阵输入的基址 (Min_addr)、向量输入的基址 (Vin_addr) 和向量输入的大小。MMV指令可以支持任意尺度的矩阵向量乘法,只要所有输入和输出数据都可以同时保存在scratchpad memory中即可。使用专用的 MMV 指令计算 W x,而不是将其分解为多个向量点积,因为后一种方法需要额外的开销(例如,显式同步、对同一地址的并发读/写请求)才能在 M 的不同行向量之间复用输入向量 x。 Pasted image 20240131163214.png
  • 向量-多矩阵指令(VMM) 反向传播(BP)算法的一个关键步骤是计算梯度向量,梯度向量可以表述为向量乘以矩阵。如果使用 MMV 指令实现,则需要一个额外的指令来实现矩阵转置。为了避免这种情况,Cambricon提供了一个向量-多矩阵指令(VMM),该指令直接适用于反向传播。VMM 指令与 MMV 指令具有相同的字段,但操作码除外。此外,在训练神经时,权重矩阵 W 通常需要使用 W = W + ηΔW 进行增量更新,其中 η 是学习率,ΔW 为两个向量的外积。Cambricon提供OuterProduct指令(OP)(输出为矩阵)、MatrixMult-Scalar(MMS)指令和Matrix-Add-Matrix(MAM)指令,协同执行权重更新。此外,Cambricon还提供矩阵减法矩阵 指令(MSM),以支持受限玻尔兹曼机 (RBM) 中的权重更新。
  • 向量指令 除了矩阵指令,还需要向量指令;包括向量加法指令(VAV) ,向量指数指令 (VEXP) ,向量-除-向量指令 (VDV) ;Cambricon还提供Vector-Add-Scalar(VAS)指令,其中标量可以是立即数或由GPR指定。Cambricon还提供了一系列向量算术指令,如VectorMult-Vector(VMV)、Vector-Sub-Vector(VSV)和VectorLogarithm(VLOG)。在硬件加速器的设计过程中,不同超越函数相关的指令(例如对数、三角函数和反三角函数)可以使用CORDIC技术有效地重用相同的功能块(涉及加法、移位和表格查找操作)。寒武纪提供了一个专用的随机向量指令(RV),可以生成一个随机数向量,该向量服从区间[0,1]的均匀分布。给定均匀的随机向量,我们可以借助 Cambricon 中的向量算术指令和向量比较指令,使用 Ziggurat 算法进一步生成服从其他分布(例如高斯分布)的随机向量。Cambricon 支持使用 Vector-Greater-Than-Merge (VGTM) 指令进行最大池化操作。VGTM 指令通过比较输入向量 0 (Vin0) 和输入向量 1 (Vin1) 的相应元素来指定输出向量 (Vout) 的每个元素,即 Vout[i]=(Vin0[i] > Vin1[i])?Vin0[i] : Vin1[i]。 Pasted image 20240131164539.png

  • 除了向量计算指令外,寒武纪还提供向量大于(VGT)、向量相等指令(VE)、向量和/或/非指令(VAND/VOR/VNOT)、标量比较和标量逻辑指令来处理分支条件,即计算上述条件分支(CB)指令的条件。

为了说明Cambricon指令集的用法,下面使用Cambricon 指令实现了三个简单但具有代表性的神经网络组件,即 MLP 前馈层、池化层和玻尔兹曼机 (BM) 层。为了简洁起见,省略了所有三个层的标量加载/存储指令,只列出了池化层的单个池化窗口(具有多个输入和输出特征图)的程序片段。

// $0: input size, $1: output size, $2: matrix size
// $3: input address, $4: weight address
// $5: bias address, $6: output address
// $7-$10: temp variable address
VLOAD $3, $0, #100 // load input vector from address (100)
MLOAD $4, $2, #300 // load weight matrix from address (300)
MMV $7, $1, $4, $3, $0 // Wx
VAV $8, $1, $7, $5 // tmp=Wx+b
VEXP $9, $1, $8 // exp(tmp)
VAS $10, $1, $9, #1 // 1+exp(tmp)
VDV $6, $1, $9, $10 // y=exp(tmp)/(1+exp(tmp))
VSTORE $6, $1, #200 // store output vector to address (200)
// $0: feature map size, $1: input data size,
// $2: output data size, $3: pooling window size ̢ 1
// $4: x-axis loop num, $5: y-axis loop num
// $6: input addr, $7: output addr
// $8: y-axis stride of input
VLOAD $6, $1, #100 // load input neurons from address (100)
SMOVE $5, $3 // init y
L0: SMOVE $4, $3 // init x
L1: VGTM $7, $0, $6, $7
// feature map m, output[m]=(input[x][y][m]>output[m])?
//                           input[x][y][m]:output[m]
SADD $6, $6, $0 // update input address
SADD $4, $4, #-1 // x-
CB #L1, $4 // if(x>0) goto L1
SADD $6, $6, $8 // update input address
SADD $5, $5, #-1 // y-
CB #L0, $5 // if(y>0) goto L0
VSTORE $7, $2, #200 // stroe output neurons to address (200)
// $0: visible vector size, $1: hidden vector size, $2: v-h matrix (W) size
// $3: h-h matrix (L) size, $4: visible vector address, $5: W address
// $6: L address, $7: bias address, $8: hidden vector address
// $9-$17: temp variable address
VLOAD $4, $0, #100 // load visible vector from address (100)
VLOAD $9, $1, #200 // load hidden vector from address (200)
MLOAD $5, $2, #300 // load W matrix from address (300)
MLOAD $6, $3, #400 // load L matrix from address (400)
MMV $10, $1, $5, $4, $0 // Wv
MMV $11, $1, $6, $9, $1 // Lh
VAV $12, $1, $10, $11 // Wv+Lh
VAV $13, $1, $12, $7 // tmp=Wv+Lh+b
VEXP $14, $1, $13 // exp(tmp)
VAS $15, $1, $14, #1 // 1+exp(tmp)
VDV $16, $1, $14, $15 // y=exp(tmp)/(1+exp(tmp))
RV $17, $1 // i, r[i] = random(0,1)
VGT $8, $1, $17, $16 // i, h[i] = (r[i]>y[i])?1:0
VSTORE $8, $1, #500 // store hidden vector to address (500)

参考文献

  1. DianNao项目—-智能计算系统官方网站 [WWW Document], n.d. URL https://novel.ict.ac.cn/diannao/
  2. Chen, T., Du, Z., Sun, N., n.d. DianNao: A Small-Footprint High-Throughput Accelerator for Ubiquitous Machine-Learning.
  3. Chen, Y., Luo, T., Liu, S., Zhang, S., He, L., Wang, J., Li, L., Chen, T., Xu, Z., Sun, N., Temam, O., 2014. DaDianNao: A Machine-Learning Supercomputer, in: 2014 47th Annual IEEE/ACM International Symposium on Microarchitecture. Presented at the 2014 47th Annual IEEE/ACM International Symposium on Microarchitecture (MICRO), IEEE, Cambridge, United Kingdom, pp. 609–622. https://doi.org/10.1109/MICRO.2014.58
  4. Du, Z., Fasthuber, R., Chen, T., Ienne, P., Li, L., Luo, T., Feng, X., Chen, Y., Temam, O., 2015. ShiDianNao: shifting vision processing closer to the sensor, in: Proceedings of the 42nd Annual International Symposium on Computer Architecture. Presented at the ISCA ’15: The 42nd Annual International Symposium on Computer Architecture, ACM, Portland Oregon, pp. 92–104. https://doi.org/10.1145/2749469.2750389
  5. Liu, D., Chen, T., Liu, S., Zhou, J., Zhou, S., Teman, O., Feng, X., Zhou, X., Chen, Y., 2015. PuDianNao: A Polyvalent Machine Learning Accelerator, in: Proceedings of the Twentieth International Conference on Architectural Support for Programming Languages and Operating Systems. Presented at the ASPLOS ’15: Architectural Support for Programming Languages and Operating Systems, ACM, Istanbul Turkey, pp. 369–381. https://doi.org/10.1145/2694344.2694358
  6. Liu, S., Du, Z., Tao, J., Han, D., Luo, T., Xie, Y., Chen, Y., Chen, T., 2016. Cambricon: An Instruction Set Architecture for Neural Networks, in: 2016 ACM/IEEE 43rd Annual International Symposium on Computer Architecture (ISCA). Presented at the 2016 ACM/IEEE 43rd Annual International Symposium on Computer Architecture (ISCA), IEEE, Seoul, South Korea, pp. 393–405. https://doi.org/10.1109/ISCA.2016.42
  7. Zhang, S., Du, Z., Zhang, L., Lan, H., Liu, S., Li, L., Guo, Q., Chen, T., Chen, Y., 2016. Cambricon-X: An accelerator for sparse neural networks, in: 2016 49th Annual IEEE/ACM International Symposium on Microarchitecture (MICRO). Presented at the 2016 49th Annual IEEE/ACM International Symposium on Microarchitecture (MICRO), IEEE, Taipei, Taiwan, pp. 1–12. https://doi.org/10.1109/MICRO.2016.7783723
  8. V. Kantabutra, “On hardware for computing exponential and trigonometric functions,” in IEEE Transactions on Computers, vol. 45, no. 3, pp. 328-339, March 1996, doi: 10.1109/12.485571. keywords: {Hardware;Read only memory;Adders;Polynomials;Arithmetic;Taylor series;Software algorithms;Approximation algorithms;Circuits;Throughput},
]]>
我的2023 http://zhifeiding.github.io/programming/summary/2023/12/31/%E6%88%91%E7%9A%842023/ 2023-12-31T00:00:00+00:00 http://zhifeiding.github.io/programming/summary/2023/12/31/我的2023

子在川上曰:逝者如斯夫,不舍昼夜

人到中年,才恍惚间觉得时间飞逝,似乎才刚过完年,路旁的树的叶子刚披上新绿,匆匆间又是北风呼啸,只剩下一片光秃秃,在冬日的阳光下画出斑驳的影子。一年四季,春夏秋冬的轮转,好似在几个日出日落之间就完成了,大抵如同人世间的代谢。似乎做了很多,仔细一想,又是一片空白,可不管如何,还是简单总结一下2023年吧:

  • 工作 总感觉自己还刚毕业没多久,可回头一想,都工作11年了,加班也加不动了。工作上无太多成就,也就乏善可言吧。
  • 生活 年初在春寒料峭中送走了爷爷,年末在秋日的暖阳里迎来了一个可爱的小宝,这就是人世的代谢吧!小宝堪称天使宝宝,省心不少。不过对大宝来说,可能收到的关注的确少了一些,由此产生了一些问题,希望后面能更合理分配时间。健康最重要,大宝今年生了几次病,希望明年能避免吧。
  • 学习 最近几年进入了新的领域,学习了一些新的东西,产生了某些模模糊糊的想法,为了加速成型,所以今年开始陆陆续续写一些总结性的文章,也算是得到了一些提升吧!

总体而言,最大体会就是人到中年,真是身不由己,恨不得有孙悟空的七十二变,多出几个分身,一个工作,一个学习,一个带大宝,一个带小宝,一个处理家庭事务。。。真的是分身乏术。

]]>
History of IBM z | The oldest is the most reliable http://zhifeiding.github.io/programming/history/2023/12/17/History-of-IBM-z-The-oldest-is-the-most-reliable/ 2023-12-17T00:00:00+00:00 http://zhifeiding.github.io/programming/history/2023/12/17/History-of-IBM-z-The-oldest-is-the-most-reliable 前言

最近几年系统性的学习并梳理了近30多年的计算技术发展历史,稍有感悟。遂决定将之整理成文,目的有二,一来作为知识沉淀,串联起不同技术,挖掘不同架构之间的渊源,二来通过整理再次审视历史,期望窥见未来发展方向。我将本系列命名为鉴往知远, 主要关注计算与互联。 本文为第三篇,主要回顾IBM z系列。

0. 概述

什么是IBM z

IBM Z是一系列现代化z/Architecture 硬件,可运行 z/OS、Linux、z/VSE、z/TPF、z/VM 和 IBM Z 系统软件。从System/360到System/370,System/370-XA,Enterprise Systems Architecture/370 (ESA/370), 和Enterprise Systems Architecture/390 (ESA/390),最后演进为z/Architecture。

上面是IBM官网对IBM z的描述。下图展示了z/Architecture的60多年的演进历史: Pasted image 20230718165037.png Pasted image 20230731171816.png 本文通过系统性回顾IBM z系列处理器及大型机,试图通过IBM z系列处理器发展的历史脉络,来展现近30年计算架构的变迁,技术的演进,进而窥见计算技术发展的未来。IBM z系列处理器除了支持的指令集和POWER不同,两者在处理器微架构上基本上是互相借鉴的,因此本文不关注微架构方面内容,主要侧重z系列大型机的系统架构设计。

为何叫大型机呢?该名字来源于Mainframe, 大型主机上的处理器、通信设备、内存等子系统全部融入在一个frame(机柜)中并形成一个完整的计算机系统。下面简要介绍IBM z大型机的历史发展:

  • System/360 1964年4月7日,IBM推出了划时代的System/360大型电脑,IBM System/360协助美国太空总署建立阿波罗11号资料库,完成太空人登陆月球计划;建立银行跨行交易系统,以及航空业界最大的在线票务系统等。IBM System/360的开发极为复杂,被誉为IBM 360系统之父的Frederick P.Brooks在30年前著有《The Mythical Man-Month(人月神话)》一书,这本书至今仍然是软件领域的必读经典
  • System/370 1970年6月,IBM发布System/370的两个型号。System/370大型机与System/360兼容。在System/370体系结构中引入了虚拟存储器的概念。虚拟存储器需要一个地址转换机制去增加应用程序可用的存储空间,它使得计算机系统具有比实际配置的内存大得多的存储空间
  • System/370 XA 1981年,IBM公布了扩展的System/370 体系结构(370-XA)。它将地址线位数增加到31位,增强了System/370的寻址能力,同时保留24位兼容方式, 原来24位地址写的应用可以无缝在System/370-XA上运行。System/370-XA还增加了扩展存储器,这种存储器与主存分离,用来保存计算机中最为常用的信息,从而显著提升性能
  • System/370 ESA 在1988年,System/370体系结构得到进一步改进。IBM发布了ESA(Enterprise System Architecture)/370ESA/370增加了访问寄存器,改进虚拟存储性能,从而可以实现应用访问虚拟空间
  • ESA/390 在1990年9月,IBM正式推出了更高级别的大型机系列ESA/390, 它也是IBM最后一个31位寻址/32位数字大型机。它在IBM大型机System/370和64位z/Architecture中扮演承上启下的作用。该系列大型机都统一以System/390(S/390) 售卖,它也是首个采用CMOS电路的高端大型机架构
    • 1997年,S/390 G4处理器,达到了之前使用二极管设计的G3的性能
    • 1998年,推出了S/390 G5处理器
  • IBM System z 2000年,IBM对当时现有的System/390进行重新命名为eServer zSeries,并以IBM独有的红色标识e来加以区分,在zSeries使用中是以z900开始。它将IBM最新设计的z/Architecture融入到了64位的数字世界中。z/Architecture是代替此前31位寻址和32位数据ESA/390架构的64位架构体系,它保留了对原有24位寻址和32位数据System/360架构的兼容
  • System z9 IBM于2005年9月16日,推出了全新以数字结尾命名的System z9系列大型机,z9可以从1路扩展到54路(z990为32路),最多可支持512GB的内存
  • System z10 2008年推出,System z10是首个采用z10 4.4GHz四核处理器的大型机,支持1.5TB的内存、高速网络Infiniband的数据速率也达到6GBps
  • zEnterprise 196 采用z196芯片,主频为5.2GHz,单个处理器拥有四核心,基于z/Architecture。z196满配24个处理器,96个处理器核
  • zEnterprise EC12采用了zEC12芯片,六核5.5GHz主频,也是基于z/Architecture。zEC12满配36个处理器、最高120个内核,其中101个内核可直接用于运行操作系统和各种应用负载
  • z13 8核处理器,主频5GHz,支持SMT,提供向量运算的支持(SIMD)
  • z14 10核处理器,主频5.2GHz,14nm工艺
  • z15 12核处理器,主频5.2GHz,支持片上压缩加速器
  • z16 8核处理器,主频5.2GHz,支持片上AI加速器

本文的故事从S/390 G5 开始,一直到最新的z16 。下表总结了各代处理器的一些参数: Pasted image 20231217225358.png

本文组织形式如下:

  • 第一章介绍IBM S/390 G5处理器及其系统组成
  • 第二章介绍z900处理器及其系统组成
  • 第三章介绍z990处理器及其系统组成
  • 第四章介绍z10处理器及其系统组成
  • 第五章介绍z196处理器及其系统组成
  • 第六章介绍zEC12处理器及其系统组成
  • 第七章介绍z13处理器及其系统组成
  • 第八章介绍z14处理器及其系统组成
  • 第九章介绍z15处理器及其系统组成
  • 第十章介绍z16处理器及其系统组成

最后列出了主要参考文献。

1. IBM S/390 G5

1.1 G5处理器

G5实现了ESA/390指令集架构,并和S/360保持兼容,G5运行在500MHz,由于ESA/390指令集架构有大量需要运行几十甚至成百上千个周期的指令,G5在实现上是单发射处理器,并使用微码(millicode)来处理复杂的指令。下图展示了G5处理器的物理规划图: Pasted image 20231104155049.png G5处理器主要由下面几部分组成:

  • L1缓存 包括缓存数据阵列,缓存目录,TLB。L1缓存一共256KB,缓存行256B,4路组相联并且指令数据共用;可以同时处理2个请求,并且支持和L2缓存4GB/s的带宽;使用绝对地址历史表AAHT(absolute address history table)来预测缓存访问的绝对地址。TLB一共1024项,4路组相联,访问寄存器翻译ART(access register translation)包含一个8项全相联的ALB(ART lookaside buffer)。有一个32KB可写的微码阵列,实现64个常见的复杂指令。
  • I-unit 主要负责取指,译码,地址生成和指令发射队列。包含一个2048项,2路组相联的BTB。
  • E-unit 主要是各种执行单元以及相应的寄存器。包括一个定点和一个浮点单元,ESA/390架构有很多十进制运算的指令,执行单元可以进行二进制和十进制的运算。
  • R-unit 主要保存处理器架构状态的检查点 Pasted image 20231104162315.png 为了提高可靠性,G5的I-unit和E-unit同时存在两份,每个时钟周期,两个相同单元的信号会被送到R-unit进行比较,如果出现不匹配,会触发硬件错误恢复。
    1. R-unit冻结检查点状态
    2. L1缓存写数据到L2缓存
    3. I-unit, E-unit和L1缓存被复位
    4. R-unit里检查点的值读出并且更新到对应寄存器
    5. R-unit里值会被第二次读出确保没有错误,否则系统进入check-stopped状态,即时钟会被停掉
    6. E-unit重新开始执行
    7. millicode里会记录以便后期分析

      1.2 SMP互联

      G5可以通过包含L2缓存的系统控制器组成12路SMP系统,整个系统分成两个相同的节点,并组装在一个MCM里。系统里每个处理器可以以相同延迟访问内存。下图展示了整体系统结构: Pasted image 20231104163043.png 上图实线是128位的数据总线,运行在250MHz,系统主要由下列部件组成:

  • 一共12个处理器CP(central processor),最多可用10个CP,另外用作IO处理器来管理IO系统以及冗余备份。
  • 系统控制器由包含L2目录和配置的L2 CNTLR和最多8个,每个1MB的L2缓存芯片组成。
    • 每个系统控制器还包含两个IO接口芯片,IO子系统通过STI(self timed interface)和IO接口芯片连接;每个IO接口芯片有6组STI,每组可提供333MB/s的带宽。
  • G5系统一共有4个内存卡,每个分成4个bank,一共可以提供16GB/s带宽,最大内存24GB。
  • 两个加解密协处理器CE,可以支持RSA和DES算法

G5里的L1缓存是写入,并且和L2是包含关系,下图展示了G5系统的缓存结构: Pasted image 20231114222612.png L2缓存管理采用的是修改的MESI算法,有两个不同的共享状态,一个是本地共享(locally shared),即数据只在本节点共享;另一个是全局共享(globally shared),既数据被所有节点共享。 L2缓存芯片面积17.36mmx17.43mm,一共59M晶体管,包含1MB的缓存整列,下图展示了G5系统里的L2缓存芯片的物理版图: Pasted image 20231114223707.png 系统控制芯片面积是16.45mmx16.52mm,一共8.6B晶体管,下图展示了G5系统里系统控制芯片的物理版图: Pasted image 20231114223722.png

2. z900

2.1 z900处理器

z900是第一个实现64位z/Architecture的处理器,指令集方面主要是增加了34个ESA/390指令,139个z/Architecture指令;微架构方面主要是实现了分离的指令和数据缓存。下图展示了z900的物理规划图: Pasted image 20231111213402.png z900实现了7级流水,下图展示了z900的流水线: Pasted image 20231111213950.png

  • 取指 从指令缓存里获取指令,需要几个周期
  • 译码 对指令寄存器里的一条指令进行译码,并读取GPR
  • 操作数地址生成 通过对GPR的值进行运算生成操作数存储地址
  • 数据缓存访问 数据缓存,目录以及TLB会同时访问
  • 操作数返回 将数据发送到执行单元,同时和操作数缓冲里的缓存行合并
  • 执行 定点指令一般一个周期,浮点一般3个周期
  • 写回 将结果写回到GPR

下图展示了z900整体的数据流: Pasted image 20231111215538.png

  • 指令单元(I-unit) 指令单元在左上角,如果BTB命中,会从指令缓存进行取指,并将指令存放到指令缓冲中,随后发送到指令寄存器。随后指令会被译码并送到指令队列。
  • 缓冲控制单元(Buffer Control Element) 缓冲控制单元主要是缓存及缓存控制器,在右上方。逻辑地址首先会在真实地址历史表(absolute real address history table)里进行哈希查找,并对缓存使用真实地址访问,同时会访问目录和TLB。如果命中,返回数据;每周期数据缓存可以读取2个双字;指令缓存为指令单元和压缩转换单元提供指令,每周期可提供一个4字。
  • 执行单元(E-unit) 由一个定点和一个浮点执行单元组成,位于上图左下角。从数据缓存过来的操作数先保存在操作数缓冲里,并合并对齐成双字。定点指令一般1个周期,浮点一般3个周期
  • 转换和压缩单元(COP) 位于上图下方中间的是转换和压缩单元,作为协处理器(coprocessor)进行数据压缩和字符串转换
  • 恢复单元(R-unit) 位于上图右下角,保存处理器的状态,并使用ECC保护,当系统发生错误时,使用保存的状态来恢复正常。

3. z990

3.1 z990处理器

z990是一个双核处理器,每个处理器核里有重复的I-unit, FXU和FPU,这些重复单元的输出结果会和对应单元结果比较以确保结果正确性。当任意一个处理器核发生错误时,两个处理器核都会进入错误恢复流程。同时每个处理器核有一个协处理器,可以进行压缩和加密运算。 Pasted image 20231112183404.png 下图展示了z990处理器核的流水线: Pasted image 20231112183711.png

  • 指令首先从指令缓存进入I-unit里的指令缓冲,并且由BTB进行分支预测,然后在D1阶段有两个译码器进行译码;
  • 接下来在I-unit里进入AA1,计算操作数的地址,对指令进行分组,同时对应数据缓存的C0阶段,会访问ALB(access lookaside buffer)和AAHT(absolute address history table);
  • C1阶段会访问数据缓存,TLB,PAAHT(page absolute address history table),如果命中则返回数据;同时E-unit进入E-1阶段,指令发送到执行单元
  • C2阶段数据缓存数据会发送到E-unit,如果TLB缺失,则发送请求到X-unit做虚拟地址到真实地址转换;同时E-unit进入E0阶段,定点单元进行算术和逻辑运算,可以同时最多执行三条指令;同时会判断分支预测方向是否正确,如果预测方向错误,I-unit两个周期之后开始对正确代码进行译码
  • PA阶段是将结果写到两个64位的结果总线,同时更新通用寄存器;同时存储数据写入到数据缓存;结果同时送到R-unit做比较和检查点
  • 后续流水线主要是完成写操作以及R-unit的检查,执行单元的结果会和冗余执行单元的结果进行比较。

下图展示了z990的主要功能单元的微架构: Pasted image 20231112183556.png 当遇到加密指令时,会执行相应的微码,对协处理器的命令寄存器进行写来激活加密协处理器,同时将数据写到输入FIFO,同时会轮询输出FIFO以便确定数据是否准备好。下图展示了加密协处理器的功能图: Pasted image 20231121222706.png

3.2 SMP系统

z990可以组成最多48路SMP系统,分成4个book,每个book最多64GB的内存,一共256GB的内存(最多512G);每个book共享32MB的L2缓存。下图展示了z990系统的存储结构: Pasted image 20231121230457.png 一个book是一个MCM(multichip ceramic module)封装,每个book包含

  • 6个处理器芯片,即12个处理器(最多16个)
  • 3个MBA(IO memory bus adapter)
  • 一个SCE(system control element),每个SCE里32MB的L2缓存作为book内的缓存一致点;一个SCE由SCC和SCD两个芯片组成;
  • 2个MSC(main storage controller)芯片
  • 一个时钟芯片 Pasted image 20231123204244.png 不同于之前z900/G5系统的双节点拓扑,z900采用ring拓扑,不仅可以连接更过的处理器,缓存,内存和IO,更重要的是允许book可以进行热插拔。每个book有2个ring端口,可以和最多两个book形成双ring拓扑连接,顺时针是ring 0,逆时针是ring 1。少于4个book的拓扑,对应位置book需要替换成jumper card提供连接。下图展示了不同book数量的拓扑连接: Pasted image 20231123204554.png 一个book内处理器发出的请求会同时从两个ring广播出去,所以从请求到数据返回平均是2.67个book到book距离。

    4. z10

    4.1 z10处理器

    z10有4个处理器核,每个处理器核有3MB的L1.5缓存,一共两个加解密和数据压缩协处理器,每两个处理器核共享一个协处理器。片上还有一个内存控制器和一个IO控制器。z10和POWER6是一起开发的,共享了定点单元,二进制和十进制浮点单元,以及内存控制器和IO控制器。z10增加了50多条z/Architecture指令。 Pasted image 20231112203106.png

    4.1.1 z10处理器核

    z10处理器核由八部分组成:

  • 取指单元(IFU) 包括64KB的指令缓存,分支预测逻辑,指令缓冲和相关控制逻辑。指令缓冲提供指令给指令译码单元(IDU)
  • 指令译码单元(IDU) 负责解析和译码z/Architecture 里定义的900多条指令,识别指令间依赖关系,形成指令对以便超标量执行,并指令发射到操作数访问和执行单元
  • 存储加载单元(LSU) 包含128KB的数据缓存,每周期支持2个4字读取
  • 翻译单元(XU) 包含一个2级TLB和硬件地址翻译逻辑
  • 顶点执行单元(FXU) 负责定点算术,逻辑和分支指令的执行,大部分一个周期完成,并支持数据前馈以便依赖的指令可以背靠背执行
  • 二进制浮点单元(BFU) 负责IEEE-754浮点和S/360定义的十六进制-十进制浮点操作
  • 十进制浮点单元(DFU) 执行IEEE-754R兼容的十进制浮点和定点操作
  • 恢复单元(RU) 保存处理器核内状态,并使用ECC保护 Pasted image 20231112204416.png z10的处理器核的流水线主要分成五部分:
  • 取指流水线
  • 译码流水线 D1,D2和D3对指令解析并译码,识别指令间依赖关系,并发送到指令队列IQ和地址生成队列AQ;G1,G2和G3对指令分组以便可以超标量执行。当指令从IQ或AQ里发射到执行单元执行,发生缓存或TLB缺失时,不会停止流水线,而是回收指令从G1开始重新执行
  • 定点执行流水线 A0-A3负责提供指令操作数给定点单元执行;对于需要从数据缓存里读取多个操作数或保存数据到数据缓存的指令,A0-A2生成操作数地址,访问TLB,缓存,A3从LSU操作数接收操作数,进行对齐,格式化;P1生成条件码,P2, P3解决条件分支,并将结果写回到寄存器
  • 浮点执行流水线
  • 检查点恢复流水线 Pasted image 20231112203152.png

    4.2 SMP系统

    5个z10处理器和2个系统控制器组成一个book,4个book通过全连接组成一个80个处理器核的SMP系统。每个CP里的处理器核分别有64K的指令缓存,128K的数据缓存,以及3M的L1.5缓存;系统控制器芯片有24MB的L2缓存,两片一共48M的L2缓存。L1.5和L1是包含关系,L2和L1.5也是包含关系。下图展示了z9 和z10处理器缓存结构以及SMP系统互联差异: Pasted image 20231114221746.png 一个book一共有48个DIMM,4个book组成SMP系统一共192个DIMM,当使用8GB的DIMM时,一共1.5TB的内存。每个CP有一个内存控制器,有4个通道,每个通道可以连接3个级联的DIMM,在一个book内,只有4个CP有连接DIMM。下图展示了一个book的整体连接,包括IO和内存: Pasted image 20231115233432.png

    5. z196

5.1 z196处理器

z196处理器芯片有4个5.2GHz的处理器核,一共14亿晶体管。每个处理器核有64KB的指令缓存,128KB的数据缓存,以及1.5MB的L2缓存。4个处理器核共享24MB的写回式L3缓存,由192个512Kb的eDRAM组成,分成两个slice,每个slice可以为每个处理器核提供160GB/s的带宽;L3目录过滤来自L4缓存的请求;并且L3缓存作为4个处理器核,GX IO控制器,和内存控制器的互联。z196还有两个用于数据压缩和加密的协处理器,分别由两个处理器核共享。 下图展示了z196的物理版图: Pasted image 20230722172630.png

5.1.1 z196处理器核

每个z196处理器核都是超标量乱序处理器,有六个执行单元:

  • 两个定点单元
  • 两个存储加载单元
  • 一个二进制浮点单元
  • 一个十进制浮点单元

每周期可以取指,译码和分发3条指令,并且执行5条指令。下图展示了一个z196处理器核的物理布局: Pasted image 20230926093221.png 主要有下面这些功能单元:

  • Instruction sequence unit (ISU): ISU实现了乱序功能,包括记录寄存器名字和指令间依赖关系,并且分发指令
  • Instruction fetch and branch (IFB)Instruction cache & merge (ICM): IFB和ICM负责取指以及进行分支预测
  • 译码单元Instruction decode unit (IDU) : 译码单元从IFU缓冲里获取指令并进行译码
  • 存储加载单元Load-store unit (LSU) : LSU处理所有的操作数访问,包含数据缓存
  • 转换单元Translation unit (XU) : XU 处理逻辑地址到物理地址的转换,包含translation look-aside buffer (TLB)Dynamic Address Translation (DAT)
  • 定点单元Fixed-point unit (FXU) : FXU处理所有定点算术运算
  • 二进制浮点单元Binary floating-point unit (BFU) : BFU处理所有二进制和十六进制的浮点和定点乘除运算
  • 十进制单元Decimal unit (DU) : DU执行十进制浮点和定点操作
  • 恢复单元Recovery unit (RU) : RU记录处理器核里所有寄存器状态,收集硬件出错信号并且管理硬件恢复

下图展示了z196处理器核的指令流: Pasted image 20230722173214.png 下图展示了z196处理器核的流水线: Pasted image 20230722173937.png

5.1.2 协处理器

z196还有两个用于数据压缩和加密的协处理器,分别由两个处理器核共享。具体而论,每个协处理器里2个压缩加速器是独立的,分别服务对应的处理器核;而加密加速器则由两个处理器核共享。每个压缩加速器有一个64KB的静态字典,分成8K项,并且有16KB的字典缓存。加密加速器用于CP assist for cryptographic function (CPACF)Pasted image 20230926094650.png

5.2 存储控制芯片(SC)

存储控制芯片(SC)使用同样45nm SOI工艺,面积24.4 x 19.6 mm, 有15亿晶体管。每个MCM有两个SC芯片,每个SC芯片有96MB的L4缓存。下图展示了SC芯片的物理规划图: Pasted image 20230926093311.png 芯片主要由L4控制器和L4缓存组成,L4缓存分成4个部分,每部分有24MB的eDRAM, 分成16个bank, 24路组相联。处理器上L3缓存和SC芯片上的L4缓存之间使用6组双向数据总线通信;SC芯片使用3组双向数据总线和另外3个Book连接,并充当交换节点。L4缓存的目录对远程Book的侦听请求进行过滤。

5.3 缓存层次结构

z196 CPC(central processor complex)实现了4层的缓存结构,如下图所示: Pasted image 20230926093617.png

  • 每个处理器核有192 KB L1缓存, 分成128 KB的数据缓存和64KB的指令缓存,L1缓存是写入,即修改的数据会立即写回到下一级。
  • L2缓存也是每个处理器核独享,一共1.5 MB,也是写入方式。
  • L3缓存位于处理器芯片(PU)上,一共24MB,由4个处理器核共享,并且是写回机制
  • L4缓存位于两个存储控制芯片(SC)上,每个存储控制芯片96MB,由MCM里所有处理器共享,也是写回机制

    5.4 内存结构

    z196内存子系统使用高速差分接口,下图展示了一个Book的内存拓扑结构: Pasted image 20230926093751.png 每个Book有10到30个DIMMs(dual in-line memory modules),DIMMs分别和MCM里的PU0, PU1和PU2上的内存控制器(MCU)相连。每个MCU有5个通道,其中一个用于RAIM(Redundant array of independent memory);每个通道有一到二个链式连接的DIMMs, 因此,一个MCU有5到10个DIMMs;每个DIMM有4, 16或32 GB, 每个Book不能混和使用不同大小的DIMM。

z196使用了内存冗余阵列RAIM(redundant array of independent memory,RAIM可以检测DRAM,socket,内存通道或者DIMM的错误并恢复。下图展示了RAIM的示意图: Pasted image 20230926093932.png 4个数据通道的奇偶保存在第5个通道的DIMM里,内存系统里的任何错误都可以被发现并动态修正。RAIM使z196的RAS设计到了另一个层次,做到了全容错的N+1。

5.5 SMP系统

6个z196处理器芯片和两个系统控制芯片一起封装成一个MCM(multichip module)。下图展示了MCM的结构: Pasted image 20230926092635.png

5.5.1 Book

一个Book包含一个MCM, 内存, 以及与I/O cages和其他CPCs的连接器。Books位于frame A的processor cage。z196 CPC可以安装1到4个Book。下图展示了Book的基本设计: Pasted image 20230926092139.png 每个Book包括:

  • 一个MCM,有6个4核z196处理器芯片,以及2个存储控制芯片
  • 内存DIMMs,一共30个插槽,提供60 GB到960 GB内存
  • 最多8个HCA-Optical, HCA2-Copper或PCIe扇出卡,HCA2-Copper主要用于连接CPC里I/O cages或I/O drawers; PCIe用于连接PCIe I/O; HCA-Optical (HCA2-O (12xIFB), HCA2-O LR (1xIFB), HCA3-O (12xIFB)和HCA3-O LR (1xIFB))用于CPCs之间连接
  • 三个DCAs(distributed converter assemblies)提供Book的供电,其中一个作为冗余
  • 两个FSP(flexible service processor)卡,用于系统控制

下图展示了Book内的各部件连接关系: Pasted image 20230926092348.png 其中,GX0到GX7是到HCAs的接口, 10 GB/s;PSIs(Processor support interfaces)用于连接FSP卡;FBC(Fabric book connectivity) 用于Book间互联。

Books之间采用全连接拓扑, 允许Book之间直接通信,如下图所示: Pasted image 20230926094424.png

5.5.2 Frames

System z frames是符合Electronic Industry Association (EIA) 标准的机柜,z196 CPC有两个42U EIA frames, 分别是frames, A和Z, 包括一个processor cage和I/O cages, I/O drawers, 或PCIe I/O drawers;所有的books,包括Book内的DCAs(distributed converter assemblies)以及冷却部件,都位于Frame A的上半部分;下图展示了使用空气冷却的Frame A和Frame Z前视图: Pasted image 20230926091747.png

Frame A 主要有下列部件:

  • 两个可选的Internal Battery Features (IBFs), 提供不间断的电源。IBF进一步加强了电源的稳定性,提高了电源抗干扰能力。当4路AC电源都断电时IFB可以提供电池供电来保存处理器数据,最多可支持10分钟供电,电池成对安装,可以安装2到6个。
  • 两个modular refrigeration units (MRUs), 用于制冷或者两个Water Conditioning Units (WCUs)
  • Processor cage, 最多包含4个books
  • 一或两个I/O drawers,每个最多8个IO卡
  • I/O cage, 有28个I/O卡槽,可以安装ESCON channels, FICON Express8 channels, OSA-Express2, OSA- Express3, 和 Crypto Express3 features。最多支持2个I/O
  • Air-moving devices (AMD), 为扇出卡, 内存, 和DCAs提供N+1的制冷

Frame Z主要有下列部件:

  • 两个可选的Internal Battery Features (IBFs)
  • Bulk Power Assemblies (BPAs)
  • I/O cage 2或者一到两个I/O drawers
  • Support Element (SE)托盘,在I/O cage 2前面, 包含两个SEs

5.5.3 I/O Drawer

每个I/O drawer支持两个I/O域(A和B),一共8个I/O卡槽。I/O drawer内的每个I/O域使用一个IFB-MP卡和一根铜线连接到Book内的Host Channel Adapter (HCA)上。HCA和IFB-MP之间连接支持6 GBps。下图展示了CPC上的I/O的连接示意图: Pasted image 20230926094946.png PCIe I/O Drawer最多支持32个 I/O卡,分成4个域,每个域使用一个PCIe switch,两个PCIe switch之间通过PCIe I/O Drawer背板连接互相备份;当一个PCIe扇出卡出错, 两个域的所有16 I/O卡可以通过另一个PCIe switch。

5.6 系统控制

CPC系统的控制使用flexible service processors (FSPs),FSP基于IBM Power PC处理器;FSP连接到内部的 Ethernet LAN来和support elements (SEs)通信。下图展示了FSB和SE之间连接: Pasted image 20230926092527.png

6. zEC12

6.1 CP (Central Processor)芯片

每个处理器芯片有6个处理器核,每个处理器核有64 KB指令缓存和96 KB数据缓存,以及1 MB的L2指令缓存和1 MB的L2数据缓存。6个处理器核共享48MB的L3缓存,L3目录过滤来自L4缓存的请求;并且L3缓存作为6个处理器核,GX IO控制器,和内存控制器的互联。每个处理器核还有一个用于数据压缩和加密的协处理器,。 下图展示了zEC12的物理版图: Pasted image 20230718165345.png

6.1.1 zEC12处理器核

每个zEC12处理器核都是超标量乱序处理器,有六个执行单元:

  • 两个定点单元(FXU)
  • 两个存储加载单元(LSU)
  • 一个二进制浮点单元(BFU)
  • 一个十进制浮点单元(DFU)

每周期可以取指,译码和分发3条指令,并且执行7条指令。下图展示了一个zEC12处理器核的物理布局: Pasted image 20230925175655.png 每个处理器核主要有下列功能单元组成:

  • Instruction sequence unit (ISU) : ISU实现了乱序功能,包括记录寄存器名字和指令间依赖关系,并且分发指令
  • Instruction fetching unit (IFU) : 负责取指以及进行分支预测, 包含指令缓存
  • Instruction decode unit (IDU) : 译码单元从IFU缓冲里获取指令并进行译码
  • Load-store unit (LSU) : LSU处理所有的操作数访问,包含数据缓存
  • Translation unit (XU) : XU 处理逻辑地址到物理地址的转换,包含translation look-aside buffer (TLB)Dynamic Address Translation (DAT)
  • 定点单元Fixed-point unit (FXU) : FXU处理所有定点算术运算
  • 二进制浮点单元Binary floating-point unit (BFU) : BFU处理所有二进制和十六进制的浮点和定点乘除运算
  • 十进制单元Decimal unit (DU) : DU执行十进制浮点和定点操作
  • 恢复单元Recovery unit (RU) : RU记录处理器核里所有寄存器状态,收集硬件出错信号并且管理硬件恢复
  • 协处理器Co-Processor (COP) : 负责数据压缩和加密

下图展示了一个zEC12处理器核的指令流: Pasted image 20230926084137.png zEC12处理器使用分支历史表(BHT),模式历史表(PHT)以及分支目标缓冲(BTB)来进行分支方向及目标的预测。

6.1.1.1 协处理器

每个处理器核内有一个用于数据压缩和加密的协处理器 (CoP), 每个压缩加速器有一个64KB的静态字典,分成8K项,并且有16KB的字典缓存。加密加速器用于CP assist for cryptographic function (CPACF)。下图展示了CoP的物理位置及其微架构: Pasted image 20230926084255.png

6.2 SC (System Controller)芯片

系统控制(SC)芯片面积28.4 x 23.9 mm, 一共33亿晶体管,其中21亿是eDRAM。每个MCM有两个SC芯片,每个SC芯片上有192 MB的L4缓存, 因此每个Book一共384MB的L4缓存,下图展示了SC芯片的物理规划图: Pasted image 20230718171247.png 芯片主要由L4控制器和L4缓存组成,L4缓存分成4个部分,每部分有48 MB,由256个1.5 MB eDRAM组成。 L4缓存组织成16个bank,24路组相联结构。L4缓存控制器由多个独立控制器组成,可同时处理125个传输。处理器上L3缓存和SC芯片上的L4缓存之间使用单向数据总线通信,SC芯片使用3组双向数据总线和另外3个Book连接,并充当交换节点。L4缓存的目录对远程Book的侦听请求进行过滤。

6.3 缓存层次结构

zEC12实现了4层的缓存结构,如下图所示: Pasted image 20230926082914.png

  • 每个处理器核有160KB的L1缓存, 分成96 KB的数据缓存和64KB的指令缓存,L1缓存是写入,即修改的数据会立即写回到下一级。
  • L2缓存也是每个处理器核独享,一共2 MB,分别是1MB的数据缓存和1MB的指令缓存,也是写入方式。
  • L3缓存位于处理器芯片(PU)上,一共48MB,由6个处理器核共享,12路组相联;L3分成两个逻辑slice,每个24MB,由2个12MB的bank组成,缓存行256B;并且是写回机制
  • L4缓存位于两个存储控制芯片(SC)上,每个存储控制芯片192MB,由MCM里所有处理器共享,也是写回机制

    6.4 内存结构

    zEC12内存子系统使用高速差分接口,下图展示了一个Book的内存拓扑结构: Pasted image 20230926083213.png 每个Book最多支持960 GB内存, 一部分内存用于实现RAIM(redundant array of independent memory),因此,每个Book实际可用内存最多768 GB。每个Book有10到30个DIMMs(dual in-line memory modules),DIMMs分别和MCM里的PU0, PU1和PU2上的内存控制器(MCU)相连。每个MCU有5个通道,其中一个用于RAIM(Redundant array of independent memory);每个通道有一到二个链式连接的DIMMs, 因此,一个MCU有5到10个DIMMs;每个DIMM有4, 16或32 GB, 每个Book不能混和使用不同大小的DIMM。

对于一个完全容错的N+1设计, zEC12使用了内存冗余阵列RAIM(redundant array of independent memory,RAIM可以检测DRAM,socket,内存通道或者DIMM的错误并恢复。下图展示了RAIM的示意图: Pasted image 20230926083353.png 4个数据通道的奇偶保存在第5个通道的DIMM里,内存系统里的任何错误都可以被发现并动态修正。RAIM使z196的RAS设计到了另一个层次,做到了全容错的N+1。

6.5 SMP系统

6.5.1 Book

一个Book包含一个MCM, 内存,以及与其他CPCs的连接器。Books位于frame A的processor cage。zEC12 CPC可以安装1到4个Book。下图展示了Book的基本设计: Pasted image 20230925170312.png 每个Book包括:

  • 一个MCM,有6个6核z196处理器芯片,以及2个存储控制芯片
  • 内存DIMMs,一共30个插槽,提供60 GB到960 GB内存
  • 最多8个 (host channel adapter (HCA或PCIe)扇出卡. HCA2-Copper主要用于连接CPC里I/O cages或I/O drawers,带宽 6 GBps; PCIe用于连接PCIe I/O drawer,带宽8 GBps, HCA-Optical用于CPCs之间连接
  • 三个DCAs(distributed converter assemblies)提供Book的供电,其中一个作为冗余
  • 两个FSP(flexible service processor)卡,用于系统控制

下图展示了Book内的各部件连接关系: Pasted image 20230925170459.png 其中,GX0到GX7是到HCAs的接口, 最高10 GB/s,可以支持 InfiniBand和PCIe.;PSIs(Processor support interfaces)用于连接FSP卡;FBC(Fabric book connectivity) 用于Book间互联。

Books之间采用全连接拓扑, 允许Book之间直接通信,如下图所示: Pasted image 20230926083927.png

6.5.2 Frames

System z frames是符合Electronic Industry Association (EIA) 标准的机柜,zEC12 CPC有两个42U EIA frames, 分别是frames, A和Z, 包括一个processor cage和I/O cages, I/O drawers, 或PCIe I/O drawers;所有的books,包括Book内的DCAs(distributed converter assemblies)以及冷却部件,都位于Frame A的上半部分;下图展示了使用空气冷却的Frame A和Frame Z前视图: Pasted image 20230925165529.png Frame A 主要有下列部件:

  • 两个可选的Internal Battery Features (IBFs), 提供不间断的电源。IBF进一步加强了电源的稳定性,提高了电源抗干扰能力。当4路AC电源都断电时IFB可以提供电池供电来保存处理器数据,最多可支持10分钟供电,电池成对安装,可以安装2到6个。
  • 两个全备份的radiator units (RUs), 用于制冷或者两个Water Conditioning Units (WCUs)
  • Processor cage, 最多包含4个books
  • 根据配置,可以组合最多两个I/O drawer或一个I/O cage
    • 最多两个PCIe I/O drawers
    • 一个I/O drawers,每个最多8个IO卡
  • I/O cage, 有28个I/O卡槽,可以安装ESCON channels, FICON Express8 channels, OSA-Express2, OSA- Express3, 和 Crypto Express3 features。最多支持2个I/O
  • Air-moving devices (AMD), 为扇出卡, 内存, 和DCAs提供N+1的制冷

Frame Z主要有下列部件:

  • 两个可选的Internal Battery Features (IBFs)
  • Bulk Power Assemblies (BPAs), 数量根据配置确定
  • 最多4个drawer,可以最多两个I/O drawers和最多4个PCIe I/O drawers:
    • 不支持I/O cage
  • Support Element (SE)托盘,在I/O cage 2前面, 包含两个SEs
  • 当使用WCUs制冷时,会在frame背面额外安装一个散热器installed in the rear of the frame.

6.5.3 I/O drawers

每个I/O drawer支持两个I/O域(A和B),一共8个I/O卡槽。I/O drawer内的每个I/O域使用一个IFB-MP卡和一根铜线连接到Book内的Host Channel Adapter (HCA)上。HCA和IFB-MP之间连接支持6 GBps。下图展示了CPC上的I/O的连接示意图: Pasted image 20230926090519.png PCIe switch卡将Book内的 x16 PCIe扩展到8个独立的卡槽,PCIe switch卡连接到Book内PCIe扇出卡上一个x16 PCIe Gen 2上,PCIe扇出卡将Book内部信号转换成PCIe。PCIe I/O drawer前面和后面都有一个PCIe switch卡,两个通过背板连接,互相备份。

6.6 系统控制

系统的控制使用flexible service processors (FSPs),FSP基于IBM Power PC处理器;每个FSP有两个端口,连接到内部的 Ethernet LAN来和support elements (SEs)通信,并提供了subsystem interface (SSI)接口来控制系统。下图展示了FSB和SE之间连接: Pasted image 20230925175019.png zEC12上的PUs物理上都是一样的,但是初始化时会选择一个PU作为IFP (integrated firmware processor),其他PU会被定性为 CP, IFL, ICF, zAAP, zIIP, 或SAP。

  • CP(Central processors) CP可以支持所有z/Architecture指令集,并运行基于z/Architecture的操作系统(z/OS, z/VM, TPF, z/TPF, z/VSE, and Linux), Coupling Facility Control Code (CFCC), 和IBM zAware
  • IFL(Integrated Facility for Linux) IFL用于运行Linux, z/VM上的Linux和IBM zAware
  • ICF(Internal Coupling Facility) ICF用于在Parallel Sysplex 环境里运行CFCC
  • zAAP(System z Application Assist Processors) zAAP用于运行IBM指定的z/OS负载, 例如Java或z/OS XML System Services
  • zIIP(System z Integrated Information Processor) zIIP用于z/OS负载使用SRB (service request block)
  • SAP(System assist processors) SAP用于运行channel subsystem LIC(Licensed Internal Code),来控制IO操作,SAP为所有的LPAR的IO操作服务
  • IFP(Integrated firmware processor) 在系统初始化时,会从所有可用PUs里分配一个作为IFP。IFP专门用来支持 Peripheral Component Interconnect Express (PCIe) (10GbE Remote Direct Memory Access(RDMA) over Converged Ethernet (RoCE) Express和zEnterprise Data Compression (zEDC) Express) 。IFP支持Resource Group (RG) Licensed Internal Code (LIC),提供本地PCIe I/O管理和虚拟化功能

    6.7 RAS

在zEC12系统中, 会保留2个PUs作为冗余,可以用来替换任意两个PU,包括CP, IFL, ICF, zAAP, zIIP, SAP, 或IFP。当系统没有可用的冗余PU时候需要替换硬件,如果一个冗余PU坏了需要替换整个MCM。

PU的错误恢复机制称为静默恢复,即当发现错误时,指令单元会重试指令并尝试恢复错误;如果第二次尝试也失败了,会将当前处理器核上状态迁移到其他处理器核上。下图展示了处理器的错误检测核恢复流程: Pasted image 20230926084424.png

7. z13

7.1 z13处理器芯片

z13处理器有8个处理器核,一共39.9亿晶体管,运行在5GHz;每个处理器核有96KB的L1指令缓存和128KB的L1数据缓存;以及2MB的L2数据缓存和2MB的L2的指令缓存;8个处理器核共享64MB的L3缓存,分成2个slice,L3目录过滤来自L4缓存的请求并且L3缓存作为8个处理器核,GX IO控制器,和内存控制器的互联。z13每个处理器核还有一个用于数据压缩和加密的协处理器。 下图展示了z13的物理版图: Pasted image 20230925143126.png

7.1.1 z13处理器核

每个z13处理器核都是超标量乱序处理器,有十个执行单元:

  • 四个定点单元(FXU)
  • 两个存储加载单元(LSU)
  • 两个二进制浮点单元(BFU)
  • 两个十进制浮点单元(DFU)
  • 两个向量浮点单元(VXU)

每周期可以取指,译码和分发6条指令,并且执行10条指令。下图展示了一个z13处理器核的物理布局: Pasted image 20230925161046.png 每个处理器核主要有下列功能单元组成:

  • Instruction sequence unit (ISU) : ISU实现了乱序功能,包括记录寄存器名字和指令间依赖关系,并且分发指令
  • Instruction fetch and branch (IFB)instruction cache and merge (ICM) : 负责取指以及进行分支预测, 包含指令缓存
  • Instruction decode unit (IDU) : 译码单元从IFU缓冲里获取指令并进行译码
  • Load-store unit (LSU) : LSU处理所有的操作数访问,包含数据缓存
  • Translation unit (XU) : XU 处理逻辑地址到物理地址的转换,包含translation look-aside buffer (TLB)Dynamic Address Translation (DAT)
  • 向量和浮点单元
    • 定点执行单元(FXU) :FXU处理所有定点算术运算
    • 二进制浮点单元Binary floating-point unit (BFU) : BFU处理所有二进制和十六进制的浮点和定点乘除运算
    • 十进制单元Decimal unit (DU) : DU执行十进制浮点和定点操作
  • Core pervasive unit (PC) : 用于指令和错误的收集
  • 恢复单元Recovery unit (RU) : RU记录处理器核里所有寄存器状态,收集硬件出错信号并且管理硬件恢复
  • 协处理器Co-Processor (COP) : 负责数据压缩和加密

下图展示了一个z13处理器核的指令流: Pasted image 20230925164444.png z13处理器使用分支历史表(BHT),模式历史表(PHT)以及分支目标缓冲(BTB)来进行分支方向及目标的预测。

7.1.1.1 协处理器单元

每个处理器核内有一个用于数据压缩和加密的协处理器 (CoP)。其中压缩加速器器使用静态字典,并利用L1指令缓存;加密加速器用于CP assist for cryptographic function (CPACF)。下图展示了CoP的物理位置及其微架构: Pasted image 20230925164714.png

7.2 存储控制芯片(SC)

系统控制(SC)芯片面积28.4 x 23.9 mm, 一共71亿晶体管,其中21亿是eDRAM。每个CPC节点有一个SC芯片,每个SC芯片的L4缓存分成480MB的非包含缓存和224MB的Non-data Inclusive Coherent (NIC)目录, 因此每个CPC共享960MB的L4缓存,以及448 MB NIC目录。下图展示了SC芯片的物理规划图: Pasted image 20230925161619.png 芯片主要由L4控制器和L4缓存组成,L4缓存分成4个部分,每部分有120MB,由256个1.5 MB eDRAM组成。 L4缓存组织成16个bank,30路组相联结构。L4缓存控制器由多个独立控制器组成,可同时处理125个传输。处理器上L3缓存和SC芯片上的L4缓存之间使用单向数据总线通信,SC芯片使用3组双向数据总线和另外3个CPC连接,并充当交换节点。L4缓存的目录对远程CPC的侦听请求进行过滤。

7.3 缓存层次结构

z13实现了4层的缓存结构,如下图所示: Pasted image 20230925162031.png

  • 每个处理器核有224KB的L1缓存, 分成128KB的数据缓存和96KB的指令缓存,L1缓存是写入,即修改的数据会立即写回到下一级。
  • L2缓存也是每个处理器核独享,一共4MB,分别是2MB的数据缓存和2MB的指令缓存,也是写入方式。
  • L3缓存位于处理器芯片(PU)上,一共64MB,由8个处理器核共享,16路组相联;L3分成两个逻辑slice,每个32MB,由2个16MB的bank组成,缓存行256B;并且是写回机制
  • L4缓存位于两个存储控制芯片(SC)上,每个存储控制芯片480MB,由节点里所有处理器共享,也是写回机制;两个SC芯片之间通过S-bus通信;NIC目录里记录L3缓存里非包含的缓存行,可以通过X-bus访问L3缓存里独占的缓存行

    7.4 内存结构

    z13内存子系统使用高速差分接口,下图展示了一个CPC drawer的内存拓扑结构:
    Pasted image 20230925162336.png 每个CPC drawer有20到25个DIMMs(dual in-line memory modules),DIMMs分别和PU上的内存控制器(MCU)相连。每个MCU有5个通道,其中一个用于RAIM(Redundant array of independent memory);每个DIMM有16,32 GB, 64 GB, 或128 GB。 CPC drawer可以混用不同大小DIMM,但是同一个MCU不能混和使用不同大小的DIMM。每个CPC drawer使用4或5个MCUs;

z13使用了内存冗余阵列RAIM(redundant array of independent memory,RAIM可以检测DRAM,socket,内存通道或者DIMM的错误并恢复。下图展示了RAIM的示意图: Pasted image 20230925162738.png 4个数据通道的奇偶保存在第5个通道的DIMM里,内存系统里的任何错误都可以被发现并动态修正。

7.5 SMP系统

7.5.1 CPC drawer

z13 CPC不同于之前的Book,而是用Drawer来组装处理器。一个13 CPC drawer有8个single chip modules (SCMs), 内存, SMP连接, 以及支持PCIe I/O drawers, I/O drawers的连接卡槽。CPC drawers放置在A frame。z13服务器最多可以安装4个CPC。下图展示了CPC Drawer的基本设计: Pasted image 20230925141535.png CPC drawer分成两个节点,每个节点包括:

  • 三个8核处理器芯片(PU) SCMs
  • 一个存储控制芯片SC SCM, 有480 MB L4缓存
  • 一共10或15个DDR3 dual inline memory module (DIMM)卡槽

因此,一个CPC drawer包含:

  • 六个8核处理器芯片PU SCMs
  • 两个存储控制芯片SC SCM, 一共960 MB L4缓存
  • 20或25个DIMM槽, 可以提供320 - 3,200 GB物理内存和256 - 2,560 GB可访问内存
  • 十个PCIe Generation 3 (PCIe Gen3)插槽,用于PCIe I/O drawer或PCIe coupling links
  • 四个GX++插槽,用于IFB或InfiniBand coupling
  • 两个flexible service processor (FSP),用于系统控制
  • 两个DC converter assemblies (DCAs),为CPC drawer提供电源,互为备份
  • Water-cooling manifold,用于处理器芯片PU散热

下图展示了CPC Drawer内PU和SC之间的连接: Pasted image 20230925141731.png

不同的总线作用如下:

  • GX++ I/O总线,提供和host channel adapters (HCAs)的连接;每方向带宽6 GBps;GXX++ I/O提供对InfiniBand和非PCIe I/O(FICON Express 8)的支持
  • PCIe I/O总线,带宽16 GBps
  • X-bus用于同一个节点内PU与PU,PU和SC之间的连接
  • S-bus用于同一个CPC Drawer内两个SC芯片之间的互联
  • A-bus用于不同Drawer的SC芯片之间的互联
  • Processor support interfaces (PSIs)用于和FSP连接

    7.5.2 Frames

    System z frames是符合Electronic Industry Association (EIA) 标准的机柜,z13有两个42U EIA frames, 分别是frames, A和Z, 包括最多4个CPC drawer, 以及I/O drawers, 或PCIe I/O drawers;下图展示了使用空气冷却的Frame A和Frame Z前视图: Pasted image 20230925141104.png 4个CPC Drawer通过两个Node分别形成全连接,如下图所示: Pasted image 20230925142441.png

Frame A 从顶到底主要有下列部件:

  • 两个Support Element (SE)服器,安装在Frame A的顶部,在之前的system z服务器,SE在Frame Z里,并且是笔记本电脑;而在z13服务器里,SE是一个1U的服务器
  • 两个可选的Internal Battery Features (IBFs), 提供不间断的电源。IBF进一步加强了电源的稳定性,提高了电源抗干扰能力
  • 一个PCIe I/O drawer
  • 两个System Control Hubs (SCHs),SCHs用于替换之间的Bulk Power Hubs
  • 最多4个CPC drawers
  • 散热单元
    • 对于风冷,三台泵和三台鼓风机(N+2冗余设计)
    • 对于水冷,两个Water Conditioning Units (WCUs)

Frame Z从顶到底主要有下列部件:

  • 两个或四个可选的Internal Battery Features (IBFs)
  • Bulk power regulators (BPRs)
  • 键盘和显示器托盘,和SE连接
  • 最多四个PCIe I/O drawers

7.5.3 I/O drawer

下图展示了CPC上的I/O的连接示意图: Pasted image 20230925165152.png PCIe I/O Drawer最多支持32个 I/O卡,分成4个域,每个域使用一个PCIe switch,两个PCIe switch之间通过PCIe I/O Drawer背板连接互相备份;当一个PCIe扇出卡出错, 两个域的所有16 I/O卡可以通过另一个PCIe switch。

7.6 系统控制

系统的控制使用flexible service processors (FSPs),FSP基于IBM Power PC处理器;每个FSP有两个端口,连接到内部的Ethernet LAN,和support elements (SEs)通信,并提供了subsystem interface (SSI)接口来控制系统。下图展示了FSB和SE之间连接: Pasted image 20230925142813.png z13上的PUs物理上都是一样的,但是初始化时会选择一个PU作为IFP (integrated firmware processor),其他PU会被定性为 CP, IFL, ICF, zAAP, zIIP, 或SAP。Licensed Internal Code (LIC)会根据客户订单来定义不同PU的功能,未被定性的PU最为冗余,LIC在系统上电之后加载。

  • CP(Central processors) CP可以支持所有z/Architecture指令集,并运行基于z/Architecture的操作系统(z/OS, z/VM, TPF, z/TPF, z/VSE, and Linux), Coupling Facility Control Code (CFCC), 和IBM zAware
  • IFL(Integrated Facility for Linux) IFL用于运行Linux, z/VM上的Linux和IBM zAware
  • ICF(Internal Coupling Facility) ICF用于在Parallel Sysplex 环境里运行CFCC
  • zAAP(System z Application Assist Processors) zAAP用于运行IBM指定的z/OS负载, 例如Java或z/OS XML System Services
  • zIIP(System z Integrated Information Processor) zIIP用于z/OS负载使用SRB (service request block)
  • SAP(System assist processors) SAP用于运行channel subsystem LIC(Licensed Internal Code),来控制IO操作,SAP为所有的LPAR的IO操作服务
  • IFP(Integrated firmware processor) 在系统初始化时,会从所有可用PUs里分配一个作为IFP。IFP专门用来支持 Peripheral Component Interconnect Express (PCIe) (10GbE Remote Direct Memory Access(RDMA) over Converged Ethernet (RoCE) Express和zEnterprise Data Compression (zEDC) Express) 。IFP支持Resource Group (RG) Licensed Internal Code (LIC),提供本地PCIe I/O管理和虚拟化功能

    7.7 RAS

    PU的错误恢复机制称为静默恢复,即当发现错误时,指令单元会重试指令并尝试恢复错误;如果第二次尝试也失败了,会将当前处理器核上状态迁移到其他处理器核上。下图展示了处理器的错误检测核恢复流程: Pasted image 20230925164839.png

    8. z14

    8.1 z14处理器芯片

    z14处理器有10个处理器核,一共61亿晶体管,运行在5.2 GHz; 每个处理器核有128KB的L1指令缓存和128KB的L1数据缓存;以及4MB的L2数据缓存和2MB的L2的指令缓存;10个处理器核共享128MB的L3缓存,分成2个slice,L3目录过滤来自L4缓存的请求并且L3缓存作为10个处理器核,GX IO控制器,和内存控制器的互联。z14每个处理器核还有一个用于数据压缩和加密的协处理器。 下图展示了z14的物理版图: Pasted image 20230925112707.png

8.1.1 z14处理器核

每个z14处理器是超标量乱序处理器,有十个执行单元:

  • 四个定点单元(FXU)
  • 两个存储加载单元(LSU)
  • 两个二进制浮点单元(BFU)
  • 两个十进制浮点单元(DFU)
  • 两个向量浮点单元(VXU) Pasted image 20230925112944.png 每个处理器核主要有下列功能单元组成:
  • Instruction sequence unit (ISU) : ISU实现了乱序功能,包括记录寄存器名字和指令间依赖关系,并且分发指令
  • Instruction fetch and branch (IFB)instruction cache and merge (ICM) : 负责取指以及进行分支预测, 包含指令缓存
  • Instruction decode unit (IDU) : 译码单元从IFU缓冲里获取指令并进行译码
  • Load-store unit (LSU) : LSU处理所有的操作数访问,包含数据缓存
  • Translation unit (XU) : XU 处理逻辑地址到物理地址的转换,包含translation look-aside buffer (TLB)Dynamic Address Translation (DAT)
  • 向量和浮点单元
    • 定点执行单元(FXU) :FXU处理所有定点算术运算
    • 二进制浮点单元Binary floating-point unit (BFU) : BFU处理所有二进制和十六进制的浮点和定点乘除运算
    • 十进制单元Decimal unit (DU) : DU执行十进制浮点和定点操作
  • Core pervasive unit (PC) : 用于指令和错误的收集
  • 恢复单元Recovery unit (RU) : RU记录处理器核里所有寄存器状态,收集硬件出错信号并且管理硬件恢复
  • 协处理器Co-Processor (COP) : 负责数据压缩和加密

下图展示了一个z14处理器核的指令流: Pasted image 20230925135714.png z14处理器使用分支历史表(BHT),模式历史表(PHT)以及分支目标缓冲(BTB)来进行分支方向及目标的预测。

下图展示了z14处理器的流水线: Pasted image 20230920165853.png

8.1.1.1 协处理器单元

每个处理器核内有一个用于数据压缩和加密的协处理器 (CoP)。其中压缩加速器器使用静态字典,并利用L1指令缓存;加密加速器用于CP assist for cryptographic function (CPACF)。下图展示了CoP的物理位置及其微架构: Pasted image 20230925140019.png

8.2 存储控制芯片(SC)

每个SC芯片的L4缓存分成672MB的缓存, 因此每个CPC共享672MB的L4缓存;用于CP和SC互联的X-Bus以及Drawer之间互联的A-bus。下图展示了SC芯片的物理规划图: Pasted image 20230925113213.png

8.3 缓存层次结构

z14实现了4层的缓存结构,如下图所示: Pasted image 20230925134940.png

  • 每个处理器核有256KB的L1缓存, 分成128KB的数据缓存和128KB的指令缓存,L1缓存是写入,即修改的数据会立即写回到下一级。
  • L2缓存也是每个处理器核独享,一共6MB,分别是4MB的数据缓存和2MB的指令缓存,也是写入方式。
  • L3缓存位于处理器芯片(PU)上,一共128MB,由10个处理器核共享,32路组相联;L3分成两个逻辑slice,每个64MB,由2个32MB的bank组成,缓存行256B;并且是写回机制
  • L4缓存位于存储控制芯片(SC)上,672MB,42路组相联;由CPC Drawer里所有处理器共享,也是写回机制;NIC目录里记录L3缓存里非包含的缓存行,可以通过X-bus访问L3缓存里独占的缓存行

L4是CPC Drawer的一致性点,即所有内存访问在发送到处理器之间都需要送到L4缓存。

8.4 内存结构

z14内存子系统使用高速差分接口,下图展示了一个CPC drawer的内存拓扑结构:
Pasted image 20230925113717.png 每一个CPC Drawer支持3,4或5个MCUs,DIMMs分别和PU上的内存控制器(MCU)相连。每个处理器芯片PU SCM有一个MCU, 支持5个DIMM通道,其中一个用于RAIM(Redundant array of independent memory);每个DIMM有32 GB, 64 GB, 128 GB,256, 或512 GB;同一个MCU不能混和使用不同大小的DIMM。

z14使用了内存冗余阵列RAIM(redundant array of independent memory,RAIM可以检测DRAM,socket,内存通道或者DIMM的错误并恢复。下图展示了RAIM的示意图: Pasted image 20230925114025.png 4个数据通道的奇偶保存在第5个通道的DIMM里,内存系统里的任何错误都可以被发现并动态修正。

8.5 SMP系统

8.5.1 CPC drawer

z14服务器每个CPC Drawer支持1 - 4个 processor drawers,每一个processor drawer包含5或6个Central Processor (CP)和一个Storage Controller (SC);另外,CPC drawers还包括DIMMs, I/O, Flexible Service Processors (FSPs), 和水冷管。下图展示了一个CPC drawer: Pasted image 20230925111432.png 每个CPC Drawer最多支持8TB的内存,所以z14服务器支持256 GB - 32 TB内存。每个CPC drawer由两个逻辑CP clusters 和一个SC SCM组成,下图展示了CPC Drawer内部连接: Pasted image 20230925111625.png CP Cluster内CP之间使用X-Bus组成全连接拓扑,同时每个CP使用X-Bus和SC芯片连接。

8.5.2 Frames

z14有两个42U EIA frames, 分别是frames, A和Z, 包括最多4个CPC drawer, 以及I/O drawers, 或PCIe I/O drawers;下图展示了使用空气冷却的Frame A和Frame Z前视图: Pasted image 20230925111015.png 4个CPC Drawer通过各自SC芯片形成全连接,下图展示了4个CPC Drawer之间的连接: Pasted image 20230925111914.png

Frame A 从顶到底主要有下列部件:

  • 两个Support Element (SE)服器,安装在Frame A的顶部,在之前的system z服务器,SE在Frame Z里,并且是笔记本电脑;而在z13服务器里,SE是一个1U的服务器
  • 两个可选的Internal Battery Features (IBFs), 提供不间断的电源。IBF进一步加强了电源的稳定性,提高了电源抗干扰能力
  • 一个PCIe I/O drawer
  • 两个System Control Hubs (SCHs),SCHs用于替换之间的Bulk Power Hubs
  • 最多4个CPC drawers
  • 散热单元
    • 对于风冷,三台泵和三台鼓风机(N+2冗余设计)
    • 对于水冷,两个Water Conditioning Units (WCUs)

Frame Z从顶到底主要有下列部件:

  • 两个或四个可选的Internal Battery Features (IBFs)
  • Bulk power regulators (BPRs)
  • 键盘和显示器托盘,和SE连接
  • 最多四个PCIe I/O drawers

8.5.3 I/O drawer

下图展示了CPC上的I/O的连接示意图: Pasted image 20230925140638.png PCIe I/O Drawer最多支持32个 I/O卡,分成4个域,每个域使用一个PCIe switch,两个PCIe switch之间通过PCIe I/O Drawer背板连接互相备份;当一个PCIe扇出卡出错, 两个域的所有16 I/O卡可以通过另一个PCIe switch。

8.6 系统控制

系统的控制使用flexible service processors (FSPs),FSP基于IBM Power PC处理器;每个FSP有两个端口,连接到内部的Ethernet LAN,和support elements (SEs)通信,并提供了subsystem interface (SSI)接口来控制系统。下图展示了FSB和SE之间连接: Pasted image 20230925112101.png

8.7 RAS

PU的错误恢复机制称为静默恢复,即当发现错误时,指令单元会重试指令并尝试恢复错误;如果第二次尝试也失败了,会将当前处理器核上状态迁移到其他处理器核上。下图展示了处理器的错误检测核恢复流程: Pasted image 20230925140234.png

9. z15

9.1 z15处理器芯片

z15处理器有12个处理器核, 一共92亿晶体管,运行在5.2GHz;每个处理器核有128KB的L1指令缓存和128KB的L1数据缓存;以及4MB的L2数据缓存和4MB的L2的指令缓存;10个处理器核共享256MB的L3缓存;有一个片上压缩加速器NXU。下图展示了z15的物理版图: Pasted image 20230923181714.png

9.1.1 z15处理器核芯片

z15处理器是超标量乱序处理器,有十二个执行单元:

  • 四个定点单元(FXU)
  • 两个存储加载单元(LSU)
  • 两个二进制浮点单元(BFU)
  • 两个十进制浮点单元(DFU)
  • 两个向量浮点单元(VXU)

每周期可以译码6条指令,发射10条指令,最多执行12条指令。下图展示了z15处理器核的物理版图: Pasted image 20230923181917.png 每个处理器核主要有下列功能单元组成:

  • Instruction sequence unit (ISU) : ISU实现了乱序功能,包括记录寄存器名字和指令间依赖关系,并且分发指令
  • Instruction fetch and branch (IFB)instruction cache and merge (ICM) : 负责取指以及进行分支预测, 包含指令缓存
  • Instruction decode unit (IDU) : 译码单元从IFU缓冲里获取指令并进行译码
  • Load-store unit (LSU) : LSU处理所有的操作数访问,包含数据缓存
  • Translation unit (XU) : XU 处理逻辑地址到物理地址的转换,包含translation look-aside buffer (TLB)Dynamic Address Translation (DAT)
  • Core pervasive unit (PC) : 用于指令和错误的收集
  • 恢复单元Recovery unit (RU) : RU记录处理器核里所有寄存器状态,收集硬件出错信号并且管理硬件恢复
  • 协处理器Co-Processor (COP) : 负责数据压缩和加密
  • Modulo arithmetic (MA) unit: 支持椭圆加密算法
  • 向量和浮点单元
    • 定点执行单元(FXU) :FXU处理所有定点算术运算
    • 二进制浮点单元Binary floating-point unit (BFU) : BFU处理所有二进制和十六进制的浮点和定点乘除运算
    • 十进制单元Decimal unit (DU) : DU执行十进制浮点和定点操作
    • 向量单元Vector Unit : 负责向量运算

下图展示了一个z15处理器核的指令流: Pasted image 20230925094835.png z15处理器使用分支历史表(BHT),模式历史表(PHT)以及分支目标缓冲(BTB)来进行分支方向及目标的预测。

下图展示了z15处理器的流水线: Pasted image 20231212223725.png

9.1.1.1 协处理器单元

每个处理器核内有一个用于数据压缩,加密和排序的协处理器 (CoP)。其中压缩加速器器使用静态字典,并利用L1指令缓存;加密加速器用于CP assist for cryptographic function (CPACF)。下图展示了CoP的物理位置及其微架构: Pasted image 20230925101023.png

9.1.2 片上压缩加速器

z15有一个片上压缩加速器 (Nest Accelerator Unit - NXU),由处理器芯片上12个处理器核共享,支持DEFLATE兼容的压缩和解压缩;并提供同步和异步两种执行模式:

  • 同步执行 用户应用程序在problem state执行
  • 异步执行 为z/OS下授权的应用而优化

下图展示了片上压缩加速器位置: Pasted image 20231212223821.png

9.2 系统控制芯片(SC)

系统控制芯片(SC)采用14nm SOI工艺,面积25.3 x 27.5 mm, 一共有122亿晶体管,每个CPC drawer有一个SC芯片。每个SC芯片包含960MB的L4缓存,以及用于Drawer之间连接的A-Bus。下图展示了SC芯片的物理规划图: Pasted image 20230923182508.png

9.3 缓存层次结构

z15实现了4层的缓存结构,如下图所示: Pasted image 20230925084313.png

  • 每个处理器核有256KB的L1缓存, 分成128KB的数据缓存和128KB的指令缓存,L1缓存是写入,即修改的数据会立即写回到下一级。
  • L2缓存也是每个处理器核独享,一共8MB,分别是4MB的数据缓存和4MB的指令缓存,也是写入方式。
  • L3缓存位于处理器芯片(PU)上,一共256MB,由12个处理器核共享,32路组相联;L3分成两个逻辑slice,每个128MB,由2个64MB的bank组成,缓存行256B;并且是写回机制
  • L4缓存位于存储控制芯片(SC)上,960MB,60路组相联;由CPC Drawer里所有处理器共享,也是写回机制

L4是CPC Drawer的一致性点,即所有内存访问在发送到处理器之间都需要送到L4缓存。

9.4 内存结构

z15内存子系统使用高速差分接口,下图展示了一个CPC drawer的内存拓扑结构: Pasted image 20230923183029.png 每一个CPC Drawer支持3或4个MCUs,DIMMs分别和PU上的内存控制器(MCU)相连。每个处理器芯片PU SCM有一个MCU, 支持5个DIMM通道,其中一个用于RAIM(Redundant array of independent memory);每个DIMM有32 GB, 64 GB, 128 GB,256, 或512 GB;同一个MCU不能混和使用不同大小的DIMM。一个CPC Drawer最多支持8TB内存,5个CPC Drawer组成的服务器最多支持40TB的内存。

z15使用了内存冗余阵列RAIM(redundant array of independent memory,RAIM可以检测DRAM,socket,内存通道或者DIMM的错误并恢复。下图展示了RAIM的示意图: Pasted image 20231216170429.png 4个数据通道的奇偶保存在第5个通道的DIMM里,内存系统里的任何错误都可以被发现并动态修正。

9.5 SMP系统

9.5.1 CPC drawer

z15 CPC drawer主要包括:

  • 一个系统控制芯片(SC)
  • 四个处理器芯片(CP)
  • 最多20条内存DIMMs
  • PCIe I/O Drawer连接插槽

下图展示了一个CPC drawer: Pasted image 20230923175853.png

每个CPC drawer由两个逻辑CP clusters 和一个SC SCM组成,下图展示了CPC Drawer内部连接: Pasted image 20230923180454.png CP Cluster内CP之间使用X-Bus连接,同时每个CP使用X-Bus和SC芯片连接。

9.5.2 Frames

z15服务器主要组成部件包括:

  • 1-4个19-inch 42u frame
  • 1-5个CPC (Processor) drawers
  • 最多12个PCIe+ Gen3 I/O drawers
  • CPC drawer Cooling Units : Radiator cooling assembly (RCA) 或Water Cooling Unit (WCU)
  • 每个Frame 2-4个Intelligent Power Distribution Units (iPDU)或1-6对Bulk Power Regulators

下图展示了一个全配置的z15服务器前视图: Pasted image 20230923174844.png 5个CPC Drawer通过各自SC芯片形成全连接,下图展示了5个CPC Drawer之间的连接: Pasted image 20230925093551.png

9.5.3 I/O drawer

z15支持4个GbE交换机, 5个CPC drawers, 和最多12个PCIe I/O drawers。下图展示了CPC上的I/O的连接示意图: Pasted image 20230923183738.png

9.6 系统控制

系统的控制使用flexible service processors (FSPs),FSP基于IBM Power PC处理器;每个FSP有两个端口,连接到内部的Ethernet LAN,和support elements (SEs)通信,并提供了subsystem interface (SSI)接口来控制系统。下图展示了FSB和SE之间连接: Pasted image 20230923181459.png

9.7 RAS

PU的错误恢复机制称为静默恢复,即当发现错误时,指令单元会重试指令并尝试恢复错误;如果第二次尝试也失败了,会将当前处理器核上状态迁移到其他处理器核上。下图展示了处理器的错误检测核恢复流程: Pasted image 20230925101311.png

9.8 散热冷却单元

下图展示了z15上的水冷散热单元: Pasted image 20230923184247.png 经过CPC Drawer之后的热水由冷却泵抽到冷却区冷却之后,在重循环到CPC Drawer。

10. z16

10.1 z16处理器芯片

zz16处理器有8个处理器核,一共225亿晶体管,运行在5.2GHz;每个处理器核有128KB的L1指令缓存和128KB的L1数据缓存;以及32MB的L2缓存。有一个片上压缩加速器NXU以及一个人工智能加速器Artificial Intelligence Unit (AIU)。下图展示了z16的物理版图: Pasted image 20230921172719.png 8个处理器核,压缩加速器NXU和人工智能加速器(AIU)使用一个双向环总线通信,人工智能加速器使用Neural Networks Processing Assist (NNPA)指令进行编程。下图展示了z16整体架构: Pasted image 20231216225654.png

10.1.1 z16处理器核芯片

z16处理器是超标量处理器,每周期可以译码6条指令,并执行10条指令。下图展示了z16处理器核的物理版图: Pasted image 20230921173038.png 每个处理器核主要有下列功能单元组成:

  • Instruction sequence unit (ISU) : ISU实现了乱序功能,包括记录寄存器名字和指令间依赖关系,并且分发指令
  • Instruction fetch and branch (IFB)instruction cache and merge (ICM) : 负责取指以及进行分支预测, 包含指令缓存
  • Instruction decode unit (IDU) : 译码单元从IFU缓冲里获取指令并进行译码
  • Load-store unit (LSU) : LSU处理所有的操作数访问,包含数据缓存
  • Translation unit (XU) : XU 处理逻辑地址到物理地址的转换,包含translation look-aside buffer (TLB)Dynamic Address Translation (DAT)
  • Core pervasive unit (PC) : 用于指令和错误的收集
  • 恢复单元Recovery unit (RU) : RU记录处理器核里所有寄存器状态,收集硬件出错信号并且管理硬件恢复
  • 协处理器Co-Processor (COP) : 负责数据压缩和加密
  • Modulo arithmetic (MA) unit: 支持椭圆加密算法
  • 向量和浮点单元
    • 定点执行单元(FXU) :FXU处理所有定点算术运算
    • 二进制浮点单元Binary floating-point unit (BFU) : BFU处理所有二进制和十六进制的浮点和定点乘除运算
    • 十进制单元Decimal unit (DU) : DU执行十进制浮点和定点操作
    • 向量单元Vector Unit : 负责向量运算

下图展示了一个z16处理器核的指令流: Pasted image 20230922153810.png

10.1.2 AI加速器

片上AI加速器主要包括数据搬运单元(data mover),以及Processor Tiles(PT),Processor Elements(PE)和Special Function Processors(SFP)组成的计算整列。下图展示了AI捷速器的架构框图: Pasted image 20230923172318.png

  • 数据搬运单元 和环形总线相连,提供200GB/s的带宽; 和计算整列接口可提供600GB/s的带宽
  • 计算整列 由128个可以计算8路FP16的FMA的Processor Tile以及32个可以计算8路FP16/FP32 SIMD组成

10.2 缓存层次结构

z16实现了4层的缓存结构,如下图所示: Pasted image 20230921100943.png

  • 每个处理器核有256KB的L1缓存, 分成128KB的数据缓存和128KB的指令缓存,L1缓存是写入,即修改的数据会立即写回到下一级。
  • L2缓存也是每个处理器核独享,一共32MB,分别是16MB的数据缓存和16MB的指令缓存,也是写入方式。
  • L3缓存位于处理器芯片(PU)上,一共256MB,由8个处理器核共享;L3缓存是shared-victim virtual缓存,由处理器芯片上8个处理器核的L2缓存组成
  • L4缓存由一个CPC Drawer内处理器共享,一共2GB;L4缓存是shared-victim virtual缓存,由一个CPC Drawer内所有的L2缓存组成

10.3 内存结构

z16内存子系统使用高速差分接口,下图展示了一个CPC drawer的内存拓扑结构: Pasted image 20230921171056.png

10.4 SMP系统

10.4.1 CPC drawer

一个z16 CPC drawer主要有下列部分组成:

  • 4个Dual chip modules (DCMs)
  • 最多48个内存DIMMs
  • PCIe I/O Drawer连接插槽

下图展示了一个CPC drawer: Pasted image 20231216230346.png

每个CPC Drawer有4个DCM,每个DCM有两个z16处理器芯片,下图展示了一个CPC Drawer内部连接: Pasted image 20230921134737.png 具体链接如下:

  • M-bus,用于同一个DCM里两个PU之间连接,
  • X-bus, 用于同一个Drawer内部PU之间的连接
  • A-bus,用于不同Drawer之间的连接

    10.4.2 Frame

    z16服务器主要组成部件包括:

  • 1-4个19-inch 42u frame
  • 1-4个CPC (Processor) drawers
  • 最多12个PCIe+ Gen3 I/O drawers
  • CPC drawer Cooling Units : Radiator cooling assembly (RCA) 或Water Cooling Unit (WCU)
  • 每个Frame 2-4个Intelligent Power Distribution Units (iPDU)或1-6对Bulk Power Regulators

下图展示了一个全配置的z16服务器前视图: Pasted image 20231216230217.png 4个CPC Drawer通过A-Bus形成全连接,下图展示了4个CPC Drawer之间的连接: Pasted image 20230921174248.png CPC drawer之间的通信由L4虚拟缓存管理,保证Drawer之间的一致性

10.4.3 I/O drawer

z16每个CPC drawer最多支持12个I/O卡,支持PCIe+ I/O drawer。下图展示了CPC上的I/O的连接示意图: Pasted image 20230921110738.png

10.5 虚拟化

逻辑分区(Logical partitioning)是PR/SM实现的功能,可以运行在LPAR模式或则DPM(Dynamic Partition Manager模式。DPM提供了一个动态管理 I/O资源的图形界面。当一个LPAR激活时,PR/SM会为之分配处理器和内存;

虚拟化是IBM Z系列的一个主要优势,由硬件,固件和操作系统一起组成。所有的计算资源(CPU,内存和I/O)都被虚拟化,可以被不同操作系统使用。LPAR是IBM Z上提供虚拟化支持的技术,可以提供对客户系统最高程度的隔离。

IBM Z上提供虚拟化管理的硬件hypervisor(type 1)是PR/SM,集成在固件中,PR/SM管理硬件资源并建立LPAR来运行操作系统,中间件和应用软件。

同时,IBM Z上也支持软件hypervisor(type 2):

  • z/VM 支持在一个LPAR里运行多个虚拟客户系统以及嵌套虚拟化
  • KVM 开源的虚拟化hypervisor

z/VM和KVM都运行在PR/SM之上,并可以同时存在,下图展示了IBM Z平台上支持的虚拟化方案: Pasted image 20230921163414.png

10.6 系统控制

系统的控制使用BMC,BMC替换了之前系统使用的FSP;每个Drawer有两个BMC,每个BMC有一个Ethernet端口,连接到内部的Ethernet LAN,和support elements (SEs)通信,并提供了subsystem interface (SSI)接口来控制系统。下图展示了BMC和SE之间连接: Pasted image 20230921171624.png 所有处理器核在上电之后都需要定性,否则不可用;可以被定性为 CP, IFL, ICF, zIIP, IFP或SAP。

  • CP(Central Processor) 用于通用计算任务
  • IFL(Integrated Facility for Linux) 专门用于运行Linux
    • Unassigned Integrated Facilities for Linux (UIFL) 作为IFL购买但还未激活
  • zIIP(System z Integrated Information Processor) zIIP用于卸载z/OS负载,以及使用SRB (System Recovery Boost)
    • Unassigned zIIP 作为zIIP购买但是还未激活,不可使用
  • Integrated Coupling Facility (ICF) ICF用于在Parallel Sysplex 环境里运行CFCC
    • Unassigned Coupling Facility 作为ICF购买但是还未激活
  • SAP(System assist processors) SAP用于运行channel subsystem LIC(Licensed Internal Code),来控制IO操作,SAP为所有的LPAR的IO操作服务
  • IFP(Integrated firmware processor) 在系统初始化时,会从所有可用PUs里分配一个作为IFP,作为系统管理使用,标准单元,不受客户定制

    10.7 RAS

    PU的错误恢复机制称为静默恢复,即当发现错误时,指令单元会重试指令并尝试恢复错误;如果第二次尝试也失败了,会将当前处理器核上状态迁移到其他处理器核上。下图展示了处理器的错误检测核恢复流程: Pasted image 20230922172019.png

10.8 Cooling options

z16服务器CPC Drawer里的DCMs使用内部水冷系统制冷,而水冷散热器,PCIe+ I/O drawers则使用风冷散热。散热器,风扇和传感器都使用N+1的冗余设计。下图展示了z16的散热系统: Pasted image 20230921173918.png

参考文献

  1. Cedric Lichtenau, Alper Buyuktosunoglu, Ramon Bertran, Peter Figuli, Christian Jacobi, Nikolaos Papandreou, Haris Pozidis, Anthony Saporito, Andrew Sica, and Elpida Tzortzatos. 2022. AI accelerator on IBM Telum processor: industrial product. In Proceedings of the 49th Annual International Symposium on Computer Architecture (ISCA ‘22). Association for Computing Machinery, New York, NY, USA, 1012–1028. https://doi.org/10.1145/3470496.3533042
  2. D. Berger, C. Jacobi, C. R. Walters, R. J. Sonnelitter, M. Cadigan and M. Klein, “Enterprise-Class Multilevel Cache Design: Low Latency, Huge Capacity, and High Reliability,” in IEEE Micro, vol. 43, no. 1, pp. 58-66, 1 Jan.-Feb. 2023, doi: 10.1109/MM.2022.3193642.
  3. O. Geva et al., “IBM Telum: a 16-Core 5+ GHz DCM,” 2022 IEEE International Solid-State Circuits Conference (ISSCC), San Francisco, CA, USA, 2022, pp. 46-48, doi: 10.1109/ISSCC42614.2022.9731541.
  4. C. Jacobi, “Real-time AI for Enterprise Workloads: the IBM Telum Processor,” 2021 IEEE Hot Chips 33 Symposium (HCS), Palo Alto, CA, USA, 2021, pp. 1-22, doi: 10.1109/HCS52781.2021.9567422.
  5. A. Saporito et al., “Design of the IBM z15 microprocessor,” in IBM Journal of Research and Development, vol. 64, no. 5/6, pp. 7:1-7:18, Sept.-Nov. 2020, doi: 10.1147/JRD.2020.3008119.
  6. A. Saporito, “The IBM z15 processor chip set,” 2020 IEEE Hot Chips 32 Symposium (HCS), Palo Alto, CA, USA, 2020, pp. 1-17, doi: 10.1109/HCS49909.2020.9220508.
  7. W. P. Kostenko, J. G. Torok and D. W. Demetriou, “IBM z15: Improved data center density and energy efficiency, new system packaging, and modeling,” in IBM Journal of Research and Development, vol. 64, no. 5/6, pp. 16:1-16:10, Sept.-Nov. 2020, doi: 10.1147/JRD.2020.3008100.
  8. C. Berry et al., “2.7 IBM z15: A 12-Core 5.2GHz Microprocessor,” 2020 IEEE International Solid-State Circuits Conference - (ISSCC), San Francisco, CA, USA, 2020, pp. 54-56, doi: 10.1109/ISSCC19947.2020.9063030.
  9. N. Adiga, J. Bonanno, A. Collura, M. Heizmann, B. R. Prasky and A. Saporito, “The IBM z15 High Frequency Mainframe Branch Predictor Industrial Product,” 2020 ACM/IEEE 47th Annual International Symposium on Computer Architecture (ISCA), Valencia, Spain, 2020, pp. 27-39, doi: 10.1109/ISCA45697.2020.00014.
  10. B. Abali et al., “Data Compression Accelerator on IBM POWER9 and z15 Processors : Industrial Product,” 2020 ACM/IEEE 47th Annual International Symposium on Computer Architecture (ISCA), Valencia, Spain, 2020, pp. 1-14, doi: 10.1109/ISCA45697.2020.00012.
  11. C. Jacobi et al., “Design of the IBM z14 microprocessor,” in IBM Journal of Research and Development, vol. 62, no. 2/3, pp. 8:1-8:11, March-May 2018, doi: 10.1147/JRD.2018.2798718.
  12. W. P. Kostenko, D. W. Demetriou and J. G. Torok, “IBM z14: Improved datacenter characteristics, energy efficiency, and packaging innovation,” in IBM Journal of Research and Development, vol. 62, no. 2/3, pp. 16:1-16:11, 1 March-May 2018, doi: 10.1147/JRD.2018.2803438.
  13. C. Berry et al., “IBM z14™: 14nm microprocessor for the next-generation mainframe,” 2018 IEEE International Solid-State Circuits Conference - (ISSCC), San Francisco, CA, USA, 2018, pp. 36-38, doi: 10.1109/ISSCC.2018.8310171.
  14. D. Wolpert et al., “IBM z14: Enabling physical design in 14-nm technology for high-performance, high-reliability microprocessors,” in IBM Journal of Research and Development, vol. 62, no. 2/3, pp. 10:1-10:14, March-May 2018, doi: 10.1147/JRD.2018.2800499.
  15. C. Berry et al., “IBM z14: Processor Characterization and Power Management for High-Reliability Mainframe Systems,” in IEEE Journal of Solid-State Circuits, vol. 54, no. 1, pp. 121-132, Jan. 2019, doi: 10.1109/JSSC.2018.2873582.
  16. B. W. Curran et al., “The IBM z13 multithreaded microprocessor,” in IBM Journal of Research and Development, vol. 59, no. 4/5, pp. 1:1-1:13, July-Sept. 2015, doi: 10.1147/JRD.2015.2418591.
  17. C. R. Walters, P. Mak, D. P. D. Berger, M. A. Blake, T. C. Bronson, K. D. Klapproth, A. J. O’Neill, R. J. Sonnelitter, and V. K. Papazova. 2015. The IBM z13 processor cache subsystem. IBM J. Res. Dev. 59, 4–5 (July/September 2015), 3:1–3:14. https://doi.org/10.1147/JRD.2015.2428591
  18. C. Axnix, G. Bayer, H. Böhm, J. Von Buttlar, M. S. Farrell, L. Cranton Heller, J. P. Kubala, S. E. Lederer, R. Mansell, A. Nuñez Mencias, and S. Usenbinz. 2015. IBM z13 firmware innovations for simultaneous multithreading and I/O virtualization. IBM J. Res. Dev. 59, 4–5 (July/September 2015), 11:1–11:11. https://doi.org/10.1147/JRD.2015.2435494
  19. E. W. Chencinski et al., “Advances in the IBM z13 I/O function and capability,” in IBM Journal of Research and Development, vol. 59, no. 4/5, pp. 5:1-5:10, July-Sept. 2015, doi: 10.1147/JRD.2015.2429032.
  20. P. J. Meaney et al., “The IBM z13 memory subsystem for big data,” in IBM Journal of Research and Development, vol. 59, no. 4/5, pp. 4:1-4:11, July-Sept. 2015, doi: 10.1147/JRD.2015.2429031.
  21. C. K. Shum, F. Busaba and C. Jacobi, “IBM zEC12: The Third-Generation High-Frequency Mainframe Microprocessor,” in IEEE Micro, vol. 33, no. 2, pp. 38-47, March-April 2013, doi: 10.1109/MM.2013.9.
  22. F. Busaba et al., “IBM zEnterprise 196 microprocessor and cache subsystem,” in IBM Journal of Research and Development, vol. 56, no. 1.2, pp. 1:1-1:12, Jan.-Feb. 2012, doi: 10.1147/JRD.2011.2173962.
  23. B. W. Curran et al., “The zEnterprise 196 System and Microprocessor,” in IEEE Micro, vol. 31, no. 2, pp. 26-40, March-April 2011, doi: 10.1109/MM.2011.34.
  24. P. Mak, C. R. Walters and G. E. Strait, “IBM System z10 processor cache subsystem microarchitecture,” in IBM Journal of Research and Development, vol. 53, no. 1, pp. 2:1-2:12, Jan. 2009, doi: 10.1147/JRD.2009.5388579.
  25. C. . -L. K. Shum et al., “Design and microarchitecture of the IBM System z10 microprocessor,” in IBM Journal of Research and Development, vol. 53, no. 1, pp. 1:1-1:12, Jan. 2009, doi: 10.1147/JRD.2009.5388586.
  26. C. F. Webb, “IBM z10: The Next-Generation Mainframe Microprocessor,” in IEEE Micro, vol. 28, no. 2, pp. 19-29, March-April 2008, doi: 10.1109/MM.2008.26.
  27. T. J. Slegel, E. Pfeffer and J. A. Magee, “The IBM eServer z990 microprocessor,” in IBM Journal of Research and Development, vol. 48, no. 3.4, pp. 295-309, May 2004, doi: 10.1147/rd.483.0295.
  28. B. W. Curran et al., “IBM eServer z900 high-frequency microprocessor technology, circuits, and design methodology,” in IBM Journal of Research and Development, vol. 46, no. 4.5, pp. 631-644, July 2002, doi: 10.1147/rd.464.0631.
  29. E. M. Schwarz et al., “The microarchitecture of the IBM eServer z900 processor,” in IBM Journal of Research and Development, vol. 46, no. 4.5, pp. 381-395, July 2002, doi: 10.1147/rd.464.0381.
  30. Curran, B., Camporese, P., Carey, S., Chan, Y., Chan, Y.-H., Crea, R., Hoffman, D., Koprowski, T., Mayo, M., Northrop, G., Sigal, L., Smith, H., Tanzi, F., 2001. 15.5 A 1.1GHz First 64b Generation Z900 Microprocessor.
  31. T. McPherson et al., “760 MHz G6 S/390 microprocessor exploiting multiple Vt and copper interconnects,” 2000 IEEE International Solid-State Circuits Conference. Digest of Technical Papers (Cat. No.00CH37056), San Francisco, CA, USA, 2000, pp. 96-97, doi: 10.1109/ISSCC.2000.839707.
  32. T. J. Slegel et al., “IBM’s S/390 G5 microprocessor design,” in IEEE Micro, vol. 19, no. 2, pp. 12-23, March-April 1999, doi: 10.1109/40.755464.
  33. C. F. Webb and J. S. Liptay, “A high-frequency custom CMOS S/390 microprocessor,” Proceedings International Conference on Computer Design VLSI in Computers and Processors, Austin, TX, USA, 1997, pp. 241-246, doi: 10.1109/ICCD.1997.628874.
  34. C. F. Webb et al., “A 400 MHz S/390 microprocessor,” 1997 IEEE International Solids-State Circuits Conference. Digest of Technical Papers, San Francisco, CA, USA, 1997, pp. 168-169, doi: 10.1109/ISSCC.1997.585319.
  35. Slegel, T.J., Averill, R.M., Check, M.A., Giamei, B.C., Krumm, B.W., Krygowski, C.A., Li, W.H., Liptay, J.S., MacDougall, J.D., McPherson, T.J., Navarro, J.A., Schwarz, E.M., Shum, K., Webb, C.F., 1999. IBM’s S/390 G5 microprocessor design. IEEE Micro 19, 12–23. https://doi.org/10.1109/40.755464
  36. Turgeon, P. R.; Mak, P.; Blake, M. A.; Fee, M. F.; Ford, C. B.; Meaney, P. J.; Seigler, R.; Shen, W. W. (1999). The S/390 G5/G6 binodal cache. IBM Journal of Research and Development, 43(5.6), 661–670. doi:10.1147/rd.435.0661
  37. G. S. Rao, T. A. Gregg, C. A. Price, C. L. Rao and S. J. Repka, “IBM S/390 Parallel Enterprise Servers G3 and G4,” in IBM Journal of Research and Development, vol. 41, no. 4.5, pp. 397-403, July 1997, doi: 10.1147/rd.414.0397.
  38. P. Mak et al., “Processor subsystem interconnect architecture for a large symmetric multiprocessing system,” in IBM Journal of Research and Development, vol. 48, no. 3.4, pp. 323-337, May 2004, doi: 10.1147/rd.483.0323.
  39. Heller, L.C., Farrell, M.S., 2004. Millicode in an IBM zSeries processor. IBM J. Res. & Dev. 48, 425–434. https://doi.org/10.1147/rd.483.0425
]]>
History of Loongson | How long is the way of Loongson http://zhifeiding.github.io/programming/history/2023/10/22/History-Of_Loongson-How-Long-is-the-way-of-Loongson/ 2023-10-22T00:00:00+00:00 http://zhifeiding.github.io/programming/history/2023/10/22/History-Of_Loongson-How-Long-is-the-way-of-Loongson 前言

最近几年系统性的学习并梳理了近30多年的计算技术发展历史,稍有感悟。遂决定将之整理成文,目的有二,一来作为知识沉淀,串联起不同技术,挖掘不同架构之间的渊源,二来通过整理再次审视历史,期望窥见未来发展方向。我将本系列命名为鉴往知远, 主要关注计算与互联。 本文为第二篇,主要回顾龙芯系列。

0. 概述

龙芯根据架构的不同,存在 3 个处理器系列。

  • 龙芯一号,用于消费电子和嵌入式应用
  • 龙芯二号,用于嵌入式应用和低性能个人计算机的单核处理器
  • 龙芯三号,用于更高性能计算机、高性能计算和服务器的多核处理器

龙芯处理器核按照微架构,分为四类,分别是:

  • 单发射32位(132)GS132:带硬件分频器的基本嵌入式 MIPS32 内核。3- (GS132) 或 5- (GS132E) 级流水线
  • 双发射32位(232)GS232:高端嵌入式 MIPS32
    • GS232 最多有 5 级流水线,500MHz,16KB L1。GS232 主要用于龙芯一号产品
    • GS232E最多有 10 级流水线,1000 MHz,16KB L1,L2 = 4 MB 共享。乱序执行
  • 四发射64位(464) GS464:具有四路超标量乱序执行的MIPS64内核。该设计起源于龙芯2F处理器
    • GS464 支持 MIPS64 R2 + LoongMMI(2E 和 2F 中的两个不同版本)
    • GS464V 于 2010 年随龙芯3B 首次推出,是具有矢量功能的 GS464
    • GS464EGS464 的改进版本,包括更大的缓存和更好的分支预测等
    • GS464EVGS464 系列的发展,首先被 3A4000 处理器使用
  • 双发射64位(264)GS264:MIPS64 内核,是GS232的64位实现

另外,LA464GS464的发展,支持 LoongArch。下图展示了龙芯各代产品之间继承和发展关系图: Pasted image 20231019150554.png

  • 龙芯 1Godson-1是单发射乱序32位处理器,是中国国内设计的第一个通用处理器
  • 龙芯 2 是 MIPS III 兼容 64 位处理器系列。与龙芯 3 系列共享 GS464处理器核,龙芯 2的发展规划是从CPU发展为SOC。龙芯 2E (2006) 是一个 CPU,2F (2007) 集成了北桥。2F 的设计是 GS464 核心的基础
  • 2009年的龙芯 3A1000是第一个生产的处理器,使用 4 个 GS464 内核,65 nm工艺。 龙芯 3A1000 能够以接近 1 GHz的时钟速度运行,首先是4 个 CPU 内核(~15 W),然后是 8 个内核(40 W)的龙芯3B1500
  • 2015 年,发布了 龙芯3A1500龙芯3B2000。使用增强型 GS464E 处理器核,改进后的微体系结构提供了更好的性能,据报道速度是 龙芯3A1000 的 3 倍,并且还引入了 LoongISA 增强型指令集龙芯3A1500 用于嵌入式应用,而 龙芯3B2000 用于服务器和 PC
  • 2017年龙芯发布龙芯3A3000龙芯3A3000 采用四核 64 位设计,主频为 1.5 GHz,功耗仅为 30 W
  • 2019 年底,发布了 龙芯3A 4000龙芯3B 4000 系列。使用了升级后的 GS464EV 微架构。处理器设计有四个内核,8MB 的 L3 缓存和 1.8 GHz 至 2 GHz 之间的工作时钟
  • 2021年7月,龙芯3 5000系列发布。该系列处理器是龙芯首款自主研发的LoongArch指令集架构,包括 龙芯3A5000,一个四核台式机 CPU 和 3C5000L,一个十六核服务器 CPU,基于单个封装中的四个 3A5000。使用LA464处理器核
  • 2023年11月,龙芯官方发布龙芯3A6000使用是6发射双线程的LA664处理器核

本文主要关注龙芯三号,其微架构主要为四发射64位,即GS464系列。关于龙芯指令集架构历史渊源请参考第一章龙芯指令集架构的介绍。本文通过系统性回顾整个龙芯系列处理器,试图通过龙芯系列处理器发展的历史脉络,来展现国内处理器技术发展历程,以及和国际主流处理器厂商的差异。下表总结了各代处理器之间的关键指标和规格:

                           
  Godson-1 Godson-2B Godson-2C Godson-2E Loongson 2F Loongson 2G Loongson 3A1000 Loongson 3B1500 Loongson 3A2000 Loongson 3A3000 Loongson 3A4000 Loongson 3A5000 Loongson 3A6000
Date 2001 2003 2004 2006 2008 2010 2009 2015 2015 2016 2019 2021 2023
Core Name GS132 NA NA GS464r1 GS464r1 GS464r2 GS464r2 GS464V GS464E GS464E GS464EV GS464V/LA464 LA664
Technology 0.18um 0.18um 0.18um 90nm ST 90nm ST 65nm ST 65nm SMIC 32nm SMIC 40nm ST 28nm ST 28nm 12nm 12nm
Transistors 4M 15M 15M 47M 51M 100M 425M 1.14B 8B 8B      
Area(mm^2) NA 41.5 41.5 36 43 54 140 182.5 248.6(17.66x14.08) 248.6(25.3x28.8) 232 147  
TDP(W) 0.5 NA NA 5-7 3-5 3 15 30-60 15 40 50 35  
Frequency(GHz) 0.266 0.25 0.45 1 0.8 1 0.8-1 1.5 0.8-1 1.2-1.5 1.8 2.3-2.5 2.5
No. Inst Decode 1 4 4 4 4 4 4 4 4 4 4 4 4
No. Inst Issue 1 4 4 4 4 4 4 4 4 4 4 4 6
COREs 1 1 1 1 1 1 4 8 4 4 4 4 4
Threads ST ST ST ST ST ST ST ST ST ST ST ST SMT2
L1 Cache I$: 8K 2 way
D$: 8K 4 way
I$: 64K 4 way
D$: 64K 4 way
I$: 64K 4 way
D$: 64K 4 way
I$: 64K 4 way
D$: 64K 4 way
I$: 64K 4 way
D$: 64K 4 way
I$: 64K 4 way
D$: 64K 4 way
I$: 64K 4 way
D$: 64K 4 way
I$: 64K 4 way
D$: 64K 4 way
I$: 64K 4 way
D$: 64K 4 way
I$: 64K 4 way
D$: 64K 4 way
I$: 64K 4 way
D$: 64K 4 way
I$: 64K 4 way
D$: 64K 4 way
I$: 64K 4 way
D$: 64K 4 way
L2 Cache NA 8MB offchip 8MB offchip 512K 4 way 512K 4 way 1M 4 way 4M 8 way 128K/Core 256K/Core 16 way 256K/Core 256K/Core 256K/Core 16 way 256K/Core
L3 Cache NA NA NA NA NA NA NA 8M 4M 16 way 8M 16 way 8M 16 way 16M 16 way 16M 16 way
IO PCI PCI PCI PCI PCI PCI HT 1.0 2x8@800MHz HT 2.0 2x16@3.2GHz HT 2x16@3.2GHz HT 2x16@3.2GHz HT 2x16@3.2GHz HT 2x16@3.2GHz HT 3.0 x16@6.4GHz
Memory 8-256M 128bit 64M-2G DDR DDR2 DDR2-333 DDR2/3 DDR2/3 DDR2-800/3-1200 2x72 DDR2-800/3-1333 2x72 DDR2-800/3-1600 2x72 DDR4-2400 2x72 DDR4-3200 2x72 DDR4-3200 2x72@42GB/s
Comments MIPS-III 32 MIPS-III 64 MIPS-III 64 MIPS-III 64 MIPS-III 64 MIPS64 MIPS64 LoongISA 1.0 LoongISA 1.0 LoongISA 1.0 LoongISA 2.0 LoongISA 2.0  

可以发现,龙芯处理器很多精力都花在指令集上了,而本身处理器核的微架构更新比较缓慢。

本文组织形式如下:

  • 第一章简单介绍龙芯指令集架构LoongArch v1.02
  • 第二章介绍Godson-1的微架构,了解龙芯乃至中国的第一个处理器设计
  • 第三章介绍Godson-2Godson-3A的处理器核GS464微架构,后续龙芯都是以GS464为基础
  • 第四章简单描述Loongson-3B1500 整体架构以及支持向量运算的处理器核GS464V微架构
  • 第五章介绍Loongson-3A2000的处理器核GS464E的微架构
  • 第六章简单介绍基于GS464ELoongson-3A3000,主要是基于Loongson-3A2000做了工艺升级
  • 第七章简单介绍基于GS464EVLoongson-3A4000
  • 第八章介绍基于LA464处理器核的Loongson-3A5000
  • 第九章介绍Loongson-3A6000
  • 文章最后列出了主要的参考文献

1. LoongArch指令集架构

龙芯的指令集架构分为三个阶段:

  1. MIPS 龙芯在初始阶段使用MIPS64 指令集架构(ISA)。2009 年 6 月,ICT 直接从MIPS公司获得了 MIPS32 和 MIPS64 架构的许可。2011 年 8 月,龙芯科技有限公司从 MIPS 公司获得 MIPS32 和 MIPS64 架构许可,用于继续开发基于 MIPS 的龙芯 CPU 内核
  2. LoongISA 2015年龙芯3A2000采用LoongISA 1.0扩展指令集,是 MIPS64 的超集。LoongISA 指令作为 GS464E 内核的一部分引入。包括下列部分:
    • LoongEXT,通用扩展,148 条指令
    • LoongVZ,MIPS64 版本 5 中引入的“VZ”系统的虚拟化扩展,5 条指令
    • LoongBT,更快的 x86 和ARM二进制翻译,213 条指令
    • LoongSIMD,原名LoongMMI(在龙芯2E/F),为128位SIMD,1014条指令
    • 来自 MIPS 第 5 版的 MIPS SIMD 架构 (MSA)、DSP 和 VZ 模块
  3. LoongArch 随着龙芯 3 5000 系列的发布,龙芯在 2021 年转向了自己的处理器指令集架构(ISA)。LoongArch 包括一个简化的 32 位版本(LA32R),一个标准的 32位版本 (LA32S) 和 64 位版本 (LA64)。

LoongArch ISA 手册已于 2021 年 8 月部分可用,其第一卷记录了基本架构。根据LoongArch手册,ISA使用了MIPS的特权模型和IRQ机制,其他部分大多遵循RISC-V的做法:去掉了分支延迟槽,改变了指令编码。LoongArch 是全新的指令集,不是在 MIPS 上做的扩展。包含基础指令 337 条、虚拟机扩展 10条 、二进制翻译扩展176 条、128 位向量扩展 1024 条、256 位向量扩展 1018 条,共计 2565 条原生指令。相对于MIPS,摒弃了部分不适合现代CPU的指令,又做了大量改进和扩展。例如单条指令支持的立即数从MIPS的最大16位扩展到最大24位,分支跳转偏移也从64K扩展到1M字节,以及寻址空间从固定分段改变为单一平面等,都有效减少了编译结果的目标指令条数和访存次数,提高了效能。LoongArch的指令系统在设计时,以先进性、扩展性、兼容性为目标,其中兼容性是指融合MIPS/x86/ARM指令系统的主要特点,高效支持二进制翻译。

1.1 寄存器

LoongArch 为RISC指令集,有32个通用寄存器、32个浮点/向量寄存器。其中r0的值为0,PC的值是当前指令地址,只能被转移指令,异常陷入和异常返回间接修改。寄存器宽度在LA32下是32比特,在LA64下是64比特。

Pasted image 20231018134609.png

1.2 计算模式

龙芯架构分为LA32和LA64两种计算模式,LA64可以兼容LA32的应用层软件,具体由CSR.MISC.VA32L1/VA32L2/VA32L3控制,当这些值为1时,运行在PLV1/PLV2/PLV3级下的软件就以32位地址模式运行。此时硬件将访存虚拟地址低32位零扩展至64位之后的值作为访存的地址。

1.3 指令格式

MIPS只有3种指令格式,LoongArch重新设计了指令格式 ,使用32位定长指令,可用的格式多达9种 ,其包含3种无立即数格式和6种有立即数格式。重新设计的指令格式可以包含更多的指令槽,有利于以后的长远发展。指令编码格式如下表所示: Pasted image 20231018134157.png

1.4 特权模型

龙芯架构分为4个特权等级,分别是PLV0~PLV3,由CSR.CRMD.PLV 确定。其中,PLV0具有最高特权等级,可以使用特权指令并访问所有特权资源。PLV1~PLV3,都不能执行特权指令和访问特权资源,在MMU采用映射地址翻译模式下具有不同的访问权限。

1.5 存储模型

龙芯架构的存储一致性模型采用弱一致性(Weakly Consistency)模型,程序必须使用同步指令对写共享单元的访问保护起来,以保证对于写共享单元的访问是互斥的。对访存的顺序限制如下:

  1. 同步指令的执行满足顺序一致性条件,即同步操作在所有处理器核中都严格按照程序顺序执行,在当前同步指令完成之前不能开始执行下一个同步操作
  2. 在任一访存指令被执行之前,该指令之前的同步指令已经完成
  3. 在任一同步指令被执行之前,该指令之前的访存指令都已完成

龙芯架构下支持三种存储访问类型,由页表中MAT(Memory Access Type) 决定,分别是:

  • 一致可缓存(Coherent Cached) 访问对象可以是主存也可以是缓存
  • 强序非缓存(Strongly-ordered UnCached) 严格按照程序顺序执行
  • 弱序非缓存(Weakly-ordered UnCached) 读允许投机执行,写可以合并

1.6 内存管理及虚拟化

龙芯架构MMU地址翻译由CSR.CRMD控制,

  • CSR.CRMD.DA=1 && CSR.CRMD.PG=0时,虚拟地址就是物理地址
  • CSR.CRMD.DA=0 && CSR.CRMD.PG=1时,虚拟地址需要经过翻译,可以分为直接映射和页表映射

1.6.1 直接映射地址翻译模式

软件通过设置CSR.DMW0~CSR.DMW3寄存器来分别设置四个直接映射配置窗口,前两个同时用于取指和存储加载指令,后两个只作用于存储加载指令。 在LA64架构下,当虚拟地址最高4位[63:60]与配置窗口寄存器中的VSEG域相等且特权等级匹配时,物理地址等于虚拟地址的[PALEN-1:0]。 在LA32架构下,每一个直接映射配置窗口寄存器可以配置一个$2^{29}$字节固定大小的虚拟地址空间,当虚拟地址的最高3位[31:29]与配置窗口寄存器中的[31:29]相等且特权等级匹配时,物理地址等于虚拟地址[28:0]拼接上映射配置寄存器配置的物理地址高位。

1.6.2 页表映射

龙芯架构下TLB的重填以及TLB与内存页表的一致性维护全部需要软件完成,多级页表结构如下所示: Pasted image 20231018195837.png 当遍历页表时,PGD由虚拟地址$PALEN-1$决定,

  • 当VA[PALEN-1]=0时,PGD来自CSR.PGDL
  • 当VA[PALEN-1]=1时,PGD来自CSR.PGDH

页表项格式如下表所示: Pasted image 20231018202258.png

1.7 异常和中断

异常和中断会打断当前正在执行的应用程序,并切换到异常中断处理程序入口开始执行,异常和中断属于架构中特权资源处理部分,下面主要介绍常用一些异常:

  • 系统调用异常 执行SYSCALL 指令触发
  • 断点异常 执行BREAK指令触发
  • 指令不存在异常 所执行的指令编码未定义时触发
  • 特权指令错异常 在非特权模式下执行特权指令时触发
  • 地址错异常 当取指或访存指令的地址出现分发情况时,分别会触发取指指令地址错异常或访存指令地址错异常
  • 浮点错异常 当浮点指令的数据出现异常情况需要特殊处理时触发

1.7.1 异常和中断处理

TLB重填异常的入口地址是CSR.TLBRENTRY, 机器错误异常的入口是CSR.MERRENTRY,其他异常称为普通异常,入口地址等于$入口页号 | 页内偏移$ ,所有普通异常的入口页号都是CSR.EENTRY ;而页内偏移由中断偏移模式和异常号(ecode)共同决定,等于$2^{CSR.ECFG.VS+2} * (ecode+64)$ 。中断被当成普通异常处理,因此使用普通异常的入口计算方式,区别是,中断对应的异常号是对应中断号加上64。异常ecode如下表所示: Pasted image 20231018221820.png 触发异常的指令的地址会被记录到ERA里,作为异常返回地址;对于地址错误相关的异常,出错的地址会被记录到BADV。触发异常的指令会被记录到BADI里。

2. Godson-1

龙芯第一款处理器龙芯1号设计于2001年,2002年发布,是一款32位单发射乱序执行CPU,主频266MHz。学术论文上代号是Godson-1,是中国科学院知识创新工程方向性项目与国家“八六三”高技术研究发展计划项目的研究成果。它采用 0.18 微米 CMOS 工艺制造,具有 8 KB L1D、8 KB L1I 和一个 64 位浮点单元,能够达到 200 双精度 MFLOPS。下图展示了Godson-1的物理规划版图: Pasted image 20231019213439.png

龙芯1号实现基于操作队列复用的寄存器重命名技术,采用Tomasulo算法进行动态调度,分支预测使用静态预测,即每次都预测分支执行。主要由取指单元,译码单元,操作队列,定点和浮点寄存器文件和定点浮点执行单元组成。下图展示了Godson-1的微架构: Pasted image 20231019213259.png 指令译码单元按程序顺序将译码后指令分发到操作队列,操作队列根据指令类型发射到对应的保留站,并按序结束已经完成的指令。保留站中的指令经过执行单元之后,结果写回到操作队列和结果总线。如果指令发射时源操作数还没有准备好,并不会阻止指令的发射,而是通过操作队列号建立指令间的数据依赖关系并发射到保留站;保留站自动侦听总线结果并接受所需要的值,具体过程如下:

  1. 指令进入操作队列时将该指令的的源寄存器号与操作队列中的每一个指令的目标寄存器号进行比较,得到操作队列中最近的写该寄存器的指令的位置Qid
  2. 指令发射时检查Qid的值,如果已经写回到操作队列则直接读出,否则将Qid送到保留站并记录值未准备好
  3. 当保留站中所有操作数都准备好后开始运算并把结果送到结果总线,对应操作队列和保留站

指令流水线分成取指,译码,重命名,发射,执行,写回,完成等阶段,其中执行阶段可能需要多拍,具体如下:

  • 取指 根据当前程序计数器PC将指令从缓存读到指令寄存器IR,无分支指令及异常情况下,下一条指令的PC为当前指令的PC+4
  • 译码 根据IR中的指令进行译码并写入操作队列,如果操作队列已满,流水线暂停
  • 重命名 该指令的的源寄存器号与操作队列中的每一个指令的目标寄存器号进行比较,得到操作队列中最近的写该寄存器的指令的位置Qid
  • 发射 从操作队列中选出一个指令并发射到相应的保留站,如果指令源操作数不可用,则需要保留站记录值未准备好
  • 执行 执行单元从保留站中取出所有源操作数都准备好的指令进行运算,并将结果及指令在操作队列位置编号送到结果寄存器
  • 写回 把结果寄存器的值以及相应指令在操作队列位置编号送到结果总线,保留站和操作队列侦听结果总线的信息,并更新相应状态
  • 结束 如果操作队列中的第一个指令已经完成,则结束该指令并将操作队列里的结果写回到目标寄存器。如果操作队列中的第一个指令在执行过程中发生异常,则进行异常处理

3. Godson-2 和 Godson-3

龙芯2F于2007年7月31日流片成功,90纳米工艺,4发射乱序执行,面积 $43mm^2$ ,龙芯2F龙芯第一款成功的商用处理器。下图展示了Godson-2E的物理规划图: Pasted image 20230726155408.png 下图展示了Godson-2F的物理规划图: Pasted image 20230726155505.png

龙芯2G是在“龙芯安全适用计算机CPU研制与应用”核高基重大专项课题支持下研发的,2008年开始投入设计,2010年研制成功。龙芯2G采用65纳米工艺,主频1.0GHz,晶体管数目1亿,指令集兼容MIPS64,且增加了X86二进制翻译加速指令,以及龙芯媒体扩展指令,有64KB的指令和64KB数据的L1缓存,以及1MB的L2缓存,功耗3W。在该处理器上,使用了X86二进制翻译技术,提出了在MIPS平台上实现X86动态二进制翻译的方法。龙芯2G相当于龙芯3A1000的单核版本。龙芯3A1000于2008年底交付流片,采用意法半导体的65nm工艺流片,主频800MHz-1GHz。龙芯3A1000进行了第一次改版并于2010年5月中旬流片,10月底第一次改版流片成功。3A1000的第二次改版于2012年2月下旬流片,2012年8月中旬流片成功。

龙芯3A1000集成了4个四发射乱序执行的GS464核,9级流水线,有64KB一级数据缓存和64KB一级指令缓存,4MB共享二级缓存,最高主频1GHz,功耗15w(支持动态降频),芯片面积 $174mm^2$ ,晶体管数目4.25亿。每个CPU核包含两个浮点乘加部件,双精度浮点性能峰值为16GFlops。在龙芯3A1000处理器中,实现了x86二进制翻译加速指令。3A1000集成了PCI控制器、LPC、SPI、UART、GPIO和2个HT1.0;集成72位DDR2/3控制器。下图展示了Godson-3A1000的物理规划版图: Pasted image 20230726160528.png 龙芯3A1000第一级互联采用6x6的交叉开关,用于4个处理器核,4个共享缓存模块和两个IO端口的连接。第二级互联采用5x3的交叉开关,连接4个共享的缓存模块,两个内存控制器和一个IO端口。下图展示了龙芯3A1000整体架构: Pasted image 20231020182251.png 下图展示了一个8x8交叉互联的架构: Pasted image 20231020181812.png 8个AXI master link(AML) 和 8个AXI slave link(ASL) 通过一个交叉开关进行互联,AML 使用读写请求的地址信息进行路由,读写各有8个地址区间,对应ASLASL通过相应请求的AML 端口号将读写响应路由到对应的AMLAMLASL各有两级流水,所以交叉互联一共有4个周期延迟。

3.1 GS464微架构

下图展示了GS464的微架构: Pasted image 20231020181006.png 指令流水线分成取指,译码,重命名,发射,执行,写回,完成等阶段,其中执行阶段可能需要多拍,具体如下:

  • 取指 根据当前程序计数器PC将指令从缓存读到指令寄存器IR,无分支指令及异常情况下,下一条指令的PC为当前指令的PC+16
  • 预译码 对指令扫描,识别出分支指令并对其分支方向进行预测
  • 译码 根据IR中的4条指令进行译码并送到寄存器重命名模块
  • 重命名 将架构寄存器映射到物理寄存器上
  • 分发 寄存器重命名之后的指令被分发到定点或浮点保留站以便执行,同时送到重定序队列以便顺序完成;分支和存储加载指令被分发到对应的分支队列和存储加载队列。保留站和发射队列每项可保存分发4条指令
  • 发射 从保留站中选出操作数都准备好且最老的一个指令并发送到相应的执行单元,如果指令源操作数不可用,则侦听结果和前馈总线
  • 执行 执行单元从保留站中取出所有源操作数都准备好的指令进行运算,并将结果发送到结果和前馈总线
  • 结束 每周期可完成4条指令,完成的指令的结果被发送到寄存器映射模块以便更新架构寄存器同时释放资源

3.1.1 取指和分支预测

GS464包含 1 个4 路组相联 64 KB 的指令缓存, 其缓存行大小为 32 字节, 指令缓存的标签和数据部分同时访问并在下一时钟周期进行命中的判断与选择。其中数据部分划分为 8 个bank,每次取指令时只用读取所需要的bank, 降低了缓存访问时的动态功耗。指令缓存使用虚地址索引和实地址标识的索引方案。取指部件的虚实地址转换通过 16 项全相联结构的指令 TLB 完成, 指令 TLB 中的内容是页表的子集。其中, 每项存放 1 个页表项, 每个页表项均可支持 4 KB-1 GB 之间不同大小的页。当指令缓存命中时, 取指部件每个时钟周期最多可以从指令缓存中取出 4 条指令, 并送往下 一个流水级进行分支预测. 而当指令缓存未命中时, 取指部件将生成请求并访问缓存失效队列, 访存失效队列负责进行缓存缺失处理, 并将结果返回给指令缓存。从缓存失效队返回的结果将整体填回指令缓存, 指令缓存最多可容忍 3 个缓存行不命中, 即有 3 个未完成 (outstanding) 的缓存行不命中时, 依旧可以从正确的地址取指令。当取指请求恰好落在从缓存失效队列返回的缓存请求数据上时, 可以直接取出相应指令进入下一个流水级。此 外, 指令缓存的预取由缓存失效队列中的硬件预取引擎统一完成, 不在取指部件中单独进行。指令缓存的数据部分中还包含预译码信息, 每条指令的预译码信息为 8比特大小, 主要用于指令切分、分支类型判定和部分指令例外的判定。预译码信息通过在缓存失效队列重填指令缓存时计算得出, 并存储在指令缓存中。

在预译码阶段,会扫描IR里4条指令中的分支指令并预测分支方向和分支目标,branch-likejump 指令总是预测执行,对于条件分支指令,则使用分支历史表(BHT)来预测分支方向,使用分支目标缓冲(BTB)和返回地址堆栈(RAS)预测分支目标地址。BHT由9比特全局历史寄存器(global history register) GHR 和4K模式历史表(pattern history table) PHT组成,PHT里每项有2比特的饱和计数器,高位用于分支方向预测。BTB有16项,每一项由指令地址和跳转指令目标地址以及2比特饱和计数器组成,计数器值为0或1的项首先被替换。RAS有4项,当遇到branch and link 指令时,将当前指令地址加8推进RAS,而遇到jump register 31 指令时从RAS中弹出指令地址。

在译码阶段,4条指令被译码并送到寄存器重命名模块。

3.1.2 寄存器重命名

GS464使用合并的架构和重命名寄存器堆,定点和浮点分别是64项,相应使用64项的PRMT(physical register mapping tables)来维护架构和物理寄存器之间映射关系。PRMT每项包含:

  • 状态 每个物理寄存器处在下列状态之一:MAP_EMPTYMAP_MAPPED, MAP_WTBK, MAP_COMMIT
  • 名字 物理寄存器对应的架构寄存器标识
  • 有效位 如果多个物理寄存器映射到一个架构寄存器,则标识最新的

寄存器重命名时,需要查找PRMT来找到两个源寄存器src1,src2,目标寄存器dest 对应的最新映射的物理寄存器psrc1, psrc2odest。另外,一个处于MAP_EMPTY的物理寄存器pdest被映射到dest,且状态修改为MAP_MAPPED,有效位置1,odest有效位置0。之后映射的物理寄存器被送到保留站,odest保存在重定序队列以便指令结束时释放物理寄存器。当指令执行完成时,对应的PRMT项状态更新为MAP_WTBK, 指示后续依赖指令的操作数准备好了。当指令完成后,pdest的状态更新为MAP_COMMITodest更新为MAP_EMPTY

3.1.2 指令发射

GS464有两个保留站,分别是定点和存储加载保留站和浮点保留站。每个保留站有16项,每周期可接收4条指令。每项包含一个年龄域,当指令进入保留站时设置成最小值,当同一个功能单元的新指令进入时,旧指令的值加一。从保留站中选出操作数都准备好且最老的一个指令并发送到相应的执行单元,如果指令源操作数不可用,则侦听结果和前馈总线

对于分支指令,除了发送到保留站和重定序队列之外,还会进入分支队列,每周期可接收一条分支指令,同时最多保存8条分支指令。当分支指令执行时,结果写回到分支队列,包括JRJALR指令的地址,条件分支的分支方向,以及预测是否正确。每一个指令都会分配一个brqid,对于分支指令,指示在分支队列的位置,对于其他指令,标识了该指令前一个分支指令的位置。当分支预测错误时,该分支指令之后的指令都会被取消。

3.1.3 指令完成

寄存器重命名之后指令都被保存在重定序队列,直到指令完成。当指令执行结束且写回后,重定序队列按照程序顺序完成,重定序队列一共可以保存32条指令,每周期可接收4条指令。新进入的指令处于ROQ_MAPPED状态,当指令结果写回时后,对于分支指令,状态更新为ROQ_BRWTBK,其他指令则更新成ROQ_WTBK。对于分支指令,只有分支结果确定且对于预测错误的分支指令冲刷流水线之后才会更新成ROQ_WTBK。当指令到达重定序队列队头且处于ROQ_WTBK时才可以结束。每周期可完成4条指令。当指令完成时,pdestodest发送到寄存器重命名模块以便更新处理器架构状态并释放odest项。对于产生异常的指令,也会在指令到达队头时处理。

3.1.4 访存队列

GS464有64K的指令缓存和数据缓存,都是4路组相联;64项的TLB,为全相联结构。访存队列一共有16项,最多可以跟踪16条存储加载指令。当加载指令进入队列时,会检查所有更老的存储指令;当存储指令进入队列时,会检查所有更年轻的加载指令。

4. Loongson 3B1000和3B1500

龙芯3B1000由核高基项目课题“高性能多核CPU研发与应用”支持,采用意法半导体65纳米工艺设计,主频1GHz,功耗25W,片内集成8个64位四发射乱序执行龙芯向量处理器核GS464V,4MB的二级缓存,每个核包含两个256位向量部件,峰值浮点性能达到128GFLOPS。龙芯3B1000的最大特色是龙芯向量处理器核的设计,该处理器核将GS464核的的浮点部件和浮点寄存器堆替换为2个256位的向量处理部件和1个128x256位的向量寄存器堆,使龙芯3B在1GHz下的峰值双精度浮点计算能力达到128GFlops。在龙芯3B1000处理器中,实现了300多条专用的向量处理指令。龙芯3B1000芯片面积 $300mm^2$ , 晶体管数目接近6亿。

龙芯3B1500集成了8个四发射乱序执行的64位GS464V处理器核,9级流水线,每个处理器核有64KB的私有一级指令缓存和64KB的私有一级数据缓存,128KB私有二级缓存,有8MB三级共享缓存,采用中芯国际32纳米工艺生产,芯片面积 $180mm^2$ , 晶体管数11亿,主频1.5GHz,单芯片双精度浮点计算能力达到192GFlops,功耗30w(典型)/60w(向量)。 有2个HT2.0,PCI、LPC、SPI、UART、GPIO,72位DDR2/3控制器。龙芯3B1500由2个处理器节点组成,每个处理器节点有4个GS464V处理器核,两个处理器节点之间通过交叉开关互联。下图展示了龙芯3B1500 整体架构图: Pasted image 20231019211906.png

下图展示了龙芯3B1500物理版图: 3b1500.PNG

4.1 GS464V微架构

GS464V在32nm工艺下面积为 $6.6mm^2$ ,有两个256比特的向量算术单元,每一个可以执行4个双精度的乘加运算;对外是一个128比特的AXI接口。下图展示了GS464V的物理规划图: Pasted image 20231019220550.png

下图展示了GS464V的微架构,和GS464的区别就是浮点单元换成了向量单元,其他流水线都是一样的。 gs464v.PNG

4.2 存储层次

龙芯3B1500 每个GS464V处理器核内有4路组相联64KB的指令缓存,4路组相联64KB的数据缓存,以及4路组相联作为victim缓存的128K的L2缓存;8个GS464V处理器核共享8MB的L3缓存。 Pasted image 20231019221039.png 下图展示了各级存储测试的延迟: Pasted image 20231019221141.png

5. Loongson 3A2000

龙芯3A2000处理器集成了4个四发射乱序执行64位GS464E处理器核,也是首款采用GS464E微结构的处理器。 采用中芯国际40纳米CMOS工艺生产,主频800~1000MHz

GS464E处理器核是GS464的改进版,集成了64KB一级指令缓存,64KB一级数据缓存,256KB二级缓存和4MB三级缓存。流水线从GS464的9级提高到了12级。峰值浮点性能16GFlops。在接口上,龙芯3A200集成了两个HT3.0接口,PCI控制器、LPC、SPI、UART、GPIO,72位DDR2/3-1333×2控制器。

5.1 GS464E微架构

通过调研IBM POWER7等处理器,GS464E相比于之前的 GS464 架构, 重点强化了访存性能和分支预测准确率, 实现了 MIPS DSP 指 令集和虚拟机支持, 增大了处理器中各项队列的项数, 并增大了缓存容量和 TLB 容量。访存子系统拥有 3 级缓存结构, 每一级都采用 LRU 替换策略, 可以支持多核缓存一致性协议。下图展示了GS464E的物理规划图,主要由取指单元,寄存器重命名单元,定点单元,浮点单元,访存单元,L2缓存等组成。 Pasted image 20231019103636.pngGS464相比,GS464E 处理器核主要更新:

  • 取指单元 取指单元的功能是通过分支预测持续获得指令流, 并进行指令译码. 在 GS464E 处理器核中, 通过重新设计, 消除了分支指令预测跳转后的取指空泡; 通过加入循环缓冲器 (loop buffer), 使得最多 56 条指令组成的循环程序执行时不需访问指令缓存
  • 寄存器重命名 寄存器重命名部件的功能是进行各种寄存器的重命名, 用于动态流水线中的乱序发射。GS464E 处理器核中的寄存器重命名表扩展到 128 项定点物理寄存器和 128 项浮点物理寄存器, 此外, DSP 控制寄存器、HILO 寄存器以及浮点比较结果寄存器都单独进行重命名
  • 指令重定序 指令重定序单元的功能是将乱序发射的指令进行重定序, 并进行分支预测错与指令异常的处理. 指令重定序队列 (reorder queue, ROQ) 从 64 项增大到 128 项; 分支指令队列从 8 项 扩大到 24 项
  • 定点单元 定点单元用于进行定点计算. 在 GS464E 处理器核中, 通过激进的计算结果提前反馈 (forward) 逻辑设计, 存在寄存器数据相关的 2 条定点指令之间的延迟 (load-to-use) 从 2 个时钟周期减少到了 1 个; 此外还加入了数字信号处理 (digital signal processing, DSP) 功能单元
  • 浮点单元 浮点单元用于进行浮点计算. 浮点比较结果寄存器现在可以单独进行重命名, 因此浮点比较以及使用浮点比较结果的指令可以乱序发射和动态流水
  • 访存单元 访存部件用于处理访存指令. 访存指令专用发射队列大小为 32 项, 可以将访存指令乱序发射到 2 个访存功能部件, 每个功能部件均可执行读取 (load) 或存储 (store) 指令; 访存重定序队列的项数从 24 项提升至 64 项. 一级数据缓存采用了 LRU 替换策略, 并将 缓存行大小扩展为 64 字节长. 地址翻译快速查找表 (translation lookaside buffer, TLB) 的项数也有大幅扩充, 采用了 64 项可变大小页外加 1024 项固定大小页的双重 TLB 设计
  • 缓存失效队列 缓存失效队列由指令缓存失效请求与数据缓存失效请求所共用, 用于处理缓存失效并重填缓存行. 在 GS464E 处理器核中, 其项数从 8 项提升至 16 项, 并实现了激进的指令和数据预取引擎, 该预取引擎会根据缓存失效队列中的信息自动生成预取请求, 并通过缓存失效队列来处理这些预取请求. 该预取机制不会导致一级缓存污染
  • Victim Cache Victim Cache 是片内的第二级缓存, 当一级缓存失效时被查询. 在 GS464E 处理器核中, 其总容量扩大为 256 KB, 相联结构从 8 路组相联改为 16 路组相联, 并采用了 LRU 替换策略, 提高了 Victim Cache 的命中率

下图展示了GS464E的微架构: Pasted image 20231019104824.png

5.1.1 取指单元

GS464E的取指单元主要包括L1指令缓存,指令TLB,分支预测器,指令队列和译码单元。下图展示了GS464E的取指单元的流水线: Pasted image 20231019105026.png 每个 GS464E 处理器核包含 1 个4 路组相联 64 KB 的指令缓存, 其缓存行大小为 64 字节, 指令缓存的标签和数据部分同时访问并在下一时钟周期进行命中的判断与选择。其中数据部分划分为 8 个bank,每次取指令时只用读取所需要的bank, 降低了缓存访问时的动态功耗。指令缓存使用虚地址索引和实地址标识的索引方案。取指部件的虚实地址转换通过 64 项全相联结构的指令 TLB 完成, 指令 TLB 中的内容是页表的子集。其中, 每项存放 1 个页表项, 每个页表项均可支持 4 KB-1 GB 之间不同大小的页。当指令缓存命中时, 取指部件每个时钟周期最多可以从指令缓存中取出 8 条指令, 并送往下 一个流水级进行分支预测. 而当指令缓存未命中时, 取指部件将生成请求并访问缓存失效队列, 访存失效队列负责进行缓存缺失处理, 并将结果返回给指令缓存。从缓存失效队返回的结果将整体填回指令缓存, 指令缓存最多可容忍 3 个缓存行不命中, 即有 3 个未完成 (outstanding) 的缓存行不命中时, 依旧可以从正确的地址取指令。当取指请求恰好落在从缓存失效队列返回的缓存请求数据上时, 可以直接取出相应指令进入下一个流水级。此 外, 指令缓存的预取由缓存失效队列中的硬件预取引擎统一完成, 不在取指部件中单独进行。指令缓存的数据部分中还包含预译码信息, 每条指令的预译码信息为 8比特大小, 主要用于指令切分、分支类型判定和部分指令例外的判定。预译码信息通过在缓存失效队列重填指令缓存时计算得出, 并存储在指令缓存中。

GS464E 处理器核采用了多种不同的机制来预测分支指令的跳转方向和跳转目标, 并通过分支目标缓冲器 (BrBTB) 来处理分支指令之后取指空泡的情况。分支预测机制在每个时钟周期最多可以处理 4 条分支指令, 但只有最后一条可以是预测为跳转的分支指令, 预测为跳转的分支指令的后续指令将在下一个时钟周期进行处理。GS464E 处理器核采用 3 个时钟周期延迟的 “取指 — 分支” 循环迭代设计,

  • 第 1 个时钟周期 根据程序计数器 (program counter, PC) 的值访问指令缓存
  • 第 2 个时钟周期 指令缓存查询完毕, 取出最多 8 条指令
  • 第 3 个时钟周期 逐条解析指令, 预测分支指令的跳转方向和跳转目标, 如果取出的多条指令中存在预测为跳转的分支指令, 则需要根据此类指令中最早的那条来更新 PC 值

由于取出指令并预测出后续指令 PC 需要花费 3 个时钟周期, 其中有 2 个时钟周期无法确保能取出有意义的指令, 为避免性能损失, GS464E 处理器核实现了分支目标缓冲器 (BrBTB), 直接根据取指所使用的 PC 值预测后续指令的 PC 值。如果取出的指令中没有预测为跳转的分支指令, BrBTB 也没有预测出需要跳变的 PC 值, 则取指部件从当前 PC 向后顺序取指令。BrBTB 为 128 项全相联结 构, 使用当前时钟周期的 PC 值来索引下个时钟周期的预测 PC, 在其预测正确的情况下, 即使有需要跳转的分支指令, 取指流水线也不会断流。BrBTB 的功能是根据当前 PC 来预测下一个时钟周期的取指 PC, 用于消除分支指令之后的取指空泡, 但是分支预测工作还是需要解析不同的指令来进行不同处理的。

分支指令跳转方向的预测使用一套组合分支历史表 (BHTs), 包括 1 个 16384 项的全局分支历史表 (global branch history table, GBHT), 1 个 16384 项的局部分支历史表 (local branch history table, LBHT) 和 1 个 16384 项的全局选择历史表 (global branch select table, GSEL)。每个时钟周期取出的最多 8 条指令可以同时查找这套分支历史表,上述 3 个分支历史表中的每项都是 2 bit 饱和计数器, 其最高比特位在 GBHT 和 LBHT 中用于指明跳转方向, 而在 GSEL 中则用于决定选用 GBHT 还是 LBHT 的预测方向。

间接跳转指令的跳转目标预测分为两种情况:

  • 函数返回跳转指令 (MIPS 指令集中的 JR r31 指令) 采用 16 项的返回地址栈 (return address stack, RAS) 进行预测。当分支预测阶段发现函数调用跳转指令时, 将该指令延迟槽之后指令的 PC 值压入 (push) 至 RAS 中。当分支预测阶段发现函数返回跳转指令时, 则弹出 (pop) RAS 栈顶所存放的 PC 值作为跳转目标的预测值。为了防止在错误推测路径上执行对 RAS 栈顶指令或栈顶内容的错误修改, RAS 的栈顶指针和当前栈顶的 PC 值都有其临 时备份, 用于自纠正
  • 除上述函数返回跳转指令之外的的间接跳转指令使用项数为 1024 的跳转目标缓存器 (jump branch target address cache, JBTAC) 进行预测, 该缓存器使用取指 PC 及跳转历史信息进行索引。

当指令被取出后, 会根据预译码信息的指示, 按照不同的指令类型, 分别使用上述 3 种机制中的某 一种机制进行分支预测. 经过分支预测阶段后, 指令被存入大小为 64 项的指令队列中. 在 GS464E 处 理器核中, 基于该指令队列的资源还实现了循环缓冲器 (loop buffer). 循环缓冲器会监测进入指令队列的指令流 PC 特征, 当发现指令流中包含一个不大于 56 条指令的单层循环时, 将停止从指令缓存取指, 而是直接从指令队列中取出指令送到译码阶段. 当循环次数达到并退出循环时, 循环缓冲器会被清空.

译码功能部件在每个时钟周期会从指令队列头部取出 4 条指令进行译码。译码过程的行为较简单, 就是将指令码翻译为方便功能部件处理的内部码, 标识出指令类型、所需要操作的寄存器号以及指令码中可能包含的立即数, 用于接下来的寄存器重命名阶段。

5.1.2 指令分配与提交单元

指令分配与提交单元负责指令在处理器核中的分配与定序, 具体包括寄存器重命名,指令分配,指令发射,指令重定序,指令提交及分支与异常处理这几个功能。

译码后的指令首先进行寄存器重命名, 随后根据操作类型分配至不同的发射队列中。寄存器重命名是动态流水线中进行乱序发射的关键技术, 将为指令中指定的逻辑寄存器各自分配一个物理寄存器。在 GS464E 处理器核中, 需要进行重命名的寄存器有: 通用定点寄存器、通用浮点寄存器、HILO 寄存器、DSP 控制寄存器、浮点比较结果寄存器。这些需要重命名的寄存器各自进行映射, 通过物理寄存器映射表 (physical register map table, PRMT) 来保存物理寄存器和逻辑寄存器之间的关系. 用于通用定点寄存器重命名的为 128 项 64位宽的寄存器堆, 用于通用浮点寄存器重命名的为 128 项 64位宽的寄存器堆, 用于 HILO 寄存器重命名的为 16 项 128位宽的寄存器堆, 用于 DSP 控制寄存器 重命名的为 32 项 32位宽的寄存器堆, 用于浮点比较结果寄存器重命名的为 32 项 32位宽的寄存 器堆。

GS464E 处理器核中有 3 个独立的发射队列:

  • 16 项的定点发射队列,定点发射队列负责源操作数和目标操作数均为通用定点寄存器、HILO 寄存器或 DSP 控制寄存器的运算指令和分支指令
  • 24 项的浮点发射队列,浮点发射队列负责源操作数和目标操作数均为通用浮点寄存器或浮点比较结果寄存器的运算指令和分支指令
  • 32 项的访存发射队列,访存发射队列除了负责所有定点,浮点的访存操作指令外, 还包括控制寄存器操作指令 (CP0 指令) 以及在定点与浮点寄存器间交互数据的指令 从控制功耗的角度出发, 3 个发射队列均采用移动指针而非移动队列中存储内容的管理策略, 每 个时钟周期需要计算当前应当发射指令的指针。只有源寄存器都已经就绪的指令才能被发射, 而指令在寄存器重命名阶段时就会先检查其源寄存器是否已经就绪。若其源操作数还没有准备好, 则该指令在进行指令分配以及在发射队列中的时候, 都要将自身的源寄存器号同结果总线或前馈总线的目标寄存器号相互比较, 以确定本条指令所需的源寄存器是否就绪。此时所使用的寄存器号都是经过寄存器重命名后的物理寄存器号。上述的 3 个发射队列都采用乱序发射机制, 指令的所有源操作数只要准备好就可以发射。当存在多个发射候选时, 最早进入的指令具有最高的优先级。

GS464E 处理器核中, 指令被顺序译码和重命名,乱序发射和执行, 但是要有序提交。重定序队列负责指令的有序结束, 它从寄存器重命名模块获取程序指令序信息, 并有序地保存流水线中所有已经完成寄存器重命名但未提交的指令。指令在功能单元执行完毕并写回 (writeback) 后, 重定序队列按照程序指令序顺序提交这些指令。重定序队列最多可同时容纳 128 条指令。重定序队列每个时钟周期最多可以提交队列顶端的 4 条已经处于写回状态的指令。指令的提交信息会送往寄存器重命名模块, 用于修改重命名的状态, 同时还需要通知访存重定序队列, 因为存储指令需要提交后才能修改存储器的内容。GS464E 处理器核实现了精确异常, 当取指令,译码或执行时发生异常时, 异常信息被送至重定序队列保存下来, 只有异常指令成为重定序队列头时, 才进行异常报告与处理。硬件进行的异常处理工作包括: 将异常原因、异常指令的 PC 值等信息记录到有关的 CP0 寄存器中, 并根据异常类型把异常处理程序的入口地址送到程序计数器中。

分支指令在寄存器重命名后进入重定序队列和发射队列的同时还会顺序地进入分支指令队列。GS464E 处理器核中的分支指令队列最多可以容纳 24 条分支指令, 该队列会记录分支指令进行分支预测时的预测结果。分支指令和其他指令一样都需要在功能部件执行, 但是其结果总线额外包含分支结果, 分支结果会写回到分支指令队列。这些结果包括 JRJALR 指令的目标地址, 以及条件转移指令的转移方向, 利用这些结果可以判断这条指令的分支预测是否准确. 不论预测成功与否, 分支指令的执行结果都会反馈到取指部件, 用于修正相关的分支预测器, 以帮助后续分支指令的预测。预测错误的分支指令和在它之后取进来的指令都需要取消。分支指令队列负责发送分支错误取消总线, 根据队列中记录的程序指令序, 准确地进行分支取消操作, 同时将正确的 PC 值送到程序计数 器中。

5.1.3 定点单元和浮点单元

GS464E 处理器核中的定点单元包含 1 个多端口定点寄存器堆以及 2 个完全相同的定点运算单元。定点寄存器堆共 128 项, 一共有 8 个读端口和 4 个写端口。每条定点运算流水线中均包含: 用于 执行定点加、减、比较、陷阱指令的算术逻辑单元 (arithmetic logic unit, ALU), 用于执行移位、循环 移位和比特提取与截断指令的循环桶形移位器, 位操作单元, 前导零计数器, 分支处理单元, 除法部件和乘法器, 每种运算单元的数量均为 1 个。所有频繁执行的指令均在 1 个时钟周期内执行完毕, 且通过激进的前馈机制设计, 使得存在寄存器相关的多条指令可以背靠背连续发射。乘法器采用全流水设计, 可进行 64x64有符号或无符号乘法运算, 运算延迟为 3 个时钟周期, 全流水设计使得每个乘法器在每个时钟周期都可接受 1 条新的指令, 并产生 128比特的乘积结果。

GS464E 处理器核中的浮点部件包含 1 个多端口浮点寄存器堆以及 2 个完全相同的浮点运算单元。浮点多端口寄存器堆共 128 项, 一共有 8 个读端口和 4 个写端口。每条浮点运算流水线中均包含: 格式转换单元 (用于执行 “定点转为浮点”,“单精度浮点转为双精度浮点” 这类格式转换指令), 浮点比较单元, 浮点除法单元, 浮点开方与求倒数单元, 以及浮点乘加 (fused multiply–add) 单元 (用于执行浮点加、减、乘、乘加、乘减指令), 每种运算单元的数量均为 1 个。其中格式转换单元采用 3 级全流水设计, 浮点乘加单元采用 4 级全流水设计。

5.1.4 访存单元

访存部件包含以下的子部件: 访存指令发射队列 mmqueue,访存专用定点寄存器堆 mr,两个访存地址生成部件 memaddr, 一级数据缓存,一级数据 TLB ,两 个访存标签比较部件 dtagcmp、访存重定序队列 cp0queue, 以及二级 TLB 部件 sec tlb。只有一份的子部件由两条访存流水线共享使用。下图展示了访存单元流水线: Pasted image 20231019105057.png 访存指令发射队列 mmqueue 接收寄存器重命名部件送来的指令信息, 并将当前已经就绪且 程序指令序上最老的访存指令发射到访存流水线上。大部分访存指令都可以在两个访存部件中的任意一个执行, 存储操作和加载操作一样, 会等待地址和数据同时就绪后, 才发射到流水线中。两条访存流水线在拥有 4 个读端口的寄存器堆 mr 中读取所需的操作数; 一些特殊指令需要发送额外请求去定点部件或浮点部件, 以获取所需的源数据, 例如, 浮点存储指令 SDC1 所需要存储的数据只存放在浮点寄存器堆中。所有类型的访存指令的地址肯定会存放在 mr 中, 不需要从定点部件或浮点部件取。两条访存流水线分别拥有一个地址计算模块 memaddr,地址计算模块根据访存指令的类型, 利用 mr 读出的寄存器内容计算访存指令的虚拟地址 (effective address, EA 或虚地址)。虚地址低位送到数据缓存模块进行索引查找, 整个虚地址送到 DTLB 模块进行虚实地址翻译。 一级数据缓存是由 4 路组相联、每一路 16 KB 大小的双端口随机存储器 (random access memory, RAM) 构成的, 两个端口分别对应一条访存流水线。每个端口根据地址的低位读取 RAM 中存放的标签和数据, 并将读出的结果送至 dtagcmp 部件准备进行标签比较。同时, 存储指令需要存储的数据在此单元计算, 同样也送到 dtagcmp 部件。一级数据 TLB 与一级数据缓存同时被查询。一级数据 TLB 部件使用 2 个 64比特虚地址作为输入, 查询双端口的全相联组织的 DTLB, 得到 2 条访存指令的虚地址所对应的 48比特物理地址 (physical address, PA 或实地址), 并送至 dtagcmp 模块准备进行标签比较。此外, 大部分 CP0 相关的特权指令, 如 MTC0 及 MFC0 都是在 DTLB 模块执行的。两个实地址比较模块 dtagcmp 模块分别对应一条访存流水线。这个模块将数据缓存模块读出的 4 路标签与 DTLB 模块得到的实地址进行比较, 确定一级数据缓存是否命中, 以及命中在哪一路。命中路的数据会被取出, 和数据送来的 存储指令所要存储的数据一起计算, 得到访存指令的执行结果, 并送到访存重定序队列 cp0queue。访存重定序队列 cp0queue 接收程序指令序信息, 接收 dtagcmp 模块送来的指令地址与数据信 息, 并通过回滚机制来维护乱序发射的访存指令之间的正确执行序。Cp0queue 除了访存指令重定序工作之外, 在每个时钟周期还需要写回最多 2 条可写回的 加载指令和 最多 2 条可写回的存储指令,将最多 1 条访存失效的指令送往缓存失效队列,将最多 2 条已经提交 且被允许写一级数据缓存的存储指令发送到一级数据缓存的写端口。Cp0queue 可以被视作访存指令的归宿, 所有访存指令都在这里进行缓存失效处理和写回。目标寄存器为定点寄存器的加载类型访存指令在从数据缓存流水级到 dtagcmp 流水级传递时, 会进行猜测提前反馈操作, 称为 specfwd。在从 dtagcmp 流水级到 cp0queue 传递时, 会重新发送上一 个时钟周期的 specfwd 信息, 形成 fwdbus 总线。两条访存总线的最多 4 条用于提前反馈的信息会被 送至定点发射队列和访存发射队列, 并置猜测就绪标记, 使得指令可以猜测地发射。如果猜测前馈猜测错误, 则会发送对应该访存流水线的猜测取消信号 spec cancel, 猜测错误的条件包括: 一级数据缓存未命中,或者一级 DTLB 未命中,或者该指令在 cp0queue 被回滚。猜测取消信号将会取消对应的 specfwd 以及 fwdbus 总线带来的所有后果, 已经猜测发射的相应指令也会被取消, 并回到发射队列重新等待发射机会。在上述 前馈机制的作用下, 可以得知访存指令在理想情况下的延迟: 访存指令到定点指令以及访存指令到访存指令的 load-to-use 延迟为 4 个时钟周期, 访存指令到浮点指令的 load-to-use 延迟 为 6 个时钟周期。

访存重定序机制是用于维护乱序发射的访存指令之间执行顺序的机制。在之前的 GS464 处理器核设计中, 访存重定序采取的是数据传递机制, 使用数据传递机制进行访存指令重定序的方法为: 当一条指令经过发射路径到达重定序队列时, 这条指令需要从所有执行序在它之前的,与其相关的存储指令处获取对应数据; 同时, 如果这条指令是存储指令, 那么这条指令还要将它自己的数据传递给所有的已经在重定序队列中与其相关的且执行序在它后面的指令。简单说来, 该机制可以描述成 “取前给后”。在物理设计上, 实现这样的数据传递机制代价很大: 该指令可能从多条指令处取得数据, 可能从任意指令处拿取任意字节的数据; 存储指令可能把自己的数据传递给多条指令, 可能将数据传递给任意指令的任意字节位置。这个机制的物理设计过于复杂, 严重限制了队列的规模, 致使 GS464 处理器核中的访存重定序队列只有 24 项大小。 在 GS464E 处理器核中实现了 2 个访存功能单元, 同一时刻可能有 2 条指令进入访存重定序队列, 数据传递机制的实现代价更是难以接受。为了提高指令并行度,将访存重定序队列项数增大, 在 GS464E 处理器核中, 只保留了指令是否相关的判断, 取消了数据传递的功能, 通过指令回滚到发射队列重新发射的机制来保证执行的正确性。其具体操作方式如下所述: 当一条指令经过发射路径到达重定序队列时, 发现队列中有执行序在它之前的与其相关的存储指令, 那么该指令回滚到访存发射队列 mmqueue, 并等待该存储指令写入一级数据 缓存后再次发射; 如果一条存储指令经过发射路径到达重定序队列时, 发现队列中已有执行序在它之后的与其相关的指令, 那么将这些指令回滚到 mmqueue, 让这些指令重新发射。其中, 指令相关的判断会根据指令的操作类型,访存地址等信息进行精确的判断, 例如, 对 A 地址的半字存储 SH 操作并不会使得对 A+2 地址的半字取 LH 操作回滚。简单说来, 该机制可以描述为 “等前打后”。通过采取 “等前打后” 的访存重定序策略来代替 “取前给后” 的策略, 略增加了发射队列和访存重定序队列的设计复杂度, 在一些情况下会带来少许性能降低, 但是却大大降低了物理设计的难度, 可以在同样的设计主频下使用更大的访存重定序队列, 增加访存指令并行度, 可以更好的容忍访存延迟。同时, 也为支持更大的访存宽度, 如 256比特向量访存指令, 提供了可能性。

GS464E 处理器核中的一级数据缓存采取 4 路组相联结构, 总大小为 64 KB。其中, 每一路大小为 16 KB, 分为 256 个缓存行, 每一行为 64 字节。一级数据缓存使用虚地址索引, 实地址标识, 每一个缓存行需要 48比特的标签来存储实地址信息, 以及 512比特的数据来存储数据, 标签和数据部分都使用 ECC 校验码来进行冗余保护。一级数据缓存采用 LRU 替换策略, 当一个缓存行被查询命中时, 或因缓存失效而被新填入时, 会被调整到最难被替换的优先级; 如果一个缓存行因多核一致性导致的外部请求被无效, 该缓存行会被调整至最容易被替换的优先级。一级数据缓存是一个双端口的缓存结构, 每一个时刻最多可以实现 2 条访存指令的查询操作;同时, 存储指令从访存重定序队列发出写缓存操作时, 也通过这 2 个端口进行写操作, 其优先级低于访存指令的查询操作。除此之外, ECC 校验出错时的自纠正操作和缓存失效重填请求都需要从第一个写端口进行写入, 写入操作将按照特定优先级进行, 并对低优先级的操作产生阻塞。

虚实地址翻译工作在硬件实现上是由两级 TLB 来完成的。一级数据 TLB 对软件透明, 每次访存操作执行时被查询; 软件可见的是二级 TLB, 软件修改 TLB 的指令 (如 TLBWR) 会直接修改二级 TLB。 二级 TLB 对一级数据 TLB 是包含关系, 一级数据 TLB 的缺失会自动从二级 TLB 中查找并取 回, 硬件会自动维护包含关系。 此外, 指令 TLB 也是根据二级 TLB 中的内容填入的。 一级数据 TLB 的规模为 32 项, 二级 TLB 则是由 2 个部分组成, 包括 64 项全相联的可变页大小的地址可寻址存储器 (content addressable memory, CAM) 部分, 以及 8 路组相联,每一路 128 项, 共计 1024 项的固定页大小的 RAM 部分, 这两级 TLB 中的每一项都可以装载 1 个标准 MIPS 双页。一 级数据 TLB 是双端口的, 分别对应于 2 个访存功能部件, 一级 TLB 查询发生不命中时, 会选择在程序指令序上较老的那条指令来查询只有 1 个端口的二级 TLB。二级 TLB 查询需要花费 2 个时钟周期, 如果命中, 那么命中的结果会写入一级数据 TLB, 其替换策略为随机替换; 如果未命中, 其结果也会通知访存重定序队列。需要查询二级 TLB 的指令经过访存重定序队列中的回滚机制, 重新回到发射队列, 再次发射时, 二级 TLB 的查询结果已经返回, 因此可以判断是否真正的发生了 TLB 失效异常。 二级 TLB 中可变页部分 (CAM 部分) 和固定页部分 (RAM 部分) 会被同时查询, 但是软件进行 TLB 写入时, 只有其中一个会被修改: 如果写入项的页大小与提前配置好的固定页相同, 则 TLB 指令 会将 TLB 表项写入固定页部分, 否则, 将写入可变页部分。 64 项的 CAM 部分和 8 路组相联的 RAM 部分都采用随机替换策略。

GS464E 处理器核的一级数据缓存是一个写回 (writeback) 式的缓存, 所有的存储操作都需要对一级数据缓存进行写入。 当存储指令发生缓存失效时, 需要将存储指令所需的缓存行从内存搬运至一级数据缓存, 再进行写入。然而在很多情况下, 存储指令都倾向于填满整个缓存行, 因此这个搬运过程就显得多余, 还带来了不少的时间与功耗开销。 为了降低这个开销, GS464E 处理器核中引入了存储填充 (store fill) 机制。该机制的工作原理为: 当存储指令在一级数据缓存中发生缓存失效时, 其访存失效请求会将待存储的数据一并送至位于缓存失效队列中的存储填充缓冲区, 同时, 该访存失效请求暂缓访问 SCache。如果接下来的多条存储请求在该缓冲区中成功地拼满了缓存行, 那么只需向 SCache 请求空白的缓存行即可。收到空白行请求的 SCache 不会访问内存, 在进行多核一致性处理后直接返回, 缓存失效队列负责将缓冲区中拼满的数据重填回一级数据缓存。在存储填充进行期间, 相应的存储指令可以退出流水线, 释放队列空间。如果较长时间没有拼满一个缓存行, 或遇到了属于同一个缓存行的加载操作, 或遇到内存屏障类操作 (如 SYNC 或 CACHE 指令), 存储填充机制就会进行退出处理, 向 SCache 请求一个正常的缓存行, 待结果返回后, 在缓冲区进行数据拼凑操作, 将拼凑后的结果填回一级数据缓存。 硬件会记录存储填充成功与否的近期历史, 并对存储填充机制进行自动调整。 GS464E 处理器核中实现的存储填充机制可以适用于多核处理器的情况, 减少了存储指令导致的内存读取, 并允许存储指令提前退出流水线, 提升了处理器的整体执行性能。

5.1.5 缓存失效队列

缓存失效队列位于一级缓存与 SCache 之间, 负责对 Victim Cache 进行访问和管理, 实现缓存失效请求的处理和重填工作, 并负责硬件预取请求的生成和处理。 在 GS464E 处理器设计中, 对缓存失效的处理过程进行了多项创新性的改动, 包括基于缓存失效队列的无污染硬件预取引擎设计以及可以支持多核情况的存储填充机制。

缓存失效队列共有 16 项, 进入该队列的请求包括访存重定序队列发来的访存失效请求、取指部件发来的指令失效请求以及 SCache 发来的多核一致性请求, 此外, 硬件预取引擎会将生成的数据和指令预取请求也送给缓存失效队列, 由该队列进行处理。所有进队请求的地址均为实地址。缓存失效队列中的缓存失效请求会先查询 Victim Cache, 如果命中, 则会将结果重填回一级缓存, 并将一级缓存替换出的缓存行填入 Victim Cache 中之前被取出的位置; 如果 Victim Cache 查询未命中, 则会访问 SCache, 待 SCache 的结果返回后, 填入一级缓存, 将一级缓存替换出的有效数据根据 LRU 算法写入 Victim Cache, 并将 Victim Cache 替换出的有效脏数据写回到 SCache。 缓存失效请求总是会先查询 Victim Cache, 查询未命中时再查询 SCache, 这种串行访问的设计降低了缓存一致性维护的复杂度。缓存失效队列中由 SCache 发来的多核一致性请求会对一级缓存和 Victim Cache 进行查询, 根据查询结果和一致性请求的类型, 对缓存行进行无效、写回等操作, 并将结果返回 SCache。缓存失效队列中的硬件预取请求会对 SCache 进行查询, 根据查询结果, 将预取来的数据暂存在队列中。如果有缓存失效请求和硬件预取请求操作同一个缓存行, 那么预取到的数据会发送给这个缓存失效请求。缓存失效队列会定期清除掉那些一直没有被使用到的预取数据。这样的预取处理方式不会带来任何一级缓存污染。请求同一个缓存行的缓存失效操作会在缓存失效队列中进行合并, 但只限于同属于数据缓存失效或指令缓存失效。缓存失效队列还有专门的缓冲区用于存储访存失效存储指令的数据, 以支持存储填充机制。

GS464E 处理器核中使用了最多同时支持 4 个数据访问流和 1 个指令访问流的流式硬件预取引擎, 数据和指令的预取相对独立。 其中, 数据流式预取引擎可以支持升序和降序模式, 使用访存失效请求来建立和维护访问流信息; 而指令预取只能支持升序的预取, 使用指令失效请求来建立和维护流信 息。 当失效请求为连续的 2 个缓存行时, 将会建立访问流, 每个访问流都配有 3比特的倒数计数器, 用于计算这个访问流是否已过期。缓存失效请求如果在某个访问流上延续, 那么配属于这个访问流的计数器会刷新到最大值。访问流建立后, 就可以触发预取, 预取请求的触发包括下列两种情况. 如果缓存失效请求在缓存失效队列中和预取请求合并, 证明预取是有益的, 将会根据此次失效的地址查询预取引擎中已经建立的访问流信息。指令失效请求会查询指令预取引擎, 而访存失效请求会查询数据预取引擎。如果访问流查询命中, 则根据访问流的升序或降序信息, 产生 1 个预取请求, 预取请求的地址是失效地址加上特定增量; 如果访问流查询不命中, 则寻找计数器为零或计数器最小的访问流, 将其顶替。如果未能和预取请求合并的缓存失效请求在 Victim Cache 中查询未命中, 则证明需要进行预取, 此时会根据此次失效的地址查询预取引擎中的访问流信息, 如果访问流信息查询命中, 则根据访问流的升序或降序信息, 产生预取请求, 预取请求地址是失效地址加上特定增量; 访问流查询未命中则不进行操作。每次触发预取时, 预取地址相对于失效地址的增量会随着这个访问流的历史触发次数而变化, 被触发过的次数越多, 其预取增量越大。这个增量值的上限则由已建立的访问流的个数决定: 当只有 1 个访问流存在时, 增量上限被设定为 4 个缓存行大小; 当超过 1 个访问流时, 该增量被设定为 2 个缓存行大小,指令预取的增量上限一直设定为 4 个缓存行。GS464E 处理器核使用增量预取策略, 相对于每次触发就预取多条的策略, 在访问流预测正确的情况下效果是相同的, 但是访问流预测错误时, 增量预取策略会少一些无效的预取请求。

缓存

GS464E 处理器核使用了三级片上缓存结构, 其中位于每个处理器核内部的私有缓存包括一级数据缓存和一级指令缓存, 以及数据和指令共用的 Victim Cache, 第三级缓存为 SCache, 由所有处理器核共享。一级指令缓存为 4 路组相联设计, 64 KB 容量, 缓存行大小64 字节, 随机替换。一级数据缓存采用 LRU 替换策略,4 路组相联设计, 64 KB 容量, 缓存行大小64 字节。 Victim Cache 与两个一级缓存是exclusive关系, 处于一级缓存中的缓存行必定不存在于 Victim Cache 中; Victim Cache 与 SCache 维护包含 (inclusive) 关系, 也即处于 Victim Cache 中的缓存行必定在 SCache 中有其对应的备份。一级缓存和 SCache 是Inclusive关系。

Victim Cache 为 16 路组相联, 每一路 16 KB, 共计 256 KB, 缓存行大小为 64 字节, 使用 LRU 替换策略。Victim Cache 位于一级缓存之下, 由缓存失效队列进行管理, 当一级缓存发生缓存失效时被查询。 查询 Victim Cache 时, 先读取标签再读取命中路的数据的方式, 使用少量延迟来换取功耗的降低。 在缓存失效请求查询 Victim Cache 未命中情况下, 由缓存失效队列负责向 SCache 发出失效请求. 当一个缓存行从一级缓存中替换出来时, 会被填入 Victim Cache, 而 Victim Cache 替换出的数据将会写回到 SCache。 指令缓存行与数据缓存行都可以存放在 Victim Cache 中, 以缓存行标签域中的一个额外比特来做区分。

SCache 为片上末级缓存, 由所有处理器核共享, 一个四核处理器就会拥有 4 个 SCache 以 供 4 个处理器核使用。每个 SCache 为 16 路组相联, 容量为 1 MB, 缓存行大小为 64 字节, 使用 LRU 替换算法。 每个 SCache 使用大小为 16 项的管理队列来查询和维护. 相比于一级缓存和 Victim Cache, 每个 SCache 的缓存行还额外包含 64比特的目录域, 用于记录该 缓存行被哪个处理器核持有, 以及被处理器核持有的是指令行还是数据行。在这个目录的设计规模下, 最多支持一个芯片集成 32 个处理器核. 在区分数据行和指令行之外, SCache 并不区分一级缓存和 Victim Cache, 因此一级数据缓存持有的缓存行或 Victim Cache 持有的数据缓存行都会被视作该处理器核持有数据缓存行。在 GS464E 处理器核配属的 SCache 中, 加入了基于缓存一致性的硬件抗别名设计。当程序使用的页的大小比一级缓存中每个缓存路的容量更小的情况下, 就会出现别名的情况, 同一个物理地址会被放置在一级缓存中的多个索引上。为了保证映射到同一个物理地址的多个虚地址之间的数据是一致的, SCache 在标签域中加入了额外的 2比特的页染色域, 利用 SCache 对片内两级缓存的包含关系, 保证这个缓存行只能存在于满足当前页染色域的特定索引位置上。当一个访存请求要求页染色域的另一个值时, 会发生缓存失效, SCache 发现该请求页染色不命中之后, 会通过一致性请求, 写回并无效处于一级缓存或 Victim Cache 之中的缓存行备份, 修改页染色域的值为新值后, 再行返回, 以此保证每个物理地址只对应一个实例。基于缓存一致性的硬件抗别名设计是 GS464E 处理器核的创新性功能, 在保持一级缓存大容量的前提下, 实现了对较小页的高效硬件支持。SCache 中还为使用原子操作指令 (例如, LL/SC 指令) 进行多核的同步加入了特殊设计: 当一个 处理器核使用原子操作指令获得一个缓存行时, SCache 在短时间内将禁止把这个缓存行转让给其他处理器核。该时间间隔为随机数, 随机的范围可以通过软件进行配置。通过上述设计, 多个处理器核同时争抢同一个内存地址时, 可以在时间上串行开来, 减少了竞争。这个特殊设计可以提高多核同步的性能, 并可以防止因每个处理器核都占有时间过短,无法修改共享数据而导致的活锁现象。在 SCache 中查询失效的请求会向下一级存储设备发出访存请求。下一级存储设备包括内存, PCI, SPI 或其他外部设备。

在一级数据缓存命中的加载指令延迟为 4 个时钟周期;在 Victim Cache 命中, 则会给这条访存指令带来额外 18 个时钟周期的延迟;如果是 Victim Cache 也失效但是在 SCache 中命中的访存指令, 相比一级缓存命中的情况要多 50 个时钟周期的延迟, 其中访问 SCache 需要的时间为 11 个时钟周期, 其他延迟包括请求在片内传递的延迟, 以及为支持处理器核降频设计所需要的异步队列所带来的延迟。

6 Loongson 3A3000

龙芯 3A3000/3B3000主频 1.2Hz–1.5GHz,为4核处理器,采用4个四发射乱序执行的64 位超标量处理器核GS464E,支持 MIPS64 指令集,支持龙芯扩展指令集,采用12 级超标量流水线; 每核有2 个定点单元、2 个浮点单元和 2 个访存单元。每个处理器核包含 64KB 私有一级指令缓存和 64KB 私有一级数据缓存;每个处理器包含 256KB 私有二级缓存;所有处理器核共享 8MB 三级缓存。

龙芯3A2000相比,除了流片工艺从中芯国际的40纳米提升到意法半导体的28纳米CMOS 工艺,处理器的三级缓存也从4MB提高到8MB。峰值浮点性能24GFlops,典型功耗 <40W@1.5GHz。集成的接口有两个HT3.0接口,PCI控制器、LPC、SPI、UART、GPIO,两个72位DDR2/3-1600,支持ECC。

7 Loongson 3A4000

龙芯3A4000采用龙芯最新研发的GS464V,尽管龙芯3A4000仍然采用28nm工艺, 但主频提高到2.0GHz, 综合性能是上一代龙芯3A3000的两倍。用于片间互连及连接桥片的HT控制器带宽提高一倍以上,内存控制器从DDR3升级到DDR4,对虚拟机支持更加完善,效率达到95%以上。龙芯3A4000/3B4000也是首次在片内集成漏洞防范设计、硬件国密算法、安全可信模块与安全访问控制机制的处理器。龙芯3B4000龙芯3A4000的基础上支持多路互连。 Pasted image 20231019101252.png

8 Loongson 3A5000

龙芯3A5000采用和龙芯3A4000的处理器同样的GS464EV, 采用12nm工艺流片, 主频提升到2.5GHz。龙芯3A5000依然是4核处理器,而龙芯3C5000将是一款16核处理器。龙芯3A5000/3B5000是面向个人计算机、服务器等信息化领域的通用处理器,基于龙芯自主指令系统LoongArchLA464微结构的四核处理器,在与龙芯3A4000处理器保持引脚兼容的基础上,频率提升至2.5GHz,功耗降低30%以上,性能提升50%以上。龙芯3B5000龙芯3A5000的基础上在HT0接口上支持一致性互联以便支持多路互连。下图展示了其芯片架构: Pasted image 20231018222854.png 第一级互联采用5x5的交叉开关,用于4个处理器核,4个共享缓存模块和一个IO端口的连接。第二级互联采用5x3的交叉开关,连接4个共享的缓存模块,两个内存控制器和一个IO端口。IO环总线一共8个端口,分别连接4个HT控制器,慢速输入输出模块,安全模块以及两级交叉开关。两个HT控制器共用16条HT总线,可以作为两个8位HT或一个16位HT使用。

上述互联结构都采用读写分离的数据通道,位宽128比特,与处理器同频;处理器核和第一级交叉开关读通道是256比特。

下图展示了龙芯3A5000的物理规划版图: Pasted image 20231019182021.png

8.1 LA464处理器核

LA464是一个4发射的超标量处理器,有4个定点单元,2个256位的向量单元和2个访存单元。每个向量单元支持8个单精度或4个双精度乘加运算;访存单元支持256位存储访问.下图展示了LA464处理器核的微架构: Pasted image 20231018231056.png

8.1.1 共享缓存

Scache模块是龙芯3A5000内部所有处理器核共享的L3缓存,采用16路组相联,由缓存管理模块和缓存访问模块组成:

  • 缓存管理模块 负责处理来自处理器和DMA的访问请求
  • 缓存访问模块 负责存放缓存标签,目录和数据

8.1.2 SMP互联

通过HT进行互联可以组成2路,4路,8路或16路SMP系统,整个系统物理地址宽度为48位,地址高4位用来识别单个节点,每个节点实际可用地址空间是44位。当系统节点数目不足16时,需要配置路由设置寄存器,保证没有对应节点的地址能够返回响应。

9 Loongson 3A6000

龙芯3A6000处理器是龙芯第四代微架构的首款产品,集成4个最新研发的高性能6发射64位LA664处理器核。主频达到2.5GHz,支持128位向量处理扩展指令(LSX)和256位高级向量处理扩展指令(LASX),支持同时多线程技术(SMT2),全芯片共8个逻辑核。龙芯3A6000片内集成双通道DDR4-3200控制器,集成安全可信模块,可提供安全启动方案和国密(SM2、SM3、SM4等)应用支持。和3A5000相比,主要是更新了处理器内核,芯片整体架构如下图所示: Pasted image 20231128195637.png 第一级互连采用 5x5 的交叉开关,用于连接四个处理器核、四个共享 Cache 模块、以及一个 IO 端口连接 IO-RING。 第二级互连采用 5x3 的交叉开关,连接 4 个共享 Cache 模块,两个 DDR4 内存控制器、 以及一个 IO 端口连接 IO-RING。 IO-RING 包含多个端口,连接包括 HT 控制器,MISC 模块,SE 模块与两级交叉开关。HT 控制器内集成一个 DMA 控制器,DMA 控制器负责 IO 的 DMA 控制并负责片间一致性的维护。 上述互连结构都采用读写分离的数据通道,数据通道宽度为 128 位,工作在与处理器 核相同的频率,用以提供高速的片上数据传输。此外,一级交叉开关连接 4 个处理器核与 scache 的读数据通道为 256 位,以提高片内处理器核访问 scache 的读带宽。

SCache 模块是龙芯 3A6000 处理器内部所有处理器核所共享的三级缓存。SCache 模块支持16 项缓存访问队列,采用 16 路组相联结构,支持 ECC 校验。 共 享缓存模 块包括共享 缓存管理模块scachemanage 及共享缓存访问模块scacheaccess。Scachemanage 模块负责处理器来自处理器和 DMA 的访问请求,而共享缓存的标签、目录和数据等信息存放在 scacheaccess 模块中。为降低功耗,共享缓存的标签、 目录和数据可以分开访问,共享 缓存状态位、w 位与标签一起存储,标签存放在 TAG RAM 中,目录存放在 DIR RAM 中,数据存放在 DATA RAM 中。失效请求访问共享缓存,同时读出所有路的标签、目录,并根据 标签来选出目录,并根据命中情况读取数据。替换请求、重 填请求和写回请求只操作一路的 标签、目录和数据。

LA664 是六发射 64 位的处理器核。在龙芯 3A6000 中的多个 LA664 核以及共享缓存模块通过 AXI 互连网络形成一个分布式共享片上末级缓存的多核结构。LA664 支持同时多线程技术(SMT2);有四个定点、四个向量、四个访存单元;每个向量单元宽度为 256 位,最多支持 8 个单精度或 4 个双精度乘加运算; 访存单元支持 256 位存储访问,虚地址为 64 位,物理地址为 48 位;一级指令缓存和数据缓存大小各为 64KB,4 路组相联; Victim Cache 作为私有二级缓存,大小为 256KB,16 路组相连; 一级缓存实现奇偶校验,二级、片上末级缓存实现 ECC 校验,均支持一位纠正。

参考文献

  1. LoongArch-Vol1-v1.02
  2. Loongson 3A5000/3B5000 Processor Reference Manual - Multicore Processor Architecture, Register Descriptions and System Software Programming Guide, n.d.
  3. Wang H., Wang W., Wu R., Hu W., 2015. 龙芯GS464E处理器核架构设计. Sci. Sin.-Inf. 45, 480–500. https://doi.org/10.1360/N112014-00292
  4. Hu, W., Wang, J., Gao, X., Chen, Y., Liu, Q., Li, G., 2009. Godson-3: A Scalable Multicore RISC Processor with x86 Emulation. IEEE Micro 29, 17–29. https://doi.org/10.1109/MM.2009.30
  5. W. Hu et al., “Godson-3B1500: A 32nm 1.35GHz 40W 172.8GFLOPS 8-core processor,” 2013 IEEE International Solid-State Circuits Conference Digest of Technical Papers, San Francisco, CA, USA, 2013, pp. 54-55, doi: 10.1109/ISSCC.2013.6487634.
  6. W. Hu et al., “Godson-3B: A 1GHz 40W 8-core 128GFLOPS processor in 65nm CMOS,” 2011 IEEE International Solid-State Circuits Conference, San Francisco, CA, USA, 2011, pp. 76-78, doi: 10.1109/ISSCC.2011.5746226.
  7. Gao, X., Chen, Y.-J., Wang, H.-D., Tang, D., Hu, W.-W., 2010. System Architecture of Godson-3 Multi-Core Processors. J. Comput. Sci. Technol. 25, 181–191. https://doi.org/10.1007/s11390-010-9315-3
  8. Hu W W, Tang Z M. Microarchitecture design of the Godson1 Processor. Chinese Journal of Computers, April 2003, 26(4): 385-396.
  9. Hu W W, Zhang F X, Li Z S. Microarchitecture of the Godson-2 processor. Journal of Computer Science and Technology, March 2005, 20(2): 243-249.
  10. Loongson 3A6000 Processor Reference Manual - Multicore Processor Architecture, Register Descriptions and System Software Programming Guide, n.d.
]]>
History of POWER | What makes POWER so powerful http://zhifeiding.github.io/programming/history/2023/09/30/History-Of-POWER-What-Makes-POWER-so-Powerful/ 2023-09-30T00:00:00+00:00 http://zhifeiding.github.io/programming/history/2023/09/30/History-Of-POWER-What-Makes-POWER-so-Powerful 前言

最近几年系统性的学习并梳理了近30多年的计算技术发展历史,稍有感悟。遂决定将之整理成文,目的有二,一来作为知识沉淀,串联起不同技术,挖掘不同架构之间的渊源,二来通过整理再次审视历史,期望窥见未来发展方向。我将本系列命名为鉴往知远, 主要关注计算与互联。 本文为第一篇,主要回顾IBM POWER系列。

0. 概述

POWER (Performance Optimization With Enhanced RISC)架构起源于1990年IBM的RISC System/6000产品。1991年,Apple, IBM, 和Motorola一起合作开发了PowerPC架构。1997, Motorola和IBM合作将PowerPC用于嵌入式系统。2006, Freescale和IBM合作制定了POWER ISA 2.03。 2019年8月21, 开源了POWER Instruction Set Architecture (ISA)。PowerISA由必须的基础架构,4组可选特性,一组过时特性组成。OpenPOWER也允许自定义扩展。

本文通过系统性回顾整个POWER系列处理器,试图通过POWER系列处理器发展的历史脉络,来展现近30年计算架构的变迁,技术的演进,进而窥见计算技术发展的未来。

本文组织形式如下:

  • 第一章简单介绍POWER指令集架构3.1B版本, 也是最新POWER10处理器使用的指令集。通过本章介绍,可以了解程序在POWER架构上运行的过程及预期结果,掌握异常处理,特权模型,以及POWER调试手段
  • 第二章简单回顾整个POWER系列处理器,总结各代处理器的面积,功耗,缓存,IO等基本内容
  • 第三章,第四章,第五章分别描述POWER 1POWER 2的整体架构,简单介绍了POWER 3的微架构,主要是了解这些古老系统结构
  • 第六章详细描述POWER 4微架构以及从单核到双核的进化
  • 第七章详细描述POWER 5微架构,从单线程到双线程的演进,以及集成的片上内存控制器
  • 第八章介绍POWER 6处理器微架构,了解从之前乱序执行变为顺序执行的取舍
  • 第九章介绍POWER 7处理器微架构,了解在支持更多线程情况下如何减少面积和功耗,以及内部缓存协议状态
  • 第十章介绍POWER 8处理器微架构,了解如何从上一代SMT4到SMT8
  • 第十一章主要介绍POWER 9处理器微架构,了解基本单元之间解耦,SMP互联
  • 第十二章完整介绍POWER 10处理器微架构,SMP互联,片上加速器,中断
  • 文章最后列出了主要的参考文献,主要是POWER指令集架构,各代POWER的架构和微架构论文,以及各代POWER服务器的技术文档

1. POWER指令集架构

1.1 寄存器

  • Condition Register (CR) 是32寄存器,记录指令执行结果,供测试和条件分支指令使用
  • Link Register (LR) 是64位寄存器,保存 Branch Conditional to Link Register 指令跳转地址, 并且可以保存当 LK=1 时分支指令和 System Call Vectored 指令后的返回地址。
  • Count Register (CTR) 是64位寄存器。当执行的分支指令的 BO 编码时候可以作为for循环计数寄存器。Count Register 也可以保存 Branch Conditional to Count Register 指令的跳转目标地址。
  • VR Save Register (VRSAVE) 是32位寄存器,软件作为SPR使用。
  • Fixed-Point Exception Register (XER) 是64位寄存器
    • 0:31 Reserved
    • 32 Summary Overflow (SO) 当Overflow置位时Summary Overflow置位
    • 33 Overflow (OV) 指令执行溢出时置位
    • 34 Carry (CA)
    • 35:43 Reserved
    • 44 Overflow32 (OV32) OV32 32位运行模式时溢出位
    • 45 Carry32 (CA32) CA32 32位运行模式时溢出位
    • 46:56 Reserved
    • 57:63 指定 Load String IndexedStore String Indexed 指令传输的字节数
  • Floating Point Status and Control Register(FPSCR) 控制浮点异常处理和浮点指令执行结果状态。32:55位是状态位, 56:63是控制位

Pasted image 20230904172658.png

  • Logical Partitioning Control Register (LPCR) LPCR 控制资源的逻辑分区,Logical Partitioning (LPAR) 功能将线程和存储空间分配到一个逻辑分区,用来隔离不同分区之间的线程;通过一个hypervisor,这种隔离可以作用于problem和privileged non-hypervisor态。
  • Logical Partition Identification Register (LPIDR) LPIDR 设置逻辑分区ID
  • Machine State Register (MSR) 是64位寄存器,控制和定义了线程的状态:
    • 0 Sixty-Four-Bit Mode (SF) 当线程处于ultravisor时软件要保证 SF=1
      • 0 线程运行在32位模式
      • 1 线程运行在64位模式
    • 1:2 Reserved
    • 3 Hypervisor State (HV) 具体意义参考特权模型章节
    • 4 Reserved
    • 5 常0
    • 6:37 Reserved
    • 38 Vector Available (VEC)
      • 0 线程不能执行任何向量指令
      • 1 线程可以执行向量指令
    • 39 Reserved
    • 40 VSX Available (VSX)
      • 0 向量不能执行 Vector Scalar Extension(VSX) 指令
      • 1 向量可以执行 VSX 指令
    • 41 Secure (S)
      • 0 线程处于非安全态,不能访问安全域线程,且不在ultravisor态
      • 1 线程处于安全态
    • 42:47 Reserved
    • 48 External Interrupt Enable (EE)
      • 0 External , Decrementer , Performance Monitor , 和 Privileged Doorbell 中断被禁止
      • 1 External , Decrementer , Performance Monitor , 和 __Privileged Doorbell__使能
    • 49 Problem State (PR) 具体意义参考特权模型章节
    • 50 Floating-Point Available (FP)
      • 0 线程不能执行浮点指令
      • 1 线程可以执行浮点指令
    • 51 Machine Check Interrupt Enable (ME)
      • 0 Machine Check 中断禁止
      • 1 Machine Check 中断使能
    • 52 Floating-Point Exception Mode 0 (FE0)
    • 53:54 Trace Enable (TE)
      • 00 Trace Disabled: 线程正常执行指令
      • 01 Branch Trace: 当线程执行完分支指令之后产生 Branch type Trace 中断
      • 10 Single Step Trace: 当线程成功完成下一个指令时产生一个 Single-Step type Trace 中断,urfid , hrfid , rfid , rfscv , 或 Power-Saving Mode 指令除外
      • 11 Reserved
    • 55 Floating-Point Exception Mode 1 (FE1)
    • 56:57 Reserved
    • 58 Instruction Relocate (IR) 0 禁止指令地址转换; 1 使能指令地址转换
    • 59 Data Relocate (DR)
      • 0 禁止数据地址转换,并且不发生 Effective Address Overflow (EAO)
      • 1 使能数据地址转换,EAO 产生 Data Storage 中断
    • 60 Reserved
    • 61 Performance Monitor Mark (PMM) 软件控制Performance Monitor

1.2 计算模式

处理器提供两种执行模式, 64位模式和32位模式。 两种模式下,设置64位寄存器指令仍然影响所有64位。计算模式控制有效地址的解释, Condition RegisterXER 的设置, 当 LK=1Link Register 被分支指令的设置 , 以及 Count Register 被条件分支指令的使用。几乎所有指令都可以在两种模式下运行。在两种模式下,有效地址的计算都使用所有相关寄存器的64位( General Purpose Registers , Link Register , Count Register 等) 并且产生64位结果。

1.3 指令格式

下面列出了大部分的指令格式,还有一些请参考架构手册。 Pasted image 20230904175410.png

有一类特殊指令格式,称为指令前缀格式,前缀指令由4字节前缀和4字节后缀组成。所有前缀的0:5都是0b000001.

1.3.1 分支指令

分支指令按照下面5种方式计算有效地址(EA):

  1. 将分支指令地址加上位移 (当分支或条件分支的 AA=0 时).
  2. 使用绝对地址 (当分支或条件分支的 AA=1 时).
  3. 使用 Link Register 里的地址( Branch Conditional to Link Register ).
  4. 使用 Count Register 里的地址 ( Branch Conditional to Count Register ).
  5. 使用 Target Address Register 里的地址 ( Branch Conditional to Target Address Register ). Pasted image 20230905092520.png Pasted image 20230905092500.png

1.3.2 条件寄存器指令

这些是操作条件寄存器 CR 的指令 Pasted image 20230905093726.png Pasted image 20230905093750.png Pasted image 20230905094031.png Pasted image 20230905094050.png Pasted image 20230905094419.png

1.3.3 系统调用指令

系统调用指令主要用于切换特权模式

  • LEV=1 时,唤起hypervisor
  • LEV=2SMFCTRL.E = 1 时, 唤起ultravisor
  • LEV=2SMFCTRL.E = 0 时, 唤起hypervisor。但是,这种方式是编程错误 Pasted image 20230905095119.png

1.3.4 定点加载存储指令

  • 有效地址(EA)索引的字节,半字,字,双字被加载到 RT 寄存器
  • RS 寄存器里字节,半字,字,双字被存储到有效地址(EA)索引空间 Pasted image 20230905101900.png Pasted image 20230905102304.png Pasted image 20230905102532.png Pasted image 20230905102612.png Pasted image 20230905102630.png Pasted image 20230905102726.png Pasted image 20230905102804.png

1.3.5 定点算术指令

  • addic , addic , subfic , addc , subfc , adde , subfe , addme , subfme , addzesubfze 指令设置 CR.CA , 在64位模式下反映位0的进位,在32位模式反映位32的进位
  • 对于XO形式的Multiply LowDivide指令, CR.SO/OV/OV32 设置依赖计算模式, 反映 mulld , divd , divde , divdudivdeu 的64位溢出, mullw , divw , divwe , divwudivweu 低32位的溢出.

1.3.6 定点比较指令

定点比较指令将寄存器 RA 和如下值比较 a. 符号扩展SI b. 无符号扩展UI c. RB 寄存器的值

cmpicmp 是有符号比较, cmplicmpl 是无符号比较. Pasted image 20230905103727.png

1.3.7 定点逻辑指令

定点逻辑指令对64位进行按位操作 Pasted image 20230905104113.png

1.3.8 定点旋转和移位指令

定点旋转和移位指令对通用寄存器值进行旋转和移位操作,从位0开始 Pasted image 20230905104311.png

1.3.9 Binary Coded Decimal (BCD) 辅助指令

Binary Coded Decimal辅助指令操作BCD( cbcdtdaddg6s )和十进制浮点操作数 Pasted image 20230905104845.png

1.4 特权模型

Machine State Register (MSR) 是64位寄存器,定义了线程的特权状态。 线程的特权状态由 MSR.S , MSR.HVMSR.PR 组成,意义如下: Pasted image 20230905144055.png MSR.SF 控制线程32/64位计算模式.

1.5 存储模型

存储属性是以页表为单位设置,每一个读写访问都需要检查对应的存储属性。主要有下列存储属性:

  • Write Through Required 写操作不会使数据缓存里的数据转变为修改
  • Caching Inhibited 对Caching Inhibited访问会直接在主存进行
  • Memory Coherence Required 对Memory Coherence Required访问需要保持一致性
  • Guarded 只有在下列情况才会对Guarded存储地址进行访问:
    • 需要顺序执行模型的指令的访问
    • 读访问且存储地址已经在缓存中

只有进行有效地址的转换的访问才受这些属性的影响。存储访问的内存模型是 weakly consistent ,相对于 stronger consistency 的模型提高了性能。

1.6 内存管理及虚拟化

地址转换模式是由 Partition Table Entry 里的 Host Radix 位控制。Host Radix 位控制当前分区是使用 HPT(Hashed Page Table) 还是 Radix Tree 进行转换。MSR.HV/PR/IR/DR 决定了地址转换入口和行为。

  • Partition Table Control Register (PTCR) 是64位寄存器,保存了分区表的host的真实基地址。
    • 4:51 PATB 分区表基地址
    • 59:63 PATS 分区表大小=2^(12+PATS)且 PATS ≤24 ptcr.png

1.6.1 Ultravisor Real, Hypervisor Real, 和Virtual Real Addressing Modes

当指令地址转换或数据地址转换功能被禁止时,根据当前处于的特权模式,内存访问被称为 ultravisor real addressing mode , hypervisor real addressing modevirtual real addressing mode 。这三种模式内存访问根据 MSRS.HV , PATE.HR , PATE.PS , URMOR , HRMOR , 有效地址第0位 (EA0), 和 RMCF 值分为不同方式。 有效地址1:3位不使用。

1.6.1.1 Ultravisor/Hypervisor Offset Real Mode Address

MSR.HV = 1EA.0 = 0 时, 存储访问由 Ultravisor Real Mode Offset RegisterHypervisor Real Mode Offset Register 控制, 根据 MSR.S 值:

  • MSR.S=1 时, 有效地址4:63位和 URMOR 里的60位偏移值按位或,得到的60位结果就是访问的真实地址
  • MSR.S=0 时, 有效地址4:63位和 HRMOR 里的60位偏移值按位或,得到的60位结果就是访问的真实地址

1.6.1.2 Virtual Real Mode Addressing Mechanism

MSR.HV = 0MSR.DR=0MSR.IR=0 时,分区使用 Paravirtualized HPT(PATE.HR=0) 进行地址转换,能够访问的内存空间由 Virtualized Real Mode Area (VRMA) 控制。地址转换和存储保护仍然像地址转换使能一样处理,只是有效地址到虚拟地址的转换使用 VRMA.SLBE ,而不是通过SLB。有效地址的0:23位不使用。下图展示了 SLBE 的内容: vrma.slbe.png

1.6.2 Segment Translation

下图展示了64位有效地址通过 Segment Lookaside Buffer (SLB) 转换为78位虚拟地址的过程: Pasted image 20230905155844.png 如果 SLB 未命中, LPCR.UPRT=1 , 且 MSR.HV=0LPID=0 时会搜索 Segment TableSegment Lookaside Buffer (SLB) 指定了 Effective Segment IDs (ESIDs)Virtual Segment IDs (VSIDs) 的映射。

Paravirtualized HPT 模式,使用Page Table来将78位虚拟地址转换为真实地址。Hashed Page Table (HTAB) 指定了虚拟页表和真实页表的映射,Hashed Page Table (HTAB)Page Table Entry Groups (PTEGs) 组成。一个 PTEG 包含8个 Page Table Entries (PTEs) ,每个16。 下图展示了使用 HPT 将78位虚拟地址转换位60位真实地址过程 Pasted image 20230906084212.png

1.6.3 Radix Tree Translation

Radix Tree root descriptor (RTRD) 指定了转换的地址大小,根表的大小和位置。下图展示了4级Radix Tree在 PDE.NLS=13NLS=9 时将52位EA转换成56位RA的过程: Pasted image 20230905170905.png Radix Tree Page Directory Entry内容如下: Pasted image 20230905171134.png Pasted image 20230905171203.png Radix Tree Page Table Entry radix_tree_pte.png

  • 0 V 有效位
  • 1 L 叶节点
  • 2 sw SW bit 0
  • 7:51 RPN Real Page Number
  • 52:54 sw SW bits 1:3
  • 55 R Reference
  • 56 C 修改位
  • 58:59 ATT 属性
    • 0b00- normal memory (0010)
    • 0b01- reserved
    • 0b10- non-idempotent I/O (0111)
    • 0b11- tolerant I/O (0110)
  • 60:63 EAA 访问权限
    • 0 Privilege (只应用于process-scoped translation)
      • 0 - problem可访问; privileged访问由 [I]AMR 位0控制
      • 1 - 只可privileged访问
    • 1 Read
      • 0 不可读
      • 1 可读
    • 2 Read/Write
      • 0 不可读写
      • 1 可读写
    • 3 Execute
      • 0 不可执行
      • 1 可执行

1.6.3.1 Nested Translation

MSR.HV=0 且地址转换使能时,对于guest real address必须经过分区的hypervisor的Radix Tree转换。下图展示了Radix on Radix Page Table对52位EA转换过程,一共需要25次内存访问: Pasted image 20230905172603.png

1.6.4 Secure Memory Protection

SMFCTRL.E=1 时使能Secure Memory Protection。每个内存地址有Secure Memory属性 mem.SM 。当 mem.SM=1 时表示是安全内存区域;mem.SM=0 表示是普通内存区域。通常只有安全分区和ultravisor会访问安全内存区域。

1.7 异常和中断

Power指令集架构提供了中断机制,允许线程能够处理外部信号,错误或指令执行异常。系统复位和机器检查中断是不可覆盖的,其他中断可覆盖且处理器状态可保留。当中断发生时, SRR0 , HSRR0USRR0 指向正在执行且未完成的指令。 中断可分为是否是执行指令引起或其他系统异常。系统异常包括:

  • System Reset
  • Machine Check
  • External
  • Decrementer
  • Directed Privileged Doorbell
  • Hypervisor Decrementer
  • Hypervisor Maintenance
  • Hypervisor Virtualization
  • Directed Hypervisor Doorbell
  • Directed Ultravisor Doorbell
  • Performance Monitor

其他都是指令中断

1.7.1 中断寄存器

根据处理器所在特权状态,可以分为:

  • Machine Status Save/Restore Registers 中断发生时,处理器状态被保存在 Machine Status Save/Restore registers ( SRR0SRR1 )。
  • Hypervisor Machine Status Save/Restore Registers 中断发生时,处理器状态被保存在 Hypervisor Machine Status Save/Restore registers ( HSRR0 and HSRR1 )。
  • Ultravisor Machine Status Save/Restore Registers 中断发生时,处理器状态被保存在 Ultravisor Machine Status Save/Restore registers ( HSRR0 and HSRR1 )。

1.7.2 中断处理

中断处理包括保存一部分线程状态,识别中断原因,并从相应中断向量地址执行:

  1. 根据中断类型将指令地址加载到 SRR0 , HSRR0 , 或 USRR0
  2. 根据中断类型将相关信息保存到 SRR1 , HSRR1 , 或 USRR1 的33:36位和42:47位
  3. MSR 保存到 SRR1 , HSRR1 , 或 USRR1 的0:32, 37:41, 和 48:63位
  4. 根据 LPCR.AILLPCR.HAIL 设置 MSR.IR/DR 位, 并且设置 MSR.SF = 1 。第一条中断指令执行时生效
  5. 在新的 MSR 设置下,从对应中断向量处取指执行代码。LPCR.AILLPCR.HAIL 决定地址是否需要偏移 下表列出了所有类型的中断向量及其有效地址: Pasted image 20230906141329.png

1.8 调试

调试功能允许硬件和软件通过追踪指令流,比较数据地址,单步执行等进行调试:

  • Come From Address Register Come From Address Register (CFAR) 是64位寄存器, 当执行 rfebb , rfid , 或 rfscv 执行时,寄存器值设置为当前执行的有效地址。
  • Completed Instruction Address Breakpoint Completed Instruction Address Breakpoint 提供了发现完成执行特定地址指令的机制。地址比较是基于有效地址(EA)。Completed Instruction Address Breakpoint 机制是由 Completed Instruction Address Breakpoint Register (CIABR) 控制。
  • Data Address Watchpoint Data Address Watchpoint 提供了发现多个双字有效地址(EA)加载存储访问的机制。至少两个独立地址范围可以指定。每个 Data Address Watchpoint 是由一对SPRs控制:Data Address Watchpoint Register(DAWRn)Data Address Watchpoint Register Extension (DAWRXn)

2. POWER处理器概述

  • 1975年,IBM Thomas J. Watson Research Center发明了第一个RISC机器,801。801原始设计目标是1 IPC,研究重点是定义一个能够每周期执行多个指令,即超标量的架构。研究的结果是第二代RISC架构,称为”AMERICA architecture”
  • 1986年,IBM 位于Austin, Texas的开发RT System的实验室, 基于AMERICA architecture开始开发产品。这个研究最终实现了IBM RISC System/6000(RS/6000) ,即IBM’s POWER架构
  • 1990年,IBM发布RISC System/6000, 包括9种当时工业界最快最强大的工作站。RISC System/6000使用IBM研发的精简指令集,一个IBM实现的新版本UNIX操作系统Advanced Interactive Executive (AIX)。这就是POWER 1
  • 1991年,Apple,IBM和Motorola宣布研发一种用于个人电脑和低端工作站的精简指令集处理器,可以运行IBM AIX和Macintosh。这就是PowerPC
  • 1993年,IBM发布了自1990年以来RISC System/6000产品线最大的更新,包括四款使用PowerPC 601处理器的工作站,和三款使用IBM多芯片微处理器POWER2的高端工作站
  • 1999年,IBM发布了基于POWER3微处理器的RS/6000 SP超级计算机。POWER3能每秒执行20亿次运算,比使用POWER2 的Deep Blue计算机快2倍。Deep Blue在1997年打败象棋世界冠军Garry Kasparov
  • 2001年, POWER4实现单芯片双核心,共享第二级缓存,以及第三级缓存控制器
  • 2004年,POWER5实现双线程,并集成内存控制器
  • 2007年,POWER6实现4.5G的高频。为了实现高频从之前的乱序执行简化成了顺序执行
  • 2010年,POWER7实现单片8核四线程,片上集成32M 3级缓存
  • 2016年,POWER8实现单片12核八线程,片外128M 4级缓存,具备NVLink接口
  • 2017年,POWER9增加了更多IO和带宽
  • 2021年,POWER10实现单片15核八线程,增加互联能力

下表总结了各代POWER处理器的各方面数据,可以从中看到POWER系列的发展路径。

                             
  POWER1 POWER2 POWER3 POWER4 POWER5 POWER6 POWER7   POWER8   POWER9     POWER10
Date 1990 1993 1997 2001 2004 2007 2010 2012 2014 2016 2017 2018 2020 2021
Technology 1.0um 0.35um 0.22um 180nm SOI 130nm SOI, 90nm 65nm SOI 45nm SOI 32nm SOI 22nm 22nm GF 14nm HP GF 14nm HP GF 14nm HP Samsung 7nm
Transistors 8.9M   15M 174M 276M 790M 1.2B 2.1B 1.2B   8B 8B 8B 18B
Area(mm^2) 12.7x12.7(ICU,FXU,FPU)
11.3x11.3(DCU,SCU)
12.7x12.7 (ICU,FXU,FPU)
11.7x9.55 (DCU, SCU)
  267 389 341 567 567 650 650 728(25.3x28.8) 728(25.3x28.8) 728(25.3x28.8) 602
TDP(W) NA NA NA           120-190 120-190 190 190 190  
Frequency(GHz) 0.02-0.03 0.055-0.0715 0.2-0.45 1.1-1.3 1.5 4-4.5     2.0-3.3 2.0-3.3 2.75-3.8 2.75-3.8 2.75-3.8 3.5-4
No. Inst Decode 3 8 4 8 8 8 6 6 8 8        
No. Inst Issue 2 6 4 5 5 7 8 8 10 10        
COREs 1 1 1 2 2 2(in order) 8 8 12 12 12 12 12 15
Threads ST ST ST ST SMT2 SMT2 SMT4 SMT4 SMT8 SMT8 SMT8 SMT8 SMT8 SMT8
L1 Cache I$: 8K 2 way
D$: 64K 4 way
I$: 32K
D$: 4x32K
I$: 32K 128 way 128B cacheline
D$: 64K 128 way 4 banks
I$: 64K direct map
D$: 32K 2 way
I$: 64K 2 way
D$: 32K 4 way
I$: 64K 4 way
D$: 64K 8 way
I$: 32K 4 way
D$: 32K 8 way
I$: 32K 4 way
D$: 32K 8 way
I$: 32K
D$: 64K
I$:32KB 8-way
D$:32KB 8-way (SMT4)
I$:32KB 8-way
D$:32KB 8-way (SMT4)
    I$:48KB 6-way
D$:32KB 8-way(SMT4)
L2 Cache NA 512K-3M direct map 1M-16M offchip 3x480K 8 way 3x640K 10 way 2x4M 8 way 256K/Core 8 way 256K/Core 8 way 512K/Core 8 way 1MB 8-way inclusive 1MB 8-way inclusive     2MB 8-way
L3 Cache NA NA NA 8 way cache directory
32 M off chip
512B cache line
3x12M 12 way
256B cache line
32M 16 way
128B off chip
4M/Core
32MB eDRAM
10M/Core
80MB eDRAM
8M/Core 96M eDRAM 8 way
128M offchip L4
10MB/SMT8 Core 20-way
120MB
eDRAM
10MB/SMT8 Core 20-way
120MB
eDRAM
120MB   8MB/SMT8 Core 16-way
120MB
IO         PCIE G2 3GB/s 10GB/s PCIE G2@20GB/s
SMP 6x60GB/s
PCIE G2@20GB/s
SMP 6x60GB/s
PCIE Gen3 x32
CAPI 1.0
SMP 6.4G x3
PCIe Gen3
CAPI 1.0
NVLINK 25GT/s 160GB/s
PCIe Gen4 x48
CAPI 2.0
OpenCAPI3.0
NVLINK2.0
25GT/s x48
300GB/s
PCIe Gen4 x48
CAPI 2.0
OpenCAPI3.0
NVLINK2.0
25GT/s x48
300GB/s
PCIe Gen4 x48
CAPI 2.0
OpenCAPI4.0
NVLINK2.0
25GT/s x48
300GB/s
PCIe Gen5 x64
PowerAXON 16 x8@32GT/s
SMP Interconnect 14 x9@32GT/s
Memory 8-256M 128bit 64M-2G   0-16G 15GB/s 30GB/s 100GB/s 100GB/s 230GB/s 9.6G DMI 230GB/s 150GB/s 8 DMI DDR4 ports@230GB/s 16 x8@25GT/s OMI
650GB/s
16 x8@32GT/s
1TB/s
SMP(sockets) NA   2 16 32 32 32 32 32 32        
Comments RISC architecture SMP 64 bit hypervisor mode integrated memory ctrl private L2
decimal floating point
vector multimedia ext
eDRAM L3 cache on die acceleration big data optimized high bandwidth GPU attach scale out
direct-attach DDR4 memory
scale up
memory buffers
memory attached via OMI single chip module , 16 sockets
dual chip module, 4 sockets

3. POWER 1

RS/6000架构在当时一个主要特性就是集成了浮点算法单元,同时将不同功能单元独立,主要包括:

  • 定点单元
  • 浮点单元
  • 分支单元

下图展示了RISC system/6000架构逻辑结构 Pasted image 20230912135927.png RISC System/6000架构定义了分离的指令和数据缓存。这些缓存都是写入。指令缓存主要和分支单元耦合,而数据缓存由定点和浮点单元共享。

  • 分支单元 分支单元主要负责取指,地址翻译和检查, 中断处理。除非对应定点或浮点单元上指令队列已满或对定点或浮点单元上数据存在依赖性,分支单元能不断对下一个指令进行取指,解码,并执行相应指令,或者将对应定点或浮点指令分发到对应定点或浮点单元。分支单元每周期可以至少获取3条指令,分别对应定点单元,浮点单元,及分支单元。并且每周期可以分发一个定点和浮点指令。POWER 1不支持分支延迟槽。
  • 定点单元 定点单元除了处理所有定点算术指令外,还需要为浮点单元及自身计算数据地址。因此,定点单元需要负责调度浮点单元和数据缓存之间数据交换。浮点单元寄存器只负责接收或提供数据,因此,浮点单元加载和存储操作是消耗定点单元周期数。
  • 浮点单元 浮点单元支持ANSI/IEEE Standard 754-1985。 RISC System/6000浮点运算是双精度计算。因此,单精度浮点运算也会被转换为双精度进行运算。

下图展示了POWER 1的有效地址(EA)转换过程,32位有效地址首先经过段寄存器转换为52位虚拟地址(VA), 然后52位虚拟地址(VA)经过TLB翻译成32位真实地址(RA): Pasted image 20230912141125.png

4. POWER 2

POWER2 包括高性能的Multi-Chip Module (MCM)和和低端的Single Chip Module(SCM),区别主要是DCU和内存接口,MCM逻辑框图如下所示:

Pasted image 20230816174929.png

包括4个Data Cache Unit芯片,每个128 Kbytes数据缓存,32 Kbyte指令缓存,512 Kbyte - 2 Mbyte L2缓存,4 Word宽内存接口,支持 64 Mbyte - 2048 Mbyte内存

SCM逻辑框图如下所示:

Pasted image 20230816175250.png

包括两个DCU,每个64KB数据缓存,512 Kbyte - 1 Mbyte L2 缓存,2 Word宽内存接口,支持32 Mbyte - 512 Mbyte内存。

4.1 POWER 2 Core

处理器每周期可以分发6条指令,包括两个定点单元,一个浮点单元,和分支单元。下图展示了逻辑框图:

Pasted image 20230816175511.png

5. POWER 3

POWER3是第一个支持32位和64位PowerPC ISA的处理器。下图展示了POWER 3 的全芯片图 Pasted image 20230912085657.png

POWER3由7个功能单元组成:

  • Instruction processing unit (IPU)
  • Instruction flow unit (IFU)
  • Fixed-point unit (FXU)
  • Floating-point unit (FPU)
  • Load/store unit (LSU)
  • Data cache unit (DCU)
  • Bus interface unit (BIU)

下图展示了POWER3 处理器功能模块图: Pasted image 20230912085752.png

  • Instruction processing unitinstruction flow unit IPUIFU 负责取指,缓存以及指令分发和完成整个生命流程。IPU有32KB指令缓存和cache reload buffer(CRB) 。 指令缓存缓存行大小是128B,因此一共有256行,组织成128路组相联,并且单周期访问。CRB 保存从内存读取最新缓存行。另外实现虚拟地址转换,实现了256条目2路组相联instruction translation lookaside buffer (ITLB) 和16条目 instruction segment lookaside buffer (ISLB) 。每周期可以取8条指令,分发4条指令,并且完成4条指令。为了提高吞吐,指令顺序分发,大部分可以乱序执行和结束,顺序完成。指令分发到不同功能单元指令队列并且由32条目的completion queue记录。这些功能单元指令队列确保对应功能单元有足够指令可以选择来执行,并且阻塞的指令不会阻碍IFU的指令分发。completion queue 确保处理器的架构状态的正确性,强制指令顺序完成和中断以及异常的正常处理。POWER3 采用两种机制来提高分支预测的准确性。首先,通过跟踪所有并发的带条件码的指令,处理器能够在指令分发时就确定分支结果。另外,对于在指令分发时无法确定的分支,会进行投机。当带条件码指令完成并且分支结果投机错误,分支指令之后所有指令会取消并重新分发正确指令。
  • Fixed-point execution units POWER3 包含3个定点执行单元:2个单周期执行单元和一个多周期执行单元。单周期执行单元执行算术,移位,逻辑,比较,trapcount leading zero 指令。其他比如乘法,除法等都由多周期执行单元执行。两个单周期执行单元共享一个6条目的指令队列, 多周期执行单元使用一个3条目的指令队列。不同于POWER 2 包含两个执行定点和加载存储的对称的执行单元,POWER3 有两个专门的存储加载单元。独立的定点执行单元和存储加载单元对于类似Monte Carlo仿真这样整数操作占比大的应用很显然有比较大性能提升,但是即使是对浮点运算也很重要。像在sparse-matrix-vector multiply 中,整数索引必须先转换成字节偏移。
  • Floating-point execution units FPU 包含两个对称的执行融合乘加流水的执行单元。所有浮点指令都需要经过乘法和加法阶段。对于浮点乘,加法阶段0作为一个操作数。对于浮点加,乘法阶段1作为一个操作数。
  • Load/store execution units 所有的存储加载操作都由两个存储加载执行单元完成。加载指令将数据从内存转移到定点或浮点重命名寄存器,存储指令将数据从寄存器转移到内存。存储指令使用一个16条目store buffer 来提高性能. 当存储指令获取到数据之后就可以完成,而不必等到写进数据缓存。两个加载存储执行单元共享一个6条目的指令队列LSU 乱序执行允许加载指令超过存储指令同时记录数据依赖性。存储指令的顺序在执行阶段和存储队列中维护。
  • Data cache unit DCU 主要由数据内存管理单元MMU , L1缓存和数据预取单元组成
    • Memory management unit MMU 主要负责数据的地址转换,包括一个16条目 segment lookaside buffer (SLB) 和两个镜像的256条目两路组相联data translation lookaside buffers (DTLB) 以便支持两个存储加载执行单元。MMU 支持1T物理内存,64位有效地址和80位的虚拟地址。
    • L1 data cache L1数据缓存是单周期访问的64 KB,由4个bank,一共512个128B缓存行组成。每个bank是128路组相联。每个bank,由地址A55/A56决定,根据双字地址(A60)地址分成2个子bank。 least-recently-used (LRU) 替换算法不适用于128路组相联缓存,因此,POWER3 在L1指令缓存和L1数据缓存中采用round-robin 替换方案。为了适应不同位宽和频率以便重建缓存行,需要在传输路径上加入linewidth buffers 。L1数据缓存和BIU之间, 每个bank有一个cache- reload buffers (CRBs) 和一个cache-storeback buffers (CSBs)。 加载操作命中CRB 直接提供数据,不必等到缓存行加载。CSBBIU 之间是64-byte 接口。L1数据缓存可以支持4个缓存缺失,可以有效掩盖内存延迟。当加载操作没有命中L1数据缓存,指令会被放入6条目的load-miss queue(LMQ) , 同时BIU发出数据加载传输, 后续加载指令可以继续执行。只有当第五个加载操作没有命中L1数据缓存,并且LMQ 里已经有4个未命中加载指令,加载操作才会被暂停,直到LMQ 里任意一个加载指令执行完成。
    • 数据预取 POWER3处理器一大创新是硬件数据预取功能。POWER3处理器根据监控到的缓存行缺失及匹配到的模式进行数据预取。当一个模式或数据流被探测到,处理器会对缓存行进行投机预取,假设数据会马上被使用。数据预取对于掩藏内存延迟非常关键。预取的数据流在地址上是连续的缓存行,要么是递增,要么是递减的。 POWER3处理器预取引擎包括一个10条目的stream filter 和一个 stream prefetcherstream filter 观察所有数据缓存缺失的真实地址(RA),检测潜在的预取数据流。stream filter 根据加载指令的地址操作数,猜测下一个缓存行的真实地址是增加还是减少,并记录到FIFO filter 。当发生新的缓存缺失时,如果发生缓存缺失的真实地址和猜测的地址一致,这样就检测到一个数据流。如果stream prefetcher 当前少于4个数据预取流,当前数据流会被接受,并且预测下一个缓存行加载操作会通过BIU 发出。一旦数据流被放入stream prefetcher , 数据流保持活跃直到数据流到达终点或者有新的缓存缺失进入stream filter。数据预取引擎会尝试保持预取2个缓存行,前一个缓存行会被放到L1 缓存,后一个缓存行会被放到BIU里一个预取缓冲区。因此,数据预取引擎可以并发预取4个数据流,每个2个缓存行,一共8个预取操作。数据预取引擎监控所有加载操作的地址操作数,当LSU结束当前缓存行并开始加载下一个缓存行,数据预取引擎将预取缓冲区数据传输到L1,并预取下一个缓存行到预取缓冲区。

下图展示了预取引擎框图 Pasted image 20230912094139.png

  • Bus interface unit BIU提供IPUDCU,预取引擎和L2缓存之间连接。数据接口位宽128位。
  • L2 cache POWER3 支持1MB-16MB的L2缓存,可以是组相连或直接映射。总线和L2以32B位宽相连,一个128B缓存行需要4个周期传输。

6. POWER 4

POWER 4 是一个双核乱序处理器,通过一个core interface unit(CIU) 共享一个统一的片上二级缓存,下图展示了POWER4 芯片的逻辑框图: Pasted image 20230912171951.png

  • CIU 是3个L2控制器和2个处理器之间的crossbar switch 。每个L2控制器每周期能提供32B数据。CIU 通过一个8B的接口接受来自处理器的存储操作
  • 每一个处理器有一个相关联的noncacheable unit(NC unit),负责处理指令串行功能和非缓存存储加载操作
  • L3控制器和目录在POWER4 片上,但是实际L3位于片外
  • fabric controller 负责L2和L3之间的数据流以及POWER 4 SMP通信
  • GX controller 控制器负责IO

每个处理器芯片包括四种类型IO:

  • 和同一个模块内其他POWER4 芯片通信,4个16-byte接口。物理是线上,这4个逻辑总线有6个总线组成,3个输入,3个输出
  • 和不同模块的POWER4 芯片通信,2个8-byte的总线,一个输入,一个输出
  • 片外L3接口,2个16-byte总线,一个输入,一个输出,运行在1/3处理器频率
  • 2个4-byte GX总线, 一个输入,一个输出,运行在1/3处理器频率

同时 POWER4 增加了 logical partition ID , real mode offset register (RMOR) , real mode limit register (RMLR)hypervisor RMOR 寄存器,提供将SMP系统分成逻辑分区的功能。这些寄存器只能在hypervisor模式下修改。逻辑分区可以提高系统的稳定性,并且可以用于虚拟化。下图展示了POWER 4的全芯片图: Pasted image 20230809154420.png

6.1 POWER4 Core

POWER 4 处理器是一个乱序的超标量设计,一共实现了16级流水线,每周期可以取指8条指令,发射5条指令,完成5条指令,可以同时处理超过200条指令。为了增强指令级并行,POWER 4处理器拥有8个执行单元,2个相同的可以每周期执行融合乘加的浮点执行单元,2个存储加载单元,2个定点执行单元,一个分支执行单元和一个操作条件寄存器的执行单元。下图展示了POWER4处理器的框图 Pasted image 20230912172922.png

6.1.1 分支预测

POWER4 使用多级分支预测机制来预测条件分支是否发生。每周期直接相连的64KB的指令缓存提供8个指令,分支预测逻辑每周期可以查找两条分支指令。根据找到的分支类别,不同分支预测机制用来预测分支方向或分支目标地址。无条件分支的方向不做预测,所有条件分支都做预测,即使在取指阶段通过 condition register 已知。对于 branch-to-link-register (bclr)branch-to-count-register (bcctr) 指令,分支目标分别通过硬件实现的 link stackcount cache机制预测。 绝对和相对分支目标地址在分支指令扫描时候直接计算。POWER4使用3个分支历史表来预测分支方向:

  • 第一个是本地预测器,类似于分支历史表BHT,使用分支指令地址来索引16 384条目的数组,产生1比特预测分支是否发生
  • 第二个是全局预测器,通过一个执行过的分支指令的11比特向量,和分支指令地址进行按位异或,来索引16 384条目的全局历史表来产生1比特预测分支是否发生
  • 第三个是选择表,记录上面两个预测器预测表现来选择其中一个预测器,16 384条目的选择表和全局预测器使用同样方式索引来产生1比特的选择信号。

动态分支预测能够被软件覆盖,通过设置条件分支指令的2个保留位,一个用来指示软件覆盖,一个用来预测方向。POWER4 使用 link stack 来预测 branch-to-link 指令的目标地址,一般用于子函数返回。通过设置 branch-to-link 指令的提示位,软件可以将 branch-to-link 是否代表子函数返回,目标地址是否重复等信息通知处理器。当取指逻辑取到 branch-and-link 指令并预测发生分支跳转时,处理器会将下一条指令的地址推入 link stack 。当取到一个提示位指示是子函数返回并预测发生分支跳转的 branch-to-link 指令时,link stack 会被弹出,并从弹出的地址继续取指。 POWER4 使用一个32-entry, tagless直接映射的 count cache 来预测软件提示的重复的目标。count cache 每一条能记录62位地址。当软件提示目标地址可重复的 branch-to-linkbranch-to-count 指令执行时,目标地址被写入 count cache 。当再次取指这样指令时,目标地址通过 count cache 来预测。

6.1.1 取指

一旦 instruction-fetch address register (IFAR) 被加载,指令缓存立即被访问,并每周期提供8条指令。每个指令缓存行是128B,可以提供32个指令,因此每个缓存行被分为4个相等的区域。因为指令缓存缺失比较少,为了省面积,指令缓存只有一个端口,每周期可以读或写一个区域。I-cache directory (IDIR) 每条包含42位的真实地址(RA),由有效地址访问(EA)。当I-cache缺失时,指令从L2以4个32B传输,最需要的区域在前两个周期传输。缓存行被写入instruction-prefetch buffer,指令缓存可以继续被后续指令访问。当取指逻辑不使用指令缓存时,例如发生另一个指令缓存访问缺失,缓存行会被写入指令缓存。这样指令缓存的写入操作可以被掩藏而不影响正常的取指操作。 EA, RA对被保存在128条目的2路组相联的 effective-to-real address translation (ERAT) 表中。POWER4 分别实现了IERATDERAT,都是用有效地址(EA)访问。 每个处理器实现了一个1024条目的4路组相联的 TLB

当指令流水线准备好接受指令时,IFAR的值被发送到指令缓存, IDIR, IERAT, 和分支预测逻辑,同时IFAR被更新为下一个顺序区域的地址。下一个周期,指令从指令缓存转发到译码,分解和分组的指令队列,同时从IDIR接收真实地址(RA), 从IERAT接收有效地址EA, 真实地址RA对,以及分支方向预测信息。IERAT会被检查是否有有效的记录并且真实地址RA和IDIR的真实地址RA匹配。如果IERAT是无效的记录,EA必须从TLB和SLB进行翻译,取指会被暂停。假设IERAT记录是有效的,并且IERAT的RA和IDIR的真实地址RA匹配,指令缓存访问命中。使用分支预测逻辑重新加载IFAR,然后重复上面过程。填充译码,分解和分组前面的指令队列可以允许取指逻辑提前运行,而且当发生指令缓存缺失时,指令队列可以继续提供指令而不必停止后面的流水线。

如果发生指令缓存缺失,首先,instruction-prefetch buffers会被检查是否有请求的指令,如果有,会将指令发送到流水线并写入指令缓存。如果instruction-prefetch buffer也不存在请求的指令,取指命令被发送到L2,L2高优先级处理指令重载传输。当数据从L2返回,会尝试写入到I-cache。除了这些取指命令,POWER4 会预取指令缓存行到 instruction-prefetch bufferinstruction-prefetch buffer可以保存4个32条指令。 指令预取逻辑监控取指请求,当instruction-prefetch buffer里存在请求缓存行时,会预取下一个缓存行;当instruction-prefetch buffer里不存在请求缓存行时,会预取下两个缓存行。这些预取操作需要保证I-cache里不存在预取的缓存行。预取的缓存行会被保存在instruction-prefetch buffer里,从而保证不会污染指令缓存。

6.1.2 译码,分解和分组

一组包含5个内部指令,称为IOPs。解码阶段,指令被顺序放入一个组。最老的指令放到槽0, 余下依次放入,槽4保留给分支指令。如果必要,no-ops 被强制放入槽4。一个周期分发一个组的指令。组按照程序顺序分发,不同的IOPs被发射队列乱序发射到执行单元。一个周期只能完成一个组,并且只有一个组里所有指令都完成,并且更老的组已经完成,这个组才能完成。为了保证正确性,一些指令不允许投机执行,为了确保这些指令不会被投机执行,这些指令只有作为下一个完成的指令时才会被执行,这被称为完成序列化。为了简化实现,这些指令单独组成单指令组。完成序列化例子包括guarded space的存储加载指令和context synchronizing 指令,例如修改处理器状态的 move-to-machinestate-register 指令。

6.1.3 组分发和指令发射

一次分发一个指令组到指令队列,当指令组分发时,控制信息被保存在 group completion table (GCT) 。GCT可以保存20个组。GCT会记录指令组里第一条指令的地址。当指令执行结束,也会被记录到对应的GCT,记录会一直维护直到指令组退休。每个指令槽对应不同的执行单元的发射队列。定点执行单元和存储加载单元共享一个发射队列。下表列出了不同发射队列的深度和不同类型的队列的个数: Pasted image 20230913150523.png

指令被分发到发射队列的顶端,当指令从发射队列发射出去后,队列内指令往下移动。对于两个发射队列对应一个执行单元的,两个队列交织发射,所有的源操作数都准备好且最老的指令被发射到执行单元。当指令组分发时,指令组需要的所有资源都需要可用,不然指令组会被停住直到所有资源可用。成功的分发需要下列资源:

  • GCT条目:每一个指令组需要一个GCT条目,当组退休时会被释放
  • 发射队列槽: 指令组里每个指令都需要一个对应的指令队列槽,当指令被成功发射到执行单元时会被释放。有些情况下指令发射几个周期之后才能释放,例如,依赖加载操作指令的定点指令可以被投机发射,这时候并不确定加载指令是否会命中L1数据缓存。如果加载指令未命中L1数据缓存,定点指令需要撤回到发射队列直到依赖的数据被加载到寄存器。.
  • 重命名寄存器:指令组里指令必须要有相应的重命名寄存器资源。重命名资源只有在下一个写同样逻辑资源指令完成时才释放。下表总结了 POWER4 处理器可用的重命名资源:

Pasted image 20230913154714.png

  • Load reorder queue (LRQ) 条目: 指令组里加载指令必须有可用的LRQ条目,当指令组完成时被释放。LRQ一共32条目
  • Store reorder queue (SRQ) 条目: 指令组里存储指令必须有可用的SRQ,当指令组完成,并且存储操作成功写到L2之后释放。SRQ一共32条目

6.1.4 存储加载执行单元

每一个SRQ条目关联一个store data queue (SDQ)条目,SDQ条目维护存储指令的数据直到指令组完成。一旦完成,SDQ里的数据会被写入到缓存。另外,三个特别hazards需要避免:

  • Load hit store 当对同一个内存地址的年轻的读在更老的写把数据写回缓存之前执行时必须从SDQ获取数据。当读指令执行时,会检查SRQ,是否有对同一个地址的更老的写指令,如果有,数据从SDQ转发。当数据不能转发时比如读写地址重叠但是并不完全一致时,包含读指令的指令组被遗弃并重新取指执行。如果更老的写指令还未将数据写到SDQ,读指令被拒绝,并重新发射。
  • Store hit load 当对同一个内存地址的年轻的读在知道有更老的写之前执行完时,读操作接收到数据是错误的。为了避免这种情况,当写指令执行时,需要检查LRQ,如果存在更年轻的读已经执行了,包含读指令的指令组和后续的指令组都被遗弃,并重新取指执行。写指令之后所有指令组也被遗弃。如果读写指令在同一个指令组,指令组被遗弃,并且指令组里的指令单独组成一个指令组。
  • Load hit load 对同一个内存地址的读必须保证顺序。在LRQ条目里有一个位,指示对当前条目里的数据发生了侦听。当读指令执行时,和LRQ里的所有地址进行比较,当和一个被侦听过的更年轻的写匹配时,顺序一致性可能存在问题。为了简化实现,老的读指令之后的指令组都被遗弃。如果两个读指令在同一个指令组,当前指令组被遗弃,并且指令组里的指令单独组成指令组。

6.2 POWER4 Core Pipeline

下图展示了 POWER 4处理器的流水线: Pasted image 20230912173004.png

在MP(mapper)阶段所有依赖性被确定,资源被分配,指令组被分发到对应的发射队列。在ISS阶段, IOP被发射到对应的执行单元。在RF阶段读取对应寄存器获取源操作数。在EX阶段执行。在WB阶段写回执行的结果到对应寄存器,这个时候,指令结束执行但还未完成。至少经过Xfer和CP两个周期,所有更老的指令组已经完成并且同一个组里其他指令结束执行指令才能完成。如果指令打包成指令组速度没有取指速度快,从指令缓存里取出的进入指令缓存的指令处于D1阶段。 同样,如果没有资源分发指令组到发射队列,指令等待在MP之前;指令在ISS之前在发射队列等待;在CP之前等待完成。

两个存储加载单元流水线是一样的,称为LD/ST流水线。 访问寄存器文件之后,存储加载指令在EA周期生成有效地址。加载指令在DC周期访问DERAT,数据缓存目录和数据缓存。如果DERAT未命中,加载指令被拒绝,保留在发射队列。同时请求会发送到TLB重新加载DERAT。第一次发射最少7个周期之后,被拒绝的指令会重新发射。如果DERAT仍然未命中,指令会再次被拒绝。这个过程一直持续直到DERAT命中。如果TLB也未命中,地址转换会被投机执行,但是TLB只有在指令确定执行之后才会更新。因此,只有在触发地址缺失的指令所在的指令组是下一个完成的指令组时才会更新TLB。TLB同时支持4 KB和16 MB页表。

对于加载指令,如果L1数据缓存目录指示包含数据,数据会在fmt周期进行格式化并写入到对应的寄存器,依赖的指令也可以使用数据。依赖的指令会假设数据缓存命中并发射,这样这些指令的RF周期和加载指令的WB周期对齐。 如果L1数据缓存提示未命中,请求会发送到L2获取对应缓存行。发送的请求会被保存在load miss queue(LMQ)中。LMQ可以保存8条请求。如果LMQ满了,加载指令会被拒绝并在7个周期之后重新发射。如果已经存在同一个缓存行的请求,第二个请求会被合并到同一个LMQ条目。如果这是同一个缓存行第三个请求,加载指令会被拒绝。所有从L2返回的数据都会和LMQ进行匹配,匹配到的数据会被转发到寄存器以便对应的加载操作可以完成,同时对应LMQ条目被释放。

对于存储指令,数据被保存到SDQ,一旦存储指令对应的指令组完成,会尝试将SDQ数据写到数据缓存。如果数据已经存在L1数据缓存,修改的数据会写回到数据缓存;如果不存在,不会写回到L1。修改的数据都会写回到L2。POWER4 的缓存一致性点是L2。另外,L2缓存对L1是包含的,即所有L1数据都在L2中。

6.3 POWER4 L2缓存

POWER4 上L2由两个处理器共享,下图展示了L2的逻辑视图: Pasted image 20230912173042.png

L2由3个相同块组成,每一个都自己控制器。缓存行在3个控制器之间做哈希。每个块包括4块SRAM分区,每一个分区每两个周期能提供16B数据;4个分区每周期能提供32B数据,需要4个周期传输一个128B缓存行。数据阵列实现SECDED,并且有冗余的wordline和bitline;L2缓存目录由2个冗余的8路组相联,奇偶保护阵列组成。冗余的阵列除了提供备份,同时也提供了2个非阻塞的读端口,允许侦听而不影响存储加载请求。L2实现了pseudo-LRU替换算法。因为L1是写入设计,到L2的写请求最多8B,L2有2个4条目的64B的队列来合并写请求,减少到L2的请求。每个控制器里有4个一致性处理器来管理L2,每个一致性处理器处理一个请求。请求可能来自两个处理器的L1数据缓存或者取指,或者存储存储队列。一致性处理器负责:

  • 负责命中时数据返回,或未命中时从fabric controller返回数据到CIU
  • 更新L2目录
  • 未命中时发送请求到fabric
  • 当发生读未命中或写请求时,控制L2的写入
  • 当一个处理器写的缓存行存在另一个处理器L1缓存时,通过CIU发送无效请求到处理器

每个L2控制器有4个侦听处理器负责管理从总线侦听到的一致性操作。当总线操作命中L2时,一个侦听处理器会负责做出相应操作。根据操作类型,L2目录里的包含位,缓存行的一致性状态,会导致:

  • 发送无效请求到处理器L1数据缓存
  • 从L2读取数据
  • 更新缓存行在目录里的状态
  • 将修改的数据写回到内存
  • 将数据发送到其他L2

除了分配一个侦听处理器,L2对于所有侦听操作提供一个侦听响应。对于侦听请求,L2目录会被访问以确定缓存行是否存在以及对应的一致性状态,同时侦听的地址会和当前活跃的一致性处理器比较来发现可能的地址冲突。基于这些信息,会返回对应的侦听响应。 L2缓存控制器也充当两个处理器的保留站来支持 load [double] word and reserve indexed (lwarx/ldarx)store [double] word conditional (stwcx/stdcx) 指令。每个处理器一个地址寄存器用来保存保留的地址。当 lwarxldarx 指令执行时会设置一个标志,当侦听到无效操作包括从其他处理器发送的对保留地址的写,或者 stwcxstdcx 执行成功 (通过 condition register 里一位来通知处理器执行结果),会清除标志。L2实现增强的MESI一致性协议,一共7个状态:

  • I (invalid state): 数据无效
  • SL (shared state): 数据有效,缓存行可能在其他L2。数据可以传输到同一个MCM内的其他L2。当处理器L1数据缓存加载或指令未命中L2并且数据来自其他缓存或内存时会进入 SL 状态
  • S (shared state): 数据有效,缓存行可能在其他L2。数据不可以传输给其他L2。当来自同一个MCM的处理器发出的侦听读命中时进入该状态
  • M (modified state): 数据有效,数据被修改且独占,数据可以传输给任意L2。当处理器发出写操作时进入该状态。
  • Me (exclusive state): 数据没有修改但被独占,Me 状态缓存行写出只需要无效对应标签,数据不需要写出。当处理器执行 lwarxldarx 指令并且缓存行时从内存获取时候会进入该状态。
  • Mu (unsolicited modified state): 数据有效,数据被修改且独占,当处理器执行 lwarxldarx 指令并且缓存行时从其他处于 M 状态L2获取时会进入该状态。
  • T (tagged state): 数据有效,但是和内存比有修改,并且数据已经传输给其他缓存,在这个状态,数据不能传输给其他L2除非收到回应。当 M 状态时收到侦听读时候会进入该状态。

下表列出了L2和L1可能对应的缓存状态: Pasted image 20230913172331.png

L2系统里还有两个noncacheable units (NCU), 分别对应两个处理器。NCU处理分缓存的读写,以及缓存同步操作。每个NCU由NCU masterNCU snooper组成。

  • NCU master负责来自处理器的请求,包含一个深度为4的FIFO队列,处理非缓存的写,包括memory-mapped I/O的写,和缓存以及内存屏障操作。一个深度为1的队列来处理非缓存的读操作。 片上处理器的缓存和同步操作和非缓存的写操作一样处理,不同的是不带数据。这些操作会发送到L2控制器,大部分会被L2侦听到,包括 icbi , tlbie , translation lookaside buffer synchronize (tlbsync) , enforce in-order execution of I/O (eieio) , synchronize (sync) , page table entry synchronize (ptesync) , lsync , data cache block flush (dcbf) , data cache block invalidate (dcbi) 指令。
  • NCU snooper处理来自总线的 translation lookaside buffer invalidate entry (tlbie)instruction cache block invalidate (icbi)NCU snooper侦听来自总线的 sync , ptesync , lsync , eieio , icbitlbie 操作,并传递给处理器。

6.4 POWER4 L3 Cache

下图展示了L3的逻辑视图: Pasted image 20230912173114.png

L3由控制器和数据阵列组成,控制器在POWER4 芯片上,包含标签目录,仲裁逻辑等。数据阵列在包含两个16MB eDRAM的L3芯片上,后面可以连接单独的内存控制器。为了物理实现和减少bank冲突,L3上的eDRAM组织成8个bank, 每个bank 2M,并分成4个4M的组。L3控制器也分成4个组,每个有两个一致性处理器,可以处理来自总线的请求,L3和内存的访问,以及更新L3标签目录。另外,每个组包含两个处理器来进行内存的踢出,无效操作和IO的DMA操作。 每两个组共享一个L3标签目录。L3是8路组相联,缓存行512B,并以128B大小和L2维持一致性。每个缓存行支持下面5个状态:

  • I (invalid state): 数据无效
  • S (shared state): 数据有效,L3只能传输给L2
  • T (tagged state): 数据有效,并且和内存数据相比是修改过的,数据可能存在其他L2或L3里
  • Trem (remote tagged state): 和T状态类似,但是数据是从其他芯片传输过来的
  • O (prefetch data state): 数据和内存里数据一致,其他L2或L3状态未知

L3缓存数据要么来自直接连接的内存,或者连接的其他处理器芯片的内存。当其中一个处理器的读请求未命中L3时,L3控制器分配一个S状态的缓存行,和L1以及L2的包含性不是必须的。因此,当L3释放数据时,并不需要无效L1或L2缓存。当本地L2弹出M或T状态数据时,L3数据进入TTrem状态。当收到侦听时,L3进入TTrem状态,这样当L3写出时候. 不需要做内存地址译码。L3使用T/Trem来决定数据是否可以写入到直接连接的内存控制器,或者需要将写出操作发送到总线。处在TTrem状态时,L3可以给系统上任何请求提供数据。但是在S状态时, L3只能为本地L2提供数据。这样减少片间数据传输,尽量使用本地L3。当处在O状态时, 数据可以传输给任意请求者。

6.5 POWER4 Memory System

下图展示了POWER4的内存系统视图: Pasted image 20230912173158.png

每个POWER4 芯片有一个可选的内存控制器连接到L3缓存后面,每个内存控制器有1或2个内存接口。每个芯片有2个8-byte总线,一个输入,一个输出。system memory interface (SMI)芯片和DRAM芯片由4个4-byte 双向总线连接,工作在400MHz内存控制器有一个64条目的读命令缓存,65条目的写命令缓存和一个16条目的写缓存队列。

6.6 POWER4 IO

下图展示了 POWER4 的IO结构,GX总线连接远程IO桥芯片。 Pasted image 20230913093144.png

6.7 MCM

下图展示了4个 POWER4 芯片通过4个逻辑总线组成8路SMP系统。 Pasted image 20230913100716.png

每个芯片写到独立的总线,并和L2,I/O控制器,L3控制器进行仲裁。每个芯片侦听所有的总线,从L2发出的读请求被所有芯片侦听到:

  • 请求数据是否在L2,一致性状态是否允许从L2传输到请求的芯片
  • 请求数据是否在L3或内存,如果在,返回数据到请求的芯片

从单芯片角度看,互联拓扑类似总线;从整体看,单个芯片类似交换机。

6.8 32路SMP

下图展示了4个MCMs组成更大的SMP系统 Pasted image 20230913092752.png

一到四个MCMs可以进行互联,当多个MCMs互联时,中间的芯片的总线充当repeaters,将请求以环状拓扑从一个模块传输到另一个模块。和单个MCM类似,每个芯片有单独的请求/命令和数据总线,但是侦听所有总线。多个MCMs配置比单个会轻微增加10%的的内存访问延迟,但是提供了统一的内存模型,简化编程。

6.9 POWER4 RAS

L1缓存使用奇偶效验保护,L1数据缓存错误会被当成同步的machine-check中断。 machine-check中断处理函数实现在固件代码里以便支持错误恢复,当中断发生时,固件会保存处理器的架构状态,并检查处理器寄存器来决定恢复和错误状态。如果是可恢复的,固件会无效L1数据缓存来清除错误,并递增错误计数器。如果数据计数器比预设的阈值大,表示是一个不可恢复的错误,固件会禁止发生错误的L1数据缓存部分。固件然后恢复处理器架构状态,以fully recovered的状态回调操作系统的machine-check处理函数。操作系统检查固件返回的状态并继续执行。 L3 标签目录是ECC保护,支持SECDED。不可修正的错误会导致system checkstop。如果是可修正的错误,访问会被暂停直到错误被修正,同时会发送recovered attention message到service processor。 L3地址, 内存地址和控制总线有parity,可以发现单bit的错误。L3和内存的数据总线支持ECC的SECDED。不可修正的错误会被发送到requesting processor并导致machine-check中断。 L3 标签目录发生stuck fault或L3 cache-embedded DRAMs发生超过 line-delete控制寄存器范围的stuck faults,包含对应L3缓存的处理器芯片可以被重新配置,从逻辑上在系统里删掉而不影响系统里其他L3缓存。

7. POWER 5

POWER5 将L3直连到L2,作为victim cache,另外,POWER5 还集成了片上内存控制器,以提高主存访问速度。每个处理器核支持双线程,对于操作系统,POWER5 是一个4路SMP处理器。两个处理器共享1.875MB L2 缓存,并分为3个分区,每一个分区是10路组相联。 L3分为3个slice,分别作为L2的victim cache,每个slice是12路组相联,缓存行大小为256B,分为2个128B的sector。POWER5 芯片和L3通过2个16B的双向总线以1/2处理器速度相连。4 bytes宽的I/O bus称为GX bus,运行在1/3处理频率。下图展示了POWER 5的全芯片图: Pasted image 20230914085010.png

7.1 多线程的演进

将超标量微处理器改成SMT需要做下面这些修改:

  • 增加 Program Counter (PC) 共享取指逻辑
  • 增加GPR/FPR重命名资源,高地址位可用来识别不同线程
  • 增加完成逻辑来记录不同线程
  • 地址和标签中增加线程区别位

下图展示了从ST到Coarse Grain Thread, Fine Grain Thread和Simultaneous Multi Thread的演进: Pasted image 20230809154930.png

POWER5处理器中, 为了实现SMT,相比POWER 4

  • 段表缓存在全相联的64个条目的 segment lookaside buffer (SLB) , 每个线程一个
  • 页表缓存在1,024个条目, 4路组相联的 translation lookaside buffer (TLB)
  • BHT和 count cache 没有因为SMT而修改
  • return address stack,每个线程一个
  • 4个 instruction prefetch buffers ,每个线程一半,每个线程可以独立处理指令缓存缺失和指令预取
  • GCT修改为 linked list 实现,这样每个线程可以独立分配和释放。共享的GCT保持和POWER4一样的条目数
  • 寄存器重命名有一些小修改,每个逻辑寄存器有一个线程位,每种重命名资源增加一些
  • 除了浮点发射队列从20增加到24, 其他发射队列保持不变
  • 对于LRQSRQPOWER4是32个条目,对于SMT,需要分成每个线程一个,这样会导致LRQSRQ容易用完。为了不增加队列物理大小,每一个队列都提供了32个虚拟队列条目。虚拟队列条目包含足够信息来分辨指令而不是存储加载指令地址和数据。这种方案以很小成本扩展了LRQ和SRQ大小,从而不会停止指令分发。当指令分发时,真实的LRQ或SRQ已满,指令可以分发到虚拟条目。当真实条目可用时,虚拟条目转换成真实条目。在存储加载指令发射时必须使用真实的LRQSRQ
  • Branch Issue Queue(BIQ) 保持和POWER4一样的16条目大小,每个线程8条
  • load miss queue (LMQ) 增加了一个线程位,有2个线程共享

下表总结了重命名寄存器和发射队列的大小比较: Pasted image 20230914112838.png

下图展示了POWER5处理器的逻辑视图: Pasted image 20230804094425.png

7.2 多线程指令流和流水线

POWER5指令流水线和POWER4一样。所有流水线延迟,包括分支预测错误惩罚,L1数据缓存命中延迟都和POWER4一致。POWER5流水线如下图所示: Pasted image 20230914085221.png

在SMT模式下, 每个线程一个程序计数器。取指之后不同线程的指令被放到不同的指令缓存(D1之前),每个指令缓存可以存放24条指令,比POWER4单个指令缓存稍小。在D0阶段,基于线程的优先级,从一个指令缓存中取5条指令,并且在D1和D3阶段组成一个指令组。一个指令组中的指令全部来自同一个线程,并同时解码。下图展示了POWER5的指令流程图: Pasted image 20230914085156.png

7.2.1 多线程的调度

POWER5 处理器对每个线程,支持8种软件优先级。Level 0表示线程没有激活,Level 1到Level 7优先级从低到高。POWER5支持两种ST操作

  • 默认启动工作在SMT模式,当某个线程空闲时,软件可以指导硬件将线程进入休眠状态。要唤醒一个休眠的线程,要么活跃的线程执行一个特殊的指令,要么外部或递减中断发生在休眠线程上。
  • 当线程进入null状态时,操作系统将无法感知该线程。

多线程支持如下两种调度方式:

  • 动态资源平衡 动态资源平衡的目标是保证两个线程流畅的执行。动态资源平衡通过监控类似GCT和LMQ来决定一个线程是否占用资源。例如,如果一个线程遭遇很多L2缓存缺失,依赖指令可能充满了发射队列,阻止了其他指令组的分发,拖慢了其他线程。为了避免这种情况,动态资源平衡逻辑发现线程超过L2缓存缺失阈值之后可以停止该线程。 动态资源平衡逻辑有下面三种手段停止线程:
    • 降低线程优先级 当线程用了超过预定的GCT条目时使用
    • 阻止线程解码 当线程发生超过阈值的L2缺失时使用
    • 遗弃线程所有等待分发的指令并阻止线程解码 当线程执行类似 synch 这种耗时很长指令时使用
  • 可调线程优先级 可调优先级可以让软件决定线程的优先级,一般下列情况需要调整线程优先级:
    • 等待锁的线程 这种情况软件可以降低线程优先级
    • 线程处于空闲状态
    • 某个线程需要比其他跑的快, 例如,软件可以给实时任务相对后台任务更高的优先级

7.3 POWER5 Memory System

内存读数据位宽时16 bytes ,写位宽是8 bytes。POWER5使用 synchronous memory interface (SMI) 来连接DDR-I或DDR-II SDRAM。

  • 当使用2个SMI芯片时,每个SMI芯片在控制器侧配置成8-byte的读和2-byte写, DIMMs侧则是2个独立的8-byte端口
  • 当使用4个SMI芯片时,每个SMI芯片在控制器侧配置成4-byte的读和2-byte写DIMMs侧则是2个独立的8-byte端口

SMI芯片内部有缓冲来匹配控制器和DIMMs之间频率和位宽的差异。下图展示了内存控制系统的逻辑视图: Pasted image 20230914090521.png

7.4 POWER5 SMP

fabric bus controller (FBC) 控制片间的通信,互联拓扑称为分布式交换,在不同配置下保持一样的行为。高端POWER5系统采用MCM封装,基本单元是8个POWER5 芯片和8个L3芯片封装成两个MCM。MCMs, 内存, 和连接I/O drawers的桥接芯片组成一个book。下图展示了16路POWER5系统: Pasted image 20230914090918.png

POWER5 在MCM内部是通过两个环状总线互联,两个环方向相反。每个总线是8B位宽,运行在处理器频率。一个Book内两个MCM通过4对8B位宽,运行在1/2处理器频率的单向总线互联。一个POWER5 book是16路SMP,对于SMT2,就是32路SMP。4个books可以互联组成64路SMP系统。每个Book中的POWER5芯片和边上芯片通过运行在1/2处理器频率的8B位宽总线互联。下图展示了64路SMP互联示意图: Pasted image 20230914091104.png

也可以基于DCM来组成1-8个POWER5芯片系统。DCM包含一个POWER5芯片和一个L3芯片。下图展示了一个基于DCM的16路POWER5 SMP系统: Pasted image 20230914091243.png

7.4.1 Fabric bus controller

FBC对L2/L3, 内存控制器,MCM的片内总线和缓冲和MCM的片间总线传输进行缓冲和保序。总线地址和数据是分开的,允许乱序返回。

  • 地址总线 MCM内部的地址总线是8 bytes位宽,运行在1/2处理器频率,MCM之间地址总线是4 bytes宽,运行在处理器频率,每个地址传输使用4个处理器周期。地址总线使用ECC,支持SECDED。地址传输包括50位真实地址(RA),地址标签,传输类型和其他信息。MCM内部有12个点对点的地址总线,MCM之间总线使用环拓扑来广播地址,在64路SMP系统中,地址串行经过8个MCM。环上每个芯片负责转发地址到环上的下一个MCM, 并且到MCM内部其他芯片。当发起传输的芯片收到发出的地址之后,停止传播。
  • 响应总线 类似地址总线,MCM内部的响应总线运行在1/2处理器频率.,MCM之间响应总线运行在处理器频率。响应总线是延迟之后的地址总线, 包括每个处理器芯片上内存系统侦听到地址之后缓存一致性相关的操作。响应总线使用奇偶效验保护。响应总线在地址总线之后延迟固定的周期。一旦MCM内部源芯片收到MCM内部其他3个芯片的侦听响应,就将这些响应,自身响应以及来自环前面MCM的响应结合起来并转发到环上下一个MCM。当发起侦听的芯片收到自己发起的侦听响应之后,会生成一个合并的响应并像地址一样广播到系统中。 这个结合的响应详细列出了相应地址上应该做出的动作,比如应该进入什么状态,对于读操作应该哪一个芯片提供数据,那些必须做无效操作等。为了减少cache-to-cache传输延迟,POWER5增加了一个early combined response机制,允许remote chip收到地址之后从自己处于S状态的L2或L3发送数据到请求处理器 。early combined response通过和MCM侦听响应来比较找到第一个可以提供数据的一致性侦听者。
  • 数据总线 数据总线用于所有数据传输,比如缓存介入。也用于地址传输之后的数据传输,比如cast-outs, snoop pushes, 和DMA写。 数据总线使用ECC,支持SECDED。在POWER4系统上, 数据使用简单的环拓扑进行广播传输。在POWER5中,一个MCM内部的数据总线增加到8个,MCM之间也增加到8个,另外,fabric bus路由数据到指定的芯片。

7.5 POWER5 RAS

POWER5系统上,很多固件能直接升级而不需要重启或不影响系统运行。所有系统互连都实现ECC保护,单bit互联错误会动态修正,如果错误持续,会调度修复程序。对于不可修复的错误,包含错误的部分会被下线而不需要人工干预。内存使用SECDED,并且后台会做memory scrubbing来修正错误。并且每个内存区有一个额外的DRAM可以透明的替换出错的DRAM。

8. POWER 6

POWER6 是一个双核,每核双线程的顺序处理器,增加了虚拟化,十进制算术运算,向量多媒体运算功能,并且实现了检查点重试和 处理器冗余功能。recovery unit (RU) 保存处理器的状态,并且使用ECC保护,当发生错误时,处理器使用这些状态恢复。下图展示了POWER6的全芯片图: Pasted image 20230726195941.png

8.1 POWER6 Core流水线

POWER6处理器流水线分为instruction fetch pipe, instruction dispatch pipe, Floating point pipe, BR/FX/load pipe, 和Checkpoint recovery pipe组成,下图展示了POWER6处理器的流水图: Pasted image 20230915084655.png

来自L2的指令在P1到P4阶段进行预解码,然后写入L1。分支预测使用2位16K条目的分支历史表(BHT)来预测分支方向。每周期L1提供8条指令并传输到指令解码流水线的指令缓冲,每个线程有64条目的指令缓冲。所有线程的指令合并成一个指令组,每个指令组包含7条指令。之后会被分发到不同的发射队列,并发射到对应的执行单元执行。十进制和向量多媒体扩展指令通过 浮点发射队列(FPQ) 进行发射并在十进制和向量多媒体指令单元执行。 执行单元的结果送到 checkpoint recovery (CR) pipe 并保存到ECC保护的缓冲中,等待恢复。定点存储加载指令按顺序执行,浮点指令可以和加载指令及定点指令并行执行。为了减少内存延迟影响,会投机预取执行指令预取数据到L1数据缓存,投机预取指令到L1指令缓存,为浮点加载指令增加一个 load-data buffer ,硬件stride预取,软件预取。为了优化一些指令的执行延迟,在分发阶段和执行阶段之间增加了一些缓冲阶段:

  • 为了在加载指令和依赖的定点指令之间实现一个周期的加载使用,定点指令在执行之前会额外多两个周期
  • 为了避免预测错误导致的分支延迟,分支指令额外增加两周期来和定点指令对齐
  • 为了在加载指令和依赖的浮点指令之间实现零周期的加载使用,浮点指令在FPQ会额外多六个周期

8.1.1 IFU

IFU从L2加载指令到L1,这些请求要么是L1指令缓存缺失发起,要么是连续两个缓存行加载请求之后导致的指令预取。每个取指请求都是一个缓存行128B,数据以4个32B返回,最多能有32个取指请求从处理器发送到L2。从L1缓存发出的指令会被写到IDU里的指令缓冲I-buffer。POWER6POWER4POWER5一个主要差异是把很多译码和分组的功能放到预译码阶段,因此解决了L1指令缓存到指令分发的关键路径。在将指令写入L1指令缓存之前,需要4个周期的预译码和分组,增加了L2的访问延迟。IFU主要负责:

  • 指令重编码 在预译码阶段会记录指令信息,例如会调整一些指令的寄存器域以便指令对于执行单元保持一致并减少关键路径上逻辑。POWER6上最重要的指令记录发生在分支指令上,相对分支指令包含一个立即数域,是相对当前 PC 的偏移值,指定了分支目标地址。预译码时会将偏移值和 PC 的低位相加,消除了关键分支执行路径上的加法器。预译码也会决定 PC 高位是否需要加,减来计算分支目标地址,这些信息都会编码进记录的分支指令里。绝对分支指令的分支目标地址也可以做符号扩展。条件分支指令也会编码以实现高频。
  • 指令分组 在预译码阶段指令会被分组并且记录到L1指令缓存,分组可以简化在关键分发路径上的分发仲裁。 同一个指令组只有同一个线程的指令,组里指令条数和分发带宽以及执行单元资源匹配,一个线程5条指令。执行的分支指令结束一个组。L1指令缓存里的每个指令有一个开始位控制在IDU里的分组。如果指令开始为被设置,指令开始一个新的组。 指令组里指令要满足:
    • 一个指令组不能使用超过POWER6执行单元资源:两个FXUs, 两个LSUs, 两个FP或VMX和一个分支单元
    • 一个指令组不能有对 GPR , FPR , CR , XERwrite-after-write依赖
    • 一个指令组不能有对 XERread-after-write依赖
    • 一个指令组不能有对 GPRread-after-write依赖
    • 一个指令组不能有对 CRread-after-write依赖
    • 一个指令组有读目标 FPR 的指令跟随FMA指令
    • 一个指令组不能有对同一个 FPR 的浮点存储指令跟随浮点加载指令
  • 分支执行 POWER6每周期能预测8条分支指令,分支预测使用16K条目2位的BHT; 8个条目全相联的 count cache ; 和一个6条目的 link stackBHTcount cache 由两个线程共享。 每个线程可以由10条分支等待。

8.1.2 IDU

IDU负责指令分发,跟踪,发射和完成。在分发阶段,一个线程的指令组里的所有指令一起分发。如果两个线程的指令数不超过可用的执行单元,两个线程可以同时分发。POWER6每个线程能分发5条指令,两个线程一共7条指令。为了提高分发带宽,IDU使用两个并行的指令数据流,一个线程一个。每个线程有一个每周期能从指令缓存接收8条指令的I-buffer,每个线程每次最多从I-buffers取5条指令。每个线程指令然后经过非FPU和VMX依赖性跟踪,如果指令组里的指令依赖性解决,指令组被分发。否则,指令组被停在分发阶段直到解决依赖性。非FPU和VMX指令的依赖性使用目标表跟踪,一个线程一个。目标表保存指令当前在流水线里的位置信息,当指令从I-buffer进入到到分发阶段,这些指令的信息写入到目标表。随后的定点指令访问目标表来获取依赖数据,然后被分发。FPU和VMX指令的依赖性由分发阶段后面的FPQ解决。FPU和VMX算术指令被分发到FPQ,每个FPQ能保存8个指令组,每个组可以有2个FPU或VMX算术指令,FPQ每周期发射2个FPU或VMX算术指令。为了在加载指令和依赖的浮点指令之间实现零周期的加载使用,浮点指令在FPQ会额外多六个周期,以便和来自LSU的加载数据对齐。如果加载的数据不能写入FPR,数据被写入32条目的 load target bufferload target buffer 允许每个线程有16个加载指令在浮点算术指令之前执行,从而消除额外6个浮点流水周期的影响。 IDU使用一个完成表来记录执行中的大量的指令,每个线程使用10条目的完成表,每个条目可以记录32个指令的信息。当遇到要执行的分支时,预测执行的分支指令之后新分配一个完成表条目。

8.1.3 FXU

POWER6处理器实现了两个FXU来处理定点指令并为LSU生成地址。大部分定点指令一个周期执行完成,POWER6处理器FXU可以实现依赖指令背靠背执行而不需要转发数据到依赖的指令。

8.1.4 BFU

POWER6处理器有两个BFU,为了对齐执行周期差异,额外增加一个流水周期。和FXU类似,中间结果可以转发给依赖指令而不必做rounding和normalization。

8.1.5 LSU

LSU由存储加载地址生成和执行逻辑,L1数据缓存,地址转换,store queue, load miss queue (LMQ), 和数据预取引擎组成,实现下面功能:

  • 存储加载执行 为了实现POWER6高频设计,LSU执行单元采用了相对简单的数据流,保存最少的状态。大部分存储加载指令执行一个操作,一个硬件状态机用来处理 load/store multiple and string 指令。对于跨缓存行的操作,内部分成2个操作。
  • L1数据缓存 POWER6处理器包含8路组相联的64KB的L1数据缓存,缓存行大小是128B,由4个32B的区组成。L2数据以32B大小发送,并且缓存行的无效操作也以32B大小处理,加载操作能命中部分有效的缓存行。L1数据缓存由2个端口,可以支持2个读或一个写。缓存行重加载拥有最高的优先级,并且阻塞已经分发的存储加载指令。执行的加载指令拥有第二高优先级。最后如果没有缓存行重新加载或加载指令,完成的存储指令能够从存储队列写到L1数据缓存。 L1数据缓存是store-through,所有的写操作发送到L2 cache。
  • 组预测 为了满足访问路径的周期, 实现了一个组预测。 组预测基于有效地址EA并且可以用作一个小目录来从8个L1数据缓存组里选择。虽然L1数据缓存的目录也可以使用,但是需要ERAT之后的真实地址,要花费更多时间。 组预测使用EA(51:56)索引,8路组相联,每个组或条目包含11个EA哈希位, 2个有效位(每个线程一个)和一个奇偶位,11位EA哈希值使用下面公式生成: (EA(32:39) XOR EA(40:47)) + EA(48:50) 。当读缓存时,生成的EA(51:56)来索引组预测, 并且生成11位哈希值和8个组的内容比较,如果匹配并且对应线程有效位是置位,使用预测的信号访问L1数据缓存。

8.2 POWER6一致性协议

POWER5中使用的广播侦听协议中,一致性传输需要的带宽随着系统规模而增长。因此,基于目录的NUMA (nonuniform memory access)方案更有吸引力,基于目录的协议使用目录来指示内存区域的归属,因此限制广播在一个小的节点内,减少了节点外的传输。POWER6开发了基于目录的NUMA方式的广播协议。下表总结了POWER6的一致性协议中的缓存状态: Pasted image 20230915100402.png Pasted image 20230915100432.png 下表总结了缓存状态对应的scope-state: Pasted image 20230915103531.png scope-state位保存在冗余的内存中,对于128B的缓存行,该位指示缓存行是否是本地使用。该scope-state位和数据一起读写,4个新增加的缓存状态提供了一种缓存scope-state的方法。当缓存的scope state被释放时,通常是写回到内存。当scope state隐含全局状态时写回操作时必须的,当scope state是本地时,写回操作是可选的。 scope-state和4个新的缓存状态降低了基于目录的NUMA的成本,并且可以和广播一致性协议集成。POWER6使用很多预测器来预测一致性请求是本地还是全局广播操作。

8.3 POWER6缓存层次

POWER6处理器核包含64KB L1 I-cache和64-KB L1 D-cache分别在IFU和LSU中。每个处理器核还有4-MB L2缓存,片上两个处理器核共享32-MB L3缓存, L3缓存控制器在片上,但是数据阵列在片外,L3缓存行是128B,16路组相联。下表总结了各级缓存的特性和组织形式: Pasted image 20230914170540.png 4-MB L2缓存是8路组相联,每个缓存行128B,并且和POWER5上L2缓存实现三个独立控制器不同,POWER6上是一个控制器。L2缓存数据阵列分成4个间隔区,每个包含一个缓存行的32B。处理器发出的缓存行读,castout读和介入读操作使用4个间隔区,但是read-modify-write和L2重新加载时writeback只使用一个缓存行的一个或多个32B的区。目录和一致性管理逻辑分成两个地址哈希区,每个目录区每两个处理器周期能接受一个处理器请求,或一个侦听请求或一根更新操作。不同于POWER5上的L2使用不同的读端口处理处理器请求和侦听请求,POWER6 L2使用滑动窗口来调度侦察请求而不和处理器请求冲突,从而减少面积和功耗。

因为L1 D-cache是store-through,L2每个目录区使用一个8条目128B宽的队列来累积处理器请求。一个条目累积的所有写操作都被L2处理成read-modify-write操作,只影响使用到的间隔区。L2使用每个目录区的16个read/claim (RC) machines中的一个来处理处理器发出的所有读和L2存储队列发出的read-modify-write操作。RC machines 管理所有处理器发出的缓存读写操作。如果L2 cache缺失,L2会等待L3 cache的响应。如果L3命中,数据返回到L2。如果L3未命中,L2 cache会发出请求到SMP一致性互联总线,数据最终通过SMP一致性互联总线从其他L2, L3返回。如果新的缓存行需要释放L2中缓存行,L2会使用每个目录区4个castout machines中一个来将数据或状态转移到L3 victim cache或内存。 为了处理SMP一致性互联总线上的侦听请求,L2首先查询目录,如果需要响应,使用每个目录区4个snoop machines中一个来处理。snoop machine操作包括从缓存读取数据分发送到SMP一致性互联总线,更新目录状态或者从缓存读取数据发送给内存,并无效目录状态,或者只是更新或无效目录状态。 片上两个L2之间有一个高速cache-to-cache接口来提高两个缓存的传输延迟。处理器发出的读操作首先检查自己的L2目录,同时转发到另一个L2,如果自己L2缺失而另一个L2命中,数据会从该L2转发到处理器核和L2。

L3分为两个目录区,分别对应两个L2,L3使用每个目录区8个read machines中的一个来处理L2发送过来的读操作。如果命中,数据返回L2和处理器核,否则,发送响应到对应的L2指示需要发送请求到SMP一致性互联总线。L3使用每个目录区8个write machines中的一个来处理L2发送过来的castout写操作。如果新的缓存行需要释放已有的缓存行,L3使用和write machine关联的castout machine来将数据写回内存。对于SMP一致性互联总线的侦察请求,L3首先查询目录,如果需要响应,L3使用每个目录区4个snoop machine中的一个来处理。

8.4 POWER6内存系统

POWER6有两个内存控制器,每个支持4个通道,每个通道支持2B读数据接口,1B 写数据接口和一个运行在4倍DRAM频率的命令接口,最快支持800-MHz DDR2 DRAM。每个通道可以支持1到4个缓冲芯片。

8.5 POWER6 I/O系统

POWER6 I/O控制器和POWER4以及POWER5保持一致,一个4B读接口和4B写接口与I/O hub芯片相连,这些接口运行在1/2处理器频率。

8.6 POWER6 SMP

下图展示了POWER6的SMP互联接口 Pasted image 20230726201124.png 4个POWER6芯片组成一个基本互联单元Node,每个POWER6有5个运行在1/2处理器频率的8B位宽的SMP接口,三个专门用于Node内部互联。如下图所示: Pasted image 20230914163617.png 依赖于一致性协议上的创新,一致性总线和数据时分复用同一个物理链路,可以67%带宽分配给数据,33%分配给一致性,或者50%分配给数据,50%分配给一致性。 在一个Node内,4个POWER6组成全连接网络。

不同于之前的环拓扑,POWER6可以使用8个Node组成的全连接拓扑,如下图所示: Pasted image 20230914163644.png

8.7 POWER6 RAS

POWER6处理器内部RU包含处理器状态备份,处理器内部的状态检查点不断保存在RU里,而且数据使用ECC保护。L1使用奇偶,L2和L3使用ECC保护。当发生错误时,处理器被停止并阻止和外部通信,上一次成功执行的指令的检查点数据被从RU里读出并恢复到对应处理器上,L1会被清空。处理器从恢复的检查点继续执行。如果是无法修复错误,RU里的数据会被传输到系统中空闲的处理器上并继续执行。

9. POWER 7

POWER7芯片有8个处理器核,每个核有12个执行单元,并且支持SMT4。POWER 7芯片有两个内存控制器,每个内存控制器支持4通道的DDR3,一共8通道内存可以提供100GB/s带宽。芯片上下是SMP接口,提供360 GB/s一致性带宽,可以支持POWER7扩展到32片。下图展示了POWER7芯片的全芯片图: Pasted image 20230915155142.png

9.1POWER7 Core

POWER7能够动态在ST, SMT2和SMT4之间切换。处理器核主要包含6个单元:

  • 取指单元IFU
  • instruction-sequencing unit (ISU)
  • LSU
  • FXU
  • VSU
  • 十进制FPU (DFU)

IFU包含32KB指令缓存, LSU包含32KB数据缓存, 共享256KB L2缓存。每周期能取8条指令,解码和分发6条指令,发射和执行8条指令。每个处理器核有12执行单元:2个定点单元,2个LSU, 4个双精度浮点单元,一个向量单元,一个分支单元,一个条件寄存器单元和一个十进制浮点单元DFP。两个LSU能执行简单的定点操作,每个浮点单元可以执行双精度乘加运算,一共8FLOPS。POWER6首次引入的DFU可以加速很多商业应用。下图展示了处理器核的规划图: Pasted image 20230915155118.png 下图展示了POWER7的指令流视图: Pasted image 20230915155003.png 为了减少面积和功耗,SMT4设计采用了partition方法,一对线程使用一套物理GPR并且使用一个FXU和LSU,另一对线程使用另一套物理GPR和另一个FXU和LSU。POWER7能够使用比支持SMT2的POWER5更少的物理GPR来对SMT4进行寄存器重命名。在POWER4POWER5的乱序处理器中, GPR, FPR和VR的寄存器重命名结构是分开的。在POWER7中, 这些都合并成了一个80条目的寄存器重命名结构,匹配分发和完成之间并发的非分支指令数量。另外,在早期处理器中,浮点和定点还有存储加载指令的发射队列都是分开的,但是,在POWER7中, 这些队列都合并成一个,叫做统一发射队列UQ。为了实现高频,UQ物理上分成两个24条目的队列UQ0和UQ1。 POWER6里FPU和VMX是分开的,但是在POWER7里, 这两个合并成了 vector and scalar unit (VSU) , 并实现了 vector and scalar extension (VSX) 架构,使用64个128位的架构寄存器来实现两路 single-instruction multiple-data (SIMD)POWER7相比POWER6没有增加发射端口但是仍然支持新的VSX指令集并且每周期能执行4个浮点运算,8FLOPS。

L1数据和指令缓存使用bank设计,允许读写同时访问,一个bank同一个周期能支持2个读或一个写。

一个POWER7处理器核和L2及本地L3组成一个chiplet,并处于单独电源域,和相连接的PowerBus异步。

9.1.1 POWER7取指和译码

下图展示了POWER7取指和译码逻辑及流水线: Pasted image 20230915154836.png POWER7处理器核有一个4路组相联32-KB的L1指令缓存,使用了16路bank来避免读写冲突。组预测使用64条目的 instruction effective address directory (IEADIR)I-cache directory (IDIR) 同时被访问并在下一个周期确认组预测的正确性。一个64条目的 instruction effective-to-real-address translation table(IERAT) 被用来加速地址转换。IERAT 的前32个条目支持线程0和2,后32个条目支持线程1和2,IERAT 支持4K,64K页表,并根据需要将64 MB和16 GB页表映射成64K。

IFU从L2中取指并写入L1指令缓存,每次取指请求返回4个32B。这些请求要么是L1指令缓存缺失,要么是指令预取。对每一个L1指令缺失请求,预取引擎发出额外两个顺序缓存行请求。4个线程的取指请求都是独立的,处理器核最多发出4笔并发请求。只有 ST和SMT2 支持指令预取。 指令在写入L1指令缓存之前经过两个周期进行预译码并生成奇偶校验,预译码的位用来扫描发生的分支跳转,帮助分组和几个异常情况的处理。 分支指令扫描过程中会对分支指令进行修改以便生成目标地址,修改过的包含部分计算出的目标地址的分支指令,会被保存到L1数据缓存。来自L2的32B数据在3个周期之后写入到L1指令缓存,如果线程正在等待这些指令,它们同时也会被送到 instruction buffers (IBUF) 和分支扫描逻辑。

Instruction fetch address registers (IFARs) 记录每个线程的 program counter ,每周期 IFAR 选择一个线程的PC并作为取指地址送到指令缓存和分支预测逻辑。指令缓存每周期可以提供8条指令,并写入 IBUF , 随后被组装成分发组。线程优先级,缓存缺失,IBUF 满和线程资源平衡都会影响线程的调度。 IBUF有20个条目,每个可保存4条指令。在SMT4模式,每个线程有5个条目,在ST和SMT2 模式,每个线程有10个条目。特殊的线程优先级逻辑每个周期选择一个线程进行分组,从线程对应的IBUF里读取最多4个非分支指令和2个分支指令并组成一个组。和POWER4POWER5不同,分支指令不会结束一个组。分组之后,指令要么被解码,要么被送到微码硬件将复杂指令拆分成一系列内部简单操作。

分支的方向使用分支历史表来预测,由8K条目的本地BHT (LBHT),16K条目的全局BHT(GBHT)和8K条目的全局选择器(GSEL) 组成。这些预测器每周期可以对8条分支指令进行分支预测,由所有活跃线程共享。LBHT由10位取指地址索引,GBHT和GSEL由取指地址和每个线程单独的21位的 global history vector (GHV) 哈希成11位的值索引。GSEL条目里的值用来选择LBHT和GBHT作为分支预测结果。所有BHT条目都是2比特, 高位决定预测的方向,低位提供hysteresis。

分支的目标地址使用下面两个机制预测:

  1. 非子函数返回的间接分支指令使用所有线程共享的128条目的 count cache , count cache 使用取指地址和GHV异或生成7位值索引,count cache 每个条目包含62位预测地址和2位置信位。当预测结果不准确时,置信位用来决定何时进行条目的替换。
  2. 子函数返回的分支使用每线程一个的 link stack 来预测, branch-and-link 指令被扫描到时,下一个指令的地址被放入对应线程的 link stack 。当扫描到 branch-to-link 指令时,link stack 会被弹出。当扫描到 branch-and-link 但是被之前预测错误的分支指令被刷掉时,link stack 允许保存一个投机条目。在ST和SMT2模式,每个线程使用16条目的 link stack ,在SMT4模式, 每个线程使用8条目的 link stack

在ST模式,当遇到发生的分支时3个流水周期的分支扫描会产生处于空闲,为了消除这种惩罚,增加了一个 BTAC 来记录直接分支的目标地址。BTAC 使用当前取指的地址来预测两个周期之后的取指地址,如果预测正确,发生分支时BTAC能够提供取指地址。当条件分支用来跳过一系列的定点或存储加载指令且分支很难预测时,POWER7 可以检测到这样指令,并将其从指令流水线中移除,然后根据条件来执行定点或存储加载指令。条件分支被转换成内部操作,而定点或存储加载指令依赖内部操作。这样阻止了可能的错误的分支预测导致的刷流水线的操作。

9.1.2 POWER7 ISU

下图展示了负责分发指令,重命名寄存器,发射指令,完成指令和处理异常的ISU的逻辑视图: Pasted image 20230915154927.png 在ST和SMT2模式,两个物理的GPR保存相同内容,线程的指令可以分发到任意一个子发射队列UQ0或UQ1,通过每周期轮换子发射队列保证两个子发射队列的负载平衡。在SMT4模式,两个物理的GPR单独使用,线程T0和T1的定点和存储加载指令被分发到UQ0, 使用GPR0, 发射到FX0和LS0; 线程T2和T3的定点和存储加载指令被分发到UQ1, 使用GPR1, 发射到FX1和LS1。

大部分VSU指令可以分发到UQ0或UQ1,不管是在ST, SMT2或SMT4模式,除了:

  1. VMX的浮点以及整型指令必须分发到UQ0
  2. permute (PM), 十进制浮点, 和128位存储指令必须分发到UQ1
  3. 分发到UQ0的VSU指令在VS0执行
  4. 分发到UQ1的VSU指令在VS1执行

POWER7处理器核以组作为分发单位,一次一个线程的指令组。在指令送到发射队列之前,使用mapper逻辑对寄存器重命名,GPR, VSRXER, **CR, FPSCRlink, 和count寄存器都会被重命名。GPRVSR共享80个重命名寄存器,CR使用56个物理寄存器,XER使用40个物理寄存器,LinkCount寄存器使用24个物理寄存器,FPSCR使用一个20条目的缓冲来保存每个指令组的FPSCR状态。这些资源都是独立并被所有线程共享的。更新多个目的寄存器的指令被拆分成子指令。

ISU分配 load tag (LTAG)store tag (STAG) 来管理存储加载指令,LTAG是一个指向分配给加载指令的 load-reorder-queue (LRQ) 条目的指针;STAG是一个指向分配给存储指令的 store-reorder-queue (SRQ) 条目的指针;当耗尽物理的SRQ/LRQ条目后,会使用虚拟的STAG/LTAG来减少对指令分发的阻塞。当物理的LRQ被释放之后,虚拟的LTAG会被转换成真实的LTAG;当物理的SRQ被释放之后,虚拟的STAG会被转换成真实的STAG。虚拟的STAGLTAG只有转换成真实之后才会被LSU执行。ISU可以为每个线程分配63个LTAG和63个STAG

POWER7使用三个发射队列:一个48条目的UQ, 一个12条目的 branch issue queue (BRQ) , 和一个8条目的 CR queue (CRQ) 。分发的指令被保存在发射队列,BRQ或CRQ一个周期后发射到执行单元;UQ两个个周期后发射到执行单元。BRQ和CRQ是移动队列,分发的指令被放入队头,然后往队尾移动;为了降低功耗,UQ是非移动队列,而是移动指向队列位置的指针。发射队列可以顺序或乱序发射指令,已经准备好的老的指令有更高的优先级。 当指令的源操作数都可用之后就可以被发射了,对于存储加载指令STAG和LTAGA需要是真实条目。对于BRQ和CRQ, 通过将重命名后的目的物理指针和所有并发的指令的源物理指针比较来检查指令依赖性;对于UQ, 通过一个依赖矩阵来记录队列指针来检查依赖性。发射队列每周期一共可以发射8条指令,包括一条分支指令,一条条件寄存器逻辑操作指令,两个发射到FXU的定点指令,两个发射到LSU的存储加载指令或简单的定点指令,两个发射到VSU的向量标量指令。

BRQ每周期可以接收2条分支指令,并发射一个分支指令到IFU执行;CRQ每周期接收2条条件寄存器逻辑指令或SPR操作指令,并发射一个指令到IFU;UQ一共有48条目,物理上分成2个24条目,包括所有FXU, LSU, VSU, 和DFU执行的指令。队列上半部分包含FX0, LS0, 和VS0(含VMX整数指令)执行的指令;下半部分包含FX1, LS1, 和VS1(含DFP, VMX PM, 和VSU 128位存储指令)执行的指令,UQ0/UQ1分周期分别能接收4条指令。64位的VSU存储指令在分发阶段拆分成地址生成(AGEN)和数据操作。因为UQ是非移动的队列,指令的相对年龄通过一个age matrix决定。UQ0/UQ1每周期分别可以一条定点指令,一条存储加载指令和一个向量标量指令,一共6条指令。指令可以投机发射,比如当定点指令依赖于加载指令,而加载指令还未确定是否数据缓存或 data effective-to-real-address translation (D-ERAT) 命中。当投机错误时,指令被拒绝并在几个周期之后再次发射。简单的定点指令也可以选择发射到LSU从而提高FXU的吞吐。

ISU还负责记录和完成指令,使用一个 global completion table (GCT) 来记录所有分发后的指令,按指令组记录,分发和完成都以指令组为单位。GCT有20条目,所有线程共享,一个条目记录一个指令组,最多包括4个非分支指令和2个分支指令。因此,GCT最多可以记录120条分发后的指令。GCT条目里的指令组里每个指令都有一个结束位,当指令成功执行之后,结束位会被标记。当一个指令组里所有指令都标记结束且指令组是线程里最老的指令组时,指令组就可以完成了;指令组完成时,指令组里所有指令的结果都在架构上可见,completion group tag (GTAG) 被广播到相关联资源以便被释放。 POWER7 每周期每线程对可以完成一个指令组(T0和T2是一对,T1和T3是一对),每周期一共2个指令组。

ISU还需要处理刷流水线操作,像分支预测错误,存储加载执行发生冒险,上下文同步指令或异常处理,都可能需要将投机指令从流水线刷掉。完成单元使用20位的掩码来完成刷流水线操作,每一位对应一个组;同时当分支预测错误的分支指令不是组里第一条指令,需要从线程里刷掉后续指令组时对部分组刷流水线操作会发出 GTAG ,以及4位槽掩码指示是哪些指令。

9.1.3 LSU微架构

LSU有两个对称的LS0和LS1流水线,每一个能够一个周期执行存储加载指令。LSU组要功能单元有:存储加载AGEN和执行, SRQ , store data queue (SDQ) , LRQ , load miss queue (LMQ), 包括D-ERAT , ERAT miss queue, segment lookaside buffer (SLB)和TLB的地址转换单元, 包括组预测和数据目录(DDIR)的L1数据缓存和数据预取 prefetch request queue (PRQ) 引擎。下图展示了LSU的微架构: Pasted image 20230915154725.png

  • 存储加载执行 在ST和SMT2模式时,存储加载指令可以在LS0或LS1执行;在SMT4模式,线程T0和T1的指令在LS0流水线执行,线程T2和T3的指令在LS1流水线执行。存储指令发射两次,AGEN发射到LSU, 数据操作发射到FXU或VSU。LSU主要数据流包括32B的L2的重加载总线接口,到L2的16B的写数据接口,到VSU的16B加载数据接口,来自VSU的16B的写数据接口,来自FXU的8B写数据接口。POWER7 的L1数据缓存只有32 KB, 减少了数据缓存访问延迟。定点加载指令只有2个周期的加载使用延迟,在加载指令和依赖的定点指令之间只有一个流水线气泡;VSU加载指令有3个周期的加载使用延迟,在加载指令和依赖的VSU指令之间会产生两个流水线气泡。每个LSU流水线也可以执行定点加和逻辑指令,提高了指令发射的灵活性
  • 存储加载顺序 尽管指令乱序发射和执行,LSU必须保证存储加载指令遵守架构上的编程顺序。LSU主要依赖SRQ和LRQ来实现编程顺序。SRQ是一个32条目,基于真实地址RA的 content-addressable memory (CAM) 。每个线程有64虚拟条目,允许分发64个并发写;可以发射32个并发的写;SRQ由所有线程共享。SRQ条目在存储指令发射时分配,当数据写到L1数据缓存或发送到L2时释放。每个SRQ条目都有一个对应的16B的SDQ条目,存储指令每周期可以发送最多16B数据到L2。写数据可以转发给后面的读指令,即使读写指令都是投机执行。LRQ也是一个32条目,基于真实地址RA的 content-addressable memory (CAM) 。每个线程有64虚拟条目,允许分发64个并发写;可以发射32个并发的写;LRQ由所有线程共享。LRQ记录读操作,检查是否有同一个地址的年轻的读在更老的读或写之前执行的冒险。当检查到这样冒险发生时,LRQ会将年轻的读和后面同一个线程的指令从流水线刷掉,加载指令重新取指并执行
  • 地址转换 指令执行时,EA经过由两个64条目的DERAT缓存和一个64条目的IERAT组成第一级地址转换逻辑转换成46位的真实地址。如果ERAT未命中,由每个线程32条目的SLB和所有线程共享的512条目的TLB组成的第二级地址转换逻辑进行转换。有效地址EA首先使用线段表转换成68位虚拟地址,然后68位虚拟地址经过 page frame table 转换成46位真实地址。POWER7 支持256 MB和1 TB两种大小的段, 以及4 KB, 64 KB, 16 MB和16 GB四种页表大小。
    • D-ERAT是基于CAM的全相联的缓存,物理上分成两个,每个LSU流水线一个。在ST和SMT2模式, 两个D-ERAT保持同步;在SMT4模式,T0和1共享一和LS0关联的个64条目的D-ERAT,T2和T3共享一和LS1关联的个64条目的D-ERAT。每个D-ERAT条目支持 4-KB, 64-KB或16-MB页表, 16 GB保存为多个16-MB页表。D-ERAT采用LRU替换算法
    • SLB是每线程32条目,全相联的基于CAM的缓冲,每个SLB条目支持256 MB或1 TB段. POWER7支持 multiple pages per segment (MPSS) 扩展;MPSS使一个4KB基础页表的段可以同时有4-KB, 64-KB, 和16-MB页表;一个64KB基础页表的段可以同时有64-KB, 和16-MB页表。SLB由操作系统管理,当SLB缺失时发出数据或指令的段中断
    • TLB是512条目,4路组相联的缓冲,TLB由硬件管理并使用真LRU替换算法。TLB缺失时最多支持2个并发table-walk, TLB支持hit-under-miss功能,即在做table-walk时支持访问。POWER7处理器里, 每个TLB条目都有 logical partition (LPAR) identity 标签,TLB条目里的 LPAR identity 处理器里的 LPAR identity 匹配
  • L1数据缓存 POWER7里L1数据缓存时8路组相联32-KB,每个128B缓存行由4个32B组成。L2有一个专门的32B的重加载数据接口,每周期可以传输32B数据,缓存行可以以32B为单位进行命中。L1数据缓存有两个用于指令加载的读端口和一个用于存储指令或缓存行重加载的写端口。缓存行重加载的写有最高优先级,读的优先级最低。L1数据缓存物理上是4个,每个由16个bank组成,缓存的bank可以支持一个周期同时有一个写和两个读,除非是同一个bank。如果读发生和写发生bank冲突,加载指令被拒绝并重新发射。L1数据缓存是store-through,所有的写都发到L2,而不需要cast-out;写缺失时不会分配L1,而是发到L2;L1包含于L2。L1一个32B区支持字节写,最多16B。L1由有效地址EA索引,L1 D-cache目录使用LRU替换算法, 8路组相联,一共32 KB。 组预测用来减少L1数据缓存命中延迟,使用一个小目录来预测包含数据的组;组预测阵列时8路组相联,使用EA(52:56)索引,每个条目包含EA(33:51),每个线程有效位和奇偶位哈希得到的11位结果。当读缓存时,生成的EA(52:56)来索引组预测, 并且生成11位哈希值和8个组的内容比较,如果匹配并且对应线程有效位是置位,使用预测的信号访问L1数据缓存。否则,发生缓存缺失
  • 加载缺失处理 未命中L1的加载指令发出缓存行重加载请求,并释放发射队列条目,在LMQ中创建一个条目来记录缓存行的加载,同时支持将数据转发到目的寄存器。LMQ有8个条目,并使用真实地址,在所有线程间共享。LMQ支持读合并,最多两个加载指令可以关联到同一个条目,LMQ最多支持8个缓存缺失

9.1.4 POWER7 FXU

FXU有两个相同的FX0和FX1组成,下图展示了FX0的逻辑视图: Pasted image 20230915154552.png 每个FXU由一个多端口的GPR,一个执行加减,比较和陷阱的ALU,一个执行旋转,移位和选择的rotator,一个count (CNT) leading zeros单元,一个执行按位permute的bit-select unit (BSU),一个除法器,一个乘法器,和一个执行计数,奇偶,BCD指令的miscellaneous execution unit (MXU)组成。 大部分定点指令在一个周期执行完成,并且同一个流水线中的依赖的指令可以背靠背执行。FXU中GPR有112个,最多用于两个线程的架构寄存器和重命名寄存器;并有4个读端口,其中两个为定点单元提供操作数,另两个为相连的LSU的AGEN提供操作数;两个物理写端口每周期操作两次,实现逻辑上4个写端口,两个接收定点单元的结果,另两个接收相连的LSU的数据缓存的数据。在 ST和SMT2模式,两个GPR的内容保持一致,而SMT4则分别用于两对线程对。 FXU的比较单元是专门定制的,能够比ALU更快计算出比较指令里的条件码,因此,允许比较指令和分支指令背靠背执行。

9.1.4 VSU

POWER7 VSU实现了VSX架构,引入了64个架构寄存器。另外,VSU还合并了VMX,BFU和DFU。下图展示了VSU逻辑视图: Pasted image 20230918150731.png

9.2 POWER7 缓存层次

POWER7有一个共享的32-MB L3缓存,由8个处理器本地的4-MB L3组成。eDRAM只有SRAM1/5功耗, 而且只占1/3面积。下图展示了POWER7的缓存层次图: Pasted image 20230915155341.png POWER7 L2和L3缓存支持同样的13个缓存状态,和POWER6缓存状态移植。尽管没有增加新的缓存状态,增加了新的一致性操作。其中一个时缓存注入,I/O设备的direct memory access (DMA)写操作目的地可能是缓存,如果一个处理器核的L2或本地L3拥有缓存行 (M, ME, MU, T, TE, TN, 或TEN状态), 数据会被写到本地L3。另外部分受害缓存管理策略,用于L2和本地L3数据传输,可以减少功耗。下表总结了POWER7的缓存状态: Pasted image 20230915154407.png POWER5POWER6中的 barrier synchronization register (BSR) 功能在POWER7中被虚拟化了。每个系统里,多个MB的主存空间可以被分为BSR存储区间,BSR提供了并行任务之间低延迟的同步。对BSR区间的写会立即广播到所有的读对象,允许指定的主线程低延迟的编排工作线程,这个功能对HPC里并行计算很有用。

  • L2缓存 一个全相连16深度,每个32B的存储缓存用来接收处理器核发出的写,4个32B的条目组成128B可以一起分发到L2
  • L3缓存 每个4-MB L3由32个eDRAM组成,eDRAM比6T SRAM稍慢。L3区域控制器提供了一个处理器核和L2的分发端口,一个L3分发端口,两个侦听分发端口(分别对应奇偶缓存行)。L2未命中的访问会通过处理器核和L2的分发端口访问本地4-MB L3区域,如果命中则由8个read machine中一个管理。预取和一些L2写缺失也会通过处理器核和L2的分发端口访问L3,这些由24轻量级RC machine中一个处理。每个预取的数据由10个write machine处理,每个write machine有一个关联的cast-out machine来管理由于写而导致的cast-out。本地L3未命中的访问会被广播到一致性总线,并被内存,其他L2,其他L3和其他7个远端的4-MB L3侦听;在28M远端L3命中的请求通过侦听分发端口访问。

9.3 POWER7 SMP

POWER7采用了和POWER6同样的基于非阻塞广播的一致性协议,使用分布式管理relaxed-order-optimized multiscope。片上一致性互联通过芯片中间的奇偶仲裁逻辑来路由一致性请求的奇偶缓存行,每个周期可以授予一个even请求和一个odd请求。 一旦请求被授予,请求被广播到芯片左右两边的奇偶侦听总线。需要广播到其他芯片的请求被路由到芯片上下的多片SMP互联。从其他芯片来的请求被奇偶仲裁逻辑管理并广播到侦听总线。 下图展示了4个POWER7组成的Node: Pasted image 20230918164544.png 每个芯片有4个10B的Node内SMP互联接口,位于芯片顶端。

下图展示了由8个Node组成的SMP系统: Pasted image 20230725175956.png 每个芯片有2个10B的node外SMP互联接口,位于芯片底部。每个Node一共8个Node外互联,使用其中7个可以组成一个8Node的SMP系统。不同于POWER6,数据和一致性传输带宽可以动态分配。POWER6引入的投机本地范围一致性广播被广泛使用,例如,将256路SMP系统分成8个Node区域可以使每个32路区域独享SMP互联和侦听带宽。

9.4 POWER7 RAS

下图展示了POWER7的RAS特性: Pasted image 20230918170442.png 当错误被处理器核发现和上报之后, POWER7处理器核迅速阻止所有指令的完成,以及取指核分发。如果错误条件不足以产生checkstop, 处理器核发起恢复流程。回复流程刷掉流水线里所有的指令,并将处理器核恢复到错误发生之前的架构状态,将处理器核和系统隔离,进行自检,清除和测试SRAM,复位所有逻辑单元,读写GPR和VSR寄存器来使用ECC改正任何单比特错误。然后从恢复状态开始重新执行。

像GPR和VSR大的寄存器使用ECC保护,其他小的寄存器奇偶校验; 所有SRAM使用ECC并支持SECDEC;指令缓存使用奇偶校验。另外,POWER7处理器核对各种SPRs和核配置寄存器使用RAS硬化的锁存器。 L1数据缓存使用奇偶校验。当执行加载指令从L1数据缓存读数据并发现奇偶错误时会触发硬件恢复,加载指令会被刷掉,L1数据缓存内容无效,从出错的存储指令所在指令组重新开始执行。当L1数据缓存,目录或组预测阵列发生无法修正错误时,会使用组删除机制来阻止使用出错的组。

10. POWER 8

POWER8芯片有12个SMT8处理器核,每个处理器核可以分成4个区,每个分区支持2个硬件线程;处理器核每周期可以取8条指令,解码并分发8条指令,发射和执行10条指令,并完成 8条指令。POWER8还实现了硬件的TM (Transactional Memory)。每个POWER8处理器有2个DDR3/DDR4内存控制器,48条PCIE Gen3通道,512K的L2缓存,96M的L3缓存,以及内存缓冲芯片里的128M的L4。下图展示了POWER8处理器的全芯片规划图: Pasted image 20230718154255.png

10.1 POWER 8 Core

POWER8处理器核由6部分组成:instruction fetch unit (IFU), instruction sequencing unit (ISU), load-store unit (LSU), fixed-point unit (FXU), vector and scalar unit (VSU)decimal floating point unit (DFU)。取指单元IFU里有32 KB指令缓存,存储加载单元LSU里有64 KB数据缓存,共用512 KB的L2缓存。下图展示了POWER8处理器核的规划图: Pasted image 20230718155035.png POWER8处理器核有16个执行流水线:2个定点流水线,2个存储加载流水线,2个加载流水线,4个双精度浮点流水线(或8个单精度浮点流水线),2个可以执行VMX和VSX的对称的向量流水线,一个加密流水线,一个分支流水线,一个条件寄存器逻辑流水线和一个十进制浮点流水线。 2个存储加载流水线和2个加载流水线可以执行简单的定点指令;4个双精度浮点流水线可以执行双精度乘加运算,可以每周期处理8个双精度,16个单精度,另外还可以执行64位的SIMD指令。

10.1.1 POWER8 Core指令流和流水线

下图展示了POWER8处理器核的指令流视图: Pasted image 20230918172554.png 指令从内存系统经过解码,分发和发射队列,然后送到功能单元执行,除了分支和条件寄存器逻辑指令,大部分指令都被分发到 Unified Issue Queue (UniQueue) ,由对称两半UQ0和UQ1组成;GPR和VSR物理上也分为两部分,GPR0和GPR1,VSR0和VSR1;GPR0和VSR0用于UQ0,GPR1和VSR1用于UQ1。相应的定点,浮点,向量,存储加载流水线也分成两部分FX0, FP0, VSX0, VMX0, L0, LS0和FX1, FP1, VSX1, VMX1, L1, LS1,分别对应UQ0和UQ1。在单线程模式,GPR和VSR的两部分是一样的值,指令可以分发到UQ0或UQ1,根据指令类型每周期轮换分发的发射队列来保证负载平衡。在SMT(SMT2, SMT4, SMT8)模式,线程分成两个组,每个组对应一个发射队列和相应的执行流水线。偶数线程 (T0, T2, T4, T6)的定点,浮点,向量和加载存储指令只能使用UQ0,访问GPR0和VSR0,在FX0, LS0, L0, FP0, VSX0, 和VMX0流水线上执行;奇数线程(T1, T3, T5, T7)的定点,浮点,向量和加载存储指令只能使用UQ1, 访问GPR1和VSR1, 在FX1, LS1, L1, FP1, VSX1, 和VMX1流水线上执行。加密和十进制浮点指令也只能发射到线程对应的发射队列,但是在同一个流水线上执行。分支和条件寄存器逻辑指令有自己专门的发射队列,并由所有线程共享。 下图展示了POWER8处理器核的流水线: Pasted image 20230919095043.pngPOWER7最大的不同是是分发由两个流水线组成。

10.1.2 POWER8 IFU

为了支持SMT8和 LPARs (logical partitions) 需要修改IFU里的很多资源:

  • 首先,指令缓存对齐的提高导致了更高的取指数量
  • 第二,改善的分支预测提高了分支目标和方向的预测结果
  • 第三,指令分组的提高允许一个分发指令组包含更多的指令
  • 第四,提高了指令地址转换的命中率
  • 第五,实现了指令聚合来提高一些指令序列的性能
  • 最后,更好的流水线冒险避免机制减少了刷流水线次数

下图展示了POWER8的IFU的逻辑视图和流水线: Pasted image 20230918172656.png

IFU主要负责:

  • 取指和预译码 POWER8有8路组相联32 KB的L1指令缓存,使用16路bank避免读写冲突。一个256条目的 Instruction Effective Address Directory (IEAD) 来对组实现预测,指令缓存目录同时被访问以在下个周期确定组预测正确性。指令缓存能够在128B的缓存行内以16B为单位索引。一个64条目全相联的 __ Instruction Effective to Real Address translation Table (IERAT)__ 用来加速地址转换,IERAT 由全部线程共享, IERAT 支持 4 KB, 64 KB, 和16 MB的页表,其他页表可以使用多个相邻的小叶表实现。IFU从L2中取指并写入L1指令缓存,每次取指请求返回4个32B。这些请求要么是L1指令缓存缺失,要么是指令预取。对每一个L1指令缺失请求,预取引擎发出额外顺序缓存行请求。线程的取指请求都是独立的,处理器核最多发出8笔并发请求。 只有 ST,SMT2和SMT4 支持指令预取。ST模式时预取3个顺序缓存行,在SMT2和SMT4预取1个缓存行,SMT8不做预取以便节省带宽。预取不一定会被完成,取决于带宽情况。指令在写入L1指令缓存之前经过两个周期进行预译码并生成奇偶校验,预译码的位用来扫描发生的分支跳转,帮助分组和几个异常情况的处理。 分支指令扫描过程中会对分支指令进行修改以便生成目标地址,修改过的包含部分计算出的目标地址的分支指令,会被保存到L1数据缓存。来自L2的32B数据在3个周期之后写入到L1指令缓存,如果线程正在等待这些指令,它们同时也会被送到instruction buffers (IBUF)和分支扫描逻辑。Instruction Fetch Address Registers (IFARs) 记录每个线程的 program counter ,每周期 IFAR 选择一个线程的PC并作为取指地址送到指令缓存和分支预测逻辑。指令缓存每周期可以提供8条指令,并写入 IBUF , 随后被组装成分发组。线程优先级,缓存缺失,IBUF 满和线程资源平衡都会影响线程的调度
  • 分组 指令会被同时送到分支扫描逻辑和指令缓冲IBUF,IBUF有32条目,每个4条指令;在SMT8模式,每个线程有4条目,在SMT4模式,每个线程有8条目;SMT2和ST模式,每个线程有16个条目。指令被分成组,特殊的线程优先级逻辑每个周期选择一个线程进行分组,在ST模式下,从线程对应的IBUF里读取最多6个非分支指令和2个分支指令并组成一个组;在SMT模式下,来自不同线程的指令被分成两个组,每个组最多3个非分支指令和1个分支指令
  • 译码 分组之后,指令要么被解码,要么被送到微码硬件将复杂指令拆分成一系列内部简单操作
  • 指令聚合 POWER8处理器可以将两个相连的架构指令聚合成一个内部指令
  • 分支预测 POWER8 IFU支持对8条指令进行分支扫描,分支扫描占用3个流水周期。如果有无条件或预测跳转的分支,准备目标地址以便下一周期取指使用;当发生跳转的分支时,需要三个周期才能获取下一个取指地址,有两个周期对当前线程是空闲的;但是在SMT模式,这两个周期会分配给其他线程。条件分支的方向使用分支历史表(BHT)进行预测,包括16K条目的本地BHT(LBHT), 16K条目的全局BHT(GBHT)和16K条目的 global selection array (GSEL) 。每次预测8条指令,这8条都可以是分支指令。LBHT使用取指地址的14位索引,GBHT和GSEL使用取指地址和每个线程单独的21位 Global History Vector (GHV) 哈希之后的11比特索引。GSEL条目的值用来选择LBHT和GBHT的预测结果。所有BHT条目都是2比特, 高位决定预测的方向,低位提供hysteresis
  • 流水线冒险 POWER8 IFU实现了新的机制消除因为流水线冒险导致的性能下降。Store-Hit-Load (SHL)是年轻的读操作在老的写操作之前执行,是乱序执行里一种流水线冒险。当检测到存在这种冒险时,从从流水线刷掉加载指令和后面指令,并标记加载指令的地址;当标记的加载指令再次执行时,会对加载指令设置依赖,确保在存储指令之后执行

10.1.3 POWER8 ISU

下图展示了负责分发指令,重命名寄存器,发射指令,完成指令和处理异常的ISU的逻辑视图: Pasted image 20230918172731.png POWER8处理器核以组作为分发单位,在ST模式, 一个组最多8条指令,6条非分支指令和2条分支指令,并且第二个分支指令在指令组的最后,每周期分发一个组;在SMT模式,每周期分发两个组,每个组最多4条指令,最多3条非分支指令,1条分支指令。在指令分发之前,指令组里所有指令需要的各种重命名资源和队列都要可用,不然会被保持在分发阶段。

ISU使用一个 Global Completion Table (GCT) 来记录所有分发后的指令,按指令组记录,分发和完成都以指令组为单位。GCT有28条目,所有线程共享,一个条目记录一个指令组,在ST模式, 每个GCT是一个指令组,在SMT模式, 每个GCT条目是两个指令组;因此,GCT最多可以记录224条分发后的指令。GCT条目里的指令组里每个指令都有一个结束位,当指令成功执行之后,结束位会被标记。当一个指令组里所有指令都标记结束且指令组是线程里最老的指令组时,指令组就可以完成了;指令组完成时,指令组里所有指令的结果都在架构上可见,completion group tag (GTAG) 被广播到相关联资源以便被释放。

10.1.4 POWER8 LSU

POWER8LSU有两个对称的LS0和LS1流水线和两个对称的加载(L0和L1)流水线,下图展示了POWER8 LS0的流水线: Pasted image 20230918172837.png LS0和LS1流水线,每一个都能够一个周期执行存储加载指令;L0和L1流水线,每一个都能够一个周期执行加载指令。另外,这四个流水线都能在3个周期执行简单的定点指令。LSU组要功能单元有:存储加载AGEN和执行, SRQ , store data queue (SDQ) , LRQ , load miss queue (LMQ) , 包括 D-ERAT , ** ERAT Miss Queue(EMQ)** , segment lookaside buffer (SLB) 和TLB的地址转换单元, 包括组预测和数据目录(DDIR)的L1数据缓存和数据预取 prefetch request queue(PRQ) 引擎。

  • 存储加载执行 在ST模式时,存储加载指令可以在LS0或LS1执行存储指令,在LS0, LS1, L0 和L1中执行加载指令;在SMT2, SMT4, 和SMT8模式,一半线程的指令在LS0和L0执行, 另一半线程的指令在LS1和L1中执行。存储指令发射两次,AGEN发射到LS0或LS1, 数据操作发射到L0或L1。LSU主要数据流包括64B的L2的重加载总线接口,到L2的16B的写数据接口,到VSU的两个16B加载数据接口,来自VSU的两个16B的写数据接口,来自FXU的两个8B写数据接口。定点加载指令只有3个周期的加载使用延迟,在加载指令和依赖的定点指令之间有两个流水线气泡;VSU加载指令有5个周期的加载使用延迟,在加载指令和依赖的VSU指令之间会产生四个流水线气泡。每个LSU流水线也可以执行定点加和逻辑指令,提高了指令发射的灵活性
  • 存储加载顺序 尽管指令乱序发射和执行,LSU必须保证存储加载指令遵守架构上的编程顺序。LSU主要依赖SRQ和LRQ来实现编程顺序。SRQ是一个40条目,基于真实地址RA的CAM结构,每个线程有128虚拟条目,允许分发128个并发写;可以发射32个并发的写;SRQ由所有线程共享。SRQ条目在存储指令发射时分配,当数据写到L1数据缓存或发送到L2时释放。每个SRQ条目都有一个对应的16B的SDQ条目,存储指令每周期可以发送最多16B数据到L2。写数据可以转发给后面的读指令,即使读写指令都是投机执行。LRQ也是一个44条目,基于真实地址RA的CAM。每个线程有128虚拟条目,允许分发64个并发写;可以发射44个并发的写;LRQ由所有线程共享。LRQ记录读操作,检查是否有同一个地址的年轻的读在更老的读或写之前执行的冒险。当检查到这样冒险发生时,LRQ会将年轻的读和后面同一个线程的指令从流水线刷掉,加载指令重新取指并执行
  • 地址转换 指令执行时,EA经过由两个48条目DERAT缓存和一个64条目的IERAT组成第一级地址转换逻辑转换成50位的真实地址。如果ERAT未命中,由每个线程32条目的SLB和所有线程共享的512条目的TLB组成的第二级地址转换逻辑进行转换。有效地址EA首先使用线段表转换成78位虚拟地址,然后78位虚拟地址经过 page frame table 转换成50位真实地址。POWER8 支持256 MB和1 TB两种大小的段, 以及4 KB, 64 KB, 16 MB, 和16 GB四种页表大小
    • D-ERAT是基于CAM的全相联的缓存,物理上分成四个,每个LSU流水线一个。在ST模式, 四个D-ERAT保持同步;在SMT模式,一半线程使用LS0和L0关联的两个48条目的D-ERAT,另一半线程使用LS1和L1关联的两个48条目的D-ERAT。每个D-ERAT条目支持 4-KB, 64-KB, 或16-MB页表, 16 GB保存为多个16-MB页表。D-ERAT采用LRU替换算法。第二个DERAT是256条目全相联的CAM结构,由所有线程共享,当主DERAT未命中时查找第二个DERAT。
    • SLB是每线程32条目,全相联的基于CAM的缓冲,每个SLB条目支持256 MB或1 TB段. POWER8支持 multiple pages per segment (MPSS) 扩展;MPSS使一个4KB基础页表的段可以同时有4-KB, 64-KB, 和16-MB页表;一个64KB基础页表的段可以同时有64-KB, 和16-MB页表。SLB由操作系统管理,当SLB缺失时发出数据或指令的段中断
    • TLB是2048条目,4路组相联的缓冲,TLB由硬件管理并使用真LRU替换算法。TLB缺失时最多支持4个并发table-walk, TLB支持hit-under-miss功能,即在做table-walk时支持访问。POWER7处理器里, 每个TLB条目都有 logical partition (LPAR) identity 标签,TLB条目里的 LPAR identity 处理器里的 LPAR identity 匹配

10.1.5 POWER8 FXU

FXU有两个相同的FX0和FX1组成,下图展示了FX0的逻辑视图: Pasted image 20230918172918.png 每个FXU由一个多端口的GPR,一个执行加减,比较和陷阱的ALU,一个执行旋转,移位和选择的ROT,一个count (CNT) leading zeros单元,一个执行按位permute的bit-select unit (BSU),一个除法器,一个乘法器,和一个执行计数,奇偶,BCD指令的miscellaneous execution unit (MXU)组成。 FXU中GPR有124个,最多用于四个线程的架构寄存器和重命名寄存器;其余架构寄存器保存在SAR中。GPR有8个读端口,其中两个为定点单元提供操作数,两个为相连的LSU的AGEN提供操作数,两个为相连的LU的AGEN提供操作数,两个为SAR提供数据;6个写口,两个接收定点单元的结果,两个接收相连的LSU的数据缓存的数据,两个接收相连的LU的数据缓存的数据。 POWER8处理器核实现了VSU到FXU的总线,减少了VSR 到 GPR传输的延迟。 在 ST模式,两个GPR的内容保持一致,在SMT2, SMT4, 或SMT8 模式,分别用于不同线程。POWER8 FXU通过增加一倍的寄存器空间保存架构寄存器值来支持 Transactional Memory (TM) ,增加寄存器是SAR。

10.1.6 POWER8 VSU

下图展示了POWER8的VSU: Pasted image 20230918172953.png POWER8 VSU支持所有标量和向量指令的双发射,VMX/VSX Permute (PM)流水线延迟改进到2个周期, 存储带宽增加到每周期16-byte向量,来匹配每周期32-byte的加载带宽, 使用2个周期的Simple Unit (XS)流水线执行浮点比较指令。

10.2 POWER 8 片上缓存

POWER8片上缓存包括:

  • 32K, 8路组相联的L1指令缓存
  • 64K, 8路组相联的L1数据缓存,每周期支持4个16B的读或1个16B的写
  • 512K,8路组相联的L2缓存,每周期支持64B的读和16B的写
  • 96M,8路组相联的L3缓存,每周期32B的读和32B的写 下图展示了POWER8的片上缓存层次: Pasted image 20230718155501.png

10.3 POWER8 内存系统

POWER8有两个内存控制器,每个支持4个通道,每个接口支持9.6 Gb/s,一共可以达到230 GB/s带宽,每个处理器系统一共支持1TB的内存。下图展示了内存结构: Pasted image 20230718160154.png 下图展示了定制的DIMM上的memory buffer芯片: p8_mem.png memory buffer芯片额外提供了128M的L4缓存,同一个缓存的部分写操作可以在L4上合并。

10.4 POWER8 CAPI

Coherent Accelerator Interface Architecture (CAIA) 定义了加速设备和POWER8连接的一致性加速接口,Coherence Attach Processor Interface(CAPI) 使用PCIe Gen3连接设备,并和处理器共享缓存一致性的内存以及虚拟地址转换,加速器上的程序可以直接使用有效地址指针,CAPI使加速器在系统上是一个处理器,而不仅仅是一个IO设备。 使用CAPI的好处包括从处理器直接使用共享内存,核处理器缓存直接传输数据,简化编程模型。

11. POWER 9

POWER9芯片有24个SMT4处理器核或12个SMT8处理器核,每对SMT4处理器核或者一个SMT8处理器核,包含512kB L2缓存和10MB L3缓存。

  • SMT8 是为PowerVM优化
  • SMT4 适用于Linux Pasted image 20230907145848.png

11.1 POWER9 Core Execution Slice微架构

一个Slice是一个集成 Vector and Scalar Unit(VSU)Load/Store Unit(LSU)的64位计算模块,VSU混合了整型和浮点的标量和向量操作。IBM宣称提高了资源利用率同时提供了不同slice间高效数据交换。两个slices组成一个Super-Slice,每个super-slice是一个128位的POWER9物理设计模块。两个super-slices,一个Instruction Fetch Unit(IFU) 和一个Instruction Sequencing Unit(ISU)组成一个POWER9 SMT4核,SMT8等效于两个SMT4。下图展示了相应的关系: Pasted image 20230907160728.png

11.2 POWER9 Core流水线

POWER9减少了5个从取指到计算的周期,对于浮点指令额外减少了3个从映射到退休的周期;增强了指令融合,减少了需要拆分成uOP的指令数, 移除了分发时的指令分组。下图展示了POWER8POWER9的流水线对比图: Pasted image 20230907162021.png 下图展示了POWER9 SMT4的流水线: Pasted image 20230907180319.png

11.3 POWER9 – Core Compute

POWER9 处理器核IFU有8路组相联32K指令缓存;每周期可以取8条指令,译码6条指令;每个VSU有4个64位标量或2个128向量位执行单元,有4个存储加载单元;每个VSU可以执行4个64位算术运算,2个128位Permute,和加解密运算;LSU有8路组相联32K数据缓存,支持4个并发64位读写。下图展示了SMT4的指令流: Pasted image 20230907161654.png 下图展示了POWER9 SMT4核的微架构: Pasted image 20230907180048.png

11.4 POWER9 片上加速器和加速器接口

POWERAccelPOWER提供的所有片上接口和加速协议的集合。POWER9提供两套加速接口:

  • 48条PCIe Gen4,双向192 GB/s带宽
  • 96条25G接口,双向600GB/s带宽

在这两个物理接口之上,主要有4套协议:

  • CAPI 2.0 POWER9基于PCIe引入的CAPI 2.0,是POWER8上的CAPI的带宽的4倍
  • OpenCAPI 4.0 基于POWER9的25G接口(300 GiB/s),应用于CPU和加速器连接
  • NVLink 2.0 GPU和CPU高带宽互联
  • OMI 串行高带宽内存接口
  • 片上加速
    • 1个GZip
    • 2个842 Compression
    • 2个AES/SHA

下图展示了上述的接口和应用: Pasted image 20230907163735.png

11.5 POWER9变种

POWER9根据内存接口和扩展性分为3个变种,如下图所示: Pasted image 20230907165748.png

  • POWER9 Scale out 使用直连内存并支持2路SMP
  • POWER9 Scale up 使用DMI Buffered Memory并支持16路SMP
  • POWER9 Advanced IO使用OMI buffered memory并支持16路SMP

11.6 POWER9 SMP

  • 16Gbps X-Bus 用于Drawer内全连接互联,一个drawer由4个POWER9组成
  • 25Gbps O-Bus 用于Drawer与Drawer之间互联

下图展示了基于POWER9的Power E980系统逻辑架构示意图: Pasted image 20230907174711.png

下图分别展示了由2-, 3-, 和4-drawer组成的SMP系统的示意图: Pasted image 20230907175136.png Pasted image 20230907175155.png

12. POWER 10

POWER10最多有15个SMT8的处理器核,每个核有2 MB L2缓存和本地8 MB L3缓存,一共120M的 non-uniform cache access (NUCA) L3缓存。POWER10在制造时候确定支持SMT8或SMT4;SMT8处理器核是为PowerVM固件和hypervisor设计,支持每线程一个分区或一个核一个分区;SMT4处理器核只支持每线程一个分区。下图展示了POWER10的全芯片规划图: Pasted image 20230906201517.png

12.1 Power10 SMT4处理器核微架构

下图展示了POWER10的微架构以及相对POWER9的对比: Pasted image 20230908111004.png

  • 每周期来自L2 cache的64B,先预译码并以每周期32B保存在6路组相联的48KB的L1指令缓存中。每周期,从L1中取8条指令,然后扫描分支指令,通过分支预测器来预测分支方向和目标地址。
    • 当L1取指未命中时,请求发送到L2,基于一个预取预测器,缓存缺失通常最多会导致7个缓存行的预取
    • 当可用时,指令会被旁路到译码流水线,当译码停滞或切换线程时,指令被缓存在128条目的指令缓冲中。
  • 每周期译码8条指令,8B的前缀指令暂用8条指令中的2条;少量指令被分解成2,3或4个内部操作,少数指令会使用微码引擎经过多个周期展开成内部操作。预译码标记的需要融合的指令在译码阶段处理。
  • 每周期可以执行8条指令,分发阶段为指令指定执行资源,NOP 在分发阶段直接结束而不需用经过计算流水线,当下列资源不足时,会导致分发停止:
    • 发射队列条目和slice分配
    • 寄存器重命名和依赖顺序
    • 存储加载队列虚拟条目
  • 分发指令使用 Instruction Completion Table (ICT) 来记录和跟踪,直到指令结束执行;每个SMT4 拥有 512条目的 ICT ;2个条目称为一个指令对,每周期可以完成64条指令。

12.1.1 发射队列

每个slice有20条目的发射队列,每个SMT4处理器核有4个发射队列,一共支持80个依赖指令。 每个发射队列有一个本地计算slice和结对组成的super-slice的第二个发射队列,super-slice包含一套额外的计算流水线和一个读端口和写端口。每周期,每个slice的发射队列能发射3条指令:

  • 一个计算指令
  • 一个加载指令
  • 一个存储或分支或简单指令

每个super-slice选择一个加载和存储/分支/简单指令执行,下图展示了一个SMT4的发射队列组成示意图: Pasted image 20230908113518.png

12.1.2 POWER10处理器核流水线

下图展示了POWER10处理器核流水线,包括IFU流水线,LSU流水线和VSU流水线: Pasted image 20230908111733.png

  • 分支流水线 分支指令和存储地址计算以及简单加指令公用发射端口;每个SMT4每周期能处理一个分支指令,即使 CR 寄存器还未确定,只要分支目标地址寄存器 LNK , CNT , 或 TAR 准备好之后分支指令就会发射;这些部分执行的分支指令会在 branch condition queues (BCQ) 里等待 CR 结果,这样可以使依赖目标寄存器的分支解决目标寄存器依赖。目标寄存器(LNK, CNT, TAR)和GPRs之间通过共享物理寄存器来减少 move_tomove_from 指令的延迟;目标地址产生指令和分支指令之间的依赖通过数据转发来减少延迟。
  • 简单流水线 类似用来操作地址的立即数加指令,既可以在ALU流水线支持,也可以在存储/分支/简单流水线支持。这些指令可以使用每个SMT4里两个简单端口中任意一个,两个周期延迟计算结果;立即数加指令使用动态策略来发射到简单流水线或是ALU流水线。
  • 存储加载流水线 当存储加载指令的操作数依赖性满足并且对应加载或存储队列条目分配之后,存储加载指令发射,并且相应发射队列条目被释放。存储指令首先发射来生成地址,随后发射来存储数据;存储加载流水线冒险在本地的存储加载流水线及队列中处理。类似读写缓存bank冲突的读冒险可以使用一个周期流水线延迟解决,其他需要刷流水线的冒险使用存储和加载队列解决。

12.1.3 POWER10处理器核指令流

下图展示了POWER10的简化的指令流图: Pasted image 20230908111421.png POWER10实现了一个激进投机的顺序流水前端,每周期取指,译码和分发8条指令。

12.2 Thread核LPAR管理

对于SMT8的处理器核,一个SMT4的处理器核负责偶数逻辑线程(0, 2, 4, 6), 另一个SMT4的处理器核负责奇数逻辑线程(1, 3, 5, 7)。一个SMT4处理器核支持ST, SMT2核SMT4模式,当在SMT4和SMT2之前切换时,硬件会重新平衡线程资源;线程通过中断激活,使用 stop 指令休眠。下图展示了一个SMT8处理器核的资源划分和组成情况: Pasted image 20230908140921.png 处理器的资源基于SMT的模式会动态分配,资源的共享以线程对为单位,一般如下:

  • 在动态线程优先级的基础上,在所有激活的线程之间切换取指
  • 在SMT4模式,译码和分发逻辑通过分割,可以支持每个线程对每周期4条指令,除了微码引擎,每个4指令的流水都是互相独立的
  • 在SMT4模式,发射队列,执行单元,存储加载执行单元都是以指令对为单位切分,每个指令对使用一个super-slice
  • load miss queue(LMQ) 和L1缓存所有SMT4线程共享
  • 对于硬件检测到的预取,预取队列是共享的;对于软件发起的预取,预取队列根据线程数静态分配

12.3 L2 Cache

一个SMT4处理器核有8路组相联,1M的L2缓存,缓存行是128B;对于L1指令缓存和L1数据缓存都是inclusive,缓存分为4个bank,不同bank的读写可同时进行;并使用一个8路组相联,4个bank多端口的缓存目录,每个bank有一个处理器核读端口,两个侦听读端口,一个写端口;处理器读端口和侦听端口工作在1/2处理器频率,写操作被安排在第二个周期,因此不会和读操作冲突。L2缓存是全局一致性的点,每个处理器线程有一个保留站;当L2缓存出现错误时,目录支持行删除功能。

12.4 L3 Cache

一个SMT4处理器核有16路组相联,4M的私有L3缓存,缓存行128B,使用4个bank,支持并行读写,到L2有64B的读端口,和来自L2的64B的写端口;目录也是16路组相联每两个周期支持不同bank的4个读或2个写;LRU算法使用4个比特来记录使用率和数据类型。L3缓存有4个分发流水线可以处理来自总线的侦听请求,侦察分发流水通过L3目录决定如何处理请求。如果请求需要发送数据或侦听推送或无效相关的缓存行,相应的请求被发送到16个侦听状态机处理;如果请求是 lateral cast-out (LCO) 或接受的缓存注入,请求被发送到侦擦号状态及和写注入状态机。

12.5 SMP互联

发送命令的芯片负责发送反射的命令和结合的响应到SMP系统所有其他芯片,其他芯片返回合并的部分响应到发送命令的芯片。数据在点到点之间移动,对于读,包含数据的芯片直接将数据发送给请求芯片;对于写,包含数据的芯片直接将数据发送到lowest-point of coherency (LPC),路由标签里包含芯片的标识。命令请求使用标签并且使用侦听协议广播,多个广播范围用于减少总线的利用率,SMP互联使用缓存状态确定缓存行最后的位置,是否需要更大范围的广播。

1-Hop的广播范围定义如下图所示: Pasted image 20230909193458.png 2-Hop的广播范围定义如下图所示: Pasted image 20230909193512.png POWER10真实地址定义如下所示: Pasted image 20230909193549.png

12.5.1 Power10 SMP互联拓扑

POWER10片外SMP互联是高度可扩展,多层,全连接拓扑,片外接口使用18位32Gbps的高速差分接口,可以配置成1-hop或2-hop

  • 1-Hop SMP拓扑 在1-Hop配置下,POWER10能够和最多8个处理器芯片全连接组成8路SMP系统,每个芯片最多使用7个A-link互联。1-Hop SMP系统拓扑如下图所示: Pasted image 20230909093241.png
  • 2-Hop SMP拓扑 在2-hop配置下,POWER10能够和其他3个芯片全连接组成一个4芯片的组,组内使用 X-links ,组内每个POWER10芯片和其他组的芯片连接;组内每个芯片提供3个 A-links 和其他组连接,一共可以互联4个组。2-Hop SMP系统拓扑如下图所示: Pasted image 20230909093315.png

12.6 NCU

POWER10Non-Cacheable Unit (NCU)负责处理非缓存的读写操作,字和双字的原子读写指令( lwat , ldat , stwat , stdat ),, tlbiesync and ptesync 指令,每一个SMT4有一个NCU单元。 下图展示了NCU的逻辑框图: Pasted image 20230909194305.png POWER10NCU有一个专用的cache-inhibited load station (LDS),每个线程一个,处理非缓存的读写操作,字和双字的原子读写指令( lwat , ldat )。非缓存的读,无论是否是guarded, 和原子读即不会合并也不会乱序;对于非缓存的写,字和双字的原子读写指令( stwat , stdat ),由一个16条目的store gather station组成的store queue (STQ)处理,4个线程共享,一对64B的station可以合并成128B。

POWER10NCU有8个address machines (SAM)可以支持8个非缓存写或stwat , stdatNCU还有8个snoop queues (TLBS)来处理侦察到的 TLBIE 和4个 snoop queues (SLBS)处理SLBIE并转发到处理器核。

12.7 内存控制器

POWER10内存控制器提供了片上SMP互联和OpenCAPI memory interface (OMI)接口之间控制逻辑,OMI接口可以连接外部符合OpenCAPI 3.1(Memory Interface Class only)的memory buffer芯片,memory buffer芯片直接连接业界标准的DIMM。每个内存通道支持2个OMI连接,物理上,内存控制器组织成4个extended memory OMI (EMO)实例,每个EMO有两条通道。内存控制器可以处理来自处理器,缓存和IO的128B的读请求和64B写请求,1 - 128B部分写和内存原子操作(AMOs)。内存控制也处理地址保护,充当lowest-point of coherency (LPC)

8个内存控制器可以配置成1个或多个地址交织的组,每个组内部,地址空间被分成不同部分,每个连续的部分可以round-robin方式由不同内存控制器处理。POWER10最大可用地址空间是128 TB。在一个内存控制器通道里,两个OMI子通道总是以128B进行交织。下图展示了POWER10的内存系统示意图: Pasted image 20230909195300.png 为了提高大型系统的RAS,内存控制器支持:

  • Selective Memory Mirroring 在这个配置下,内存子通道分成镜像对,不同镜像对和非镜像的 BAR 寄存器允许访问镜像或非镜像区域
  • Whole Memory Encryption 内存控制器支持对所有的访存传输做Advanced Encryption Standard (AES)加解密。加密通过固件可访问配置寄存器使能,对OMI配置空间和MMIO空间不会加密。

12.8 片上加速器

Nest Accelerator unit (NX) 由加解密和压缩解压缩引擎组成,下图展示了NX的基本结构框图: Pasted image 20230911083955.png 为了支持用户态使用有效地址对加速器调用,访问存储空间以及中断通知任务完成,NX包括下列逻辑:

  • SMP interconnect unit (SIU) 和SMP互联以及DMA控制器的接口,每个16B的数据位宽;使用支持多个并行读写的SMP interconnect common queue (SICQ)最大化带宽; User-mode access control (UMAC) 协处理器调用模块,当Virtual Accelerator Switchboard (VAS)接收到 copy/paste 指令发出的coprocessor request block (CRB) 后,UMAC侦听VAS获取可用的CRB。每个协处理器分别支持一个高优先级和一个低优先级队列;SIU负责从队列获取CRB并分发到DMA控制器;Effective-to-real address translation (ERAT) 表可以保存最近32个地址转换。
  • DMA控制器 解码CRB并代表协处理器搬运数据

下图展示了通过VAS来调用NX的流程图: Pasted image 20230911090237.png

  1. 当操作系统建立发送窗口之后,用户进程就可以使用NX了。首先,创建一个coprocessor request block (CRB)CRB的格式由NX的规范定义。然后CRB通过 copy/paste 指令发送到VAScopy 指令将CRB写到copy buffer,用户进程随后使用paste 指令将128B的CRB写到VAS。到真实地址的写传输作为remote memory access write (RMA_write)发送到SMP互联,真实地址里包含了发送窗口标识。128B的 RMA_writeCRB写到VAS的64个数据缓冲中的一个。VAS可以维护128个单独的窗口上下文,当侦听到 RMA_write 时,VAS使用发送窗口标识来查找 Send Window Table Entry , 如果不在VAS的窗口缓存中,则从内存读取
  2. VAS从发送窗口上下文中读取Receive Window Identifier,然后判断发送窗口对应的接收窗口。每个NX coprocessor type (CT)有一个单独的接收窗口,对应每个加速器的FIFO;如果接收窗口没有被缓存,则会从内存中读取
  3. 使用接收窗口上下文中FIFO地址,VASRMA_write 负载即CRB写入到NX的FIFO,VAS将发送和接收窗口标识附加到CRB里。NX在处理CRB时可以使用这些信息,CRB里的发送窗口标识可以被NX用来读取发送窗口和获取CRB里的地址的转换信息;接收FIFO是一个循环队列,当到达FIFO队尾时,VAS回到FIFO队头继续写下一个条目
  4. CRB写到FIFO之后,VAS会发送一个 ASB_notify 命令到SMP互联;ASB_notify 命令包含logical partition identifier (LPID), process identifier (PID), 和thread identifier (TID)
  5. 每个NX FIFO有一个特别的LPID:PID:TID,当NX侦听到 ASB_notify 并且匹配到自己的LPID:PID:TID时,会递增相关联的FIFO的计数器,指示有新的工作
  6. 当NX CT队列为空但是计数器不为0时,NX从接收FIFO读取下一个CRB;一旦从FIFO里获取到CRB,NX通过对VAS的MMIO的写来返回信用。通过管理信用,VAS保证不会发生接收FIFO溢出。hypervisor基于FIFO的大小来初始化接收窗口的信用,当VAS将CRB写到FIFO时将信用计数器减一,当NX通过MMIO写返回信用时加一。NX使用CRB里附加的发送窗口标识来读取发送窗口上下文并减小内部计数器
  7. NX将任务分发到关联的CT,CT可能有多个加速引擎并执行CRB
  8. 任务完成之后,NX通过MMIO的写返回一个发送窗口信用给VAS;当hypervisor创建发送窗口时,会分配很多发送信用,这样hypervisor可以对多个用户共享同样加速器资源做调度,实现QoS,防止进程使用允许之外的资源。当VAS收到 RMA_write 写命令时,VAS减少关联的发送窗口的发送信用
  9. NX写 __ coprocessor status block (CSB)__ 并且可选的发送一个中断,通知用户任务已经完成;同时更新发送窗口里的 __ accelerator processed byte count (XPBC)__ 来指示处理的字节数。

12.9 Nest MMU

Pasted image 20230911094531.png

12.10 中断控制器

POWER10 中断控制器INT由三部分组成:

  • 虚拟化控制器(P3VC)
  • 表现层控制器(P3PC)
  • 总线接口公共队列(P3CQ)

这些逻辑接收中断并将中断发送到对应的处理器线程,各逻辑之间使用POWER10的总线互联,下图展示了中断控制器的逻辑框图及中断之间交互: Pasted image 20230911102017.png

  • P3VC通过POWER10的总线互联(比如cache-inhibited的写 ci_wr )接收来自 interrupt source controllers (P3SCs) 的消息,使用主存里和每个触发源关联的 event assignment entry (EAE) 里的信息进行处理,包括更新事件队列条目,转发消息到P3PCP3PC然后将异常发送到一个处理器的线程。如果由于分配的处理器状态变化导致当前没有处理器处理中断,P3VC会重新分配中断消息。
  • P3PC通过一个到处理器核的异常总线来提醒处理器线程,每个线程有三个信号,一个产生hypervisor中断,一个产生操作系统中断,最后一个产生基于事件的分支。P3PC里和三个信号相关联的逻辑是优先级和异常队列,用来防止低优先级事件抢占高优先级事件并且记录每个处理器线程处理的中断数量以便平衡负载;另外还有一个或多个保存在类似CAM的logical server numbers,称为 thread interrupt management area (TIMA) ,这些logical server numbers用来识别物理线程上的软件实体。 当P3VC发送总线消息时,会查找这些 thread interrupt management area (TIMA) 来识别候选处理器线程。
  • P3CQ充当中断逻辑和系统之间的接口,主要负责中断控制器的消息接收和发送的顺序,比较中断控制器是否是命令的目的地,以及通过总线查询找到当前触发的中断的正确的P3PC

参考文献

  1. Power ISA (Version 3.1B), 2021.
  2. R. R. Oehler and R. D. Groves, “IBM RISC System/6000 processor architecture,” in IBM Journal of Research and Development, vol. 34, no. 1, pp. 23-36, Jan. 1990, doi: 10.1147/rd.341.0023.
  3. S. W. White and S. Dhawan. 1994. POWER2: next generation of the RISC System/6000 family. IBM J. Res. Dev. 38, 5 (Sept. 1994), 493–502. https://doi.org/10.1147/rd.385.0493
  4. F. P. O’Connell and S. W. White, “POWER3: The next generation of PowerPC processors,” in IBM Journal of Research and Development, vol. 44, no. 6, pp. 873-884, Nov. 2000, doi: 10.1147/rd.446.0873.
  5. pSeries 690 Service Guide, n.d.
  6. Andersson, S., Bell, R., Hague, J., Holthoff, H., Mayes, P., Nakano, J., Shieh, D., Tuccillo, J., n.d. RS/6000 Scientific and Technical Computing: POWER3 Introduction and Tuning Guide.
  7. J. M. Tendler, J. S. Dodson, J. S. Fields, H. Le and B. Sinharoy, “POWER4 system microarchitecture,” in IBM Journal of Research and Development, vol. 46, no. 1, pp. 5-25, Jan. 2002, doi: 10.1147/rd.461.0005.
  8. Bossen, D.C., Kitamorn, A., Reick, K.F., Floyd, M.S., 2002. Fault-tolerant design of the IBM pSeries 690 system using POWER4 processor technology. IBM J. Res. & Dev. 46, 77–86. https://doi.org/10.1147/rd.461.0077
  9. B. Sinharoy, R. N. Kalla, J. M. Tendler, R. J. Eickemeyer and J. B. Joyner, “POWER5 system microarchitecture,” in IBM Journal of Research and Development, vol. 49, no. 4.5, pp. 505-521, July 2005, doi: 10.1147/rd.494.0505.
  10. Kalla, R., 2003. IBM’s POWER5 Microprocessor Design and Methodology.
  11. Kalla, R., Sinharoy, B., Tendler, J.M., 2004. IBM power5 chip: a dual-core multithreaded processor. IEEE Micro 24, 40–47. https://doi.org/10.1109/MM.2004.1289290
  12. Clabes, J., Friedrich, J., Sweet, M., DiLullo, J., Chu, S., Plass, D., Dawson, J., Muench, P., Powell, L., Floyd, M., Sinharoy, B., Lee, M., Goulet, M., Wagoner, J., Schwartz, N., Runyon, S., Gorman, G., n.d. Design and Implementation of the POWER5 TM Microprocessor.
  13. Jiménez, V., Cazorla, F.J., Gioiosa, R., Valero, M., Boneti, C., Kursun, E., Cher, C.-Y., Isci, C., Buyuktosunoglu, A., Bose, P., 2010. Power and thermal characterization of POWER6 system, in: Proceedings of the 19th International Conference on Parallel Architectures and Compilation Techniques. Presented at the PACT ’10: International Conference on Parallel Architectures and Compilation Techniques, ACM, Vienna Austria, pp. 7–18. https://doi.org/10.1145/1854273.1854281
  14. H. Q. Le et al., “IBM POWER6 microarchitecture,” in IBM Journal of Research and Development, vol. 51, no. 6, pp. 639-662, Nov. 2007, doi: 10.1147/rd.516.0639.
  15. IBM Power 570 and IBM Power 595 (POWER6) System Builder, n.d.
  16. Kalla, R., Sinharoy, B., Starke, W.J., Floyd, M., 2010. Power7: IBM’s Next-Generation Server Processor. IEEE Micro 30, 7–15. https://doi.org/10.1109/MM.2010.38
  17. B. Sinharoy et al., “IBM POWER7 multicore server processor,” in IBM Journal of Research and Development, vol. 55, no. 3, pp. 1:1-1:29, May-June 2011, doi: 10.1147/JRD.2011.2127330.
  18. POWER7 and POWER7+ Optimization and Tuning Guide, n.d.
  19. B. Sinharoy et al., “IBM POWER8 processor core microarchitecture,” in IBM Journal of Research and Development, vol. 59, no. 1, pp. 2:1-2:21, Jan.-Feb. 2015, doi: 10.1147/JRD.2014.2376112.
  20. Caldeira, A., Kahle, M.-E., Saverimuthu, G., Vearner, K.C., n.d. IBM Power Systems S812LC Technical Overview and Introduction.
  21. IBM Power System E980: Technical Overview and Introduction, n.d.
  22. IBM Power System S822: Technical Overview and Introduction, n.d.
  23. S. K. Sadasivam, B. W. Thompto, R. Kalla and W. J. Starke, “IBM Power9 Processor Architecture,” in IEEE Micro, vol. 37, no. 2, pp. 40-51, Mar.-Apr. 2017, doi: 10.1109/MM.2017.40.
  24. POWER9 Processor User’s Manual, 2019.
  25. W. J. Starke, B. W. Thompto, J. A. Stuecheli and J. E. Moreira, “IBM’s POWER10 Processor,” in IEEE Micro, vol. 41, no. 2, pp. 7-14, March-April 2021, doi: 10.1109/MM.2021.3058632.
  26. Power10 Processor Chip User’s Manual, 2021.
  27. IBM Power E1050: Technical Overview and Introduction, n.d.
  28. IBM Power S1014, S1022s, S1022, and S1024 Technical Overview and Introduction, n.d.
  29. W. Starke and B. Thompto, “IBM’s POWER10 Processor,” 2020 IEEE Hot Chips 32 Symposium (HCS), Palo Alto, CA, USA, 2020, pp. 1-43, doi: 10.1109/HCS49909.2020.9220618.
]]>
Hotchips 35 http://zhifeiding.github.io/programming/chips/2023/08/31/hc35/ 2023-08-31T00:00:00+00:00 http://zhifeiding.github.io/programming/chips/2023/08/31/hc35 今年hotchips 35上包含了AI, CORE, 以及optical switch内容, 比较有意思的有

  • intel的66线程的risc-v core, 结合了gpgpu的多线程和risc-v的模块化,和我的一些想法不谋而合
  • google和intel的optical switch, 这个很大可能会成为未来scale out首选
  • samsung和hynix的PIM/PNM看起来很美好, 但是看起来在商业上是无解的, 不可能计算和存储的利润都被垄断
  • AI未来发展应该的专有的更专有, 通用的更通用, 不会存在即通用又专有的空间。
  • AI不能没有大模型, 就像鱼不能没有水。人人都是大模型专家
  • ARM的CSS直接把做ARM server的门槛降到零了, 就差直接喊快来买, 不会我帮你。卷的飞起。 阿里得要版权才行, 不然亏死
  • intel的chiplet看起来比AMD的分配更好, 计算能力增加了, 对应的memory带宽也需要对应提升, 不可能出现复用。至于PCIE和Slow IO倒是可以复用
  • RISC-V的发展迅猛, SiFive的IP看起来就是按照ARM来的
  • scale, 还是scale, 不管是scale up还是scale out

Moffett Antoum AI Inference Accelerator

这家公司中文名叫墨芯, 就是去年闹得沸沸扬扬的拳打脚踢NVIDIA的那家, 主打稀疏计算。 正常开场, 一般先讲一下AI发展路径,然后转到大模型的需求。大家套路都一样。 Pasted image 20230830210446.png 大家都知道的, 大模型相比以前视觉类任务, 参数量更大 Pasted image 20230830210635.png 不论如何,反正我家产品都是很适合的 哈哈哈 Pasted image 20230830210700.png 主打的是稀疏计算 Pasted image 20230830210815.png Pasted image 20230830210842.png 开发环境看起来比较完备, 可以用simulator来评估 Pasted image 20230830210912.png SoC架构,1个scalar processor, 一个vector processor, 8个sparse processor。计算能力主要在稀疏上 Pasted image 20230830210936.png SPU具体特性 Pasted image 20230830211203.png SPU数据流, 从ddr到global buffer, 再到weight/activation buffer, 然后送到PE里计算 Pasted image 20230830211231.png vector processor很宽, 512bit, 支持int8和fp16 Pasted image 20230830211313.png 还有一个计算转置,池化的special function, 这个标配 Pasted image 20230830211333.png 4个core之间可以通信 Pasted image 20230830211354.png 大模型里的稀疏性, 所以很适合 Pasted image 20230830211412.png 70W TDP@800MHz. 非稀疏的算力的确很一般 Pasted image 20230830211431.png 还是主打推理, 不同规格的产品 Pasted image 20230830211521.png 完整工具链, 没这个都不好意思说了 Pasted image 20230830211557.png Pasted image 20230830211618.png Pasted image 20230830211641.png 当然, 多卡扩展也是必须要支持的 Pasted image 20230830211658.png 8x Moffett S30 上的性能 Pasted image 20230830211754.png Pasted image 20230830211831.png

Lightelligence Hummingbird Low-Latency Optical Connection Engine

喜闻乐见的环节,AI要的太多太多 Pasted image 20230830212110.png 公司介绍 Pasted image 20230830212147.png 性能提升两个方面, 架构创新和摩尔 Pasted image 20230830212216.png Pasted image 20230830212300.png 电信号传播的缺点,先抑后扬, 大家都这样 Pasted image 20230830212322.png 主题来了,用光网络来做片间互联 Pasted image 20230830212357.png 光网络优势,解放之前的拓扑的限制。优势在我 Pasted image 20230830212423.png Pasted image 20230830212439.png FPGA和激光组成的测试板. 可以做all-to-all broadcast. Pasted image 20230830212506.png 光和电结合的方法 Pasted image 20230830212536.png 测试电路的架构 Pasted image 20230830212654.png 感觉偏题了, 计算core的微架构, 我不关心这个啊 Pasted image 20230830212713.png 一些设计指标, 系统结构和性能数据 Pasted image 20230830212735.png Pasted image 20230830212753.png Pasted image 20230830212810.png 未来使用场景一些展望, 或者野望 Pasted image 20230830212835.png Pasted image 20230830212855.png

SiFive P870 RISC-V Processor

SiFive还是主导了RISC-V发展 Pasted image 20230830172004.png SiFive的产品路线图 Pasted image 20230830172230.png 大芯片架构, 不过怎么L2还是4个core共享呢 Pasted image 20230830172407.png pipeline Pasted image 20230830172436.png core指令流 Pasted image 20230830172751.png 从上往下分别介绍不同部分 Pasted image 20230830172940.png Pasted image 20230830173113.png Pasted image 20230830173345.png Pasted image 20230830173443.png Pasted image 20230830173503.png Pasted image 20230830173520.png 共享的L2 cache, 感觉这块有点没跟上业界节奏 Pasted image 20230830173556.png 32-core一个示例 Pasted image 20230830173628.png 这是针对消费市场的大小核例子 Pasted image 20230830173724.png 针对汽车电子的,强调RAS Pasted image 20230830173753.png 这IP真不是按照ARM的来的吗 Pasted image 20230830174154.png

Ventana Veyron V1 RISC-V Data Center Processor

每个cpu die 16个 core, 要scale到192 core, 需要12个cpu die, 这IO die能同意吗 Pasted image 20230830135727.png CPU die的一些特性 Pasted image 20230830135854.png 瞄准服务器市场, risc-v本身标准不完善,加了一些扩展。感觉这些都是坑 Pasted image 20230830135926.png core microarchitecture. Pasted image 20230830140108.png Pasted image 20230830140259.png pipeline Pasted image 20230830140403.png predict, fetch, 和decode Pasted image 20230830140428.png load/ store Pasted image 20230830140847.png each 16 core cluster共享48MB L3 cache, 这个比arm还是大 Pasted image 20230830141049.png Pasted image 20230830141238.png 吊打其他家上一代, 哈哈 Pasted image 20230830141430.png 参考实现 Pasted image 20230830141517.png

Arm Neoverse V2

Neoverse的路线图, 这个很重要,要让人有信心 Pasted image 20230830113244.png 一些加强的部分 Pasted image 20230830113317.png V2核的微架构 Pasted image 20230830113354.png 下面主要是各个不同部位的改进和相应的性能提升, 当然总结起来就是更大,更宽,更快, 所以更强。都是套路 Pasted image 20230830113505.png Pasted image 20230830115327.png Pasted image 20230830115455.png Pasted image 20230830115526.png Pasted image 20230830115637.png Pasted image 20230830115716.png Pasted image 20230830115816.png V2@5nm vs V1@7nm Pasted image 20230830113145.png 一整套的配合的IP Pasted image 20230830115930.png 后面都是各种场景V2吊打V1, 看起来就是哥哥欺负弟弟 Pasted image 20230830120028.png Pasted image 20230830120124.png Pasted image 20230830120213.png Pasted image 20230830120235.png Pasted image 20230830120258.png Pasted image 20230830120320.png Pasted image 20230830120427.png nvidia来了 Pasted image 20230830120446.png

Arm Neoverse CSS

ARM为了赚钱, 不寒碜 Pasted image 20230830161255.png 哎 以后连线的活都找不到了 伤心 Pasted image 20230830161315.png Pasted image 20230830161521.png Pasted image 20230830161837.png 各种规格 应有尽有 Pasted image 20230830162006.png 解决方案 Pasted image 20230830162102.png Pasted image 20230830162122.png MSCP都安排上了,太贴心了 Pasted image 20230830162301.png 这个倒是常规套餐 Pasted image 20230830162330.png CMN来了, 现在不用学了 我都打包给你 Pasted image 20230830162404.png ARM : 看, 能iEP都给搞好了 还要什么呢 请叫我贴心宝贝 Pasted image 20230830162442.png 阿里 : 咦 这不是倚天710吗 Pasted image 20230830162521.png 看起来很眼熟 Pasted image 20230830162554.png 之前还是AIB, 与时俱进, 换成UCIe, 其实都是一个东西 Pasted image 20230830162850.png 看 很火的CXL也能支持的 Pasted image 20230830162909.png Pasted image 20230830162929.png 给你看看floorplan Pasted image 20230830162949.png 这是正经做法 Pasted image 20230830163036.png 不止硬件 firmware, os都准备好了 真不来一套吗 Pasted image 20230830163106.png 依我看 保守了 3个月差不多 再多就是看不起人了 Pasted image 20230830163257.png

通篇看完, 就差直说阿里套餐 要不要

Intel

Intel on Changing its Xeon CPU Architecture

intel : 重核不吃香了 我知道了 我改 Pasted image 20230830154234.png intel : cloud, cloud, 不就是要高吞吐, 多线程吗 我懂 Pasted image 20230830154432.png 这个感觉走对了 , AMD的路子不对 Pasted image 20230830155339.png intel : 我的互联不差的 Pasted image 20230830155501.png 计算能力要和内存带宽匹配 Pasted image 20230830155725.png P-core一些更新 Pasted image 20230830160045.png MCR DRAM是大家都可以用的吗 Pasted image 20230830160239.png  CXL Type-3, 自家的东西 肯定是要支持的 Pasted image 20230830160701.png IO die的架构 Pasted image 20230830160823.png 这个512M cache很猛 Pasted image 20230830161014.png 赶紧准备下单吧 什么 你要核多一点的? 那看后面的吧 Pasted image 20230830161039.png

Intel Xeon E-Cores for Next Gen Sierra Forest

来看看 E-core Pasted image 20230830163606.png Pasted image 20230830163741.png Pasted image 20230830163953.png Pasted image 20230830164111.png intel : 不是说云原生吗 受够了 给你4MB L2, 看你还说我不是云原生 Pasted image 20230830164224.png 一些新的指令 Pasted image 20230830164331.png intel : 都来看 我把HyperThread也去掉了 原不原生 Pasted image 20230830164359.png intel : 这土豪金封装你学的来吗 Pasted image 20230830164533.png

Direct Mesh-to-Mesh Optical Fabric

介绍项目背景 Pasted image 20230830204756.png OOO给的太多了, 接受无能 Pasted image 20230830204834.png 单core 66-thread, 一个socket 8 cores, 一共528 threads), This is a RISC ISA not x86. 咦 怎么线程不再多一点 直接做成GPGPU呢 Pasted image 20230830205159.png core微架构, 怎么看怎么像SUN之前的Niagara呢?不知道是不是统一伙人做的 Pasted image 20230830205257.png 10-port的switch, 教科书上的标准设计 Pasted image 20230830205450.png 整体架构 Pasted image 20230830205524.png 有趣的来了, 用的光网络互联 Pasted image 20230830205611.png EMIB封装,土豪金无处不在 Pasted image 20230830205649.png 光互联的一些性能数据 Pasted image 20230830205705.png 一半的功耗在光模块上, 看来还是不堪大用 Pasted image 20230830210111.png 这IO面积比core大多了 感觉买椟还珠 Pasted image 20230830210206.png 封装和测试 Pasted image 20230830210228.png Pasted image 20230830210244.png

AMD

AMD Siena - A Smaller EPYC for Telco and Edge

AMD Zen 4, 反正就是比Zen3 更快,更省 Pasted image 20230830132822.png Zen 4c是给Bergamo定制的更小的core, 看来x85世界都认为不能被ARM在欺负了 AMD : 我们也是能做小核的 Pasted image 20230830132931.png Pasted image 20230830133535.png Pasted image 20230830134753.png

AMD CCD and Memory Technology

看我一个IO Die打遍天下 Pasted image 20230830135029.png CXL也是很火的, 不能缺席 Pasted image 20230830135430.png

Google TPUv4 and Optically Reconfigurable AI Network

TPUv4和光网络, 很早就放出来的消息,本来是期待TPUv5的, 看来google诚意不够 Pasted image 20230830174522.png Pasted image 20230830174641.png 架构图 以后专门写一写AI DSA Pasted image 20230830194958.png TPUv4 vs TPUv3 Pasted image 20230830195133.png sparseCore Pasted image 20230830195304.png TPUv4 SparseCore performance Pasted image 20230830195406.png 最喜欢看这种图了 Pasted image 20230830195516.png 机柜散热 供电 互联情况 算是有点意思 Pasted image 20230830195647.png 8个机柜一组 一共8个 组成64个机柜的集群 4096个芯片 Pasted image 20230830195728.png 具体组网情况 现在都是玩HPC那一套 Pasted image 20230830195908.png 光交换 唉 有钱就是任性 Pasted image 20230830200008.png 看这密密麻麻的线 不知道有没有机会也玩一个 Pasted image 20230830201134.png 光互联和机柜的连接 Pasted image 20230830201215.png 计算池的概念 Pasted image 20230830201236.png 光交换能灵活修改拓扑 可以提高利用率和稳定性 Pasted image 20230830201404.png Pasted image 20230830201539.png Pasted image 20230830201603.png 计算任务变化多样 所以硬件设计要有灵活性 感觉这话不应该google tpu来说啊 Pasted image 20230830201633.png Pasted image 20230830201652.png google : 增加片上存储真的很香 Pasted image 20230830201718.png 喜闻乐见的时刻 吊大一下nvidia Pasted image 20230830201748.png the PaLM model training over 6144 TPUs in two pods. Pasted image 20230830201826.png

Cerebras Wafer-Scale Cluster

常规开场白 架构 摩尔 AI模型需求 吧喇叭啦 Pasted image 20230830202057.png Pasted image 20230830202149.png Pasted image 20230830202220.png 嗯 计算能力跟不上需求 Pasted image 20230830202304.png 现在一些scale系统太啥了 scale来scale去还是小的计算节点 cerebras : 在做都是垃圾 Pasted image 20230830202413.png cerebras : 我的片子巨大无比 我还可以scale, 就问你怕不怕 Pasted image 20230830202446.png cerebras : 各位不觉得partition来partition去挺麻烦的吗 来我这买一片大的吧 Pasted image 20230830202537.png cerebras : 就说实话吧 GPU用起来还是很麻烦的 Pasted image 20230830202704.png cerebras : 来我这儿吧 我就跟HAPS一样 忘掉这些partition的烦恼 Pasted image 20230830202740.png 850,000 cores / WSE-2 Pasted image 20230830202819.png cerebras : MemoryX 存储, SwarmX 互联, 我都有了 感觉回到几十年前, SUN/IBM说我能把成百上千cpu组成一个集群 Pasted image 20230830202848.png Pasted image 20230830202916.png 还是dataflow 那一套 Pasted image 20230830202936.png 互联还能做一些ALU, 莫名想起DPU Pasted image 20230830203024.png 一些分发数据操作 没有看懂 感觉还是很复杂的 Pasted image 20230830203342.png Pasted image 20230830203500.png Pasted image 20230830203616.png SwarmX使用100GbE和RoCE RDMA Pasted image 20230830203851.png broadcast reduce node有12 nodes, 6x 100GbE links. Pasted image 20230830204042.png 100GbE相比NVLink/ NVSwitch /InfiniBand是一个可获取的商用接口了 类似CMN Pasted image 20230830204201.png  the SwarmX topology. Pasted image 20230830204255.png 说是很灵活管理 但是我不太相信 Pasted image 20230830204332.png 反正快就是了 Pasted image 20230830204500.png 看 用大芯片比用GPGPU简单多了 Pasted image 20230830204527.png

SK hynix AI Memory

还是经典开场白 不止计算, 功耗, 存储都是巨大成本 Pasted image 20230830101721.png 大模型必到 Pasted image 20230830101829.png 1GHz计算单元有512GB/s带宽. Pasted image 20230830102404.png Pasted image 20230830102656.png Pasted image 20230830102731.png GEMV in memory for AI compute - Weight matrix data is sourced from banks while vector data comes from the global buffer. Pasted image 20230830103038.png AiM的一些命令 Pasted image 20230830103223.png Pasted image 20230830103400.png Pasted image 20230830103445.png 软件 硬件上的一些挑战 Pasted image 20230830103855.png 看我是怎么解决这些挑战的 – 但是我觉得最大挑战是别人不会让你既卖memory, 又卖计算逻辑啊 Pasted image 20230830104042.png Pasted image 20230830104259.png Pasted image 20230830104358.png Pasted image 20230830104650.png Pasted image 20230830104928.png 用fpga做了测试 Pasted image 20230830105454.png 还有相应软件 Pasted image 20230830105518.png 看起来还是概念 Pasted image 20230830105625.png Pasted image 20230830105649.png

Samsung Processing in Memory Technology

还是老套的开场白 Pasted image 20230830105759.png 先否定可能的办法,不管增加通道数还是CXL都有局限性的 Pasted image 20230830105950.png Pasted image 20230830110144.png 嗯 怎么可以少了大模型呢 Pasted image 20230830110226.png 嗯 PIM的应用场景来了 Pasted image 20230830110414.png Pasted image 20230830110701.png Pasted image 20230830110902.png PIM很香,可以降低85%的功耗 Pasted image 20230830111401.png 这是已经和AMD MI100搭配使用了吗? 没看懂 都没听说过 Pasted image 20230830111435.png Pasted image 20230830111518.png T5-MoE模型在HBM-PIM Pasted image 20230830111603.png 功耗性能大丰收 Pasted image 20230830112020.png 软件 Pasted image 20230830112210.png 嗯 标准化 感觉八字还没一撇 Pasted image 20230830112301.png 都想起软件标准化了 就说想的多了一点 Pasted image 20230830112408.png 后面的都是概念了 靠想象 Pasted image 20230830112439.png Pasted image 20230830112459.png LP5-PIM, 嗯 都可以安排上 Pasted image 20230830112534.png Pasted image 20230830112613.png Pasted image 20230830112744.png PNM-CXL, CXL也出场了 Pasted image 20230830112758.png 按这个架构 host做好控制就行了 计算存储都是三星干好了 Pasted image 20230830112832.png 512GB CXL-PNM card with up to 1.1TB/s of bandwidth Pasted image 20230830112915.png CXL-PNM软件栈, 发现一个typo - phytorch Pasted image 20230830112939.png 还是降功耗 Pasted image 20230830113044.png

]]>
A Scalable High-Bandwidth Architecture for Lossless Compression on FPGAs http://zhifeiding.github.io/programming/2018/04/12/Paper-Reading-A-Scalable-High-Bandwidth-Architecture-for-Lossless-Compression-on-FPGAs/ 2018-04-12T00:00:00+00:00 http://zhifeiding.github.io/programming/2018/04/12/Paper-Reading-A-Scalable-High-Bandwidth-Architecture-for-Lossless-Compression-on-FPGAs Purpose of the Paper

这篇论文主要介绍了一种使用FPGA进行压缩的方法, 和其他方法主要不同点是在实现可扩展姓的情况下,同样吞吐率和压缩率可以使FPGA资源利用率达到其他实现方式的3倍。

Method Introduced in the Paper

Results of the Paper

Reference

A Scalable High-Bandwidth Architecture for Lossless Compression on FPGAs

]]>
DEFLATE - A Lossless Data Compression Algorithm http://zhifeiding.github.io/programming/2018/03/24/DEFLATE-A-Lossless_Compression-Algorithm/ 2018-03-24T00:00:00+00:00 http://zhifeiding.github.io/programming/2018/03/24/DEFLATE-A-Lossless_Compression-Algorithm What’s DEFLATE ?

DEFLATE 是结合LZ77Huffman coding的一种无损压缩算法。广泛用于gzip, pngzip压缩文件中。

Algorithm Description

在介绍DEFLATE之间, 我们需要先理解上面提到的DEFLATE的两个重要组成部分 : LZ77Huffman Coding

Huffman Coding

Huffman是一种变长前缀编码格式, 对于出现频率高的字符, 使用短的编码, 而频率低的字符, 使用长编码。 例如, 对于如下权重的字符,

    A    16
    D     8
    E     8

使用Huffman编码得到的Huffman Tree如下:

       ( )
    0 /   \ 1
    ( )    A
 0 /   \ 1
  D     E

LZ77 Compression

LZ77算法使用 sliding windows 来记录前面的数据流,当后面的数据流和sliding windows里数据重复时,可以使用距离之前重复数据出现的距离和重复的长度来代替实际数据。 以下面数据为例:

Blah blah blah blah blah!

可以看到, 当读入Blah b之后, 接下来的五个字符和之前的是一样的, 所以用LZ77算法表示为:

Blah b[D=5,L=5]

DEFLATE Algorithm

DEFLATE算法结合上面介绍的LZ77 Compression算法和Huffman Code,来对数据进行压缩处理。其中LZ77用来对数据中重复出现的部分进行处理, 而Huffman Coding则对LZ77处理过的数据进行编码, 将出现频率高的用更短的编码。

具体的对于DEFLATE压缩后的数据是由一系列的block组成的, 每个block格式如下:

  • 第一个 bit: 是否为连续的数据中最后一个block
1: 是最后一个block
0: 后面还有连续的block
  • 第二和三 bits: 当前block的编码方式:
00: 原始数据, 065,535字节长度
01: 使用静态Huffman 编码
10: 使用动态Huffman 编码
11: 保留

Reference

]]>