从逻辑门构建乘法累加单元
芯片设计的起点并非复杂的处理器,而是最基础的逻辑门(Logic Gates)。Reiner Pope 首先展示了如何仅使用与门(AND)、或门(OR)和非门(NOT)构建出加法器,进而组合成乘法累加(Multiply-Accumulate, MAC)单元。这是所有现代计算硬件的核心原子操作。在数字电路中,每一个比特(bit)的运算都依赖于晶体管的状态切换。通过级联多个全加器,我们可以处理多位数的加法,而乘法则可以分解为一系列的移位和加法操作。这种自底向上的构建方式揭示了复杂计算功能的物理基础:所有的智能计算最终都还原为简单的布尔逻辑运算。这种基础架构的稳定性是所有上层抽象的前提,无论是简单的微控制器还是超级计算机的GPU集群,其底层逻辑门的行为遵循相同的物理定律。
"We start with basic logic gates and work our way up to why GPUs, TPUs, FPGAs, and the human brain each look the way they do."
在构建MAC单元的过程中,数据路径的宽度直接决定了计算精度和速度。例如,一个8位MAC单元需要8个并行的加法器路径,每个路径由多个全加器串联而成。这种并行性引入了进位链(Carry Chain)的延迟问题,即高位运算必须等待低位进位信号传递到位。为了解决这一问题,工程师引入了超前进位加法器(Carry-Lookahead Adder)等优化结构,通过提前计算进位信号来减少延迟。这一基础步骤不仅展示了数字电路的设计逻辑,也引出了后续讨论中关于面积、功耗和性能(PPA)权衡的核心议题。每一个逻辑门的尺寸、延迟和功耗都是后续更复杂架构设计的约束条件。
多路选择器与数据移动的成本
在构建了基本的计算单元后,Reiner 引入了多路选择器(Multiplexers, Muxes)的概念,这是芯片中数据路由的核心组件。Mux根据控制信号从多个输入中选择一个输出,它构成了数据通路(Data Path)的基础。然而,芯片设计中最大的瓶颈往往不是计算本身,而是数据移动(Data Movement)。在摩尔定律放缓的背景下,数据移动的能量消耗远大于逻辑运算。一个比特在DRAM中移动的能量,比在SRAM中移动高几个数量级,而在片上互连中移动也比在逻辑门中计算高得多。
"The cost of data movement is the dominant factor in modern chip design, often exceeding the cost of computation itself."
为了最小化数据移动,芯片架构师必须精心设计存储层次结构。Reiner 指出,局部性原理(Locality Principle)是优化数据流动的关键。如果数据能够被重复使用,将其保留在靠近计算单元的缓存中,可以显著降低能耗和延迟。反之,如果每次计算都需要从远处内存获取数据,性能将受到严重制约。这种对数据移动成本的敏感度,直接影响了后续所有高级架构(如GPU、TPU)的设计决策,包括内存带宽、缓存大小和互连拓扑的选择。数据移动不仅是物理上的电子流动,更是信息在存储层级间迁移的效率问题,这是理解现代高性能计算芯片的关键视角。
脉动阵列的工作原理
基于对数据移动成本的认知,Reiner 详细解释了脉动阵列(Systolic Arrays)的工作原理,这是TPU和许多AI加速器的核心架构。脉动阵列是一种数据流驱动的并行计算结构,数据像血液一样在阵列单元之间流动,每个单元在数据经过时执行一次计算(通常是MAC)。与传统的冯·诺依曼架构不同,脉动阵列消除了中央控制单元和全局内存访问的瓶颈,因为数据在相邻单元之间直接传递,无需返回主存。
在脉动阵列中,权重(Weights)通常被静态加载到各个处理单元(PE)中,而激活值(Activations)则作为数据流在阵列中脉冲式传输。这种设计极大地提高了数据复用率,因为权重数据在计算整个矩阵乘法的过程中被多次使用,而无需反复从内存读取。Reiner 强调,这种架构特别适合矩阵乘法,因为矩阵乘法具有高度的数据局部性和规则的数据访问模式。通过优化数据在阵列中的流动路径,脉动阵列可以在单位功耗下实现极高的吞吐量。这种计算与存储的紧密耦合是AI加速器超越通用CPU在特定任务上性能的关键所在。
"A systolic array is essentially a grid of processing elements that pass data between them, performing computation as the data flows through."
脉动阵列的效率还取决于阵列的尺寸和数据流的调度。如果数据流与阵列的几何结构不匹配,会导致大量的空闲周期和数据阻塞。因此,编译器需要精确地将算法映射到硬件阵列上,确保每个PE在时钟周期内都有数据可处理。这种软硬件协同设计是高性能AI芯片的核心竞争力。Reiner 指出,虽然脉动阵列在AI推理和训练任务中表现优异,但其灵活性较低,难以适应非矩阵类的通用计算任务,这为后续讨论FPGA和GPU的灵活性埋下伏笔。
时钟周期与流水线寄存器
为了进一步提高计算频率,芯片设计引入了时钟(Clock)和流水线(Pipelining)技术。Reiner 解释了时钟周期如何同步整个芯片的操作,以及流水线寄存器如何将长组合逻辑路径分割为多个短阶段。在数字电路中,信号从输入到输出需要经过一系列逻辑门,这会产生传播延迟(Propagation Delay)。如果这个延迟超过时钟周期,电路将无法正确工作。因此,工程师必须在逻辑路径中插入流水线寄存器(Pipeline Registers),将计算过程分解为多个阶段,每个阶段在一个时钟周期内完成。
"Pipelining allows us to increase the clock frequency by breaking long combinational paths into shorter stages separated by registers."
虽然流水线提高了吞吐量,但也引入了流水线冒险(Hazards),如数据冒险和控制冒险。数据冒险发生在后续指令需要前序指令的结果时,而控制冒险发生在分支预测错误时。为了解决这些问题,芯片引入了旁路(Bypassing)、分支预测和乱序执行等复杂机制。Reiner 指出,这些机制增加了芯片的面积和功耗,但也使得现代CPU能够达到极高的指令级并行度。在GPU和TPU中,流水线的设计更为简单,因为它们通常执行规则的数据流任务,较少遇到复杂的分支和数据依赖。这种简化流水线的设计使得GPU和TPU可以在相同的面积下集成更多的计算单元,从而实现更高的并行吞吐量。
FPGA与ASIC的权衡
在讨论了基础架构后,Reiner 对比了现场可编程门阵列(FPGA)和专用集成电路(ASIC)。FPGA是一种硬件可编程的芯片,用户可以在制造后通过配置逻辑块和互连资源来实现特定的电路功能。FPGA的优势在于灵活性,可以快速迭代和重新配置,适合原型设计和算法验证。然而,FPGA的性能密度和能效通常低于ASIC,因为其内部结构包含大量的通用互连和配置存储资源,这些资源在特定应用中是冗余的。
"FPGAs offer flexibility at the cost of performance and power efficiency, while ASICs offer the best performance and efficiency but lack flexibility."
相比之下,ASIC是为特定任务定制设计的芯片,其电路结构针对特定算法进行了优化,去除了所有不必要的通用资源。因此,ASIC在性能、功耗和面积上具有显著优势,特别是在大规模量产时,单位成本更低。然而,ASIC的开发周期长、成本高,且一旦制造完成无法更改。Reiner 指出,这种灵活性与效率的权衡是芯片选择的核心考量。对于AI领域,训练阶段通常使用GPU或FPGA进行灵活探索,而推理阶段则倾向于使用ASIC(如TPU)以获得最高的能效比。这种分工反映了不同应用场景对芯片特性的不同需求。
缓存与Scratchpad的对比
在存储层次结构中,Reiner 进一步区分了缓存(Cache)和Scratchpad Memory(SPM,暂存存储器)。缓存是一种硬件管理的自动存储,通过缓存行(Cache Line)和替换策略(如LRU)自动处理数据的调入调出。缓存的优势在于编程简单,程序员无需显式管理数据移动,硬件会自动利用空间和时间局部性。然而,缓存的不可预测性是其缺点,因为缓存命中/未命中的延迟取决于数据是否已在缓存中,这可能导致实时系统中的性能抖动。
"Caches are hardware-managed and transparent to software, while scratchpads are software-managed and require explicit data movement."
Scratchpad存储器则是一种软件管理的显式存储,程序员必须通过DMA(直接内存访问)指令显式地将数据从主存移动到SPM,并在计算完成后移回。虽然编程复杂度高,但SPM提供了确定的延迟和带宽,因为数据移动完全由软件控制,没有缓存未命中的风险。在高性能计算和嵌入式系统中,SPM常用于对实时性要求极高的场景。Reiner 指出,GPU通常使用L1/L2缓存,而TPU和某些AI加速器则使用Scratchpad或片上SRAM,以最大化数据局部性和确定性。这种选择反映了不同架构对编程便利性与性能确定性的不同偏好。
CPU核心为何比GPU核心大得多
Reiner 解释了为什么CPU核心的硅片面积远大于GPU核心。CPU设计的目标是低延迟和高单线程性能,因此其核心包含复杂的控制逻辑,如分支预测器、乱序执行引擎、大缓存和复杂的流水线。这些组件使得CPU能够高效处理复杂的控制流和随机内存访问,但也占据了大量的面积和功耗。相比之下,GPU核心设计的目标是高吞吐量和并行性,因此其核心结构更为简单,主要包含大量的ALU(算术逻辑单元)和较小的缓存,控制逻辑极简。
"CPU cores are large and complex to handle latency and control flow, while GPU cores are small and simple to maximize throughput and parallelism."
这种差异导致了核心密度的巨大差距。在相同的芯片面积下,GPU可以集成数千个简化核心,而CPU只能集成几个复杂核心。Reiner 指出,这种设计哲学反映了任务并行性与指令并行性的不同侧重。CPU擅长处理串行任务中的复杂逻辑,而GPU擅长处理大规模数据并行任务。在AI计算中,由于矩阵运算具有高度的数据并行性,GPU和TPU的简化核心设计能够提供更高效的计算密度。然而,CPU在控制流复杂的任务中仍具有不可替代的优势,这种异构计算的趋势使得现代系统往往同时包含CPU和GPU/TPU。
大脑与芯片的对比
Reiner 将芯片设计与人脑进行对比,探讨了生物神经计算与硅基计算的根本差异。人脑由约860亿个神经元组成,每个神经元通过突触与其他神经元连接。与芯片的同步时钟不同,大脑是异步的,神经元通过脉冲(Spikes)进行通信,通信延迟取决于突触距离和生理状态。这种事件驱动的计算模式使得大脑在能效上具有极大优势,因为只有在有信息需要传递时才消耗能量。
"The brain is asynchronous and event-driven, consuming energy only when spikes are transmitted, unlike synchronous chips that consume power even when idle."
此外,大脑的存储与计算是融合的,突触权重既是存储介质也是计算单元(通过膜电位变化)。这与芯片中存储和计算分离的冯·诺依曼架构截然不同。Reiner 指出,这种存内计算(In-memory Computing)的潜力是未来芯片设计的重要方向,旨在解决内存墙(Memory Wall)问题。虽然目前芯片在速度和精确度上远超大脑,但在能效和自适应学习能力上,大脑仍具有巨大优势。这种对比激发了神经形态计算(Neuromorphic Computing)的研究,试图在硅基芯片上模拟大脑的异步和存内计算特性。
GPU即微型TPU集群
最后,Reiner 总结道,GPU本质上是一组小型TPU的集合。TPU是专为矩阵乘法优化的ASIC,而GPU则是更通用的并行处理器,但其核心架构(如流多处理器SM)在结构上与TPU的脉动阵列有相似之处。GPU通过软件编程模型(如CUDA)提供了比TPU更高的灵活性,能够处理更广泛的并行任务,包括图形渲染、物理模拟和通用计算。然而,在纯粹的AI矩阵运算中,TPU由于硬件级别的优化,通常具有更高的能效和吞吐量。
"A GPU is essentially a collection of tiny TPUs, offering more flexibility but less efficiency for specific matrix operations compared to dedicated TPUs."
这种观点强调了架构通用性与专用性的连续谱系。从CPU到GPU再到TPU,芯片的专用性逐渐增强,性能密度也随之提高。Reiner 指出,未来的芯片设计趋势是异构集成,即在同一个封装内集成CPU、GPU、TPU和NPU等不同类型的核心,以平衡灵活性、性能和能效。这种系统级芯片(SoC)的设计方法,使得设备能够根据任务需求动态分配计算资源,从而实现最优的整体性能。这种从底层逻辑门到顶层系统架构的完整视角,为理解芯片设计的复杂性提供了清晰的框架。