http://zhifeiding.github.io 2026-03-05T15:28:36+00:00 dzhf21@hotmail.com Huawei Ascend Architecture from 910 to 950 http://zhifeiding.github.io/programming/history/2026/03/05/Huawei-Ascend-Architecture-From-910-to-950/ 2026-03-05T00:00:00+00:00 http://zhifeiding.github.io/programming/history/2026/03/05/Huawei-Ascend-Architecture-From-910-to-950 概述

随着昇腾AI处理器架构的持续演进和不同产品的快速迭代,存在多种不同的架构,例如在最新的下一代架构950在硬件设计上增加了SIMT计算单元,用于提升离散操作场景及复杂分支场景的编程易用性;对华为昇腾AI处理器架构的演进历史进行一次回顾可以帮助了解不同架构的局限和应用需求,因此,本文从Ascend 910里原始DaVinci Core架构开始,最后以950结束,分析不同架构之间的异同。本文所有信息均来自公开渠道,如有错误,还请帮忙指正。

Ascend 910 DaVinci Core

Ascend 910是第一代架构,主要由标量控制单元,向量计算单元和张量积算单元组成:

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

DaVinci核包括多个缓冲区,分成不同层次。

  • L0 缓冲区专用于张量计算单元,分成三个单独的 L0 缓冲区,分别是缓冲区 A L0、缓冲区 B L0 和缓冲区 C L0。分别用于保存输入特征数据、权重和输出特征数据。
  • 缓冲区 A L0 和缓冲区 B L0 中的数据从 L1 缓冲区加载。
  • L0 缓冲区和 L1 缓冲区之间的通信由内存传输引擎MTE(Memory Transfer Engine) 管理。

0.png

Ascend 910X(200) 计算架构

相比之前的架构,该架构主要变化如下;

  • 增加L0C Buffer和Unified Buffer数据通路
  • 增加Unified Buffer和Global Memory数据通路

前一代架构广为人诟病的一点就是矩阵计算单元和向量计算单元不能直接共享数据,必须通过L1;这样会导致算子融合性能收益有限,所以在该架构主要针对这个缺陷做了优化。 1.png 本架构中,Cube计算单元和Vector计算单元同核部署,共享同一个Scalar计算单元。

  • Vector计算单元的数据来源来自于Unified Buffer,要求32字节对齐;
    • 数据从L0C Buffer传输至Unified Buffer需要以Vector计算单元作为中转。
  • Cube计算单元可以访问的存储单元有L0A Buffer、L0B Buffer、L0C Buffer,其中
    • L0A Buffer存储左矩阵,L0B Buffer存储右矩阵,L0C Buffer存储矩阵乘的结果和中间结果。

在该架构中支持核内同步,而不支持核间同步(硬件)。由于AI Core内部的执行单元(如MTE2搬运单元、Vector计算单元等)以异步并行的方式运行,在读写Local Memory(如Unified Buffer)时可能存在数据依赖关系。为确保数据一致性及计算正确性,需通过同步控制协调操作时序。对于软件,主要以SetFlag IDx来调用同步机制,数据从GM通过MTE搬运到UB, 之后Vector计算单元才能开始计算,计算完成的结构之后通过MTE搬运到GM,如下所示:

2.png

Ascend 910X(220) 计算架构

该架构相比之前的设计,主要修改如下:

  • 向量计算单元和矩阵计算单元分离
    • 该改动应该主要是为了更灵活的针对不同产品需求配置Vector和Cube的比例
  • 增加Fixpipe(硬件加速)
    • 增加了FP Buffer和对应的硬件加速器,一方面弥补了Vector的性能,另一方面也可以更好的做一些相关的算子融合
  • 增加BT Buffer ( Bias Table Buffer)
    • 这个改动和上一个也类似,主要是为了弥补Vector的性能,通过专用的硬件在Cube单元里进行带Bias运算可以极大的减轻Vector的压力

该架构相比原始910设计,对于一些算子会有较大提升,但也继承了缺陷,Vector和Cube计算单元缺少直接通信方式,需要通过GM。 3.png

AI Core分为AIC和AIV两个独立的核,分别用于矩阵计算和向量计算。每个核都有自己的Scalar单元,能独立加载自己的代码段。AIV与AIC之间通过Global Memory进行数据传递。

  • Vector计算单元 :Vector计算单元的数据来自于Unified Buffer,要求32字节对齐。
  • Cube计算单元 :Cube计算单元可以访问的存储单元有L0A Buffer、L0B Buffer、L0C Buffer,其中L0A Buffer存储左矩阵,L0B Buffer存储右矩阵,L0C Buffer存储矩阵乘的结果和中间结果。
  • 支持Fixpipe硬件化加速:Fixpipe是NPU将典型操作进行硬化的加速模块,位于AIC内部,配合Cube计算单元完成随路计算,主要功能如下:
    • 量化反量化:包括S322FP16、S322S32、S322S4、S322S8、S322S16、FP322FP16、FP322BF16、FP322S8、FP322S4、FP322FP32。
    • Relu功能,包括ReLu、PReLu和Leaky ReLu等典型的激活函数。
    • 数据格式转换

4.png 该架构支持核间同步。当不同核之间操作同一块全局内存时,可能存在读后写、写后读以及写后写等数据依赖问题,需要进行核间同步控制。核间同步控制分为以下几种模式:

  • 模式0:AI Core核间的同步控制。
    • 对于AIC场景,同步所有的AIC核,直到所有的AIC核都执行到CrossCoreSetFlag时,CrossCoreWaitFlag后续的指令才会执行;
    • 对于AIV场景,同步所有的AIV核,直到所有的AIV核都执行到CrossCoreSetFlag时,CrossCoreWaitFlag后续的指令才会执行。
  • 模式1:AI Core内部,AIV核之间的同步控制。如果两个AIV核都运行了CrossCoreSetFlag,CrossCoreWaitFlag后续的指令才会执行。
  • 模式2:AI Core内部,AIC与AIV之间的同步控制。在AIC核执行CrossCoreSetFlag之后, 两个AIV上CrossCoreWaitFlag后续的指令才会继续执行;两个AIV都执行CrossCoreSetFlag后,AIC上CrossCoreWaitFlag后续的指令才能执行。 5.png

算子中进行带bias的矩阵乘计算时,可将bias数据搬运至C2(Bias Table Buffer)上,调用一次Mmad接口实现矩阵乘加bias的计算,或者直接调用Matmul高阶API完成功能。相比于先将矩阵乘的结果从CO1(L0C)搬运到GM上,再搬运到UB上进行加bias的过程,减少了数据搬运的次数,可提升内存使用效率。下图分别是不带BT Buffer和带BT Buffer运算的差别: 6.png

7.png

算子实现中对矩阵乘结果进行量化计算时,可将量化参数搬运到C2PIPE2GM(Fixpipe Buffer)上,调用一次Fixpipe接口实现矩阵乘结果的量化计算。相比于将矩阵乘的结果从CO1(L0C)搬运到GM,再从GM搬运到UB,在UB进行量化计算的过程,数据搬运的次数更少,内存使用效率更高。下图分别是不带FP Buffer和带FP Buffer运算的差别: 8.png

9.png

Ascend 910X(300) 计算架构 - 偏端侧

该架构应该是偏端侧应用,所以Cube和Vector计算单元还是延续早期设计,在前端耦合; 同时引入之前的BT Buffer和FP Buffer来加速,降低Vector的需求。Cube计算单元和Vector计算单元同核部署,共享同一个Scalar计算单元。

  • Vector计算单元:数据来源来自于Unified Buffer,要求32字节对齐。
  • Cube计算单元:可以访问的存储单元有L0A Buffer、L0B Buffer、L0C Buffer,其中L0A Buffer存储左矩阵,L0B Buffer存储右矩阵,L0C Buffer存储矩阵乘的结果和中间结果。

该硬件架构不支持核间同步。 10.png

Ascend 950 计算架构

最新的架构则是Ascend 950,分为950PR(Prefill & Recommendation) 和950DT(Decode & Training)。在上一代基础上增加了SIMT模式的支持;同时结合了之前几代架构的修改,将Cube和Vector解耦,但同时增加了之间通信的数据通路。一个AI Core包含AIV和AIC的组合。 对于AIV:

  • 可支持两种工作模式:SIMT和SIMD,以VF(Vector Fuction) 为粒度进行切换;
  • 同一时刻不能同时支持SIMD和SIMT;
  • SIMT可以支持
    • 支持直接读写GM或UB (UB当做Shared Memory)
    • 一个SIMT Vector Function 运行一个 thread block,同一时刻一个AIV只能执行一个SIMT Vector Function
    • 每个AIV有4个Warp Scheduler, scheduler id = warp id % 4
    • 每个线程可使用的寄存器受线程个数限制
    • 最大支持128KB Data Cache,Data Cache直接复用UB作为Cacheline
  • SIMD优化包括:
    • 从A2/A3Memorybased架构切换到Regbased架构,增加SIMD Register File存储层次,可以直接对芯片的Vector寄存器Register进行操作,实现更大的灵活性和更好的性能。
    • 数据从Unified Buffer搬运到Register进行计算,产生的中间结果可以不用传回Unified Buffer,直接在寄存器计算;

对于AIC:

  • 新增MX FP4/MX FP8类型;
  • 增强单核算力,增大核数;
  • 不再支持s4类型;不支持4:2稀疏矩阵; 11.png 除了SIMT功能的增加,额外的优化包括新的数据通路:

  • 增加L0C Buffer -> Unified Buffer、Unified Buffer <-> L1 Buffer的数据通路;
  • 删除Global Memory -> L0A Buffer、Global Memory -> L0B Buffer的数据通路。删除L1 Buffer->Global Memory的数据通路;
  • MTE2 数据搬运能力增强:新增NDDMA搬运、新增Compact模式、增强搬运维度;
  • SSBuffer,用于AIC和AIV的核间通信;

对于SIMT API,基本可以做到和业界SIMT编程接口一一对应,如下所示: 12.png

两者实现相同Reduce算子的代码,不能说一模一样,基本上也没太多差别。 13.png

吸取之前架构的优点,AIV 和 AIC 支持独立运行机制。AIC和AIV独立运行机制,又称双主模式。在分离架构下,区别于MIX模式(包含矩阵计算和矢量计算)通过消息机制驱动AIC运行,双主模式为AIC和AIV独立运行代码,不依赖消息驱动,使能双主模式能够提高Matmul计算性能。默认情况下,双主模式不使能,需要通过MatmulConfig中的enableMixDualMaster参数开启。

]]>
History of GPGPU | What makes GPU General Purpose? http://zhifeiding.github.io/programming/history/2025/05/18/History-Of-GPGPU-What-Makes-GPU-Generous-Purpose/ 2025-05-18T00:00:00+00:00 http://zhifeiding.github.io/programming/history/2025/05/18/History-Of-GPGPU-What-Makes-GPU-Generous-Purpose 前言

当下最火热的领域非人工智能莫属,而支撑这些应用的硬件则是GPGPU;在过去20年,NVIDIA的GPGPU借助摩尔定律的加持和自身架构特点,占据了并行计算领域绝大部分市场,让人难以望其项背;而最近几年随着摩尔定律逐步停滞,给了大家追赶的机会。那么,在这种情况下,梳理GPU的发展历程,了解其架构变迁背后的故事,可以更好地帮我们来应对不确定的未来。如果你也有下列问题:

  • GPU是如何从图形处理单元变成通用计算的GPGPU的?
  • NVIDIA是如何凭借Tesla架构,纵横并行计算江湖近20载?
  • AMD又为何三易架构,从图形时代各领风骚到并行计算领域和当下人工智能时代节节败退?
  • Interl又是如何三心二意,左右摇摆?

针对上述问题,本文首先通过回溯40年前图形处理硬件,到GPU概念的出现 ,说明硬件是如何随着应用的需求变化从专用硬件变成可编程处理器;然后通过NVIDIA和AMD的各自产品和架构上的迭代来展现从GPU到GPGPU的演进历史,也是图形处理从固定的流水线到统一处理流水线的变迁;最后结合NVIDIA和AMD在各自统一处理器架构上对HPC和AI应用的倾向上来陈述各自的选择。

本文组织结构如下:

  • 第一节概述,简要介绍了近40年来图形处理硬件的发展,以及CUDA奠定的GPGPU一般编程模型;通过本节可以快速了解GPU和GPGPU出现的历史背景
  • 第二节从NVIDIA第一个GPU产品GeForce 256开始,经过2.5节第一个GPGPU产品Tesla,最后以最新的Rubin产品和架构结束;通过本节可以完整的了解GPU到GPGPU,GPGPU到AI加速的完整的演变过程
  • 第三节从AMD第一个统一处理器架构XBOX 360开始,到最新MI350X为止,展示AMD从Terascale,到GCN,然后CDNA的架构差异
  • 第四节简要描述了Intel Ponte Vecchio 产品架构
  • 第五节是Biren的产品一些信息
  • 最后是本文写作过程一些参考文献

1. 概述

过去40多年的图形处理流水线总体上没有太多变化,大致遵循顶点处理,三角形生成,像素处理,光栅化等主要步骤,如下图所示: 0.png

其中,顶点处理主要是做变换和光照处理,在变换与光照引擎(Transform & Lighting Engine) 中,变换是计算密集型的任务,用于将包含所有物体的3D场景,称为’世界空间’,转换为我们正在查看的’屏幕空间’。光照是3D流水线中的一个可选阶段,该阶段根据一个或多个光源计算物体的光照。光照和变换一样,也是计算密集型的任务。

在20世纪90年代这些图形处理催生出了大量的芯片,专门用来处理图形流水线,下图展示了1997年SGI的 InfiniteReality InfiniteReality 的处理单元结构: 1.png

可以看到,当时的图形芯片本身集成度不高,不同的功能是由不同芯片组成的;但是总体的图形处理流水线是类似的。这时期还是图形处理芯片或者3D芯片,即图形数据从Host发送到图形芯片,经过固定的流水线处理之后输出到显示器。

在20多年前,最开始图形芯片只负责图形的渲染,随后慢慢的变换与光照,三角形生成等也由图形芯片负责。因为这些操作都是计算密集型的,由CPU执行,给CPU带来了相当大的压力。其结果是,3D芯片常常需要等待CPU提供数据(例如,CPU限制的3D基准测试),而且游戏开发者不得不将自己限制在简单的3D世界中,因为过多的多边形使用会使CPU停顿。下表是从1996年到1999年间从图形处理芯片到GPU出现时CPU和图形芯片的分工变化: 2.png 1999年,NVIDIA推出的GeForce 256,将之前由CPU处理的变换和光照用专用硬件实现;为了区别于之前的图形芯片,第一次采用了GPU这个名称。这个时候,GPU还是一个固定功能的图形处理器。

开发人员总是希望获得更大的灵活性,因此,固定功能着色器单元变成可编程的;

  • 首先是顶点着色器变成可编程,这一时期典型代表是NVIDIA GeForce 3;
  • 随后像素着色器也变成可编程,这一时期典型代表是NVIDIA GeForce 6800;

而不同工作负载对顶点处理器和像素处理器的需求也存在较大差异,所以NVIDIA GeForce 7800应运而生,调整了顶点着色器和像素着色器的数量;然后,即使同一个应用里不同阶段对顶点处理器和像素处理器的需求也存在较大差异;因此,顶点处理器和像素处理器也逐渐从不同的计算单元演进成相同的通用计算单元,包括计算,分支等指令,以及寄存器,加载和存储等功能单元, 典型产品是NVIDIA Tesla。 3.png

4.png

在固定功能的全流水线架构中,着色器阶段瓶颈会使整个流水线停滞;而这种新的架构被称为统一处理器,可以实现着色器级负载均衡。此时,GPU由专用的图形处理功能进化为了通用的计算单元,也就是GPGPU。 5.png

1.1 GPGPU架构和编程模型

CUDA 提供了三个关键抽象 - 线程组的层次结构、共享内存和屏障同步 - 为层次结构中的一个线程提供适用传统 C 代码的清晰并行结构。 当主机 CPU 上的 CUDA 程序调用内核网格(kernel grid)时,CWD(计算工作分配单元compute work distribution unit)枚举网格块并将它们分发给可执行的 SM。线程块(thread block)的线程在一个 SM 上并发执行。当线程块结束时,CWD 单元会在空闲的SM上启动新的线程块。

以Tesla为例,一个SM 由 8 个标量 SP 核、2 个用于超越函数的 SFU(特殊功能单元)、1 个 MT IU(多线程指令单元)和片上共享存储器组成。SM 可以零开销在硬件中创建、管理和执行多达 768 个并发线程,可以同时执行多达 8 个 CUDA 线程块,受线程和内存资源的限制。SM 通过单个指令实现 CUDA syncthreads()屏障同步。快速屏障同步与轻量级线程创建和零开销线程调度一起有效地支持非常细粒度的并行性,允许创建一个新线程来计算每个顶点、像素和数据点。

SM 将每个线程映射到一个 SP 标量核,每个标量线程使用自己的指令地址和寄存器状态独立执行。SM SIMT 单元以 32 个并行线程(称为warp)为一组创建、管理、调度和执行线程。组成 SIMT warp的各个线程从同一程序地址一起开始,但可以自由地独立分支和执行。每个 SM 管理一个warp 池, 支持 24 个warp ,每个 warp 32 个线程,总共 768 个线程。

发射指令时,SIMT 单元都会选择一个准备执行的warp,并向warp的活动线程发出下一条指令。一个 warp 一次执行一条公共指令,因此当 warp 的所有 32 个线程都执行相同路径时,可以实现全部效率。如果 warp 的线程通过依赖于数据的条件分支而发散,则 warp 会按顺序执行所采用的每个分支路径,禁用不在该路径上的线程,当所有路径完成时,线程会收敛回相同的执行路径。分支发散仅发生在warp内;不同的 Warp 独立执行,无论它们执行的是公共代码路径还是不连贯的代码路径。因此,与上一代 GPU 相比,Tesla架构的 GPU 在分支代码上的效率和灵活性要高得多,因为它们的 32 线程的warp比之前 GPU 的 SIMD(单指令多数据)宽度窄得多。

SIMT 架构类似于 单个指令控制多个处理单元的SIMD 向量结构。一个关键的区别在于,SIMD 向量结构向软件公开 SIMD 宽度,而 SIMT 指令指定单个线程的执行和分支行为。与 SIMD 向量机相比,SIMT 使程序员能够为独立的标量线程编写线程级并行代码,并为协调线程(coordinated thread)编写数据并行代码。为了正确起见,程序员基本上可以忽略 SIMT 行为;但是,通过注意代码很少需要 Warp 中的线程来发散,可以实现显著的性能改进。在实践中,这类似于缓存行在传统代码中的作用:在设计正确性时可以安全地忽略缓存行大小,但在设计最佳性能时必须在代码结构中考虑缓存行大小。

另一方面,向量架构需要软件将数据合并到向量中,并手动管理发散。 线程的变量通常保留在寄存器中。SM的16KB 共享内存具有非常低的访问延迟和高带宽,类似于 L1 缓存;它包含活动线程块的每个块的 CUDA __shared__变量。SM 提供加载/存储指令以访问 GPU 外部 DRAM 中的 CUDA __device__变量。当地址位于同一块中并满足对齐标准时,它将同一 warp 中并行线程的单个访问合并为更少的内存块访问。由于全局内存延迟可能高达数百个处理器时钟,因此当线程块必须多次访问数据时,CUDA 程序会将数据复制到共享内存。

Tesla 加载/存储内存指令使用整数字节寻址来利用传统的编译器代码优化。每个 SM 中的大线程数,以及对许多并发加载请求的支持,有助于覆盖外部 DRAM 的加载到使用延迟。最新的Tesla架构 GPU 还提供原子读-改-写内存指令,便于并行缩减和并行数据结构管理。 程序通过调用 CUDA 运行时(例如 cudaMalloc()cudaFree())来管理Kernel可见的全局内存空间。Kernel可以在物理上独立的设备上执行,就像在 GPU 上运行Kernel时一样。因此,应用程序必须使用 cudaMemcpy() 在分配的空间和主机系统内存之间复制数据。

线程块(thread block)的并发线程表示细粒度数据和线程并行性。网格(grid)的独立线程块表示粗粒度数据并行性。独立网格表示粗粒度任务并行性。内核(kernel)只是层次结构中一个线程的 C 代码。

2. NVIDIA

2.1 GeForce 256 ( NV10 )

1999年,Nvidia推出GeForce 256,在此之前,基本上所有显卡都被称为“图形加速器”或简称为“显卡”。GeForce 256中加入了几项新功能,包括之前由CPU执行的Transform & Lighting(变换和照明)处理。为了和之前图形加速器做区别,NVIDIA将其称为“GPU”。GeForce 256采用220 nm工艺,工作频率为 120 MHz,支持32 - 64MB的SDRAM。下图展示了GeForce 256物理版图: 6.png GeForce 256包含一个固定功能的32位浮点变换和照明处理器以及一个固定功能的整数像素片元流水线,使用OpenGL和Microsoft DX7 API进行编程。 7.png

2.2 GeForce 3 ( NV20 )

2001 年,GeForce 3发布,采用150 nm工艺,包含 6000 万个晶体管,频率最高可达 250 MHz; 并引入了一个新的内存子系统,称为“Lightspeed Memory Architecture”(LMA),旨在压缩 Z 缓冲区并减少对内存带宽的需求。支持64MB DDR,提供7.4GB/s存储带宽。计算单元包括一个顶点着色器,4个片元着色器。

GeForce 3 是第一款采用可编程顶点处理器来执行顶点着色器的GPU,还有可配置的 32 位浮点片元流水线,使用 DX8.5 和 OpenGL 编程。 8.png

顶点处理器Vertex Processor

顶点处理器分为两个主要模块:顶点属性缓冲区(VAB)和浮点核心,如下图所示: 9.png VAB 数据会写到IB(Input Buffer),这些缓冲以round-robin方式给浮点内核提供数据。 VAB有一个dirty 位,当同一缓冲区数据写到IB时,只需要更新修改过的属性。对地址 0写时,会触发顶点的传输,类似固定功能模式下的顶点位置。 10.png 浮点内核是一个多线程向量处理器,可以对四个浮点数据进行操作。顶点数据从输入缓冲器读取,执行完之后写入到输出缓冲区 (OB)。向量和特殊函数单元的延迟相等,并且使用多个顶点线程来隐藏延迟。SIMD 向量单元负责 MOV、MUL、ADD、MAD、DP3、DP4、DST、MIN、MAX、SLT 和 SGE 操作。特殊功能单元负责 RCP、RSQ、LOG、EXP 和 LIT 操作。 11.png

编程模型

顶点处理器架构如下所示,当前顶点属性在输入(源)寄存器中可用,处理后的顶点写入输出(目标)寄存器。constant bank保存变换和光照参数,寄存器文件 (R) 保存临时结果。功能单元 (F) 实现指令集。 12.png 指令集包括向量操作、标量操作和其他操作等17 个操作,具体如下表所示: 13.png

2.3 GeForce 6800(NV40)

2003 年,NVIDIA发布GeForce 6800,采用130nm工艺,面积287 mm²,有 2.22 亿个晶体管, TDP 100 W;16 个像素超标量流水线(每个流水线上有一个像素着色器、TMU 和 ROP),支持Microsoft DirectX 9.0和Vertex Shader 3.0;6 个顶点着色器,支持Pixel Shader 3.0和 32 位浮点精度。256 位内存总线,支持最高512MB 的 GDDR3。下图展示了GeForce 6800的架构框图: 14.png GeForce 6800的工作流程从上到下,从六个相同的可编程顶点处理器开始。顶点阶段的结果将按照原始应用程序指定的顺序重新组合,以发送到三角形设置和栅格化单元。对于每个基元,光栅器会识别组成像素片元并将其发送到片元处理器(fragment processor)。16 个可编程片元处理器并行处理。每个线程接收来自光栅器的 (x, y) 地址和插值输入。最后,片元处理器的颜色和深度结果通过交叉开关分配给 16 个固定功能像素混合单元,这些单元执行帧缓冲操作,例如颜色混合、抗锯齿以及模板测试和更新。任何片元处理器结果可以发送到任何帧缓冲区位置。

顶点处理器

每个顶点处理器包括一个向量乘加单元、一个标量特殊功能单元和一个纹理单元。向量单元可以执行四个IEEE单精度乘法、加法或乘加运算,以及内积、最大值、最小值等。特殊功能单元执行超越运算,如正弦、余弦、对数和指数。下图展示了顶点处理器架构框图: 15.png

片元处理器

片元处理器在三角形上对属性进行平滑的插值。使用这些插值处理过的输入属性,片元程序使用数学和纹理查找指令来计算输出颜色。GeForce 6800 片元处理器可以执行 16 位或 32 位浮点精度(FP16 和 FP32)的运算。片元处理器的输入是位置、颜色、深度、fog和 10 个通用的 4 × FP32 属性。处理器将其输出发送到最多四个渲染目标缓冲区。与顶点处理器一样,片元处理器是通用的,也有类似的常量、临时寄存器资源和分支功能。下图展示了片元处理器架构框图: 16.png

2.4 GeForce 7800(G70)

2005年,GeForce 7800采用110 nm 技术, 面积333 mm²,3.02亿晶体管,工作频率为430 MHz;包含 24 个像素流水线,24 个 TMU,8 个顶点着色器和 16 个 ROP。内存位宽256 位,支持 256MB 的 GDDR3,频率 600 MHz (1.2 GHz DDR)。下图展示了GeForce 7800的架构框图:

17.png

2.5 Tesla

2006年,NVIDIA推出Tesla架构的GeForce 8800,采用台积电 90nm工艺,有6.81 亿个晶体管,面积470 mm2,工作频率1.5GHz,典型功率为 150 W; 包含16 个 SM,每个SM有8个SP核,一共128 个 SP 核; 支持最大12,288 个处理器线程; 峰值性能576 Gflops; 采用384位宽的内存接口,支持768 MB GDDR3,内存频率1.08GHz,提供104 GB/s 峰值带宽。下图展示了GeForce 8800的物理版图: 18.png Tesla 架构基于可扩展的处理器阵列。下图展示了有 128 个流处理器SP (streaming-processor) 内核的 GeForce 8800 GPU 的框图,这些内核被组织成 16 个流式多处理器SM (streaming multiprocessor),分布在 8 个称为纹理/处理器集群 (TPC)的独立的处理单元中。 19.png

TPC

SPA 中的每个 TPC 大致相当于以前架构中的四个像素单元,每个 TPC 都包含一个几何控制器(geometry controller)、一个 SM 控制器 (SMC)、两个流式多处理器 (SM) 和一个纹理单元。SM里的SP是标量 ALU ,代替之前架构的向量单元,因为着色器程序变得越来越长,标量越来越大,向量架构很难有效利用;下图展示了TPC的架构框图: 20.png

几何控制器Geometry controller

几何控制器通过引导 TPC 中的所有基元和顶点属性以及拓扑流,将逻辑图形顶点流水线映射到物理 SM 上;几何控制器管理专用的片上输入和输出顶点属性存储,并根据需要转发内容。DX10 有两个阶段处理顶点和基元:顶点着色器和几何着色器。

  • 顶点着色器独立于其他顶点处理一个顶点的属性。典型的操作包括位置空间变换以及颜色和纹理坐标生成。
  • 几何着色器在顶点着色器之后,处理整个基元及其顶点。典型的操作包括用于模板阴影生成的边缘拉伸和立方体贴图纹理生成。几何着色器输出图元,用于裁剪、视图转换和光栅化为像素片段等后期阶段。

SM(Streaming multiprocessor)

SM 由 8 个流处理器 (SP) 核、2 个特殊功能单元 (SFU)、1 个多线程取指和发射单元 (MT Issue)、1 个指令缓存、1 个只读常量缓存和 16 KB 读/写共享存储组成。每个 SP 内核都有一个标量乘加 (MAD) 单元。SM 将其两个 SFU 单元用于超越函数和属性插值,即从定义基元的顶点属性插值像素属性。每个SFU还包含4个浮点乘法器。SM 使用 TPC 里的纹理单元作为第三个执行单元,并使用 SMC 和 ROP 单元来实现外部内存加载、存储和原子访问。为了在运行多个不同的程序时有效地并行执行数百个线程,SM 是硬件多线程的,支持24 个 SIMD 线程束,每个线程束32个线程,可以在硬件中管理和执行多达 768 个并发线程,且调度开销为零。每个 SM 线程都有自己的线程执行状态,可以执行独立的代码路径。计算程序的并发线程可以使用单个 SM 指令在屏障处同步。

SM 的 SIMT 多线程指令单元以 32 个并行线程(称为 warps)为一组创建、管理、调度和执行。组成 SIMT warp 的各个线程属于同一类型,并且在同一程序地址处一起开始,但它们可以自由地独立分支和执行。在每个指令发出时,SIMT 多线程指令单元选择一个准备执行的 warp,并向该 warp 的活跃线程发出下一条指令。SIMT 指令同步广播到warp的活跃并行线程;由于独立的分支或预测,单个线程可能处于非活跃状态。SM 将 warp 线程映射到 SP 内核,每个线程以自己的指令地址和寄存器状态独立执行。当 warp 的所有 32 个线程都采用相同的执行路径时,SIMT 处理器实现了全部效率和性能。

如果 warp 的线程通过数据依赖的条件分支发散,则 warp 会按顺序执行每个分支路径,禁用不在该路径上的线程;当所有路径完成时,线程将重新聚合到原始执行路径。SM 使用分支同步堆栈来管理发散和聚合的独立线程。分支发散仅发生在 warp内;不同的 Warp 独立执行,无论它们执行的是公共代码路径还是不相交的代码路径。SIMD 指令一起控制多个数据通道的向量,并向软件公开向量宽度,而 SIMT 指令单独控制一个线程的执行和分支行为。

SIMT warp调度。SIMT 在 32 个线程之间有效地共享 SM 取指和发射单元。SM warp 调度器以处理器时钟速率(1.5GHz)的一半运行,在每个周期中,从 24 个warp中选择一个来执行 SIMT warp指令。发出的 warp 指令作为两组 16 个线程在四个处理器周期内执行。SP核和SFU单元独立执行指令,调度程序通过交替在它们之间发出指令可以使两者都处于完全占用状态。为不同warp程序和程序类型的动态组合实现零开销warp调度是一个具有挑战性的设计问题。记分牌对每个周期的warp发射进行限定,指令调度器对所有就绪的warp进行优先级排序,并选择优先级最高的warp发射。优先级考虑了 Warp 类型、指令类型和 SM 中执行的所有 Warp 的“公平性”。

SM 指令。Tesla SM 执行标量指令,与以前的 GPU 向量指令架构不同。着色器程序变得越来越长,标量越来越多,甚至越来越难以完全占用先前架构中四个向量单元中的两个。以前的架构采用向量打包(结合子向量)以提高效率,但这使硬件调度器和编译器变得复杂。标量指令更简单且易于编译。纹理指令仍然使用向量,采用源坐标向量并返回过滤后的颜色向量。高级图形和计算语言编译器生成中间指令,例如 DX10 向量指令或 PTX 标量指令,然后对其进行优化并转换为二进制 GPU 指令。优化器可轻松将 DX10 向量指令扩展为多个 Tesla SM 标量指令。PTX标量指令可以一对一的优化为Tesla SM标量指令。PTX 为编译器提供稳定的目标 ISA,并提供与不断发展的GPU二进制指令集架构的兼容性。由于中间语言使用虚拟寄存器,因此优化器会分析数据依赖关系并分配实际寄存器,消除死代码,在可行的情况下将指令折叠,并优化 SIMT 分支发散点和聚合点。

指令集体系结构。Tesla SM 是基于寄存器的指令集,包括浮点、整数、位、转换、超越函数、流程控制、内存加载/存储和纹理操作。SP 核是 SM 中的主要处理器,执行基本的浮点运算,包括加法、乘法和乘加;还实现了各种整数运算、比较和转换运算。SFU支持超越函数和平面属性插值的计算。

  • 浮点运算和整数运算包括加法、乘法运算、乘法加法、最小值、最大值、比较运算以及整数和浮点数之间的转换。浮点指令为取反和绝对值提供源操作数修饰符
  • 超越函数指令包括余弦、正弦、指数、对数、倒数和平方根
  • 属性插值指令可高效生成像素属性
  • 按位运算包括左移、右移、逻辑运算符和移动
  • 控制流包括分支、调用、返回、陷阱和屏障同步。浮点和整数指令还可以为每个线程设置零、负数、进位和溢出的状态标志,线程程序可以使用这些标志进行条件分支
  • 内存访问指令。为了支持计算和 C/C++ 语言需求,Tesla SM 除了图形纹理获取和像素输出外,还实现了内存加载/存储指令。内存加载/存储指令使用整数字节和寄存器加偏移地址寻址,以利用传统的编译器优化代码。对于计算,加载/存储指令可以访问三个读/写内存空间:
    • 用于每个线程、私有、临时数据的N 个本地内存(在外部 DRAM 中实现)
    • 用于低延迟访问同一 SM 中协作线程共享数据的N 个共享内存
    • 用于计算应用程序的所有线程共享的数据的N 个全局内存(在外部 DRAM 中实现)

SM控制器SMC。SMC 控制多个 SM,对共享纹理单元、加载/存储路径和 I/O 路径进行仲裁。SMC 同时处理三个图形工作负载:顶点、几何图形和像素。它将这些输入类型中的每个都打包到warp中,启动着色器处理,并分解结果。每种输入类型都有独立的 I/O 路径,SMC 负责它们之间的负载平衡。SMC 支持基于驱动程序建议的分配、当前分配和额外资源分配的相对的静态和动态负载均衡。

纹理单元。纹理单元每个周期处理一组四个线程(顶点、几何、像素或计算)。纹理指令的源操作数是纹理坐标,输出是筛选的样本,通常为四分量 (RGBA) 颜色。纹理是通过 SMC 连接的 SM 外部的一个独立单元。发射的 SM 线程可以继续执行,直到有数据依赖关系才停止。每个纹理单元都有 4 个纹理地址生成器和 8 个过滤器单元。

与独立执行并行着色器线程的图形编程模型不同,并行计算编程模型要求并行线程之间同步、通信、共享数据和协作才能有效地得到计算结果。为了管理大量可以协作的并发线程,Tesla 计算架构引入了协作线程阵列CTA (cooperative thread array),在 CUDA 术语中称为线程块。CTA 是并发线程阵列,这些线程执行相同的线程程序,可以协作计算结果。CTA 由 1 到 512 个并发线程组成,每个线程都有一个唯一的线程 ID (TID),编号为 0 到 m。程序员在线程中声明 1D、2D 或 3D CTA 维度,TID 有一维、二维或三维索引。CTA 的线程可以在全局或共享内存中共享数据,并且可以使用屏障指令同步。CTA 线程程序使用其 TID 来选择工作和索引共享数据数组。多维 TID 可以消除索引数组时的整数除法和余数运算。每个 SM 最多可同时执行 8 个 CTA,具体取决于 CTA 资源需求。程序员或编译器声明 CTA 程序所需的线程数、寄存器数、共享内存数和屏障数。当 SM 有足够的可用资源时,SMC 会创建 CTA 并为每个线程分配 TID 编号。SM 以 32 个并行线程的 SIMT warp同时执行 CTA 线程。 21.png 并行粒度。下图显示了 GPU 计算模型中的并行粒度级别和并行读/写内存共享的级别。这三个并行粒度级别是:

  • Thread线程 计算由其 TID 选择的结果元素
  • CTA 计算按其 CTA ID 选择的结果块
  • Grid网格 计算多个结果块,顺序网格计算顺序相关的应用程序

三个并行读/写内存共享的级别是:

  • local memory本地存储 每个执行线程都有一个专用的本地内存,用于寄存器、堆栈帧和可寻址临时变量
  • shared memory共享存储 每个执行 CTA 都有一个共享内存,用于访问同一 CTA 中线程共享的数据
  • global memory全局存储 网格在全局内存中通信和共享大型数据集 22.png CTA 中通信的线程使用快速屏障同步指令等待对共享内存或全局内存的写入完成,然后再读取 CTA 中其他线程写入的数据。加载/存储内存系统使用宽松的内存顺序,该顺序保证从同一线程到同一地址的读取和写入的顺序,以及屏障同步指令协调的 CTA 线程的顺序。顺序依赖的网格使用网格之间的全局网格间同步屏障来确保全局读/写顺序

CUDA 编程模型

CUDA 是 C 和 C++ 编程语言的最小扩展。程序员编写一个调用并行核函数的串行程序,并行核函数可以是简单的函数,也可以是完整的程序。CUDA 程序在 CPU 上执行串行代码,并在 GPU 上的以并行线程方式执行并行核函数。如前所述,程序员将这些线程组织到线程块和网格的层次结构中。(CUDA 线程块是 GPU CTA)。下图显示了一个 CUDA 程序在异构 CPU-GPU 系统上执行一系列并行核函数。KernelA 和 KernelB 作为 nBlkA 和 nBlkB 线程块 (CTA) 的网格在 GPU 上执行,每个 CTA 实例化 nTidA 和 nTidB 个线程。CUDA 编译器 nvcc 编译包含串行 CPU 代码和并行 GPU 内核代码的 C/C++程序。CUDA 运行时 API 将 GPU 作为具有自己的内存系统的协处理器。CUDA 编程模型在风格上类似于单程序多数据SPMD (single-program multiple-data) 软件模型,它显式地表达并行性,并且每个核函数在固定数量的线程上执行。但是,CUDA 比大多数 SPMD 实现更灵活,因为每个核函数调用都会动态创建一个新网格,其中包含正确数量的线程块和线程。CUDA 使用声明说明符关键字扩展 C/C++:

  • __global__ 用于核函数入口
  • __device__ 用于全局变量
  • __shared__ 用于共享内存变量

CUDA 核函数只是一个顺序线程的 C 函数。内置变量 threadIdx.{x, y, z} 和块 Idx.{x, y, z} ,提供线程块 (CTA) 中的线程 ID,而块 Idx 提供网格内的 CTA ID。扩展函数调用语法 kernel<<<nBlocks,nThreads>>>(args);nBlock 网格上调用并行核函数,其中每个块实例化 nThreads 并发线程,args 是函数 kernel() 的普通参数。 23.png

__global__ void KernelFunc(...); 
__shared__ int SharedVar; 
KernelFunc<<< 500, 128 >>>(...); 
// Explicit GPU memory allocation 
cudaMalloc()
cudaFree() 
// Memory copy from host to device, etc
cudaMemcpy()
cudaMemcpy2D()

2.6 Fermi

2010年, NVIDIA推出Ferimi架构GF100,采用台积电 40nm 工艺, 有 30 亿晶体管,支持384位的GDDR5内存接口。下图展示了GF100的物理规划图: 24.png

Fermi实现了IEEE 754-2008,并显著提高了双精度性能,并且为了提高大规模 GPU 计算的可行性和可靠性,内存使用纠错码 (ECC) 保护、采用64 位统一寻址、缓存内存层次结构以及针对 C、Cpp、Fortran、OpenCL 和 DirectCompute 的指令。为了说明 GPU 计算架构,下图显示了配置了 16 个SM的第三代 Fermi 计算架构:

25.png每个SM有 32 个 CUDA 核,总共 512 个。GigaThread 工作调度器将 CUDA 线程块分发给可用的SM,动态平衡 GPU 上的计算工作负载,并在适当的时候并行运行多个核函数。SM调度和执行 CUDA 线程块和单个线程。每个SM可执行多达 1,536 个并发线程,来掩藏DRAM 内存加载的长延迟。为了平衡了其并行计算能力,GPU使用专门的并行内存。Fermi GPU 有 6 个高速 GDDR5 DRAM 接口,每个接口 64 位。其 40 位地址可处理高达 1 TB 的地址空间。

SM

SM执行单元包括 32 个 CUDA 处理器核、16 个加载/存储单元和 4 个特殊功能单元 (SFU)。64 KB 的可配置的共享存储/L1 缓存、128 KB 寄存器文件、指令缓存以及两个多线程 warp 调度器和指令分发单元。SM实现了对 1,536 个并发线程零开销多线程和线程调度。为了有效地管理和执行这些单独的线程,SM采用了第一个统一计算 GPU 中引入的单指令多线程 (SIMT) 架构。 SIMT 指令逻辑在称为 warps 的 32 个并行线程组中创建、管理、调度和执行并发线程。

CUDA线程块包括一个或多个warp。每个 Fermi SM都有两个 warp 调度器和两个分发单元,每个分发单元选择一个 warp 并将指令分发到 16 个 CUDA 核、16 个加载/存储单元或 4 个 SFU 。由于 warp 独立执行,因此SM可以向适当的 CUDA 核、加载/存储单元和 SFU发射两个 warp 指令。

为了支持 C、CPP 和标准单线程编程语言,每个SM线程都是独立的,有私有寄存器、条件码和预测、线程私有内存和堆栈帧、指令地址和线程执行状态。SIMT 指令控制单个线程的执行,包括算术、内存访问以及分支和控制流指令。 26.png CUDA 核每个时钟可以执行一个标量浮点或整数指令。SM有 32 个CUDA 核,每个时钟可以执行32 个算术线程指令。整数单元实现32位精度标量整数运算,包括32位乘法和乘加运算,并支持64位整数运算。Fermi整数单元增加了位域插入和提取、位反转和计数功能。Fermi CUDA 核浮点单元实现了 IEEE 754-2008 浮点运算标准,用于 32 位单精度和 64 位双精度结果,包括融合乘加 (FMA) 指令。FMA 通过在中间乘积和加法中保持完全精度,然后将最终总和四舍五入以形成结果,从而在不损失精度的情况下计算 D = A * B + C。

内存结构

Fermi引入了一个用于加载、存储和原子访问的并行的缓存内存层次结构。SM的加载/存储单元执行加载、存储和原子内存访问指令。32 个活动线程的warp提供 32 个单独的字节地址的指令访问内存。加载/存储单元将 32 个单独的线程访问合并为最少数量的内存块访问。Fermi 引入了可配置容量的 L1 缓存,以帮助不可预测或不规则的内存访问,以及可配置容量共享内存。每个SM有 64 KB 的片上存储,可配置为 48 KB 共享存储和 16 KB L1 缓存,或 16 KB 共享存储和 48 KB L1 缓存。

所有SM共享768 KB 统一L2缓存。L2 缓存与 6 个 64 位 DRAM 接口和 PCIe 接口连接,PCIe 接口与主机 CPU、系统内存和 PCIe 设备连接。L2可以缓存通过PCIe接口访问的DRAM内存位置和系统内存页。统一的 L2 缓存负责来自SM的加载、存储、原子和纹理指令,以及来自 L1 缓存的请求,并填充SM指令缓存和统一数据缓存。

2.7 Kepler

2012年,NVIDIA 发布Kepler 架构,GK110 GPU采用台积电的 28 纳米工艺制造,面积 561 mm²,晶体管数量为 70.8 亿个。GK110物理版图如下所示: 27.png

GK110 包括5个GPC,15 个 SMX 单元和 6 个 64 位内存控制器, 28.png Kepler相对上一代,主要增加下列功能: 

  • 动态并行性(Dynamic Parallelism) 增加了 GPU 生成新任务、同步结果以及通过专用的硬件加速路径控制该任务调度的功能,所有这些都不涉及 CPU。通过在程序执行过程中提供灵活性,适应并行数量和形式,程序员可以利用更多的并行性,更有效地利用 GPU。此功能允许结构化程度较低、更复杂的任务轻松有效地运行,从而使应用程序的大部分内容能够完全在 GPU 上运行。Fermi在kernel启动时要知道问题的规模和参数,所有工作都是从主机 CPU 启动的,将运行到完成,并将结果返回给 CPU。在 Kepler 中,任何kernel都可以启动另一个kernel,并且可以创建必要的流、事件并管理处理额外工作所需的依赖项,而无需主机 CPU 交互。

29.png

  • Hyper-Q Fermi支持从不同流启动16 路并发,但最终这些流在同一个硬件工作队列中多路复用。这会导致错误的流内依赖关系,要求一个流中的依赖kernel完成,然后才能执行其他流中的其他kernel。虽然可以通过使用广度优先的启动顺序在一定程度上缓解,但随着项目复杂性的增加,越来越难以有效管理。Kepler 通过其 Hyper-Q 改进了此功能。Hyper-Q 允许 32 个硬件管理连接( Fermi 提供的单个连接),增加主机和 GPU 中 CUDA 工作分发器 (CWD) 逻辑之间的连接总数(工作队列)。Hyper-Q 允许从多个 CUDA 流、多个消息传递接口 (MPI) 进程,甚至从进程中的多个线程进行连接。以前遇到跨任务错误串行化从而限制 GPU 利用率的应用程序可以在不更改任何现有代码的情况下将性能提高多达 32 倍。每个 CUDA 流都在自己的硬件工作队列中进行管理,优化了流间依赖关系,一个流中的操作将不再阻塞其他流,使流可以并发执行,而无需专门定制启动顺序以消除可能的错误依赖。在基于 MPI 的并行计算机系统中Hyper-Q 具有显著优势。传统的基于 MPI 的算法通常在多核 CPU 系统上运行,分配给每个 MPI 进程的工作量会相应地缩放。这可能会导致单个 MPI 进程的工作量不足,无法完全占用 GPU。虽然多个 MPI 进程可以共享一个 GPU,但这些进程可能会因错误的依赖关系而成为瓶颈。Hyper-Q 消除了这些错误的依赖关系,大大提高了 MPI 进程之间 GPU 共享的效率 30.png
  • 网格管理单元(Grid Management Unit) Kepler 引入的新功能,例如 CUDA 内核能够通过动态并行直接在 GPU 上启动工作,这要求 Kepler 中的 CPU 到 GPU 工作流程提供比 Fermi 设计更多的功能。在 Fermi 上,一个线程块网格将由 CPU 启动,从运行到完成,通过 CUDA 工作分配器CWD (CUDA Work Distributor)创建从主机到 SM 的简单单向工作流。Kepler 允许 GPU 有效地管理 CPU 和 CUDA 创建的工作负载,从而改进了 CPU 到 GPU 的工作流程。Kepler可以像 Fermi 一样从 CPU 启动网格,但 CUDA 也可以在 Kepler SMX 单元中以编程方式创建新的网格。为了管理 CUDA 创建的网格和主机发起的网格,Kepler 中引入了一个新的网格管理单元GMU(Grid Management Unit)。该控制单元管理传递到 CWD 以发送到 SMX 单元执行的网格并确定其优先级。Kepler的CWD中保存已经准备好调度的网格,最多调度32个活动网格,这是Fermi CWD容量的两倍。Kepler CWD 通过双向链路与 GMU 通信,允许 GMU 暂停新网格的调度,并保留待处理和暂停的网格,直到需要。GMU 还与 Kepler SMX 单元直接连接,以允许通过动态并行在 GPU 上启动额外工作的网格并将新工作发送回 GMU,以便进行优先级排序和调度。如果调度额外工作负载的内核暂停,GMU 将使其保持非活动状态,直到相关工作完成 31.png
  • NVIDIA GPUDirect GPUDirect使位于网络上的不同服务器中的 GPU 能够无需经过 CPU的内存直接交换数据。GPUDirect 中的 RDMA 功能允许第三方设备(如 SSD、NIC 和 IB 适配器)直接访问同一系统中多个 GPU 上的内存,从而显著降低到GPU 内存的MPI发送和接收消息的延迟,并且减少了对系统内存带宽的需求,释放了 GPU DMA 引擎供其他 CUDA 任务使用 32.png

下表列出了Fermi和Kepler GPU的计算能力的对比: 33.png

Streaming Multiprocessor (SMX)

SMX包含192 个单精度 CUDA 核、64 个双精度单元、32 个特殊功能单元 (SFU) 和 32 个加载/存储单元 (LD/ST)。 34.png 每个CUDA核有完整流水线的浮点和整数算术逻辑单元。SMX 单元中的计算核使用 GPU 主时钟,而不是 2x 着色器时钟。2x 着色器时钟是在 G80 Tesla 架构 GPU 中引入的,并用于所有后续的 Tesla 和 Fermi 架构 GPU。以更高的时钟速率运行执行单元允许芯片以更少的执行单元实现给定的目标吞吐量,这本质上是一种面积优化,但更快的时钟逻辑更耗电。

SMX 以 32 个并行线程组作为一个warp来调度。每个 SMX 有 4 个 warp 调度器和 8 个指令分发单元,允许同时发射和执行 4 个 warp。4 个 warp 调度器每周期选择选择四个warp,每个warp分发两个独立的指令。Fermi不支持双精度指令与其他指令配对,但是Kepler允许双精度指令与其他指令配对。 35.png Kelper和Fermi的调度器都包含类似的硬件单元来处理调度功能,包括: a) 用于纹理和加载等长延迟操作的寄存器记分板 b) warp间调度决策,用于在符合条件的候选者中选择最优的warp c) 用于线程块级调度的GigaThread 引擎

然而,Fermi的调度器还包含一个复杂的硬件阶段,以防止数据路径本身的数据冒险。多端口寄存器记分板跟踪任何尚未准备好有效数据的寄存器,依赖关系检查器模块根据记分板分析大量完全解码的warp指令的寄存器使用情况,以确定哪些符合发射条件。对于 Kepler,这些信息都是确定的(计算流水线延迟是不变的),因此编译器可以预先确定指令何时准备好发出,并在指令本身中提供这些信息。因此可以用一个简单的硬件模块替换几个复杂且功耗高的模块;该模块提取预先确定的延迟信息,并在warp间调度时使用这些信息来屏蔽warp。 36.png

在GK110中,一个线程可以访问的寄存器数量增加了四倍,每个线程可以访问多达255个寄存器。

为了进一步提高性能,Kepler 实现了一个新的 Shuffle 指令,允许 warp 中的线程共享数据。之前,warp中的线程需要单独的存储和加载操作才能通过共享内存传递数据。使用 Shuffle 指令,warp中的线程可以以任何可以想象的排列方式从warp中的其他线程读取值。Shuffle 支持任意索引引用 - 即从任何其他线程读取任何线程。有用的随机排序子集,包括下一个线程(向上或向下偏移固定量)和warp中线程之间的异或“蝴蝶”样式排列,也可作为 CUDA 内部函数使用。与共享内存相比,Shuffle 存储和加载操作只需一步即可执行。Shuffle 还可以减少每个线程块所需的共享内存量,因为在 warp 级别交换的数据永远不需要放在共享内存中。 37.png 原子内存操作在并行编程中非常重要,支持并发线程对共享数据结构正确执行读-修改-写操作。原子操作(如 add、min、max 和 compare-and-swap)的读取、修改和写入操作的执行不能被其他线程中断。原子内存操作广泛用于并行排序、reduction和并行数据结构,而无需串行化线程执行的锁。与Fermi相比,Kepler GK110/210上的全局内存原子操作的吞吐量提高了 9 倍。Kepler GK110 还扩展了对全局内存中 64 位原子操作的原生支持。除了 atomicAddatomicCASatomicExch之外,GK110 还支持atomicMinatomicMax, atomicAnd, atomicOr, atomicXor。不支持的其他原子操作(例如,64 位浮点原子)可以使用比较和交换 (CAS) 指令进行模拟。

内存结构

Kepler的内存层次结构与 Fermi类似。Kepler 架构支持用于加载和存储的统一内存请求路径,每个 SMX 有一个 L1 缓存。Kepler GK110 还支持编译器直接使用额外的新缓存来存储只读数据。 38.png 在 Kepler GK110 架构中,与上一代 Fermi 架构一样,每个 SMX 都有 64 KB 的片上存储,可以配置为 48 KB 共享存储和 16 KB 的 L1 缓存,或 16 KB 的共享存储和 48 KB 的 L1 缓存;另外,Kepler 还支持共享内存和 L1 缓存之间分配 32KB / 32KB,从而在配置共享内存和 L1 缓存的分配方面具有更大的灵活性。为了支持每个 SMX 单元的吞吐量增加,与 Fermi SM 相比,64b 和更大加载操作的共享内存带宽也增加了一倍,达到每个内核时钟 256B。对于 GK210 架构,可配置内存总量翻了一番,达到 128 KB,最多允许 112 KB 共享内存和 16 KB 的 L1 缓存。其他可能的内存配置包括 32 KB L1 缓存和 96 KB 共享内存,或 48 KB L1 缓存和 80 KB 共享内存。

除了 L1 缓存之外,Kepler 还为已知在函数期间为只读的数据引入了一个 48KB 的缓存。在Fermi 中,只有纹理单元才能访问此缓存。在 Kepler 中,除了显著增加此缓存的容量以及纹理性能外,SM 可以直接访问缓存以进行一般加载操作。使用只读路径可以消除共享/L1 缓存路径的加载和工作集占用空间。此外,只读数据缓存的更高标记带宽支持全速未对齐的内存访问模式。只读路径的使用可以由编译器自动管理,也可以由程序员显式管理。通过使用 C99 标准const __restrict关键字访问已知为常量的任何变量或数据结构,编译器可能会标记以通过只读数据缓存加载。程序员还可以显式地将此路径与__ldg() 内部函数一起使用。

2.8 Maxwell

2014年,NVIDIA发布Maxwell架构;GM200 GPU 采用 Maxwell 2.0 架构,使用台积电的 28 纳米工艺制造,面积 601 mm²,晶体管数量为 80 亿个。下图展示了GM200的物理版图: 39.png GM200 由 6 个 GPC(Graphics Processing Cluster)、24 个SMM和 6 个内存控制器组成。L2缓存一共2MB。 40.png 每个 SMM 包含四个 warp 调度器,每个 warp 调度器每个时钟能够分发一个 warp 的两个指令。每个 SM 总共 128 个 CUDA 核,分成4个块,各有 32 个 CUDA 核,与warp线程数一致,以及用于调度的专用资源和指令缓冲。SMM有单独的96KB共享存储,但是每个线程块最大只能使用48KB;每个 SMM 还有 4 个 DP 单元。 41.png

2.9 Pascal

2016年,NVIDIA推出Pascal架构,GP100采用台积电16nm工艺,面积610 mm²,153亿晶体管;支持8x512位宽的HBM,容量16GB;下图展示了GP100的物理版图,HBM I/O 位于顶部和底部,NVLink 和PCIe I/O 位于左侧: 42.png GP100 是首款支持硬件页面故障的 NVIDIA GPU,结合 49 位 (512 TB) 虚拟寻址,GPU 和 CPU 可以使用统一的虚拟地址空间。GP100 中新增的另一个重要的功能是计算抢占 ,允许以指令级粒度抢占计算任务,而不是像以前的 Maxwell 和 Kepler GPU 架构那样以线程块粒度抢占。计算抢占可防止长时间运行的应用程序独占系统或超时。

GP100 由 6 个 GPC,30 个 TPC(每个包括 2 个 SM),60 个 Pascal SM。 43.png 每个 SM 有 64 个 CUDA 核和 4 个纹理单元。因此,GP100 一共有 3840 个单精度 CUDA 核和 240 个纹理单元。GP100 SM 分为两个处理块,每个处理块有 32 个单精度 CUDA 核、一个指令缓冲区、一个warp调度器和两个分发单元。GP100 SM 的 CUDA 核总数是 Maxwell SM 的一半,但寄存器文件大小相同的,并支持类似的warp和线程块占用。 44.png GP100 SM 有专用64 KB共享内存和 L1 缓存,该缓存也可用作纹理缓存。统一的 L1/纹理缓存充当内存访问的合并缓冲区,在将数据发送到warp之前收集warp里线程请求的数据。每个内存控制器都连接到 512 KB 的 L2 缓存,因此,GP100总共包括 4096 KB 的 L2 缓存。GP100 GPU 连接到四个 HBM2 DRAM 堆栈,每个 HBM2 DRAM 堆栈由一对内存控制器控制;Tesla P100 配备四个 4 芯片 HBM2 堆栈,总共 16 GB 的 HBM2 内存。 45.png

2.10 Volta

2017年,NVIDIA推出Volta架构,V100采用台积电12nm工艺,面积815 mm²,211亿晶体管;V100物理版图如下所示: 46.png 完全版GV100一共6个GPC,每个GPC有7个TPC,每个TPC有2个SM,一共84个SM;V100一共80个SM。 47.png Volta架构一些主要新特性包括:

  • Multi Processor Service Volta 的MPS(Multi Processor Service)可以允许多个应用程序同时在GPU 执行。 但是,由于所有应用程序共享内存资源,因此,如果一个应用程序要求很高的DRAM 带宽,或者其请求超额订阅了 L2 缓存,可能会干扰其他应用程序;并且只支持完整的物理 GPU 粒度使用。 48.png
  • 独立线程调度 Volta 架构引入了对互斥等算法防饥饿的支持,当编译器识别编程语言指定的可见机器步骤时,确保每个线程最终都会取得进展。下面代码用一个保护进入关键部分的简单的自旋锁来说明Volta 架构的新功能。当且仅当调度程序确保每个线程能独立的向前推进时,多个线程才可以同时调用以下示例中的函数demo_A。此自旋锁在 CUDA C++ 1.1 中在语法上是合法的,但在 Volta 架构上的 CUDA C++ 9.0 之前不完全支持:
    enum { unlocked = 0, locked = 1 }; 
    volatile int mutex = unlocked; 
    void demo_A() { 
      /* Among throughput processors, only Volta is guaranteed to run this critical section. */ 
      while(atomicCAS(&mutex,unlocked,locked)==locked) ; 
      mutex = unlocked; 
    }
    

    在之前的设计中,执行发散优化可能会延迟任何线程对关键部分的执行,直到所有线程终止循环,从而导致程序进入活锁状态。Volta 架构中的执行发散优化通过确保没有线程无限期挂起来解决此问题。当保留在循环中的线程执行可见的计算步骤(如原子操作)时,调度程序会为其他线程提供进行等效向前推进的机会。

  • 灵活的屏障 在 CUDA 中,最常见的同步是块中所有线程之间的屏障。如果一个块中的所有线程都调用相同次数的屏障,每个线程中的相应调用会相互同步。这是 CUDA C++ 1.0 屏障原语背后的原始想法,称为__syncthreads() ,如下面的demo_B函数中使用:
    extern bool is_odd(int); 
    extern bool is_even(int); 
    volatile bool is_sound = true; 
    void demo_B() { 
      const int x = threadIdx.x; 
      if(is_odd(x) || is_even(x)) 
      { 
          /* The assertion does not fire on Volta, but may fire on other throughput processors. */ 
          assert(is_sound); 
          __syncthreads(); 
          is_sound = false; 
      } 
    }
    

    这个函数的合理性问题与CUDA和类似的并行系统中对同步的额外限制有关,特别是当Warp执行发散时禁止线程调用__syncthreads() 。例如,demo_B可能会因逻辑运算符||的短路控制流而变得不健全。在 Volta 中引入独立线程调度能够消除限制。

  • 改进的执行收敛性 有些程序具有比任何实现都更趋同的执行潜力。考虑下面具有静态不确定执行分歧的程序:
    extern bool is_equal(int, int); 
    void demo_C() { 
      for(int i = 0;i < 1024; ++i) 
          if(is_equal(threadIdx.x, i)) { 
          /* Other throughput processors run this block with execution divergence, but Volta may avoid it. */ 
          } 
    }
    

    函数demo_C在 SIMT 处理器上执行速度可能很慢,因为线程在执行条件指令时会串行化。预测最里面的块可能被所有线程执行并不足以避免这种串行化。Volta 架构支持的收敛优化可用于此类情况。下面的程序使用 shuffle 操作在线程之间交换值。demo_D使用 CUDA 9.0 中引入的 Cooperative Groups聚合来自整个 Warp 的数据,消除了应用 Warp 优化所需的猜测,并使高性能程序员的工作效率更高。执行路径重新收敛可以看作是性能优化,而 Warp 中的显式同步仍然受支持。

    #include <cooperative_groups.h> 
    int demo_D(int *ptr) { 
      cg::coalesced_group g = cg::coalesced_threads(); 
      int prev; 
      /* Elect the first active thread to perform atomic add. */ 
      if(g.thread_rank() == 0) 
          prev = atomicAdd(ptr, g.size()); 
      /* Broadcast previous value within the Warp and add each active thread’s rank to it. */ 
      prev = g.thread_rank() + g.shfl(prev, 0); 
      return prev; 
    }
    

每个SM有64 个FP32核和32 个FP64核,并且分成4个部分,每一部分有16个FP32核,8个FP64核,16个INT32核,2个混合精度张量核(Tensor Core),一个L0指令缓存,一个warp调度器,一个分发单元,以及64 KB寄存器文件。 49.png Volta SM由四个独立调度的Sub-Core组成。SM 执行 Warp的 SIMT 调度,每个Sub-Core调度器每个时钟可以调度一个 Warp 指令。将数据路径和调度器拆分可以最大限度地提高局部性,并降低数据路径、寄存器文件和调度器的功耗。全局内存加载和存储缓存操作、共享内存 (SMEM) 暂存器操作和纹理 (TEX) 操作将发送到共享内存和 I/O (MIO) 单元。四个 SM Sub-Core将其 MIO 指令发送到共享的 MIO 单元调度执行。MIO 调度器在纹理单元或统一共享内存和 L1 数据缓存上调度执行。TEX单元每个时钟可以执行一个像素的四边形纹理指令,纹理操作所需的数据来自 L1 数据缓存。共享的 MIO 单元在Sub-Core之间提供统一的线程间通信,从而实现高效、协作的线程执行。四个Sub-Core共享一个 L1 指令缓存,每个时钟可以发送四个 Warp 指令。 50.png

每个时钟SM Sub-Core都可以从L0指令缓存中发出一个Warp 指令。指令被发送到本地分支单元 (BRU)、数学分发单元、张量核或共享 MIO 单元。数学分发单元每个时钟可以将一个Warp指令调度到四个执行单元:整数指令 (INT)、32 位浮点指令 (FP32)、64 位浮点指令 (FP64) 和其他超越指令 (MUFU)。数学分发单元能够保持两个或多个执行单元得到充分利用,具体取决于正在执行的程序中的指令组合。每个 SM Sub-Core还包含两个 4x4x4 张量核,Warp 调度器向张量核发射矩阵乘法运算;张量核从寄存器文件接收输入矩阵,执行多个 4x4x4 矩阵乘法,直到全矩阵乘法完成,并将生成的矩阵写回寄存器文件中。 51.png 每个 SM 有8 个张量核,每个Sub-Core有2个;每个张量核每个时钟执行 64(4x4x4) 个浮点运算,SM 中的8个张量核每个时钟总共执行 1,024 次浮点运算。每个张量核在 4x4 矩阵上运行并执行以下操作:D=A×B+C,其中 A、B、C 和 D 是 4x4 矩阵。矩阵乘法输入 A 和 B 是 FP16 矩阵,而累积矩阵 C 和 D 可以是 FP16 或 FP32 矩阵;FP16 乘法产生全精度乘积,然后使用 FP32 与其他中间乘积累加,形成 4x4x4 矩阵乘法。

内存结构

SM的L1 数据缓存为 128 KB,每个时钟最多可执行 32 个线程的加载和存储,最多可提供 128B。L1 数据缓存与 SMEM存储统一,128 KB 的 L1 数据存储中最多可以动态配置96 KB 用作 SMEM。L1 数据缓存加载和存储与 SMEM 加载和存储采用相同的执行路径。因此,L1 加载和存储缓存命与 SMEM 加载和存储有相同的带宽和延迟。所有SM共享6MB的L2缓存。8个512位宽的内存控制器一共提供900 GB/s带宽,支持16 GB HBM2内存。 52.png

2.11 Turing

2018年,NVIDIA推出Turing架构;TU102 GPU采用台积电12 nm工艺,面积754 mm²,包含186亿晶体管, TDP功耗250W,支持384位宽的GDDR6内存,最高24GB。TU102的物理版图如下所示: 53.png TU102 GPU 包括 6 个图形处理集群GPC (Graphics Processing Cluster),36 个纹理处理集群TPC (Texture Processing Cluster) 和 72 个SM(Streaming Multiprocessor)。每个 GPC 都包括一个专用光栅引擎和 6 个 TPC,每个 TPC 包括 2 个 SM。每个 SM 包含 64 个 CUDA 核、8 个 Tensor 核、256 KB 寄存器文件、4 个纹理单元和 96 KB 的 L1/共享内存。SM 中的新 RT Core 处理光线追踪加速。Turing GPU 架构继承了 Volta 架构中首次引入的增强型多进程服务MPS (Multi-Process Service) 功能。 在 Pascal GPU 架构之前,NVIDIA GPU 使用单个多输入/输出 (MIO) 接口作为 SLI 桥接技术,以允许第二个(或第三个或第四个)GPU 将其最终渲染的帧输出传输到物理连接到显示器的主 GPU。Pascal 通过使用更快的双 MIO 接口增强了 SLI 桥接器,提高了 GPU 之间的带宽,允许更高分辨率的输出,并为 NVIDIA Surround 提供了多个高分辨率显示器。Turing TU102使用 NVLink 而不是 MIO 和 PCIe 接口进行 SLI GPU 到 GPU 的数据传输。TU102 GPU 包括两个 x8 NVLink 2 链路,每个链路在两个 GPU 之间提供每个方向 25 GB/秒的峰值带宽(50 GB/秒的双向带宽),支持双向 SLI,但不支持 3 路和 4 路 SLI 配置。 54.png

Turing 引入了一种新的SM,显着提高了着色效率,与 Pascal相比,每个 CUDA 核的性能提高了 50%。这些改进是通过两个关键的体系结构更改实现的:

  • 首先,Turing SM 增加了一个新的独立整数数据路径,可以与浮点数据路径同时执行指令。在之前几代中,执行整数指令会阻止浮点指令的发射
  • 其次,重新设计了 SM 内存路径,将共享内存、纹理缓存和内存加载缓存统一成一个单元。L1 缓存的带宽增加了 2 倍

55.png Turing SM 被划分为四个处理块,每个处理块有 16 个 FP32 核、16 个 INT32 核、两个 Tensor 核、一个 warp 调度器和一个调度单元。每个处理块包括一个新的 L0 指令缓存和一个 64 KB 的寄存器文件。四个处理块共享一个 96 KB 的 L1 数据缓存/共享内存,传统的图形工作负载可以将 96 KB L1/共享内存划分为 64 KB 的专用图形着色器 RAM 和 32 KB 的纹理缓存和寄存器文件溢出区域;而计算工作负载可以将 96 KB 划分为 32 KB 共享内存和 64 KB L1 缓存,或 64 KB 共享内存和 32 KB L1 缓存。Turing对核心执行数据路径进行了重大改造。现代着色器程序通常混合使用浮点算术指令(如 FADD 或 FMAD)以及用于寻址和获取数据的整数加法、用于浮点比较或最小值/最大值处理结果的简单指令;平均每 100 条浮点指令会和36 条整数指令共同执行。之前的着色器体系结构中,非 FP 指令执行时,浮点数据路径会处于空闲状态。Turing在每个 CUDA 核旁边添加了第二个并行执行单元,可以与浮点单元并行执行。

56.png Turing GPU 包括新版本的 Tensor Core 设计,增加了新的 INT8 和 INT4 精度模式。

57.png

Turing 内存结构

Turing SM包含一个 96 KB 的 L1 数据缓存/共享内存,传统的图形工作负载可以将 96 KB L1/共享内存划分为 64 KB 的专用图形着色器 RAM 和 32 KB 的纹理缓存和寄存器文件溢出区域;而计算工作负载可以将 96 KB 划分为 32 KB 共享内存和 64 KB L1 缓存,或 64 KB 共享内存和 32 KB L1 缓存。TU102 GPU 配备 6 MB 二级缓存。Turing 是第一个支持 GDDR6 内存的 GPU 架构,支持384位宽,可以提供 14 Gbps带宽。

58.png

2.12 Ampere

2020年,NVIDIA推出Ampere架构,采用TSMC 7nm FFN工艺,面积826mm^2,一共542亿晶体管;完整GA100物理版图如下所示: 59.png Ampere GPU 中两个 SM 共同组成一个纹理处理器集群TPC,其中 8 个 TPC组成了一个GPU 处理集群(GPC);一共 8 个GPC。因此,GA100 GPU 的完整实现包括以下单元:

  • 8 个 GPC,每个GPC有8 个 TPC,每个TPC有2 个 SM,一共128 个 SM
  • 每个SM有64 个 FP32 CUDA 核,每个完整 GPU 8192 个 FP32 CUDA 核
  • 每个SM有4 个第三代 Tensor Core,每个完整 GPU 512 个 Tensor Core
  • 6 个 HBM2,12 个 512 位内存控制器    A100 基于 GA100,有 108 个 SM;A100 Tensor Core GPU 实现包括以下单元:
  • 7 个 GPC,每个GPC有7 或 8 个 TPC,每个TPC有2 个 SM,最多108 个 SM
  • 每个 SM有 64 个 FP32 CUDA 核,一共6912 个 FP32 CUDA 核
  • 每个SM有4 个第三代 Tensor Core,每个 GPU 432 个Tensor Core
  • 5 个 HBM2,10 个 512 位内存控制器

60.png

SM

每个SM有192 KB 的共享内存和 L1 数据缓存组合;与 V100 和 Turing GPU 类似,A100 SM 还包括单独的 FP32 和 INT32 核,允许同时执行 FP32 和 INT32 操作;许多应用程序都具有执行指针算术计算(整数内存地址计算)的内部循环,这些浮点计算受益于同时执行 FP32 和 INT32 指令。流水线循环的每次迭代都可以更新地址(INT32 指针算术)并加载下一次迭代的数据,同时在 FP32 中处理当前迭代。另外,SM主要增加一些指令和功能包括:

  • 增加新的异步复制指令将数据直接从全局内存加载到共享内存中,可以选择绕过 L1 缓存,并且无需使用中间寄存器文件 (RF)。异步复制可减少寄存器文件带宽,更有效地利用内存带宽,并降低功耗。顾名思义,当 SM 执行其他计算时,可以在后台完成异步复制
  • 用于新的异步复制指令的基于共享内存的屏障单元(异步屏障)。这些屏障可使用 CUDA 11 以符合 ISO C++ 的屏障对象的形式获得。异步屏障将屏障到达和等待操作分开,可用于从全局内存到共享内存的异步复制与 SM 中的计算重叠。可借助这些屏障使用 CUDA 线程实现生产者-消费者模型。屏障还提供了以不同粒度同步 CUDA 线程的机制,而不仅仅是warp或块级别
  • L2 缓存管理和驻留控制的新指令
  • CUDA Cooperative Groups 支持的新warp级reduction指令。 61.png Volta 和 Turing 每个 SM 有 8 个 Tensor Core,每个 Tensor Core 每个时钟执行 64 个 FP16/FP32 混合精度融合乘加 (FMA) 运算。A100 SM 包括新的第三代 Tensor Core,每个核每个时钟执行 256 个 FP16/FP32 FMA 操作;每个 SM 有四个 Tensor Core,每个时钟总共提供 1024 次密集的 FP16/FP32 FMA 操作。Tensor Core支持数据类型包括 FP16、BF16、TF32、FP64、INT8、INT4 和 Binary。Ampere 架构引入了对 TF32 的支持,使 AI 训练能够默认使用张量核心,而无需用修改。非张量运算继续使用 FP32 数据路径,而 TF32 张量核心读取 FP32 数据并使用与 FP32 相同的范围,但内部精度降低,然后生成标准 IEEE FP32 输出。TF32 包括一个 8 位指数(与 FP32 相同)、10 位尾数(与 FP16 相同精度)和 1 个符号位。 62.png 下图比较了 V100 和 A100 FP16 Tensor Core 操作,并将 V100 FP32、FP64 和 INT8 标准操作与 A100 TF32、FP64 和 INT8 Tensor Core 操作进行了比较。 63.png Tensor Core还支持FP64计算,新的双精度矩阵乘加指令取代了 V100 上的 8 条 DFMA 指令,从而减少了取指,调度,寄存器读取开销,以及数据路径功耗和共享内存读取带宽。每个 SM 每周期可计算 64 个 FP64 FMA(或 128 个 FP64 操作)。

A100 Tensor Core GPU 包含新的稀疏 Tensor Core 指令,这些指令跳过对值为零的条目的计算,从而使 Tensor Core 计算吞吐量翻倍。通过新的 2:4 稀疏矩阵定义支持稀疏计算,该定义允许在每个四输入向量中有两个非零值。A100 支持行上 2:4 的结构稀疏性,如图所示: 64.png NVIDIA 开发了一种简单而通用的方法使用这种 2:4 结构化稀疏模式进行推理。首先使用密集权重对网络进行训练,然后应用细粒度的结构化剪枝,最后通过额外的训练步骤对剩余的非零权重进行微调。

内存结构

A100 GPU 包括 40 MB 的L2缓存; L2 缓存分为两个分区,以实现更高的带宽和更低的访问延迟。每个 L2 分区本地化缓存直接连接的 GPC 中的 SM 内存访问数据。相比V100,A100 能够提供2.3 倍的 L2 带宽。硬件缓存一致性在整个 GPU 上维护 CUDA 编程模型。L2 缓存是 GPC 和 SM 的共享资源,位于 GPC 之外。

为了优化容量利用率, Ampere 架构提供了L2缓存驻留控制,可以管理要保留或从缓存中逐出的数据,可以留出一部分 L2 缓存用于持久性数据访问。例如,对于深度推理工作,可以将乒乓缓冲区永久缓存在 L2 中,以便更快地访问数据,同时避免写回 DRAM。对于深度训练中生产者-消费者链,L2 缓存控制可以优化写入读取数据依赖项的缓存。在 LSTM 网络中,可以优先循环权重缓存并在 L2 中重用。

Ampere 架构增加了计算数据压缩功能,以加速非结构化稀疏性和其他可压缩数据模式。L2 压缩可将 DRAM 读/写带宽提高 4 倍,将 L2 容量提高 2 倍。 采用SXM4 的A100 GPU包括 40 GB HBM2,分为五个HBM2,每个有八个存储器芯片;在1215 MHz (DDR) 数据速率下,A100 HBM2 可提供 1555 GB/s的内存带宽。

虚拟化

新的MIG-Multi-Instance (GPU) 功能允许将 A100安全地划分为多达 7 个独立的 GPU 实例,为多个用户提供单独的 GPU 资源来加速应用程序。使用 MIG,每个实例的处理器在整个内存系统中都有独立且隔离的路径。片上交叉端口、L2 缓存组、内存控制器和 DRAM 地址总线都唯一分配给单个实例。这可确保单个用户的工作负载能够以可预测的吞吐量和延迟运行,并具有相同的 L2 缓存分配和 DRAM 带宽。

MIG 可提高 GPU 硬件利用率,同时在不同客户端(如 VM、容器和进程)之间提供确定的 QoS 和隔离。MIG 对于具有多租户用例的 CSP(Cloud Service Provider) 特别有益,可以确保一个客户端不会影响其他客户端的工作或调度,提供增强的安全性并保证客户的 GPU 利用率。下图所示的 A100 GPU 新 MIG 功能可以将单个 GPU 划分为多个 GPU 分区,称为 GPU instances. 65.png

RAS

Ampere 架构 A100 GPU 包括改进错误/故障归因(归因于导致错误的应用程序)、隔离(隔离故障应用程序,以便它们不会影响在同一 GPU 或 GPU 集群中运行的其他应用程序)和包含(确保一个应用程序中的错误不会泄漏并影响其他应用程序)的新技术。这些故障处理技术对于 MIG 尤为重要,可确保共享单个 GPU 的客户端之间的适当隔离和安全性。

使用NVLink 连接的 GPU 有强大的错误检测和恢复功能。远程 GPU 上的页面错误通过 NVLink 发送回源 GPU。远程访问故障通信是大型 GPU 计算集群的一项关键复原功能,可帮助确保一个进程或虚拟机中的故障不会导致其他进程或虚拟机瘫痪。

同时HBM2支持SECDEC(single-error correcting double-error detection),GPU内部L2缓存,L1缓存和寄存器文件也都是用SECDEC进行保护。

2.13 Hopper

2022年,NVIDIA推出Hopper架构,H100采用台积电4nm工艺,面积814mm^2,一共800亿晶体管;下图是H100的物理版图: 66.png

完整的Hopper架构包括

  • 8个GPCs, 72 个TPCs (9 TPCs/GPC), 一共144个 SMs(2 SMs/TPC)
  • 每个SM有128个 FP32 CUDA核, 一共18432 个FP32 CUDA核
  • 每个SM有4个第四代Tensor Core,一共576个
  • 6个 HBM3或HBM2e, 12 个512位的内存控制器
  • 60 MB的 L2缓存
  • NVLink 4.0和PCIe Gen 5

采用SXM5的H100 GPU包括:

  • 8个 GPCs, 66个 TPCs, 一共132个 SMs(2 SMs/TPC)
  • 每个SM有128个 FP32 CUDA核, 一共16896个 FP32 CUDA核
  • 每个SM有4个第四代Tensor Core,一共528个
  • 5个 HBM3,12 个512位的内存控制器,一共80 GB HBM3
  • 50 MB的 L2缓存
  • NVLink 4.0 和PCIe Gen 5

采用PCIe Gen 5的H100 GPU包括:

  • 7或8 个GPCs, 57个 TPCs, 一共114 SM
  • 每个SM有128个 FP32 CUDA核, 一共14592个 FP32 CUDA核
  • 每个SM有4个第四代Tensor Core, 一共456个
  • 5个 HBM2e,12 个512位的内存控制器,一共80 GB HBM2e
  • 50 MB的 L2缓存
  • NVLink 4.0 和PCIe Gen 5

SXM5 和 PCIe H100 GPU 中只有两个 TPC 支持图形处理(即可以运行顶点、几何体和像素着色器)。下图展示了完整的H100的架构框图: 67.png

68.png H100 Tensor Core支持 FP8、FP16、BF16、TF32、FP64 和 INT8数据类型。FP8是H100 Tensor Core新支持的数据类型。如下图所示,Tensor Core 支持 FP32 和 FP16 累加器,以及两种新的 FP8 输入类型:

  • E4M3 有 4 个指数位、3 个尾数位和 1 个符号位
  • E5M2 有 5 个指数位、2 个尾数位和 1 个符号位 69.png E4M3 支持需要更小动态范围和更高精度的计算,而 E5M2 提供更宽的动态范围和更低的精度。与 FP16 或 BF16 相比,FP8 将数据存储要求减半,吞吐量翻倍。

线程块集群(Thread block cluster)功能支持以编程方式控制局部性,其粒度大于单个SM上的单个线程块。这扩展了 CUDA 编程模型,向编程层次结构添加了另一个级别,包括线程、线程块、线程块集群和网格。线程块集群支持跨多个 SM 同时运行的多个线程块,以同步和协作方式获取和交换数据。CUDA 编程模型使用包含多个线程块的网格来利用程序中的局部性。线程块包含在单个 SM 上并发运行的多个线程,其中线程可以使用屏障同步,利用SM 的共享内存交换数据。然而,随着 GPU 增长到 100个 SM 以上,计算程序变得越来越复杂,线程块作为编程模型中唯一局部性单位不足以最大限度地提高执行效率。

线程块集群是一组线程块,保证并发调度到一组 SM 上,其目标是实现跨多个 SM 的线程的高效协作。H100 中的线程块集群在 GPC 内的 SM 之间并发运行。GPC 是硬件层次结构中的一组 SM,在物理上始终靠得很近。线程块群集具有硬件加速屏障和新的内存访问协作功能。GPC 中 SM 使用专用 SM 到 SM 网络在集群中的线程之间提供快速数据共享。在 CUDA 中,网格中的线程块可以选择在线程块启动时分组到集群中,通过CUDA cooperative_groups 使用集群功能。下图左边是由传统 CUDA 编程模型中的线程块组成的网格,右边则是H100的集群层次结构。 70.png

分布式共享内存(DSMEM) 允许跨多个 SM 共享内存块进行直接 SM 到 SM 的加载、存储和原子通信。在一个线程块集群,所有线程都可以通过加载、存储和原子操作直接访问其他 SM 的共享内存。DSMEM 支持更高效的 SM 之间的数据交换,不再需要写入和读取全局内存来传递数据。集群专用的 SM 到 SM 网络可确保快速、低延迟地访问远程 DSMEM。与使用全局内存相比,DSMEM 将线程块之间的数据交换速度提高了约 7 倍。 71.png 在 CUDA 中,集群中所有线程块的所有 DSMEM 段都映射到每个线程的通用地址空间中,因此可以使用简单的指针直接引用所有 DSMEM。CUDA 用户可以利用 cooperative_groups API 构建指向集群中任何线程块的通用指针。DSMEM 传输也可以表示为异步复制操作,使用共享内存的屏障同步。

动态规划DP (Dynamic programming) 动态规划 (DP) 通过将复杂的递归问题分解为更简单的子问题来解决复杂的递归问题。通过存储子问题的结果,无需在以后需要时重新计算它们,DP 算法将指数问题集的计算复杂度降低到线性尺度。DP 通常用于广泛的优化、数据处理和基因组学算法。H100 引入了 DPX 指令,与 Ampere相比,DP 算法的性能提高了 7 倍。这些新指令为许多 DP 算法的内循环提供了对高级融合操作数的支持。

异步执行(Asynchronous execution) Hopper 架构改进了异步执行,并使内存复制与计算和其他独立任务进一步重叠,同时最大限度地减少同步点;主要是张量内存加速器TMA (Tensor Memory Accelerator)和异步事务屏障(asynchronous transaction barrier)。 72.png

TMA(Tensor Memory Accelerator) Tensor Memory Accelerator(TMA)可以在全局内存和共享内存之间传输大块数据和多维张量,满足Tensor Core对数据的需求。TMA 操作使用复制描述符启动,该描述符使用张量维度和块坐标而不是每个元素寻址来指定数据传输。可以指定高达共享内存容量的大数据块,并将其从全局内存加载到共享内存中,或者从共享内存存储回全局内存。TMA 通过支持不同的张量维度(1D-5D 张量)、不同的内存访问模式、reduction等功能,降低寻址开销并提高效率。 73.png TMA 操作是异步的,并利用 A100 中引入的基于共享内存的异步屏障。此外,TMA 编程模型是单线程的,warp 中的单个线程被选择发出异步 TMA 操作(cuda::memcpy_async )来复制张量。因此,多个线程可以使用cuda::barrier等待数据传输完成。TMA 的优势是释放了线程来执行其他独立工作。在 A100上,异步内存复制使用特殊的LoadGlobalStoreShared指令执行,因此线程负责生成所有地址并在整个复制区域中循环。在 Hopper 上,TMA 负责处理一切。单个线程在启动 TMA 之前创建复制描述符,从那时起,地址生成和数据移动将在硬件中处理。TMA 提供了一个更简单的编程模型,因为它在复制张量段时接管了计算步幅、偏移和边界计算的任务。 74.png

异步事务屏障(Asynchronous transaction barrier) 异步屏障最初是在 NVIDIA Ampere 架构中引入的。比如,一组线程在生成数据,并在屏障之后使用这些数据。异步屏障将同步过程分为两个步骤:

  • 首先,当线程生成完其共享数据时,会发出Arrive信号。此Arrive是非阻塞的,因此线程可以自由地执行其他独立任务
  • 最终,当线程需要所有其他线程生成的数据时,线程会执行Wait,这会阻止线程,直到每个线程都发出Arrive信号

异步屏障的优点是在等待时提前到达的线程能够执行独立工作,这种重叠提高了性能。如果有足够的独立执行的线程,则屏障会变得很轻量,因为Wait指令可以立即退休。Hopper 的新功能是 waiting 线程能够休眠,直到所有其他线程到达。在之前架构,等待线程会在共享内存中的屏障对象上spin。

Hopper增加了称为异步事务屏障(asynchronous transaction barrier)的新形式的屏障。异步事务障碍类似于异步障碍,是一个拆分屏障,不仅计算线程到达,还计算事务。Hopper 包含一个用于写入共享内存的新命令,该命令可传递要写入的数据和事务计数。事务计数实质上是一个字节计数。异步事务屏障在Wait命令下阻止线程,直到所有生产者线程都执行了Arrive,并且所有事务计数的总和达到预期值。异步事务屏障是异步内存复制或数据交换的新原语。集群可以进行线程块到线程块的通信,用于具有隐含同步的数据交换,并且集群功能建立在异步事务屏障之上。 75.png

Transformer Engine H100 包括一个新的 Transformer 引擎,使用软件和NVIDIA Hopper Tensor Core 技术来加速 Transformer 的 AI 计算。 76.png 在 Transformer 模型的每一层,Transformer 引擎都会分析 Tensor Core 输出值的统计数据。在了解接下来是哪种类型的神经网络层以及它所需的精度后,transformer engine还可以在将张量存储到内存之前决定将张量转换为哪种目标格式。为了以最佳方式使用可用范围,Transformer engine还使用从张量统计数据计算出的缩放因子将张量数据动态缩放到可表示的范围内。因此,每一层都完全按照其所需的数据范围运行。

内存结构

H100 有 50 MB L2 缓存,并使用分区crossbar,缓存直接连接到分区的 GPC 中的 SM 的本地内存访问数据。L2 缓存驻留控制(residency control)可优化容量利用率,有选择地管理缓存中保留在或被逐出的数据。H100 SXM5 GPU 支持 80 GB(五个堆栈)HBM3 内存,提供超过 3 TB/秒的内存带宽;PCIe H100 提供 80 GB 的HBM2e,内存带宽超过 2 TB/秒。HBM3 或 HBM2e DRAM 和 L2 缓存子系统都支持数据压缩和解压缩技术,以优化内存和缓存的使用率和性能。

2.14 Blackwell

Introduced at NVIDIA GTC 2024, the NVIDIA Blackwell architecture is a new class of AI superchip. Crafted with 208 billion transistors, and using the TSMC 4NP process tailored for NVIDIA, it is the largest GPU ever built. The Blackwell architecture also features the new second-generation Transformer Engine, which uses new Blackwell Tensor Core technology combined with TensorRT-LLM innovations, to enable fast and accurate FP4 AI inference.

NVIDIA GB200 Superchip Incl. Two Blackwell GPUs and One Grace CPU

3 AMD

下图展示了AMD GPU 架构的发展变迁历史: 77.png

  • AMD的GPU的架构始于2008年的Terascale,一共发展了三代,到2010年的Terascale 3;AMD 的 TeraScale 专为可编程图形时代而设计,并通过 DirectX 11 的 DirectCompute API 和基于 VLIW 的架构引入了通用计算。
    • TeraScale 3 (VLIW4) 用 4 路 VLIW 设计取代了之前的 5 路 VLIW 设计;还包含一个额外的曲面细分单元,以提高 Direct3D 11 性能。TeraScale 3 在 Radeon HD 6900 中引入。
  • 2012年,AMD转向GCN(Graphics Core Next)架构,并持续演进到GCN4;GCN(Graphics Core Next ) 架构转向了更具可编程性的交织向量计算模型,并引入了异步计算,使传统图形和通用计算能够高效地协同工作。
  • 2019年,随着对通用计算的性能的追求,发展出了两种架构:
    • 针对游戏进行优化,以最大限度地提高每秒帧数的AMD RDNA
    • 针对计算进行优化,以突破每秒 flops 极限的CDNA 。CDNA删除了加速图形任务的固定功能硬件,例如光栅化、曲面细分、图形缓存、混合,甚至显示引擎;保留了用于 HEVC、H.264 和 VP9 解码的专用逻辑,用于处理多媒体数据的计算工作负载,例如用于对象检测的机器学习。

新的CDNA架构通过新的矩阵计算引擎增强了标量和向量处理,并添加了 Infinity Fabric 技术以扩展到更大的系统,同时提供开放式 ROCm 生态系统开发应用程序。

下图展示了AMD 的 GPU 架构从固定功能到RDNA/CDNA的演进: 78.png

  CDNA CDNA 2 CDNA 3 CDNA 4
工艺技术 7nm FinFET 6nm FinFET 5nm + 6nm FinFET 3nm + 6nm FinFET
晶体管数 256 亿 最高可达 580 亿 最高可达 1460 亿 最高可达 1850 亿
计算单元数 | 矩阵核心数 120 | 440 最高可达 220 | 880 最高可达 304 | 1216 256 | 1024
内存类型 32GB 最高可达 128GB 最高可达 256GB 288 GB
HBM2 HBM2E HBM3 | HBM3E HBM3E  
内存带宽(峰值) 1.2 TB/s 最高可达 3.2 TB/s 最高可达 6 TB/s 8 TB/s
AMD Infinity Cache N/A N/A 256 MB 256 MB
GPU 一致性 N/A 高速缓存 高速缓存和 HBM 高速缓存和 HBM
支持的数据类型 INT4、INT8、BF16、FP16、FP32、FP64 INT4、INT8、BF16、FP16、FP32、FP64 INT8、FP8、BF16、FP16、TF32、FP32、FP64(支持稀疏性) INT4、FP4、FP6、INT8、FP8、BF16、FP16、TF32*、FP32、FP64(支持稀疏性)
产品 AMD Instinct MI100 系列 AMD Instinct MI200 系列 AMD Instinct MI300 系列 AMD Instinct MI350 系列

79.png

3.1 Xbox 360

2006 年,Xbox 360 搭载的处理器包括3个 CPU 核、48 个统一着色器和 512 MB DRAM 主内。下图显示了 Xbox 360 系统核心芯片组件的框图: 80.png

  • 3个相同的 CPU 核共享一个 8 路组关联的 1 MB 二级缓存,运行频率为 3.2 GHz。每个核都包含四路SIMD向量单元。
  • GPU 3D 核有 48 个并行的统一着色器。
  • GPU 还包括 10 MB 嵌入式 DRAM (EDRAM),带宽 256 GB/s,提供可靠的帧和 z 缓冲带宽。
  • 由 GPU 控制的 512 MB 统一主内存GDDR3工作在 700 MHz ,工作速率为 1.4 Gbit/pin/s,总带宽为 22.4 GB/s。

下图显示了 Xbox 360 GPU系统的结构框图: 81.png GPU 由以下功能模块组成:

  • 总线接口单元(BIU) ,和FSB连接,处理 CPU 发起的事务,以及 GPU 发起的事务,例如侦听和 L2 缓存读取
  • I/O 控制器,处理所有内部存储器映射的 I/O 访问,以及通过双通道 PCI-Express 总线 (PCI-E) 与 I/O 芯片之间的事务
  • 内存控制器(MC0、MC1),GDDR3 内存控制器,128 字节交织,包含用于图形的激进地址分片和减少 CPU 延迟的快速路径
  • 内存接口 内存crossbar和非 CPU 传输(如图形、I/O 和显示器)的缓冲。
  • 图形 芯片上最大的模块,包含渲染引擎
  • 高速 I/O 总线 图形内核和 EDRAM 芯片之间是芯片到芯片总线(通过基板),工作频率为 1.8 GHz ,提供 28.8 GB/s带宽。当使用多采样抗锯齿时,仅传输像素中心数据和覆盖率信息,然后在 EDRAM 芯片上扩展 • 抗锯齿和 Alpha/A (AA+AZ)处理像素到样本的扩展,以及 z 检验和 alpha 混合。
  • 视频显示

下图显示了 GPU和 EDRAM的物理版图。GPU芯片采用台积电 90 纳米工艺,包含 2.32 亿个晶体管。EDRAM 芯片采用NEC 90nm 工艺,包含 1 亿个晶体管。 82.png 83.png

  • GPU来自ATI,运行频率为 500 MHz,由 48 个并行、组合向量和标量着色器 ALU 组成;着色器单元分为三个 SIMD 组,每个组有 16 个处理器,总共有 48 个处理器。
    • 每个处理器有一个 5 宽向量单元(总共 5 个 FP32 ALU,一共 240 个单元)组成,每个周期最多可以串行执行两条指令(乘法和加法)。
    • SIMD 组中的所有处理器都执行相同的指令,因此总共最多可以同时执行三个指令线程。
    • 与早期的图形引擎不同,着色器是动态分配的,这意味着没有不同的顶点或像素着色器引擎——硬件会根据负载自动进行细粒度调整。
  • ALU 是 32 位 浮点 ALU,遵循IEEE 754 标准,在舍入模式、非规范化数字(读取时刷新为零)、NaN 处理和异常处理等方面符合图形常见的处理。ALU具有单周期的向量(包括点积)和标量运算。超标量指令在一个指令中对向量、标量、纹理加载和顶点提取进行编码,因此在获取纹理和顶点时,每个周期进行 96 个着色器计算。
  • 16 个纹理获取引擎为着色器提供数据,每个引擎能够在每个周期中生成过滤结果。
  • 16 个具有内置曲面细分的可编程顶点提取引擎,可以使用它们来代替 CPU 几何生成。
  • 16 个插值器。渲染后端可以维持每个周期 8 个像素或每个周期 16 个像素,用于深度和仅模具渲染(用于 z-prepass 或阴影缓冲区)。
  • 专用的 z 或混合逻辑和 EDRAM 保证即使在 4× 抗锯齿和透明度下,每个周期也能保持 8 个像素。z-prepass 是一种对命令列表执行首遍渲染的技术,除了遮挡确定外,不应用任何渲染功能。z-prepass 初始化 z-buffer,以便在应用完整纹理和着色器的后续渲染通道中,丢弃的像素不会在被遮挡的像素上花费着色器和纹理资源。借助现代场景深度的复杂性,此技术可显著提高渲染性能,尤其是对于复杂的着色器程序。

3.2 TeraScale 1

2008年,ATI推出了TeraScale的全新架构,应用在Radeon HD 2000系列产品。这是ATI的第一个统一着色器架构,也是ATI与AMD合并后推出的第一个设计。TeraScale旨在与Pixel Shader 4.0和Microsoft的DirectX 10.0 API完全兼容。下图是Radeon HD 2000的结构框图: 84.png

85.png TeraScale是继 XBOX 360 图形处理器之后统一着色器架构:

  • 新的调度处理器可同时处理数千个线程;
  • 增加指令缓存和常量缓存
  • 320 个离散的独立流处理单元(stream processing unit);
  • 标量 ALU实现了专用分支执行单元
  • 3个专用取指单元,纹理缓存,顶点缓存,加载/存储缓存;
  • 完全支持 DirectX 10.0、Shader Model 4.0

下图展示了统一着色器的架构: 86.png

  • 着色器指令是可变长度的VLIW(超长指令字),包括分支、循环、堆栈操作,屏障等控制流程指令;算术指令有1到7个64位操作数,其中5个标量操作数,2个常量操作数。
  • 着色器处理单元(Shader Processing Unit)由 5 路标量流处理器(stream processor)组成,最多可同时发射 5 个标量 FP32 MAD(乘加),最多支持 5 个整数运算(cmp、逻辑、加法);其中一个流处理单元可以处理超越指令(SIN、COS、LOG、EXP、RCP、RSQ),整数乘法和移位运算。
  • 分支执行单元处理流程控制和条件操作,包括全分支的条件代码生成以及ALU 中直接支持预测。1 MB 的 GPR 空间,用于快速寄存器访问。 87.png

    3.3 TeraScale 2

    2009年,AMD推出TeraScale 2架构,应用在Radeon HD 5870,处理能力是上一代的两倍 – 2.72 Teraflops 和 27.2 Giga Pixels/s。整体上有两个统一着色器引擎SE(Shader Engine) ,每个着色器引擎有一个光栅器(Rasterizer),16 个像素 ROP 单元,10个SIMD Engine,支持248 个并发wavefront,如下图所示: 88.png

每个SIMD Engine有16个Stream Core,如下图所示: 89.png

  • SIMD 引擎可以同时处理来自多个kernel的 Wavefronts,通过通道掩蔽和分支支持Wavefront内的线程发散,使Wavefront中的每个线程具有独立的程序执行路径;
    • Wavefront长度为 64 个线程,其中每个线程可以执行 5 路 VLIW 指令 – 每个时钟执行1/4 Wavefront(16 个线程)分成T0-15、T16-31、T32-47、T48-T63。
  • 每个 SIMD 引擎最多支持 8 个work group(用于线程数据共享);
  • LDS (Local Data Share)和全局内存访问支持byte、ubyte、short、ushort 访问。私有加载和只读纹理读取通过读取缓存(Read Cache )进行,通过 R/W 缓存实现无序共享一致的加载/存储/原子访问;

每个Stream Core最多接收一个 VLIW 指令,支持 5 个ALU 操作或4 个带有 LDS 操作的ALU 操作(每个线程最多 3 个操作数);每个Stream Core单元有5个PE,如下图所示,其中:

  • 4 个 PE(Processing Element),可以支持4 个独立 SP 或整数运算,2 个 DP 加法,1 个 DP fma 或 mult ;
  • 1 个特殊功能 PE,支持1 个 SP 或整数运算,SP 或 DP 超越运算;以及操作数准备逻辑,通用寄存器和数据转发和预测逻辑

90.png

LDS(Local Data Share)用于一个Work Group里的Work Item之间共享数据来提高性能: • 每个 SIMD 引擎的高带宽访问 (1024b/clk),外部 R/W 带宽的两倍 (512b/clk) • 每个 SIMD 引擎的低延迟访问,直接读取(无冲突或广播)0 延迟,LDS 间接操作 1 个 VLIW 指令延迟 • 所有bank冲突都经过硬件检测,并在必要时进行序列化,并支持快速广播读取 • 每个线程组调度的 LDS 空间由硬件分配 ,基址和大小存储在wavefront里以便私人访问 91.png GDS(Global Data Share)与 LDS 类似,不同之处在于它是整个调度网格的共享内存,而不是Work Group, 访问kernel中所有线程之间的全局数据共享内存有25个时钟周期的延迟。GDS与使用常规全局内存优势在于大量线程以少量内存运行(例如追加计数器、缩减)可能会产生阻塞点,并且硬件利用率不足;单独的共享内存 (GDS) 可以释放全局内存,供着色器用于其他wavefront。 92.png

3.4 TeraScale 3

2010年,Radeon HD 6900中引入TeraScale 3 (VLIW4), 用 4 路 VLIW 设计取代了之前的 5 路 VLIW 设计。

3.5 GCN

2011 年,AMD 放弃了 TeraScale 架构,转而采用完全重新设计并基于 RISC 微架构的 Graphics Core Next(GCN),目标之一是开发一款适合游戏和 GPGPU 工作的处理器。CU(Compute Unit)计算单元是 GCN 架构的基本计算单元。AMD Radeo HD 7970 分为 2 个原始(primitive)流水线和 4 个像素(pixel)流水线,有 32 个用于着色的计算单元(CU)和 384 位内存接口。GCN 的像素流水线分为 2 个 RBE 和 3 个内存控制器,内存带宽提高了 50%。整体架构如下所示: 93.png AMD Radeo HD 7970物理布局版图如下所示: 94.png

  • GCN 集成了一个 I/O 内存管理单元 (IOMMU),可以为GPU 透明的映射x86 地址。因此, GCN 中的 DMA 可以访问可分页的 CPU 内存来移动数据,而无需地址转换的开销;同时,虚拟内存是多任务处理的先决条件,因此对内存有竞争需求的应用程序可以安全地共存。在缓存一致性的同时,GCN 通过硬件和驱动程序支持的组合引入了虚拟内存,消除了内存管理中最具挑战性的方面。
  • GCN 命令处理器(Command Processor)负责从驱动程序接收高级 API 命令,并将它们映射到不同的流水线,GCN 中有两个主要流水线。
    • 异步计算引擎 (ACE) 负责管理计算着色器,每个 ACE 都可以处理并行的命令流
    • 图形命令处理器处理图形着色器和固定函数,图形命令处理器可以为每种着色器类型提供单独的命令流,利用 GCN 的多任务处理创建大量任务

GCN中ACE(Asynchronous Compute Engines) 负责所有计算着色器调度和资源分配,可能有多个独立运行的 ACE。

  • 每个 ACE 从缓存或内存中获取命令,并形成任务队列,这是调度的起点。
  • 每个任务都有一个调度的优先级,优先级范围从后台到实时。
  • ACE 将检查最高优先级任务的硬件要求,并在有足够的资源可用时将该任务启动到 GCN 着色器中。
  • 许多任务可以同时执行,由硬件资源限制决定。任务乱序完成,并提前释放资源,因此ACE 必须记录任务以确保正确性。
  • 当任务被分发(Dsipatch)到 GCN 着色器时,任务被分解为多个工作组(wrokgroup),这些工作组被分发到各个计算单元进行执行。
  • 每个周期,ACE 都可以创建一个工作组,并将一个wavefront从工作组调度到计算单元。
  • ACE 通常以独立方式运行,需要使用缓存、内存或 64KB 全局数据共享(Global Data Share)进行同步和通信。
    • 因此,ACE可以形成一个任务图,其中各个任务相互依赖。一个 ACE 中的任务可能依赖于另一个 ACE 或部分图形流水线上的任务。
  • ACE 可以在任务队列之间切换,方法是停止任务并从其他队列中选择下一个任务。例如,如果当前正在运行的任务图由于依赖关系而正在等待来自图形流水线的输入,则 ACE 可以切换到准备好调度的其他任务队列。ACE 将刷新与旧任务关联的任何工作组(Workgroup),然后将新任务的工作组分发到着色器。

Compute Unit

在 GCN 中,每个 CU 包括 4 个独立的用于向量处理的 SIMD 单元。每个 SIMD 单元同时在 16 个工作项上执行单个操作,但每个单元都可以单独的wavefront上工作。这需要找到要并行处理的多个wavefrnts,而不是依靠编译器在单个wavefront内找到独立的操作。

在GCN中,每个SIMD单元有独立的40比特的程序计数器(Program Counter)和指令缓冲(instruction buffer),支持10个wavefronts;因此,一个CU可以同时支持40个wavefront,可以来自不同的workgroup或者kernel。AMD Radeon HD 7970有32个CU,最多同时支持81,920个wabefront.

  • 4个CU组成一个cluster,共享4路组相联32KB L1指令缓存,缓存行64B,一般有8个指令;采用LRU(Least Recently Used )替换算法。L1指令缓存由4个bank组成,每周期可以为4个CU提供32B取指能力;一个CU内的SIMD之间的取指基于Age,调度优先级,指令缓冲利用率来仲裁。
  • 指令进入Wavefront指令缓冲之后,CU每周期采用循环仲裁选择一条SIMD指令进行译码和发射;译码之后最多5条指令发射到执行单元,两个标量执行单元和4个向量执行单元。另外,特殊指令 (NOPs, barriers, halts, 跳过预测向量指令)直接在指令缓冲执行。每个CU有16个缓冲来记录屏障(barrier)指令。
  • CU支持译码和发射7种类型的指令:
    • 分支
    • 标量ALU或标量访存
    • 向量ALU
    • 向量访存
    • LDS(Local Data Share)
    • GDS(Global Data Share)
    • 特殊指令
  • 同时只能发射一条一种类型的指令到SIMD,以避免超额订阅执行流水线;同时为了保证顺序执行,每个指令必须来自不同的wavefront。 95.png GCN CU里的标量流水线对于性能和功耗至关重要,控制流的处理分布在着色器,可以减少延迟并且减少了和中央调度逻辑通信的功耗。 每个CU有8KB的标量寄存器文件,每个SIMD有512个条目,由10个wavefront共享;一个wavefront可以分配112个用户寄存器和几个用于保留架构状态的寄存器。每个寄存器32比特且相连的寄存器可以组成64比特。
  • 第一个标量流水线使用指令编码里的16比特偏移处理条件分支,同时还要负责处理中断和同步。
  • 第二个标量流水线作为AGU(Address Generation Unit),用来从标量数据缓存读取数据;ALU是64比特,并支持包括跳转,调用,返回等控制指令,以及预测。

标量L1数据缓存是只读结构,由于标量流水线主要用于控制流指令,所以没有必要将结果写回到存储空间。标量L1的结构和L1指令缓存类似,16KB,4路组相联,64B缓存行,采用LRU替换算法;4个CU组成的cluster共享L1数据缓存,有4个bank,可以提供16B/cycle性能。

GCN里的SIMD不同于之前的VLIW,在VLIW里需要执行一个wavefront里的操作,会导致两个结果:

  • 编译器决定了性能,如果wavefront里的并行度不够,硬件利用率会比较低
  • 编译器需要小心调度寄存器文件的读写以避免端口冲突;为了避免端口冲突,wavefront不能背靠背的发射ALU操作,因此需要交织wavefront来掩盖延迟。

VLIW非常适用图形应用,但是对于复杂的计算任务需要大量的软件调优并且性能难以预测。GCN架构最大的改变是避免了wavefront内部的指令并行的需求。

由于每个SIMD执行单独的wavefront,向量寄存器文件可以分成独立的4个部分。向量通用寄存器vGPRs(General Purpose Registers)包含64条lane,每条32比特;相连的可以结合成64或128比特。每个SIMD有64KB vGPRs。

每个SIMD包含一个16 lane的向量流水线,兼容IEEE-75单精度和双精度;每条lane可以执行一条单精度融合或非融合的乘加运算或者24比特的整型操作。整型乘加操作对于一个wrokgroup内的地址计算非常有用;一个wavefront在一个周期内发射到SIMD,但是需要4个周期执行完64个work item。 GCN针对多媒体和图形处理也在向量运算单元增加了新的指令;特别是一个4x1的绝对误差和SAD(sum of absolute difference)以及用于8比特颜色32比特像素的4次绝对误差和(Quad SAD)指令。利用这些新指令,一个CU每周期可以执行64个SAD,256个运算。这些指令对于动作识别或视频搜索非常关键。 双精度和32位整型指令在SIMD内降速运行,双精度性能只有单精度的1/2到1/16。更复杂的指令如64位超越函数和除指令由微码实现。

本地数据共享和原子(LOCAL DATA SHARE和ATOMICS)

通信和同步在高性能计算中非常重要,本地数据共享(LDS)是一个显式寻址的内存,充当第三个寄存器文件,专门用于工作组(worjgroup)内的同步或图形的插值。

  • GCN 中的 LDS 容量翻了一番,达到 64KB,有 16 或 32 个 bank(取决于产品)。
  • 每个 bank 包含 512 个 32 位宽的条目。Bank 可以通过多对多交叉开关和 swizzle 单元读写 32 位值。
  • 通常,LDS 每个周期将合并来自两个不同 SIMD 的 16 个通道,因此每 4 个周期完成两个wavefront。自动检测wavefront到 32 个通道中的冲突,并在硬件中解决。访问同一 bank 中不同元素的指令需要额外的周期才能完成。
  • 广播是透明的,可以使用 8、16 或 32 位数据作为操作数。

对于图形,LDS 用于对纹理数据执行全速率插值,并且保证不会因访问模式而发生冲突。对于通用计算核,SIMD 可以在 LDS 中加载或存储数据,以避免 scatter 和 gather 访问污染缓存层次结构,或使用DS来放大缓存带宽。此外,原子单元对于工作组内的高性能同步至关重要,并且可以执行浮点最大值、最小值以及比较和交换作。

LDS 指令需要一个地址、两个数据值和一个目的地:

  • 地址来自 vGPR
  • 目的地可以是vGPR 或直接从 LDS 读取的 SIMD
  • 两个数据值可以来自 L1 数据缓存(用于存储到 LDS)或 vGPR(加载或存储)
  • 与其他设计不同,专用流水线避免使用向量 ALU 指令进行数据移动,例如将 LDS 加载到寄存器 96.png

    EXPORT

    导出单元(EXPORT)是计算单元对固定功能图形硬件以及全局数据共享 (GDS) 的窗口。完成所有计算后,结果通常会发送到图形流水线中的其他单元。例如,像素被着色后,在最终输出到显示器之前,它们通常会被发送到渲染后端进行深度和模板测试,并进行混合。导出单元将图形流水线的可编程阶段的结果写入固定功能阶段,例如曲面细分、光栅化和渲染后端。

GDS 与本地数据共享相同,不同之处在于它由所有计算单元共享,因此它充当所有wavefront之间的显式全局同步点。GDS 中的原子单元稍微复杂一些,可以处理有序的计数操作。

VECTOR MEMORY

计算单元中的 SIMD 每个时钟周期可以执行 128 次浮点运算,因此需要提供足够的带宽来匹配计算资源。GCN 中最重要的变化无疑是缓存层次结构,从紧密关注的图形设计演变为高性能和可编程的层次结构,既适合通用应用,又可以与 x86 处理器集成用于图形。这些变化从计算单元开始,延伸到整个系统。

GCN 内存层次结构是一个统一的读/写缓存系统,支持虚拟内存和出色的原子作性能,不同于前几代使用的单独读缓存和写缓冲。向量内存指令支持可变粒度的地址和数据,范围从 32 位数据到 128 位像素。

  • L1 数据缓存(L1D)为16KB,缓存行64B ,采用LRU 替换,4路组相联结构。
  • 与 L2 和其他缓存采用极其宽松的一致性模型保持一致性。从概念上讲,L1D 缓存是工作组内缓存一致的,并通过 L2 缓存实现最终的全局一致性。
  • L1D 采用带有脏字节掩码的直写、写分配设计。当wavefront指令中的所有 64 个存储都完成后,缓存行将写回 L2。所有数据都是脏数据的行会保留在 L1D 中,而任何部分干净的行都会从 L1D 中驱逐。
  • 还有一些特殊的一致性加载指令可以从 L2 缓存中加载,以确保使用最新的值。一旦 AGU 计算出合并的地址,请求就会探测 L1D 缓存标签。在命中时,缓存会读出完整的 64B 行。对于完全合并的请求,这相当于 16 个数据值或 1/4 的wavefront,尽管较差的局部性可能需要额外的周期。对于计算工作负载,缓存行被写入 vGPR 或 LDS。
  • 存储到 L1D 缓存稍微复杂一些。写入数据必须转换为适当的存储格式,然后将写入地址合并为尽可能少的单独事务,然后再命中缓存并最终写入 L2 缓存。
  • 如果内存请求在 L1D 缓存中缺失,则将其发送到统一且一致的 L2 缓存,该缓存位于着色器核心之外并与内存控制器连。
  • 为了提高效率并减少开销,灵活的内存层次结构也被用于图形,并带有一些专用硬件。地址生成单元每个周期接收 4 个纹理地址,然后计算最近的 16 个采样地址。样本从 L1 数据缓存中读取,并在纹理映射单元或TMU(Texture Mapping Unit)中解压缩。然后,TMU 过滤相邻样本,每个时钟生成多达 4 个最终插值纹理。
    • TMU 输出被转换为所需的格式,并最终写入向量寄存器文件以供进一步使用。格式转换硬件还用于将一些图形内核里的值写到内存。 97.png

      L2 CACHE

      GCN 中的分布式 L2 缓存是 GPU 中一致性的中心点。它充当 CU 集群共享的只读 L1 指令和标量缓存以及每个 CU 中的 L1 数据缓存的后盾。L2 缓存在物理上被分区为耦合到每个内存通道的切片中,访问流通过交叉开关结构从计算单元流向缓存和内存分区。

  • 与 L1 数据缓存一样,L2 是虚拟寻址的,因此不需要 TLB。L2 缓存是 16 路组相联,64B 缓存行,采用 LRU 替换算法;采用写回和写分配设计,因此可以吸收所有 L1 数据缓存的写缺失。每个 L2 切片为 64-128KB,可以将 64B 缓存行发送到 L1 缓存。 L2 缓存一致性的一大优势是,很适合执行全局原子操作和在不同wavefront之间同步。虽然 LDS 可用于wabefront内的原子操作,但在某些时候,不同wavefront的结果需要组合。这正是 L2 发挥作用的地方。一个 L2 切片每个周期可以对缓存行执行多达 16 个原子操作。
  • GCN 中的整体一致性协议是一种混合模型,将 GPU 的性能和带宽与传统 CPU 的可编程性相结合。从概念上讲,L1 数据缓存对工作组内的本地访问保持严格的一致性。在wavefront结束时或调用屏障时,数据被写入 L2 并在 GPU 上变得全局一致。此模型通常被描述为relaxed consistency,相比严格一致性有巨大的优势,低开销提供的数十个高性能本地访问,同时 L2 为程序员提供了友好的一致性
  • 同时,缓存层次结构旨在与 x86 微处理器集成。GCN 虚拟内存系统可以支持 4KB 页,这是 x86 地址空间的自然映射粒度,为将来的共享地址空间铺平了道路。事实上,用于 DMA 传输的 IOMMU 已经可以将请求转换为 x86 地址空间,以帮助将数据移动到 GPU。此外,GCN 中的缓存使用 64B 缓存行,与 x86 处理器大小相同。这为异构系统通过传统缓存在 GPU 和 CPU 之间透明地共享数据奠定了基础,而无需程序员明确的控制。

内存控制器将 GPU 连接在一起,并为系统的每个功能单元提供数据。命令处理器(CP)、ACE、L2 缓存、RBE、DMA 引擎、PCI Express、视频加速器、Crossfire 互连和显示控制器都可以访问本地图形内存。每个内存控制器的宽度为 64 位,由两个独立的 32 位 GDDR5 内存通道组成。对于低成本产品,GDDR5 也可以用 DDR3 内存代替。对于需要较大的内存空间,GDDR5 控制器可以在clasmshell模式下运行,每个通道使用两个 DRAM,从而使容量翻倍。 98.png 现代芯片最大的可靠性问题是片上内存中的软错误soft error(或位翻转)。像 AMD Radeon HD 7970 这样的高端 GPU 拥有超过 12MB 的 SRAM 和寄存器文件,分布在整个 CU 和缓存中。GCN 的片上内存支持 SECDED。第二个可靠性挑战是外部存储器。标准 GDDR5 内存接口使用 CRC 检查传输的数据,并可以重新发送任何损坏的数据。但是,没有 ECC,因此无法知道 DRAM 中保存的数据是否被软错误损坏。GCN 内存控制器具有将 SECDED 应用于 DRAM 的可选模式。受 ECC 保护的数据大约大了 6%,这略微降低了整体内存容量和带宽。

3.6 GCN2

Hawaii是 GCN 1.1, 即GCN2。AMD 显著增强了 GPU 的前端和后端,将它们各自增加了一倍。

  • 前端包含 4 个几何处理器和光栅器对,而在Tahiti上,2 个几何处理器与 4 个光栅器相关联
  • 后端包含 64 个 ROP,而Tahiti为 32 个 ROP
  • 在计算核心方面,从 32 个 CU 增加到 44 个 CU
  • 1MB的L2缓存

99.png Hawaii 里的 GCN 架构与之前相似。计算单元基本完全相同,有 64 个符合 IEEE 754-2008 标准的着色器,分为 4 个向量单元和 16 个纹理获取加载/存储单元。一些修改包括支持标准调用约定的全局平坦地址、对原生 LOG 和 EXP 运算的精度改进,以及对绝对差分的掩码四和Masked Quad Sum of Absolute Difference(MQSAD) 函数的优化,该函数可加快运动估计算法。 100.png CU 的排列方式有所不同,Tahiti有 32 个计算单元,总共 2048 个着色器和 128 个纹理单元,而Hawaii有 44 个 CU,这些 CU 被组织成 AMD 所说的四个着色器引擎,加起来一共 2816 个聚合着色器和 176 个纹理单元。最大的变化是 AMD 将硬件组织为“着色器引擎”。从概念上类似于 NVIDIA 的 SMX,每个着色器引擎 (SE) 包括着色器/CU、几何处理器、光栅器和 L1 缓存。此外,ROP 也被纳入着色器引擎模型中,每个 SE 承担一小部分 ROP。SE 之外的是命令处理器和 ACE、L2 高速缓存和内存控制器,以及各种专用的非重复功能,如视频解码器、显示控制器、DMA 控制器和 PCIe 接口。 101.png Hawaii 还使用了 8 个经过改进的异步计算引擎Asynchronous Compute Engine,负责将实时和后台任务调度到 CU。每个 ACE 最多管理 8 个队列,总共 64 个队列,并且可以访问 L2 缓存和共享内存。 102.png Hawaii采用与 5GHz GDDR5 配对的 512 位内存总线,内存带宽总量达到 320GB/s

3.7 GCN 3 - Radeon R9 Fury X

GCN 1.2 即GCN3最重要功能是 AMD 最新一代的 delta 颜色压缩技术。与Fiji的 ROP 相关联,delta颜色压缩增强了 AMD 现有的颜色压缩功能,增加了基于图块内像素模式和它们之间的差异(即增量)的压缩模式,从而提高了帧缓冲区(和 RT)的压缩频率和压缩量。GCN 3能够以有限的方式在 SIMD 通道之间共享数据,超越了现有的 swizzling 和其他数据组织方式。 中介层芯片超过了 65nm 工艺的标线限制,因此中介层经过精心构造,只有需要连接的区域才能接收金属层。在除去功能单元数量和内存变化的差异后,Fiji的整体逻辑布局接近Hawaii。64 个 CU 的布局方式与之前的 GCN 设计一致,着色器引擎整体组织方式也一样。整个GPU 分为四个部分,每个着色器引擎有 1 个几何单元(geometry unit)、1 个光栅器单元(rasterizer unit)、4 个渲染后端(总共 16 个 ROP),以及16个CU。

具体的,CU 还是以 4 个为一组,每组共享一个 16KB 的 L1 标量缓存和 32KB 的 L1 指令缓存。同时,由于Fiji的 CU 数量是 16 的倍数,这也消除了Hawaii在每个着色器引擎尾端的 3 个 CU 的古怪组。Fiji的 L2 缓存也进行了升级,达到 2MB。 103.png

104.png

3.8 GCN 4 - Radeon RX 480

Polaris 图形架构负责处理图形和计算工作负载,并尽可能高效地执行它们。Polaris 基于 GCN ,

  • 增加了每个区域的 CU 数量以提高原始计算吞吐量,但保留了相同的整体 CU 设计。
  • 改进控制逻辑和固定功能图形硬件,以充分利用可用的计算单元。Polaris 增强了命令处理、几何引擎和内存子系统,以实现比单纯 GCN 更高的性能和更高的能效。

命令处理器从驱动程序接收高级 API 指令(例如 DirectX 或 OpenCL),并将其转换为计算着色器、图形着色器或 DMA 复制命令。

  • 计算任务被映射到多个异步计算引擎 (ACE) 上。每个 ACE 从主机接收单独的命令流,并有八个任务队列。ACE 可以从八个队列中的任何一个队列的头部进行调度。ACE 将异步计算着色器workgroup分发到着色器阵列中
  • 图形流水线包含每种类型的着色器(例如,像素着色器、纹理着色器和同步计算着色器)的队列。图形命令处理器调度图形着色器,并协调固定功能硬件,例如光栅化器。
  • 两个专用的 DMA 引擎处理与 GPU 内存之间的复制命令。

AMD 开创了一种称为异步计算的技术,该技术使 ACE、图形命令处理器和 DMA 引擎能够同时将任务分发到 GPU,而无需上下文切换。并行分发工作组workgroup可大大减少执行延迟并提高吞吐量,从而提高整体性能和响应能力。DirectX 12 和 Vulkan等库里新的低级 API 向开发人员提供了并行控制逻辑,充分利用了异步着色,实现了比早期 API 更高的性能。

Polaris 架构通过两种新的QoS技术增强了命令处理器,旨在提高系统响应能力和性能。

  • 第一种称为快速响应队列Quick Response Queue,开发人员能够通过 API 将计算任务队列指定为高优先级。高优先级任务和常规优先级任务共存并共享 GPU 的执行资源,但 ACE 优先从高优先级任务中分派工作组workgroup。这种优先级方案可确保高优先级任务使用更多资源并优先完成,而无需命令处理器进行上下文切换来排除其他低优先级任务。

  • 第二种QoS即计算单元预留,更加有效和通用。顾名思义,程序员可以使用 API 扩展对 Polaris GPU 的执行资源进行分区,用于计算任务。具体来说,着色器阵列中的计算单元 (CU) 可以为一个 ACE 中的队列保留,确保队列中的工作组有专用资源可用。这是开发人员避免多个任务之间竞争的强大工具。

在“Hawaii”和其他基于 Graphics Core Next ISA 的 GPU 中,硬件设计为支持固定数量的计算队列(每个 ACE 最多 8 个)。但是,从第 3 代和第 4 代 GCN 开始,硬件调度器Hardware Scheduler(HWS) 可以虚拟化这些计算队列。这意味着可以支持任意数量的队列,并且 HWS 会在槽可用时将这些队列分配给可用的 ACE。Polaris 和 GCN 架构图中的每个 ACE 代表一个wavefront/工作组调度器。因此,“Fiji” GPU 和基于 Polaris 架构的 GPU 可以随时从任何计算队列向着色器引擎分配多达四个wavefront/工作组。HWS 单元是双线程微处理器,能够处理两个调度线程,它们的行为可以通过 AMD 的微码更新进行调整。

9 个 CU 被组织成一个着色器引擎,Polaris 架构上最多支持 4 个 SE。每个着色器引擎都与一个几何引擎相关联。Polaris 也有2MB L2 缓存。 105.png Polaris采用 256 位内存总线,比Hawaii的 512 位窄得多。Radeon RX 480 的 4GB 版本包括 7 Gb/s GDDR5,实现 224 GB/s 的带宽; 8GB 型号使用 8 Gb/s 内存,将吞吐量提高到 256 GB/s。下图是基于 Polaris 架构的 Radeo RX 480 GPU 的芯片物理布局图: 106.png

3.9 GCN 5 - VEGA

“Vega” 10 芯片采用TSMC 14 纳米 LPP FinFET 工艺制造,125 亿个晶体管,面积 486 mm^2,最高达到1.67GHz 的Boost频率;一共 64 个下一代计算单元 (NCU),总共有 4,096 个流处理器。“Vega” 10 是第一款使用 Infinity Fabric 互连构建的 AMD 图形处理器,该互连也是“Zen”微处理器的基础。这种低延迟的互连在片上逻辑模块之间提供一致性的通信,并有QoS和安全功能。在“Vega” 10 中,Infinity Fabric 将图形核心和芯片上的其他主要逻辑模块连接起来,包括内存控制器、PCI Express 控制器、显示引擎和视频加速模块。整体架构框图如下所示: 107.png 流处理器支持 16 位packed math,使峰值浮点和整数速率相对于 32 位运算翻了一番, 同时寄存器空间以及处理给定数量的运算所需的数据移动减少了一半。新指令集包括 16 位浮点和整数指令的丰富组合,包括 FMA、MUL、ADD、MIN/MAX/MED、移位、打包作等等。对于可以利用此功能的应用程序,Rapid Packed Math 可以显著提高计算吞吐量和能源效率。对于机器学习和训练、视频处理和计算机视觉等专业应用,16 位数据类型是自然而然的选择,但对于更传统的渲染作也有好处。例如,除了标准 FP32 之外,现代游戏还使用多种数据类型,Normal/direction向量、照明值、HDR 颜色值和混合因子也可以使用 16 位运算。 除了 Rapid Packed Math 之外,NCU 还引入了各种新的 32 位整数运算,可以提高特定场景的性能和效率。其中包括一组八条指令,用于加速内存地址生成和哈希函数(通常用于加密处理和加密货币挖掘),以及最大限度地减少寄存器使用的新 ADD/SUB 指令。NCU 还支持一组 8 位整数 SAD (Sum of Absolute Differences) 运算。这些指令对于各种视频和图像处理算法都非常重要,包括用于机器学习的图像分类、运动检测、手势识别、立体深度提取和计算机视觉。QSAD 指令可以在每个时钟周期内计算 16 个 4x4 像素图块,并将结果累积到 32 位或 16 位寄存器中。可屏蔽版本 (MQSAD) 可以通过忽略背景像素并将计算集中在图像中感兴趣的区域来提供进一步的优化。

108.png GPU 是大规模并行处理器,需要大量数据移动才能实现峰值吞吐量。主要依靠高级存储设备和多级缓存系统的组合来满足:

  • 各种PE的 registers 从一组 L1 cache中读取数据
  • L1 cache又访问一个统一的片上 L2 cache
  • L2 缓存提供对 GPU 专用内存的高带宽、低延迟访问

GPU 通常需要将其整个工作数据集和资源保存在本地内存中,因为替代方案(即通过 PCI Express 总线从主机系统内存中提取数据)无法提供稳定的高带宽或足够低的延迟来保持其以最高性能运行。 “Vega” 架构突破了这一限制,允许其本内存的行为类似于最后一级缓存。如果 GPU 尝试访问当前未存储在本地内存中的数据,它可以通过 PCIe 总线提取必要的内存页并将其存储在高带宽缓存中,而不是强制 GPU 在复制整个缺失资源时停止运行。由于页面通常比整个纹理或其他资源小得多,因此可以更快地复制它们。传输完成后,对这些内存页面的任何后续访问都将受益于更低的延迟,因为它们现在驻留在缓存中。此功能是通过添加称为高带宽缓存控制器 (HBCC) 的内存控制器逻辑来实现的,HBCC提供了一组功能,允许远程内存像本地内存一样工作,而本地内存的行为就像LLC(Last Level Cache)一样。HBCC 支持 49 位寻址,提供高达 512 TB 的虚拟地址空间,足以覆盖现代 CPU 可访问的 48 位地址空间,并且比当今 GPU 通常附带的几 GB 本地内存大几个数量级。HBCC 是适用于服务器和专业应用的革命性技术。对于处理的数据集大小接近系统内存容量的应用程序,基于“Vega”架构的 GPU 能为此类应用程序提供与本地内存相当的有效内存性能,而且未来甚至可以扩展到非易失性存储等大容量存储设备。应用程序可以将此存储容量视为一个统一的大内存空间。如果访问当前未存储在本地高带宽内存中的数据,HBCC 可以按需缓存页面,而最近未使用的页面将交换回系统内存。这个统一的内存池被称为 HBCC 内存段 (HMS,HBCC Memory Segment)。为了从“Vega”的新的缓存层次结构中获得最大收益,所有图形模块都通过L2 缓存进行访问。与以前基于 GCN 的架构不同,在之前架构中,像素引擎拥有自己的独立缓存,并支持更大的数据重用。由于 GPU 的 L2 缓存在新的内存层次结构中起着核心作用,因此基于“Vega”架构的 GPU 设计了大量 L2 缓存。“Vega” 10 GPU 具有 4 MB 的 L2 缓存,是以前高端 AMD GPU 中 L2 缓存大小的两倍。 109.png

4.0 CDNA 1 - MI100

AMD Instinct MI100 GPU 分为几个主要功能模块,这些模块都通过片上互联连接在一起:

  • PCI-Express 4.0 接口,使用 16GT/s 链路将 GPU 连接到主机处理器,例如第 2 代 AMD EPYC CPU,该链路在每个方向上提供高达 32GB/s。
  • 命令处理器接收 API 级命令并为 GPU 的各个组件分配工作。概括地说,任何计算处理器(无论是 CPU 还是 GPU)的三个主要功能是计算、内存和通信,每个功能由不同的模块实现。命令处理器和调度逻辑将更高级别的 API 命令转换为计算任务。这些计算任务反过来又作为计算阵列实现并由异步计算引擎 (ACE) 管理。四个 ACE 中的每一个都维护着独立的命令流,并且可以将wavefront分发到计算单元。

AMD CDNA 架构中 120 个 CU 被组织成四个 CU 阵列。CU 源自之前的 GCN 架构,并执行包含 64 个工作项的wavefront。但是,CU 通过新的矩阵核心引擎(Matrix Core Engine)得到增强,这些引擎针对矩阵数据类型进行了优化,从而提高了计算吞吐量和能效。AMD Instinct MI100 加速器的框图如下,这是第一款由 AMD CDNA 架构提供支持的 GPU: 110.png CU 通过新的矩阵引擎进行增强,以处理 MFMA 指令并提高吞吐量和能源效率。与 GCN 中的传统向量流水线相比,矩阵执行单元具有多项优势:

  • 首先,执行单元减少了寄存器文件读取的次数,因为在矩阵乘法中,许多输入值被重复使用。
  • 其次,较窄的数据类型为不需要完全 FP32 精度的工作负载(例如机器学习)提供优化空间。一般来说,乘累加指令功耗是输入数据类型的平方,因此从 FP32 转移到 FP16 或 bf16 可以节省大量功耗。

经典的 GCN 计算核心包含各种针对标量和向量指令优化的流水线:

  • 每个 CU 包含一个标量寄存器文件、一个标量执行单元和一个标量数据缓存,以处理在wavefront间共享的指令,如公共控制逻辑或地址计算。
  • CU 还包含四个大型向量寄存器文件、四个针对 FP32 优化的向量执行单元和一个向量数据缓存。通常,向量管道是 16 宽的,每个 64 宽的wavefront在 4 个周期内执行。
  • CU 通过 32KB 指令缓存获取指令,并通过调度器分发到执行单元。
  • CU 一次最多可以处理 10 个wavefront,并将其指令分送到执行单元。
  • 执行单元包含 256 个向量通用寄存器 (VGPR) 和 800 个标量通用寄存器 (SGPR)。VGPR 和 SGPR 动态分配给执行wavefront。
    • wavefront最多可以访问 102 个标量寄存器。过多的标量寄存器使用会导致寄存器溢出,从而可能影响执行性能。
    • wavefront可以占据 0 到 256 的任意数量的 VGPR,直接影响占用率;即 CU 中并发激活的wavefront的数量。例如,如果使用 119 个 VGPR,CU 中只能同时有两个wavefront处于激活状态。由于每条 SIMD 指令的指令延迟为 4 个周期,因此需要占用率应尽可能高,以便计算单元可以通过调度多个wavefront的指令来提高执行效率。

AMD CDNA 架构建立在 GCN 的标量和向量基础之上,并将矩阵添加为一等公民,同时增加了对机器学习新数据格式的支持,并保留了为 GCN 架构编写的任何软件的向后兼容性。这些矩阵核心引擎(Matrix Core Engine)增加了一个新的wavefront级指令系列,即矩阵融合乘加MFMA(Matrix Fused Multiply Add)。MFMA 系列指令执行混合精度运算,并使用四种不同类型的输入数据对 KxN 矩阵进行运算:8 位整数 (INT8)、16 位半精度 FP (FP16)、16 位brain FP (bf16) 和 32 位单精度 (FP32)。所有 MFMA 指令都产生 32 位整数 (INT32) 或 FP32 输出,降低了矩阵乘法最后累加阶段溢出的可能性。 不同的数据格式都有不同的推荐应用程序。业界普遍认为,

  • INT8 数值主要用于使用量化权重或数据的 ML 推理,并且具有最佳吞吐量和最低的内存使用率。
  • 大多数 ML 训练和一些 HPC 应用程序默认使用 IEEE FP32 数据,其中 8 位分配给指数用于范围,23 位分配给尾数以保持精度。
  • FP16 是另一个 IEEE 标准,专为图形工作负载设计,使用 5 位指数和 10 位尾数。虽然 FP16 比 FP32 效率高得多,但对于 ML 训练需要调整算法以避免溢出和收敛问题。bfloat16 格式进行了折衷,使用 FP32 的 8 位指数,但将尾数截断为 7 位。bf16 数值更容易用于 ML 训练,收敛问题较少。

下图是AMD CDNA里CU的架构框图: 111.png

内存层次结构

AMD Instinct MI100 加速器的内存层次结构的最低级别位于 CU 内部,但大多数科学或机器学习数据集都以 GB 或 TB 为单位,并且会很快溢出到内存中。内存层次结构负责保存工作数据并将其有效地传送到计算阵列供计算使用。

L2 缓存在整个芯片上共享,并在物理上分区为多个 slice。对于 MI100,L2缓存是 16 路组关联的,总共包含 32 个slice(是 MI50 的两倍),总容量为 8MB。每个slice可以提供 64B/cycle,整个 GPU 的聚合带宽超过 3TB/s(32x64x1.5)。

AMD CDNA架构内存控制器以 2.4GT/s的速度驱动 4 层或 8 层封装的 HBM2 堆栈,总理论吞吐量为 1.23TB/s,容量32GB,提供硬件 ECC 保护。

系统扩展

AMD CDNA 架构使用基于标准的高速 AMD Infinity Fabric 技术连接到其他 GPU。Infinity Fabric 链路速率为 23GT/s ,与上一代类似,宽度为 16 位;但 MI100 有3个IF链路,可在4个 GPU中实现完全连接,提供更大的双分带宽并支持高度可扩展的系统,完全连接的拓扑提高了常见通信模式的性能,例如 all-reduce 和 scatter/gather。与 PCIe 不同,AMD Infinity Fabric 链路支持一致性的 GPU 内存,这使得多个 GPU 能够共享一个地址空间。 112.png

 4.1 CDNA 2 - MI200

MI200是第二代CDNA架构,用于取代上一代MI100, MI200整体结构如下所示: 113.png 通过Infinity Fabric, AMD利用封装技术将多个计算芯粒组成一个芯片,称为MCM(Multiple Chip Module)。 114.png 两个主要的 MI200 加速器(MI250、MI250X)都使用这种方法,其中每个加速器由两个小芯片(“GCD”——图形计算芯片Graphics Compute Die)通过一致性的 4x Infinity Fabric 链路相互连接组成。通过使用多个更小尺寸、产量更高的 GCD 而不是一个大型单片芯片可以提高灵活性和可扩展性。然而,也带来了多个问题:

  • 首先,从软件的角度来看,单个加速器暴漏为两个独立的 GPU。这意味着算法需要具有多 GPU 感知能力,才能充分利用加速器。
  • 其次,尽管通过 4 个高速 IF 链路连接,但芯片到芯片的互联带宽仍然远低于 HBM 内存带宽,导致在 GCD 之间移动数据相当痛苦,并且明显慢于内存访问。这实际上是 AMD 选择将加速器暴漏为两个不同的 GPU 的原因;互联带宽无法匹配两个芯片之间的 HBM 带宽。

这个缺点在 HPC 环境中不会有太大影响。HPC 代码旨在通过使用 MPI 通过高速网络同步和传递数据,从而跨多个节点进行扩展。双芯粒 MI250X 将简单地视为两个 GPU,具有特别快的链路用于在它们之间传递消息。

MI200 GCD的整体架构框图如下所示: 115.png 总体而言,MI200 GCD 的计算架构在 MI100 的先前架构上采用了迭代、进化的方法。芯片分为 4 个计算引擎,每个引擎由一个异步计算引擎提供任务,每个计算引擎分为 2 个着色器引擎,每个着色器引擎有 14 个计算单元 (CU)。

CU的结构框图如下所示: 116.png CU 的结构与 MI100 基本相同。每个 CU 都有

  • 4 个 SIMD16 单元
  • 4 个 Matrix Core 单元
  • 一个调度器
  • 一个 16KB 64 路 L1 缓存、提供 64B/CU/clk 带宽,
  • 加载/存储单元
  • 本地数据共享。

这里的主要区别在于 ALU 现在是原生的 64 位宽。这意味着 MI200 可以全速率执行 FP64,不仅相对于 MI100 的吞吐量增加了 2 倍,而且与 NVIDIA A100 相比也具有相当大的优势,并使 MI200 加速器在 FP64 中略差于下一代 NVIDIA H100。

AMD 还使用此功能支持Packed FP32 指令,从而使某些 FP32操作(FMA、FADD 和 FMUL)的吞吐量增加一倍。然而,这并不是免费的——它需要修改代码才能工作,因为操作数需要相邻并与偶数寄存器对齐。AMD 还包括专用的packed移动指令,对分散的操作数进行排序,以便可以适用packed FP32。寄存器分配是编译器的工作,而不是程序员的工作,但是对于packed FP32,需要指导编译器才能使用此功能,因此需要进行一些修改。 117.png 从 MI100 开始,AMD 在 CU 中添加了矩阵单元。与 NVIDIA 的 Tensor Core 一样,矩阵单元可通过一组新指令进行访问。在 NVIDIA 和 AMD 上,矩阵指令打破了 SIMT 抽象模型,并在整个wavefront(或 NVIDIA 上的 “warp”)上工作。
矩阵操作在两边都有点奇怪。NVIDIA 依赖于向量寄存器文件中的特殊布局。AMD 添加了第二个累加寄存器文件。对于 A * B + C 矩阵运算,MFMA 指令可以从任一寄存器文件获取 A 和 B,但 C 必须来自累加器寄存器文件。

118.png CDNA2 通过删除单独的累加器 RF,提供一个大的统一寄存器文件来改进这一点。在 MI100 中,每个 SIMD16 单元都有 256 个“架构”向量通用寄存器 (VGPR),矩阵核心单元还有 256 个“累加器”寄存器。MI200 将这两者合并为一个具有 512 个条目的统一寄存器文件。对于矩阵运算,统一寄存器文件消除了在寄存器文件之间移动值的潜在麻烦,以确保累加器输入可以来自累加器寄存器文件。统一寄存器文件增加的条目数还有助于减少寄存器压力,并在运行非矩阵代码时可以增加占用率。 119.png MI200 中的矩阵核心单元还支持全速率 FP64,与 MI100 相比,CU 每个周期的 FP64 FLOPS 增加了 4 倍。较低精度的矩阵计算的吞吐量也有所增加,相比MI100,CU每个时钟的 BF16 吞吐量翻了一番。此外,还为 16x16x4 和 4x4x4 模块引入了功耗更低的矩阵指令。 MI200 CU 中的 LDS 改进原子操作,并支持 FP64 原子。这些变化反映并加强了 AMD 在其服务器 GPU 中采用的以 HPC 为中心的方法,非常注重双精度向量性能,而不是较低的精度或矩阵性能。MI250X 的矩阵单元比 CDNA1 中的矩阵单元有所改进,但仍然只能与NVIDIA的 FP64 每 CU/SM 时钟吞吐量相匹配。在处理较低精度的格式时NVIDIA仍然提供更高的矩阵吞吐量,这使得 Hopper 成为 ML 和 AI 工作负载的更好选择。

内存层次结构

每个 GCD 都有一个 8MB 的 16 路 L2 缓存,物理分区为 32 个切片,BW 为 128B/clk/slice,总带宽为 4096B/clk,是 MI100 的 L2 带宽的两倍。与 LDS 一样, MI200 中L2 原子操作也得到了增强,增加了对 FP64 原子的支持。

在内存方面,每个 MI200 GCD 支持4 个 3.2 Gbps HBM2E,容量64GB; 物理上一共 32 个通道,在有效电压下带宽为 64B/clk;每个 GCD一共 1.6 TB/s 的内存带宽,带宽比 MI100 增加了 33%,内存容量增加了 100%。 120.png 与 CDNA 相比,CDNA2 GCD 里CU 略少,但提供了更多的缓存和内存带宽。这种带宽增加可能是必要的,因为 CDNA2 计算单元可以全速率处理 FP64,而 FP64 消耗的内存和内存带宽是 FP32 的两倍。AMD 的 HPC 和消费类 GPU 架构在过去几年中越来越分化,CDNA2 和 RDNA2 的内存子系统截然不同。RDNA2 将廉价的 256 位 GDDR6 设置与非常复杂的缓存层次结构相结合,而 CDNA2 具有简单的两级缓存结构,但是巨大的 L2 和 DRAM 带宽。。

NVIDIA 的缓存方法与 AMD 的相反,在消费类和 HPC 中都提供高的 DRAM 带宽。消费类 GA10x 芯片有高达 6 MB 的 L2,并使用高功耗、高带宽的 GDDR6X 。相比之下,面向 HPC 的 A100 具有 40 MB 的 L2,由 HBM2 提供支持。NVIDIA Hopper 架构类似,并带来了由 HBM3 支持的 50 MB L2。

互联 – Infinity Architecture 3

高速连接是超级计算机与任何旧商用硬件的区别。HPC 程序通过在节点之间传递消息(使用 MPI 等 API)来跨多个节点进行扩展。因此,高速连接对于确保良好的扩展至关重要。HPC 集群还需要复杂的链路拓扑,以便在任意两个节点之间提供尽可能多的带宽,同时最大限度地减少所需的链路数量。MI250X 引入了更复杂的 IF 链路设置,以尽可能最大化带宽。

  • AMD 略微增加了 IF 链路带宽。MI100 的 IF 链路每个方向宽 16 位,以 23 GT/s 的速度运行,每个方向提供 46 GB/s 的带宽,或总计 92 GB/s。MI250X 的 IF 链路保持 16 位宽,但传输速率增加,每个方向提供 50 GB/s,或总计 100 GB/s。
  • AMD 通过不同类型的物理接口提供了更多的 IF 链路,以在物理限制内最大限度地提高带宽。
    • 四个 IF 链路具有封装内接口,允许同一封装芯片中的两个 GCD 以 400 GB/s 的带宽相互通信。
    • 其余三个 IF 链路具有封装间接口,用于与其他 GCD 和主机 CPU 通信。与 MI100 中每个 GPU 三个 IF 链路允许完全连接4个GPU拓扑结构不同 ,MI250X 需要更复杂的拓扑。因为每个 MI250X 卡基都是一个双 GPU 板卡,所以对于1个由4个GPU组成的 HPC 需要连接8个 GCD。AMD 为每个 GCD 提供与对等 MI250X 卡中的两个 GCD 的直接链接。当跨 GCD 通信需要额外的跃点时,可以通过高带宽的封装内链接。这可避免在较低带宽的片间链路上造成拥塞。

121.png AMD 使用 GCD 的第三个片间 IF 链路连接到 CPU。此链路仅在 IF 模式下运行,使用经过专门优化的第 3 代 EPYC CPU(Frontier 中使用的 AMD Trento 平台)。这允许 CPU 和 GPU 之间保持缓存一致性,其中 CPU 缓存其内存和 MI250X 中HBM 内存 。当与其他常规 x86 CPU 连接时,该链路的行为类似于常规 PCIe x16 接口。

MI200 的另一个重大变化是增加了一个下游 25Gbps PCIe 4.0 ESM 链路。这个下游接口耦合到 PCIe RC,使 GPU 能够驱动连接到它的 I/O 设备。因此,GPU 可以直接管理连接到它的设备,而不必依赖 CPU 进行管理。此功能对于超级计算集群中的高带宽的网卡特别有用。进出 IO 设备的流量通常由 DRAM 提供支持,这意味着通过网络控制器移动大量数据可能会占用大量 DRAM 带宽。将 NIC 直接连接到 MI250X GPU 允许 AMD 使用 GPU 的 HBM 内存支持网络流量,该内存带宽比 CPU 的 DDR4 多得多。

4.2 CDNA 3 - MI300

如下图所示,CDNA 3架构利用了最新 3D 封装技术,并从根本上将处理器的计算、内存和通信单元重新分区到异构封装中。MI300 系列集成了多达 8 个垂直堆叠的加速器复合芯粒 (XCD) 和 4 个包含系统基础功能的 I/O 芯粒 (IOD),通过AMD Infinity Fabric连接,并提供 8 个高带宽内存 (HBM) 堆栈。在微架构层面,GPU 内核中向量和矩阵数据的计算吞吐量通过对稀疏数据的支持得到增强。在宏观层面,这种对物理实现的彻底重新思考与完全重新设计的缓存和内存层次结构相结合,该层次结构可以随着计算的增加而优雅扩展,并且还将缓存一致性作为一等公民。 122.png 这种架构为构建 AMD CDNA 3 变体提供了多功能性,例如 MI300X 独立 GPU 或 MI300A APU,如下图所示。

  • MI300X 独立 GPU 主要专注于加速器计算,并包含 8 个加速器复杂芯粒 (XCD)。对于机器学习中常见的低精度数据,MI300X 独立 GPU 提供了显著的代际性能提升,峰值吞吐量为 3.4-6.8 倍,峰值理论 FP8 性能为 2.6 PFLOP/s。对于使用单精度和双精度的传统 HPC 工作负载,计算吞吐量提高了 1.7-3.4 倍,为单个处理器提供了 163.4 TFLOP/S FP64 矩阵计算能力。
  • MI300A APU 将 CPU、GPU 和内存集成在一个封装内。相比MI300X加速器,计算能力降低了 25%,为3个基于 x86 的“Zen 4”CPU 芯粒腾出空间,与 6 个 GPU 芯粒紧密耦合。APU 共享单个虚拟内存和物理内存池,延迟极低。MI300A 是世界上第一款高性能数据中心 APU,通过消除主机/设备数据拷贝,并为开发人员带来极大的易用性,并通过消除 DIMM 和 CPU 到 GPU 通信链路等组件,在系统级别降低功耗和面积。 123.png

AMD CDNA 3 计算架构

计算能力由加速器复合芯粒 (XCD)提供,它包含处理器的计算单元以及缓存层次结构的最低级别,并采用 TSMC 5nm 工艺制造。整体架构如下所示: 124.png 如上图所示,每个 XCD 都包含一组共享的全局资源,包括调度程序、硬件队列和四个异步计算引擎 (ACE),这些引擎负责将计算着色器工作组分发到计算单元 (CU),这些计算单元是 AMD CDNA 3 架构的计算核心。四个 ACE 分别与 40 个 CU 相关联,但只有 38 个活动 CU,其中 2 个用于良率管理而被禁用。38 个 CU 共享一个 4MB 的 L2 缓存,用于聚合芯粒的所有内存流量。相比 AMD Instinct MI200,AMD CDNA 3 XCD 芯粒更小,CU数量 不到一半,但使用更先进的封装,芯片一共包括 6-8 个 XCD,总共多达 304 个 CU,比 MI250X 多出约 40%。

如下图所示,AMD CDNA 3 计算单元是完整的、高度线程化的并行处理器内核,包括指令获取和调度,标量、向量和矩阵执行单元,以及包含 L1 缓存和本地数据共享 (LDS) 的加载/存储流水线,这些构成了内存层次结构的起点。虽然计算单元在架构上与 AMD CDNA 2 中的计算单元相似,但进行了全面改进,整个内核都进行了重大更改,几乎在每个级别都利用了更高的并行性,在许多情况下,每个 CU的向量和矩阵工作负载的性能提高了一倍甚至四倍。 125.png 指令缓存在两个 CU 之间共享,比上一代的容量增加了一倍,达到 64KB,8 路组相联。这种结构利用了这样一个现实,即在绝大多数情况下,相同的指令流将由一组 CU 执行,因此增加可缓存窗口和命中率,同时保持芯片面积几乎不变。AMD CDNA 3 CU 改进了源缓存,以提供更好的重用和带宽放大,以便每个向量寄存器读取都可以支持更多的下游向量或矩阵操作。

AMD CDNA 3 CU 的最大改进在于矩阵内核Matrix Core,通过提高通常用于尖端训练和推理的现有数据类型的吞吐量,以及添加全新的数据类型来支持人工智能和机器学习。机器学习性能的最大杠杆之一是采用更紧凑的数据类型,可以节省内存和缓存容量,提高吞吐量并降低功耗。十年前,大多数机器学习应用程序都依赖于 FP32,但随着时间的推移,社区使用越来越小的数据类型。为了实现最佳训练性能,AMD CDNA 2 矩阵内核支持 FP16 和 BF16,同时提供 INT8 进行推理。AMD CDNA 3 矩阵内核将 FP16 和 BF16 的性能提高了三倍,同时与上一代 MI250X 加速器相比,INT8 的性能提高了 6.8 倍。为了提高 AI 性能,AMD CDNA 3还支持FP8和TF32。

AMD CDNA 3 计算单元中的 LDS 保持在 64KB,类似于 AMD CDNA 2 计算单元。L1 向量数据缓存负责提供数据到向量寄存器文件和 LDS 中,并使执行单元得到充分利用。随着 AMD CDNA 3 计算单元吞吐量的显著提高,向量数据缓存大幅改进以在多个维度上匹配。缓存行大小翻了一番,达到 128B,L1 数据缓存容量也翻了一番,达到 32KB,提高了命中率并减轻了外部缓存级别的压力。此外,从数据缓存到内核本身的请求总线以及从 L2 的填充路径扩展以匹配新的缓存行,从而使内核的带宽增加一倍。保持不变的一点是,向量数据缓存具有非常宽松的一致性模型,需要显式同步才能保持一致性和顺序。

AMD CDNA 3内存层次结构

AMD CDNA 3 架构中最大的变化在于计算单元之外的内存层次结构,该架构已完全重新设计,以充分利用异构小芯片,并为 APU 产品中共同封装的 CPU 小芯片实现缓存一致性。这种内存层次结构的重新设计从 XCD 中的共享 L2 缓存开始。随着 AMD Infinity Cache 的加入,L2 缓存的作用发生了根本性的变化,AMD Infinity Cache 是位于有源 I/O 芯粒 (IOD) 上的最后一级缓存 (LLC)。下图显示了新的内存架构: 126.png 一些更面向内存的功能已被删除并转移到 AMD Infinity Cache,而其他方面则是新的或更突出的。例如,L2 发挥着关键的新作用,因为它是最低级别的缓存,一致性由硬件自动维护。同时,它经过重新设计,为 CU 提供更丰富的资源组合,同时将它们与一致性流量隔离,并优化了与 AMD Infinity Fabric互联网络的接口。L2 的容量是 4MB,16 路组相联,分成16 个通道,每个通道 256KB。L2 缓存由所有 38 个计算单元共享,并为来自较低级别的指令和数据缓存的请求服务。在读取端,每个通道可以读出一条 128 字节的缓存行,而 L2 缓存每个周期可以接受来自不同 CU 的四个请求,每个 XCD 的总吞吐量为 2KB/时钟。16 个通道仅支持半行 64 字节写入,每个通道每个时钟有一个来自 Infinity Fabric 的填充请求。AMD CDNA 2 的每个 L2 缓存实际上有 32 个通道,但最多只有两个实例,而 AMD CDNA 3 总共有多达 8 个实例和高达 34.4 TB/s 的聚合读取带宽。

L2 是一种写回和写分配设计,旨在聚合并减少从 AMD Infinity Fabric 到 AMD Infinity Cache 的访问次数。L2 本身在 XCD 中是保持一致性的。Infinity Cache 包括一个覆盖多个 XCD L2 缓存的监听过滤器(snoop filter),因此来自其他 XCD 的绝大多数一致性请求将在 Infinity Cache 中解析,而不会干扰高度利用的 L2 缓存。

异构集成使 AMD CDNA 3 架构能够整合大量专用于内存层次结构的硅面积。IOD 采用台积电的 6nm 工艺制造,垂直堆叠在一对 XCD 下方,包含全新的 AMD Infinity Cache 和HBM3 接口,并通过 AMD Infinity Fabric 互联网络连接到系统的其余部分。L2 充当每个 XCD 的单点接口,在溢出到 IOD 之前,将所有进出 38 个 CU 的本地内存流量聚合在一起。通道的概念起源于 L2(每个 L2 包含 16 个通道),但在 IOD 及其他内存层次结构的其余部分都至关重要。每个 L2 通过 16 个通道连接到 IOD,每个通道的宽度为 64B,在 IOD 接口上每个 XCD 总共 1KB。

AMD Infinity Cache 是 AMD CDNA 3 架构的全新结构,它通过增加缓存带宽和减少片外内存访问的数量来提高代际性能和效率。通常,GPU 缓存与内存控制器更紧密地对齐并在物理上位于同一位置,对于 AMD CDNA 3 架构来说尤其如此。AMD Infinity Cache 经过精心设计为共享内存侧缓存,这意味着它可以缓存内存数据,并且无法保存从较低级别缓存中驱逐的脏数据。这有两个显着的好处。首先,AMD Infinity Cache 不参与一致性,也不必吸收或处理任何监听流量,这显着提高了效率并减少了从较低级别缓存监听的延迟。其次,它实际上可以保存名义上不可缓存的内存,例如 I/O 缓冲区。

就像 L2 缓存一样,AMD Infinity Cache 是 16 路组相联,并围绕通道的概念构建的。每个 HBM 内存堆栈与 16 个并行通道相关联。一个通道宽 64 字节,连接到 2 MB 的数据阵列支持同时读取和写入。四个 IOD 总共有 8 个 HBM 堆栈,一共 128 个通道和 256MB 数据阵列。Infinity Cache 的峰值带宽达到惊人的 17.2 TB/s,几乎与上一代 L2 缓存的总带宽一样大。除了 AMD Infinity Cache 之外,每个 IOD 通过封装扇出到两个内存堆栈。AMD CDNA 3 架构将内存接口从 HBM2e 升级到最新的 HBM3,速率5.2Gbps,每个堆栈包含 16GB 或 24GB 内存。总的来说,MI300A上容量是128GB 和 MI300X 上的 HBM3 内存容量是192GB, 峰值理论内存带宽是5.3 TB/s 。此外,在 MI300A 中,HBM3 内存在 GPU 和 CPU 之间统一共享,从而大大降低了延迟并提高了通信吞吐量。如下图所示,

127.png

片间互联和扩展

AMD CDNA 2 架构在采用第 3 代 AMD Infinity 架构的功能方面取得了巨大飞跃,包括封装内、封装之间和主机处理器的 AMD Infinity Fabric 技术。AMD CDNA 3 架构在封装内部更广泛地使用第 4 代 Infinity 架构,将通信和扩展提升到一个新的水平,并全面提高了效率和性能。然而,AMD CDNA 3 系列的异构集成为 AMD 提供了独特的机会,可以通过 AMD Instinct MI300X 独立 GPU 和 AMD Instinct MI300A APU 在两个不同的方向上推动可扩展性。对于 AMD CDNA 3,通信链路速率为 32Gbps ,并在 IOD 之间重新分配。每个 IOD 包括两个 16 通道双向封装间 AMD Infinity Fabric 链路,用于连接其他 AMD 加速器。其中一个链路是多用途的,可以配置为 x16 PCIe Gen 5,以实现纯 I/O 功能。

128.png 如上图所示,MI300X 独立 GPU 使用7个高带宽和低延迟的 AMD Infinity Fabric 链路来形成一个完全连接的 8-GPU 系统。每个 GPU 还通过 x16 PCIe Gen 5 链路连接到主机 CPU。这种方法通常使用 OCP 通用基板 (UBB) 外形尺寸,该外形尺寸基于各种行业标准技术构建,可轻松构建和部署系统。与上一代相比,这个 8 GPU 节点本质上更快、更高效,可用于 allreduce 和 allgather 等通信模式,这些通信模式用于机器学习的梯度求和和数据并行分片。对于 MI300A APU,CPU 内核和统一内存的封装集成更具变革性。在上一代产品中,AMD EPYC 处理器和 MI250X GPU 通过两个 AMD Infinity Fabric 链路连接,带宽 144GB/s,延迟是封装级别的。在 MI300A APU 上,封装内的 AMD Infinity Fabric 以芯粒内延迟和接口吞吐量将加速器复合体芯片 (XCD) 和 CPU 复合芯片 (CCD) 直接连接到共享的 Infinity Cache 和 8 堆栈的 HBM3 堆栈中。在节点级别,MI300A APU 还在处理器之间提供比上一代更大的结构带宽。许多 HPC 系统专注于 4 处理器节点,如下图所示,每个处理器都使用两个带宽为 256GB/s 的 AMD Infinity Fabric 链路与其对等节点完全连接。 129.png

AMD CDNA 4 计算架构

First off, a check on where we are at in the journey. In 2023, AMD shipped the Instinct MI300 series. The MI300A found great success at places like HPC with El Capitan (and the GIGABYTE G383-R80-AAP1) while the MI300X series did well at Microsoft Azure for AI. The MI325X is effectively an update to the MI300X much like the NVIDIA H200 updates the H100. The MI350 series is more than that with some architectural changes an a pivot to focus more on AI than HPC. 130.png

131.png 132.png the AMD Instinct MI350 is built in a similar manner to the MI300 and MI325 with the 3D Integration. The new accelerator compute die (XCD) is now on N3P process versus N5 in the previous generation. The I/O die (IOD) is between those XCDs and the interposer. 133.png There are eight 32 CDNA 4 compute units per XCD. With eight XCDs that is 256 compute units total. You may note that is fewer than the full MI300X/ MI325X even with the N3P process shrink. AMD said that it added more compute to CDNA 4, so those are beefier compute units. 134.png Here is the block diagram including the Infinity Fabric and Infinity Cache. You might notice that on the XCD there are several compute units that are different colors. AMD has additional compute units that it can use to help bin chiplets and increase yield by binning for the best CUs. 135.png The AMD Instinct MI350 platforms are based on the OAM UBB (Universal Baseboard), the industry’s standard 8-GPU form factor. The AMD Instinct MI350X air-cooled and MI355X liquid-cooled platforms use the UBB form factor but the liquid-cooled version can scale to 1.4kW with liquid cooling. 136.png AMD’s vision is to use open standards like UltraEthernet Consortium (UEC) and UALink for scale out and scale up. Some of those are next-generation technologies, but for now, the focus is showing the racks with 64 to 128 GPUs per rack and offering up to 36TB of HBM3E memory in a single rack. 137.png As a result, we get designs for up to 128x liquid cooled MI355X GPUs. That is sixteen UBB 8 GPU trays. Even at 2U each, that is 32U worth of GPUs. Even if you have 1U host nodes, that is 48U of rack space which is significant. Remember, the NVIDIA GB200 NVL72 rack is only 72 GPUs in a rack. 138.png

4 Intel Ponte Vecchio

与 Nvidia 的 H100 和 AMD 的 MI210 相比,PVC 没有固定功能的图形硬件,并且缺少显示输出。而H100 和 MI210 仍然具有某种形式的纹理单元。因此,PVC实际上是一个巨大的并行处理器,其编程方式与为计算编程的 GPU 的方式相同。 139.png 140.png PVC 是一场小芯片盛会。 PVC 的计算芯粒采用台积电 5 纳米工艺制造,基本计算单元称为 Xe 内核(Xe Core)。计算芯粒位于 640 mm^2 基础芯粒的顶部,基础芯粒包括 144 MB L2 缓存并使用英特尔的 7 工艺。然后,基础芯粒充当 IO 芯粒,连接到 HBM2e、PCIe 和其他 GPU。PVC 将五个不同的工艺节点组合在同一个封装中,并使用嵌入式桥接(EMIB)或 3D 堆叠将它们连接起来。英特尔 GPU Max 1100实现了 56 个 Xe 内核,时钟频率高达 1.55 GHz。基本芯粒启用了 108 MB 的 L2 缓存,并连接到 48 GB 的 HBM2e 内存,理论带宽为 1.2 TB/s。Max 1100 是300W TDP 的 PCIe 卡,类似于 AMD 的 MI210 和 Nvidia 的 H100 PCIe。 141.png 如果 L1未命中,将继续访问基础芯粒上的 L2。Intel 的 L2 缓存(有时称为 L3)非常大,标称容量为 144 MB。Nvidia 的 Ada Lovelace 架构的完整体 AD102 芯片有 96 MB 的 L2 缓存,而 AMD 的 RDNA 2 有高达 128 MB 的 Infinity 缓存。这两种架构都代表了最近的趋势,即消费类 GPU 使用巨型缓存来避免昂贵的 VRAM 。 142.png

不幸的是,Intel 的 L2 延迟相当高,超过 286 ns。小芯片不是延迟增加的原因,因为 AMD CPU 上的垂直堆叠只会增加几纳秒的额外延迟。一般具有更大缓存的更大 GPU 往往会出现更高的延迟,但 Intel 比 AMD 或 Nvidia 更难解决这个问题。 143.png

TLB 以及 L2 缓存是在基础芯粒上实现的,因此 L1 缓存实际上是VIVT寻址的,命中 L2 可能会导致地址转换延迟。很多 GPU 都这样做,但如果 TLB 查找速度很慢,会增加缓存延迟。高 L2 延迟可以由更大的L1容量来克服。PVC 的 上512 KB 的 L1 和较早之前的 GPU(如 Nvidia 的 GTX 680 或 AMD 的 Radeon HD 6950)上的 L2 容量一样大,也比 AMD 的 RDNA 2 和 3 架构上的 L1 缓存大。与 AMD 和 Nvidia 相比,Intel 的 L2 缓存的访问量应该要少得多,因为 L1 的未命中率会更低。

除了全局内存外,GPU 还有充当软件管理暂存器的本地内存,英特尔称之为共享本地内存 (SLM)。Nvidia 称为共享内存(Shared Memory),AMD 称之为本地数据共享 (LDS)。

PVC 中的每个 Xe Core 有8个 512 位向量引擎,每个周期可进行 16 个 32 位操作。Nvidia 和 AMD 的设计则使用4个分区。H100 的 SM 有4个 32 位宽的 SMSP,或者32 位操作时为 1024 位宽。MI210 的 CU 有4个 16 宽的 SIMD,也是 1024 位宽的,因为每个通道本身都处理 64 位操作。 144.png

PVC 有很多弱点,L2 缓存和 VRAM 延迟太高了,并且FP64 FMA 吞吐量出奇地低。对于PVC,大量的芯片面积却没有带来足够的计算能力,即使和 AMD 的 MI210 相比。不过开发 PVC 时可能获得了不同工艺节点和封装技术的大量经验。 145.png

5 BR100

BR100 是由两个芯粒组成的多芯粒 GPU,采用台积电的 7nm 工艺,频率1 GHz,功耗为550W;每个芯粒的面积为 537 mm2,有 385 亿个晶体管,芯片一共有 770 亿个晶体管。每个芯粒有两个 HBM2E ,为 GPU 提供总共四个 HBM2E 堆栈和 64 GB 的 DRAM,1.6TB/s的存储带宽。计算芯粒和 HBM 使用 TSMC 的 CoWoS(Chip on Wafer on Substrate)封装,芯粒间 896 GB/s 的互联带宽。整体结构如下所示: 146.png GPU 通过PCIe Gen 5 x16连接到主机, 并且支持 CXL。GPU 可以通过8个“BLink”连接,每个提供 64 GB/s 的双向带宽。对于片上网络,BR100 与 Sapphire Rapids (SPR) 等英特尔的服务器 CPU 有很多共同点, 每个处理单元旁边实现一个缓存切片,并且可以将这些缓存切片组合成一个大型的统一缓存。BR100整体架构如下所示: 147.png BR100 计算单元由 SPC(Streaming Processing Cluster) 组成,SPC 的 L2 可以配置为私有暂存器(Scratchpad)或私有缓存。BR100 SPC 主要包括:

  • 16 个EU(执行单元),每个 EU 有:
    • 16 个流处理核心(V 核)
    • 1 个张量引擎(T 核)
    • 40KB TLR(线程本地寄存器, Thread Local Register)
    • 4 个SFU
    • TDA(张量数据加速器, Tensor Data Accelerator)
  • 4 个64KB L1 缓存/LSC(加载和存储缓存)
  • 高达 8MB 的分布式 L2 缓存
    • 保存所有 SPC 的共享数据
    • 可以配置为暂存器(Scratchpad)
    • 内置归约引擎(Reduction Engine)

TDA 专用于使用张量描述符加速地址计算和 OOB,TDA 通过卸载寻址开销和支持不同的张量布局来提高张量数据获取效率。 148.png

V核支持通用计算的全套 ISA,支持 FP32、FP16、INT32、INT16,包括下列功能单元:

  • SFU
  • 加载/存储
  • 数据预处理
  • 管理具有多个同步通道的 T 核
  • 处理如 Batch Norm、ReLu 等运算

BR100支持增强的 SIMT 模型

  • 128K 个线程在 32 个 SPC 上运行
  • 协作Warps (Cooperative Warp) 149.png 与其他 GPU 相比,BR100 上的向量 FP32 较弱。每个 EU 只有 16 个向量 FP32 通道,只有 16 TFLOPS 的理论 FP32 吞吐量。

一个SPC有16 个 T 核,形成2D 脉动阵列;每个 T 核有 2 组 8 x 8 点积 (dp)阵列(BF16 时为 8x 8 x dp8 3D MMA),相当于 64 x 64 矩阵乘法;支持 FP32、TF32、BF16、INT16、INT8、INT4 张量格式。 150.png

Biren设计了TF32+ 张量数据类型 ,宣称在 AI 训练中比 TF32 精确 32 倍 ,

  • E8M15,共 24 位
  • 重用 BF16 乘法器(带 1+7 尾数)并简化 T 核设计
  • 使用张量加速库时自动启动并声明为 FP32 151.png

采用8个GPU全互联进行扩展,每个 BR100 GPU 与其他每个 GPU 互联带宽是双向64 GB/s。 152.png 节点外连接由连接到 PCIe 交换机的 NIC 处理。NIC 不直接连接到 GPU,因此网络流量可能由 CPU 端内存提供支持。如此高带宽的 NIC 会给 CPU 端内存带宽带来很大压力。

Reference

  1. CUDA Programming Guide Version 1.0
  2. CUDA C++ Programming Guide, Release 12.3
  3. McClanahan, C., n.d. History and Evolution of GPU Architecture.
  4. Lindholm, E., Nickolls, J., Oberman, S., Montrym, J., 2008. NVIDIA Tesla: A Unified Graphics and Computing Architecture. IEEE Micro 28, 39–55. https://doi.org/10.1109/MM.2008.31
  5. E. Lindholm and S. Oberman, “The NVIDIA GeForce 8800 GPU,” 2007 IEEE Hot Chips 19 Symposium (HCS), Stanford, CA, USA, 2007, pp. 1-17, doi: 10.1109/HOTCHIPS.2007.7482490.
  6. Montrym, J., Moreton, H., 2005. The GeForce 6800. IEEE Micro 25, 41–51. https://doi.org/10.1109/MM.2005.37
  7. Kilgard, M.J., Moreton, H., n.d. A User-Programmable Vertex Engine.
  8. Wittenbrink, C.M., Kilgariff, E., Prabhu, A., 2011. Fermi GF100 GPU Architecture. IEEE Micro 31, 50–59. https://doi.org/10.1109/MM.2011.24
  9. J. Choquette, O. Giroux and D. Foley, “Volta: Performance and Programmability,” in IEEE Micro, vol. 38, no. 2, pp. 42-52, Mar./Apr. 2018, doi: 10.1109/MM.2018.022071134.
  10. J. Burgess, “RTX on—The NVIDIA Turing GPU,” in IEEE Micro, vol. 40, no. 2, pp. 36-44, 1 March-April 2020, doi: 10.1109/MM.2020.2971677.
  11. NVIDIA Turing Architecture In-Depth [WWW Document], 2018. . NVIDIA Technical Blog. URL https://developer.nvidia.com/blog/nvidia-turing-architecture-in-depth/ .
  12. NVIDIA Ampere Architecture In-Depth [WWW Document], 2020. . NVIDIA Technical Blog. URL https://developer.nvidia.com/blog/nvidia-ampere-architecture-in-depth/ .
  13. Choquette J. et al., “NVIDIA A100 tensor core GPU: Performance and innovation,” IEEE Micro, vol. 41, no. 2, pp. 29–35, Mar./Apr. 2021, doi: 10.1109/MM.2021.3061394.
  14. NVIDIA Hopper Architecture In-Depth [WWW Document], 2022. . NVIDIA Technical Blog. URL https://developer.nvidia.com/blog/nvidia-hopper-architecture-in-depth/ .
  15. NVIDIA H100 Tensor Core GPU Architecture Whitepaper
  16. A. C. Elster and T. A. Haugdahl, “Nvidia Hopper GPU and Grace CPU Highlights,” in Computing in Science & Engineering, vol. 24, no. 2, pp. 95-100, 1 March-April 2022, doi: 10.1109/MCSE.2022.3163817.
  17. J. Choquette, “NVIDIA Hopper H100 GPU: Scaling Performance,” in IEEE Micro, vol. 43, no. 3, pp. 9-17, May-June 2023, doi: 10.1109/MM.2023.3256796.
  18. Jia, Z., Maggioni, M., Smith, J., Scarpazza, D.P., 2019. Dissecting the NVidia Turing T4 GPU via Microbenchmarking.
  19. Jia, Z., Maggioni, M., Staiger, B., Scarpazza, D.P., 2018. Dissecting the NVIDIA Volta GPU Architecture via Microbenchmarking.
  20. Wong, H., n.d. Demystifying GPU Microarchitecture through Microbenchmarking.
  21. Abdelkhalik, H., Arafa, Y., Santhi, N., Badawy, A.-H., 2022. Demystifying the Nvidia Ampere Architecture through Microbenchmarking and Instruction-level Analysis.
  22. Markidis, S., Der Chien, S.W., Laure, E., Peng, I.B., Vetter, J.S., 2018. NVIDIA Tensor Core Programmability, Performance & Precision, in: 2018 IEEE International Parallel and Distributed Processing Symposium Workshops (IPDPSW). pp. 522–531. https://doi.org/10.1109/IPDPSW.2018.00091
  23. Andrews, J., Baker, N., 2006. XBOX 360 SYSTEM ARCHITECTURE. IEEE MICRO.
  24. Mantor, M., Houston, M., n.d. Low Power High Performance Graphics & Parallel Compute.
  25. Mark Fowler. ATI Radeon HD5000 Series : In Inside View.
  26. AMD GRAPHICS CORES NEXT (GCN) ARCHITECTURE
  27. AMD Sea Islands Series Instruction Set Architecture
  28. AMD Graphics Core Next Architecture, Generation 3 Reference Guide
  29. Kanter, D., n.d. The Polaris Architecture  .
  30. Radeon’s next-generation Vega architecture
  31. “AMD Instinct MI100” Instruction Set Architecture: Reference Guide, n.d.
  32. Introducing AMD CDNA ARCHITECTURE - The All-New AMD GPU Architecture for the Modern Era of HPC & AI
  33. “AMD Instinct MI200” Instruction Set Architecture: Reference Guide, n.d.
  34. Introducing AMD CDNA 2 ARCHITECTURE - Propelling humanity’s foremost research with the world’s most powerful HPC and AI accelerator.
  35. AMD CDNA 3 Architecture - The All-new AMD GPU Architecture for the Modern Era of HPC and AI
  36. “AMD Instinct MI300” Instruction Set Architecture Reference Guide, n.d.
  37. M. Hong and L. Xu, “壁仞™ BR100 GPGPU: Accelerating Datacenter Scale AI Computing,” 2022 IEEE Hot Chips 34 Symposium (HCS), Cupertino, CA, USA, 2022, pp. 1-22, doi: 10.1109/HCS55958.2022.9895604.
  38. W. Gomes et al., “Ponte Vecchio: A Multi-Tile 3D Stacked Processor for Exascale Computing,” 2022 IEEE International Solid-State Circuits Conference (ISSCC), San Francisco, CA, USA, 2022, pp. 42-44, doi: 10.1109/ISSCC42614.2022.9731673.
  39. D. Blythe, “XeHPC Ponte Vecchio,” 2021 IEEE Hot Chips 33 Symposium (HCS), Palo Alto, CA, USA, 2021, pp. 1-34, doi: 10.1109/HCS52781.2021.9567038.
  40. H. Jiang, “Intel’s Ponte Vecchio GPU : Architecture, Systems & Software,” 2022 IEEE Hot Chips 34 Symposium (HCS), Cupertino, CA, USA, 2022, pp. 1-29, doi: 10.1109/HCS55958.2022.9895631.
  41. NVIDIA. Nvidia collective communications library. https://github.com/ NVIDIA/nccl
  42. Luebke, D., n.d. GPU Architecture: Implications & Trends.
  43. Hower, D., n.d. GPU Architectures.
  44. Foster, M., Frasch, I., n.d. GPU Architecture and Function.
  45. Luebke, D., Humphreys, G., n.d. GPUs have moved away from the traditional fixed-function 3D graphics pipeline toward a flexible general-purpose computational engine.
  46. Owens, J.D., Houston, M., Luebke, D., Green, S., Stone, J.E., Phillips, J.C., n.d. Graphics Processing Units
  47. McClanahan, C., n.d. History and Evolution of GPU Architecture.
  48. Scalable Parallel Programming with CUDA, n.d.
  49. J. Nickolls, “GPU parallel computing architecture and CUDA programming model,” 2007 IEEE Hot Chips 19 Symposium (HCS), Stanford, CA, USA, 2007, pp. 1-12, doi: 10.1109/HOTCHIPS.2007.7482491.
  50. Buck, I., n.d. The Evolution of GPUs for General Purpose Computing.
  51. Nickolls, J., Dally, W.J., 2010. The GPU Computing Era. IEEE Micro 30, 56–69. https://doi.org/10.1109/MM.2010.41
  52. Gebhart, M., Johnson, D.R., Tarjan, D., Keckler, S.W., Dally, W.J., Lindholm, E., Skadron, K., 2012. A Hierarchical Thread Scheduler and Register File for Energy-Efficient Throughput Processors. ACM Trans. Comput. Syst. 30, 1–38. https://doi.org/10.1145/2166879.2166882
  53. Fung, W.W.L., Sham, I., Yuan, G., Aamodt, T.M., n.d. Dynamic Warp Formation and Scheduling for Efficient GPU Control Flow.
  54. Gebhart, M., Johnson, D.R., Tarjan, D., Keckler, S.W., Dally, W.J., Lindholm, E., Skadron, K., n.d. Energy-efficient Mechanisms for Managing Thread Context in Throughput Processors.
  55. Narasiman, V., Shebanow, M., Lee, C.J., Miftakhutdinov, R., Mutlu, O., Patt, Y.N., 2011. Improving GPU performance via large warps and two-level warp scheduling, in: Proceedings of the 44th Annual IEEE/ACM International Symposium on Microarchitecture. Presented at the MICRO-44: The 44th Annual IEEE/ACM International Symposium on Microarchitecture, ACM, Porto Alegre Brazil, pp. 308–317. https://doi.org/10.1145/2155620.2155656
  56. Owens, J.D., Luebke, D., Govindaraju, N., Harris, M., Krüger, J., Lefohn, A.E., Purcell, T.J., 2007. A Survey of General-Purpose Computation on Graphics Hardware. Computer Graphics Forum 26, 80–113. https://doi.org/10.1111/j.1467-8659.2007.01012.x
  57. Arora, M., n.d. The Architecture and Evolution of CPU-GPU Systems for General Purpose Computing.
  58. Guz, Z., Bolotin, E., Keidar, I., Kolodny, A., Mendelson, A., Weiser, U.C., 2009. Many-Core vs. Many-Thread Machines: Stay Away From the Valley. IEEE Comput. Arch. Lett. 8, 25–28. https://doi.org/10.1109/L-CA.2009.4
  59. M. Gebhart, S. W. Keckler, B. Khailany, R. Krashinsky and W. J. Dally, “Unifying Primary Cache, Scratch, and Register File Memories in a Throughput Processor,” 2012 45th Annual IEEE/ACM International Symposium on Microarchitecture, Vancouver, BC, Canada, 2012, pp. 96-106, doi: 10.1109/MICRO.2012.18.
]]>
From 910 To Cloudmatrix http://zhifeiding.github.io/programming/2025/04/23/from-910-to-CloudMatrix/ 2025-04-23T00:00:00+00:00 http://zhifeiding.github.io/programming/2025/04/23/from-910-to-CloudMatrix 概述

华为从2019年发布昇腾910(Ascend 910)到今年的CloudMatrix计算系统,在6年时间里完成了从芯片到系统的整合;从910不够成熟的互联方案到910C 完整的芯片和网络互连解决方案 ,在有限的资源和限制下对业务的需求的取舍,值得深入的探讨。同时,由于各种原因,关于910从芯片到系统,仿佛有一层薄雾,各类信息参差不齐,让人很难一睹全貌。本文基于网络上已有的资料,试图从芯片架构,计算结构,存储层次,互联方案等各方面揭露910的神秘面纱。

下表是910到910C的一些基本指标信息: 0.png 可以看到,不同产品之间很明显的继承和演变脉络:

  • 910可以看成是AI计算和应用还方兴未艾时的试水,所以从当前LLM的需求,910在计算尺寸,互联等方面存在较为明显的缺陷
  • 910B则是在各种限制约束下,基于910展现出来的缺点进行了增加,同时减少迭代时间,快速推出产品,小步快跑

Ascend 910

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

Ascend 910 SoC架构

昇腾910采用chiplet方案,一共8个die,4个HBM,2个dummy die,1个soc die,一个NIMBUS die;其中两个dummy die用来保持芯片整体机械应力平衡; 四个HBM总带宽为 1.2TB/s;昇腾910整体布局如下图所示: 1.png 不同die的面积如下所示: 2.png Ascend 910 SoC 包含

  • 5个D2D
  • 4个cluster,一共32 个 Ascend-Max Core
  • 16个 Arm V8 TaiShan CPU 内核和 8M CPU L3
  • 32MB on chip buffer
  • 4个HBM2 , 32GB, 1.2TB/s
  • PCIe 3 x16 RC/EP
  • 3x30GB/s HCCS
  • 2x12.5GB/s HCCN
  • 视频编解码器(Digital Vision Pre-Processor),支持128路的全高清视频解码
  • 片上网络 (NoC)。NoC采用4x6的mesh拓扑,以提供统一且可扩展的通信网络;两个相邻节点之间的链路工作频率为 2GHz,数据位宽为 1024 位,可以提供256GB/S 的带宽

SoC die和Nimbus die架构框图如下所示: 3.png

其中soc die主要用来计算,采用台积电7nm工艺,面积456mm^2,可以提供512TOPS的INT8性能;soc die的物理规划如下所示: 4.png

Ascend 910 计算架构

Ascend 910计算核是DaVinci架构,称为Ascend -Max,包括:

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

DaVinci架构框图如下所示: 5.png

DaVinci核内部的异步并行计算过程

  • Scalar计算单元读取指令序列,并把向量计算、矩阵计算、数据搬运指令发射给对应单元的指令队列,向量计算单元、矩阵计算单元、数据搬运单元异步并行执行接收到的指令。
  • 不同的指令间有可能存在依赖关系,为了保证不同指令队列间的指令按照正确的逻辑关系执行,Scalar计算单元也会给对应单元下发同步指令。

Ascend 910 存储结构

DaVinci核存储层次包括核内的L0,L1 缓冲区构成的本地存储(Local Memory),以及外部HBM/LPDDR构成的全局存储区(Global Memory):

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

DaVinci核心组件有三个计算单元,标量计算单元、向量计算单元,矩阵计算单元。另外还有一个DMA搬运单元,DMA搬运单元负责在Global Memory和Local Memory之间搬运数据;DaVinci核数据处理的基本过程:

  • DMA把数据搬运到Local Memory,Vector/Cube计算单元完成数据计算,并把计算结果写回Local Memory
  • DMA把处理好的数据搬运回Global Memory

Ascend 910的存储结构和数据流结构如下所示: 6.png

Ascend 910 互联架构

每台昇腾910服务器包含

  • 8个昇腾910芯片,并分为两组;
  • 组内连接基于高速缓存一致性网络HCCS (high-speed cache coherence network),提供30GB/S带宽 。
  • 两个组使用 PCI-E 总线相互通信,提供32GB/S带宽。
  • 整体形成hyper cube mesh网络拓扑。

7.png

多台昇腾910服务器可以通过fat-tree的网络拓扑组织成一个集群。下图展示了一个 2048 节点的集群,可以提供512 Peta FLOPS的 fp16 总计算能力,包含 256 台服务器,服务器之间的链路带宽为 100Gbps。 8.png

Ascend 910 编程模型

DaVinci核三个计算单元和 MTE 并行工作,因此需要显式同步来确保不同执行单元之间的数据依赖关系。下图展示了相应流程:

  • PSQ 不断向不同的单元发送指令,这些指令可以并行处理,直到遇到显式同步信号(屏障);
  • 屏障由编译器或程序员生成。 9.png Ascend 910主要采用SPMD(Single-Program Multiple-Data)编程方式利用数据并行:
  • 将数据分片,每片数据经过完整的一个数据处理流程。
  • 每份数据的处理运行在一个核上,这样每份数据并行处理完成,整个数据也就处理完了。

Ascend C是SPMD(Single-Program Multiple-Data)编程语言,多个DaVinci核共享相同的指令代码,每个核上的运行实例唯一的区别是就是block_idx(内置变量)不同,可以通过block_idx来区分不同的核,只要对Global Memory上的数据地址进行切分偏移,就可以让每个核处理自己对应的那部分数据了。算子被调用时,所有的计算核心都执行相同的实现代码,入口函数的入参也是相同的。每个核上处理的数据地址需要在起始地址上增加block_idx*BLOCK_LENGTH(每个block处理的数据长度)的偏移来获取。这样也就实现了多核并行计算的数据切分。Ascend C主要提供的API接口如下: 10.png

Ascend 910B

昇腾910B(Ascend 910B) 是华为2023年发布产品,计算部分采用达芬奇架构。在910的基础上主要是提高了互联能力,主要功能模块包括:

  • 25 个 Ascend Core
  • 提供280-414 FP16算力,主要是生产工艺和产品筛片划分产品规格非常多
  • 6 个 D2D,带宽数据存疑,不过考虑通过基板互联,带宽可能在TB/s以下
  • 8 个 Arm V8 TaiShan CPU 内核和 8M CPU L3
  • 256MB LLC
  • 4个HBM2e, 64GB, 1.6TB/s
  • 1个PCIE Gen5 x16
  • 7个4x56G HCCS
  • 1个4x56G HCCN
  • 支持Dragonfly组网
  • 视频编解码器(Digital Vision Pre-Processor),支持128路的全高清视频解码?这个存疑
  • 一个片上网络 (NoC)。NoC采用4x6的mesh拓扑,以提供统一且可扩展的通信网络;两个相邻节点之间的链路工作频率为 2GHz,数据位宽为 1024 位,可以提供256GB/S 的带宽 ?这个也存疑

910B和910的物理版图如下: 11.png

主要变化是去掉了910上的Nimbus die, 提高了HCCS的数量和带宽,Ascend Core的Cube计算尺寸可能也有增加。两个910B上的HBM是组成NUMA还是UMA不太确定,不过考虑到D2D的性能,可能NUMA比较合适。

Ascend 910C

昇腾910C(Ascend 910C) 是华为2024年发布产品,主要是2片910B通过D2D在基板互联组成MCM,如下图所示: 12.png 因此,Ascend 910C主要包含:

  • 2个 910B, 通过基板互联
  • HBM 8个,128GB, 3.2TB/s
  • 提供800T FP16算力
  • 7x2x25GB/s HCCS
  • 1x2x25GB/s HCCN

910C主要采用交换机组网进行互联扩展,简单猜测,如果要用满HCCS互联带宽,应该需要两个910B上的计算核同时往自己本地的HCCS进行数据传输,也就是HCCS也是NUMA结构,在外面把两个200G的HCCS合并成一个400G的,然后接到一个400G的光模块上。

后续的主要信息来源于Semianalysis, 不做过多解读。

Semianalysis预测910C的8卡基板设计如下:

  • 8个 910C
  • 56个Scaleup光模块
  • 8个Scaleout光模块
  • 支持交换机Scaleup

13.png

Ascend 910C 互联架构

Ascend 910C一个互联节点称为CloudMatrix ,包含:

  • 384个 910C
  • 12个计算服务器机柜
  • 4个网络交换机柜
  • 6912个光模块=384x7x2 + 384x1x2,采用LPO,相比DSP的光模块减少功耗

384个 910C通过交换机组成全互联拓扑,每个910C的互联带宽是7x56GB/s。CloudMatrix如下所示: 14.png

下表是Semianalysis统计的CloundMatrix 384和NVIDIA NVL72的规格对比 15.png CloudMatrix能够提供300 PFLOPs BF16计算性能, 是NVL72的1.7倍,3.6倍的存储容量和2.1倍的存储带宽;代价是3.9的功耗。总结下来,CloudMatrix 每FLOP的功耗是NVL72的2.3倍;每TB/s的存储带宽的功耗是NVL72的1.8倍;每TB的存储容量的功耗是NVL72的1.1倍。

每个计算机柜有32个910C,12个计算机柜,一共12x32=384个910C。 16.png 中间4个交换机机柜是CloudEngine 16800, 每个交换机有768个400G的接口,910C需要的400G接口数量384x7=2688个,这样每个CloudEngine需要使用的接口数量2688/4=672个,如下所示: 17.png

下表是根据上面的拓扑估算的成本对比: 18.png

CloudMatrix 384 Scale Out Topology

Semianalysis预估了CloudMatrix做Scale out的拓扑方案,如下所示: 19.png CloudMatrix 384采用two-tier 8-rail 的互联拓扑,因此需要8个leaf交换机,每个交换机需要384x2个400G,一边和910C连接,一边和Spine交换机连接;每个Pod有8个CloudMatrix 384, 一共384x8=3072个910C,因此需要3072个400G光模块;3个Pod互联需要384x8x3=9216个400G,所以需要9216/768=12个Spine交换机。

]]>
我的2024 http://zhifeiding.github.io/programming/summary/2024/12/31/%E6%88%91%E7%9A%842024/ 2024-12-31T00:00:00+00:00 http://zhifeiding.github.io/programming/summary/2024/12/31/我的2024

明日复明日,明日何其多

时光最是无情,不论是平静的岁月,还是忙碌的日子,抑或是激情的拼搏,总是日升月落,不紧不慢;时钟的嘀嗒,从绽放新叶的初春,炎炎烈日的夏天,五彩斑斓的秋日,到北风凌冽的寒冬,一声一声催人老。总是在不经意间,蓦然发现,又到了写年终总结的时候。每到这个时候,才发现年初立下的目标,许下的心愿,原来还有这么多遗憾。

  • 局限 回想当初,也是怀着要拯救中国芯片行业的崇高使命进入这个行业的;10多年的打磨也算是成为了一个合格的芯片从业者,可是也被重重说不清道不明的网局限在了硬件的小圈子里,有时感觉都被数字电路的0和1重塑了世界观,对于不同的观点和意见不是黑就是白,其他都是不能存在的状态。芯片行业处于产业链的上游,所以 离应用太远,和市场脱节,总有闭门造车的疑惑。
  • 行业 随着资本退潮,芯片行业也由之前的烈火烹油,大上快干的状态逐渐恢复到原本波澜不惊,少有人问津的冷清。唯一值得庆幸的是,半导体行业目前还能在AI的大浪潮下有一些起起伏伏,不至于一潭死水。
  • 发展 希望后面能够有机会从芯片底层往上层走走,看看不同的风景,或许可以有一些新的发现。硬件在几十年的发展中积累了太多了经验和教训,这些既是行业的宝贵财富,同时也是从业者厚重的茧,将人的视野一层又一层的圈在这些规则里。就像CPU,在我眼里可能只是一个不断的从给定地址里取数据,然后解析,做一些简单操作,最后再写到给定地址的循环动作;但是在上层应用里,有了CPU,就相当于牛顿有了苹果,可以算天文地理。所以,新的一年,希望能有更多时间和精力关注上层的需求,离应用近一些,更靠近产品。
]]>
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.
]]>