
在数据爆炸性增长和计算需求日益复杂的时代,通用 CPU 的“一刀切”方法正面临基本的物理极限。尽管这些处理器功能极其多样,但在满足人工智能和数据科学等领域现代应用所需的性能和能效方面却力不从心。本文旨在探讨计算潜力与实际效率之间日益扩大的差距,并探索硬件设计领域的一项范式转变:领域专用架构(DSA)。通过构建为特定任务量身定制的硬件,我们可以实现数量级的性能提升。在接下来的章节中,我们将首先深入探讨 DSA 的“原理与机制”,通过审视“内存墙”和“功耗墙”来揭示其必要性,并剖析其使用的专门技术,如脉动阵列和定制数据流。随后,在“应用与跨学科联系”部分,我们将看到这些原理如何应用于解决实际问题,从而展示 DSA 在各个科学和工程学科中的变革性影响。
想象一下你有一项任务,可以是从整理一副牌到组装一辆汽车。对于大多数日常任务,一个通用工具就已足够。人手、标准扳手或多功能厨刀都能相当不错地完成许多工作。通用中央处理器(CPU)就是与此对应的数字设备——一个出色的“万金油”,被设计用来执行你能想象到的任何指令序列。
但如果你的工作不是组装一辆车,而是一万辆呢?如果你的工作不只是整理一副牌,而是数十亿副,并且你的生活,或者至少你的生意,都依赖于这个速度呢?你不会使用一把普通的扳手,而会建造一个定制的机械臂。你不会用手去整理,而会发明一台专门的纸牌分类机。这便是领域专用架构(DSA)的精髓。它是一种为解决某一类特定问题而精心打造的硬件,其效率惊人,让通用 CPU 望尘莫及。
要真正领会 DSA 背后的天才设计,我们必须首先理解 CPU 所面临的根本限制。这些不仅仅是工程上的挑战,更是由物理定律决定的巨大障碍,通常被称为内存墙(Memory Wall)和功耗墙(Power Wall)。
让我们回到汽车工厂的比喻。CPU 的核心就像流水线上效率极高的工人,能以惊人的速度进行计算(即“工作”)。“内存墙”问题就是如何足够快地将零件送到这些工人手中。这些零件——也就是你的数据——存储在一个名为动态随机存取存储器(DRAM)的巨大仓库中。连接仓库和流水线的传送带就是内存总线,其速度有限。如果你的工人速度太快,或者每项任务需要许多不同的零件,工人们将花费大部分时间等待,盯着空无一物的传送带。整个工厂的产出不受工人速度的限制,而是受制于供应链。
我们可以用一个非常直观的概念——Roofline 模型 ——来将其形式化。想象一张图表,其中处理器的性能(以每秒操作数计)与其计算强度(arithmetic intensity)相关联。计算强度,记为 ,是问题的核心:它是执行的计算量与从主存仓库移动的数据字节数之比。
高计算强度意味着你对获取的每份数据都进行了大量计算。而低计算强度则意味着你为了少量计算而不断获取新数据。系统的最大性能 受两个“屋顶”的限制:处理器的峰值计算性能 ,以及内存施加的性能限制,即计算强度乘以内存带宽 。
这两个限制相交的点在图上形成一个“拐点”。这个关键点对应着阈值计算强度 。如果你的应用的计算强度 小于 ,那么你就受内存限制(memory-bound);你的性能由内存系统决定,拥有更快的工人也无济于事。如果 ,那么你就受计算限制(compute-bound);工人成为瓶颈,而你正在充分利用你的处理器。对于许多现代应用,尤其是在数据科学和人工智能领域,现实是严峻的:它们在通用 CPU 上严重受限于内存。
第二个束缚是功耗墙(Power Wall)。从 DRAM 仓库中获取一份数据不仅慢,而且耗能巨大。将电信号通过长导线从芯片传输到 DRAM 模块的物理行为,其能耗比在处理器核心内对该数据进行一次计算高出几个数量级。
我们可以用一个简单而深刻的能量模型来量化这一点。设 为执行一次乘加(multiply-accumulate)操作的能量,这是许多科学领域的基本计算单元。设 为从 DRAM 传输一个比特数据的能量。总能量是计算能量和访存能量之和。当计算所消耗的能量等于访存所消耗的能量时,达到收支平衡点,此时对应一个特定的计算强度 :
在现代系统中, 是 的 10 到 100 倍并不少见。这意味着你对获取的每个比特数据需要执行 10 到 100 次操作,才能在能量预算上达到收支平衡!如果操作次数少于这个值,你移动数据消耗的能量将超过处理数据消耗的能量。这就是功耗墙的实际体现。
DSA 是对这两堵墙的直接冲击。它们不只是试图建造一个稍快一点的工人或一条稍宽一点的传送带,而是重新设计整个工厂。
DSA 是如何实现性能和效率上的惊人飞跃的?它们遵循一套专业化的策略,根据目标问题的确切结构,量身定制硬件的数据路径、存储系统乃至指令集。
CPU 的算术逻辑单元(ALU)就像一个通用工作台,能执行任何操作,但没有为任何特定序列进行优化。相比之下,DSA 构建了一条定制的流水线。其中一个最优雅且最具影响力的例子是脉动阵列(systolic array)。
想象一个由简单处理单元(PE)组成的网格。数据不是从中央存储库中获取,而是被“泵送”通过这个网格,以一种有节奏的、脉动的方式从一个 PE 移动到其相邻的 PE,就像血液流经心脏一样。每个 PE 执行一个小的计算——比如一次乘加操作——然后将其结果或输入数据传递给下一个 PE。
这种设计对于具有规则数据依赖性的算法(如矩阵乘法或卷积)极为高效,而这些算法正是人工智能的核心。为什么?因为它体现了数据复用(data reuse)的原则。一份数据一旦被取到芯片上,就会在流经阵列时被多个 PE 使用。这大大减少了对昂贵的 DRAM 仓库的访问次数。在脉动阵列中,相邻计算所需的数据光环(halo)不会被浪费地从内存中重新获取;它只是在片上从一个 PE 传递到其相邻的 PE,这是一个成本极低的操作。
然而,这种专业化是有代价的。脉动阵列是一个固定大小的网格,比如 。如果你想乘以大小为 的矩阵,而 和 不是 和 的整数倍,那么在处理“边缘”区块时,你的一些 PE 将会处于空闲状态。硬件利用率下降,有效性能只是峰值性能的一部分,这是问题规模与硬件规模不匹配的代价。可实现的最大利用率恰好是阵列必须执行的真实工作量与填充后工作量之比:。
数据移动的特定模式,即数据流(dataflow),是一个关键的设计选择。对于神经网络中的卷积等操作,可以设计硬件来保持输入数据块静止,让滤波器权重流过它(行固定(row-stationary)流)。或者,可以保持权重静止,让输入流过它们(权重固定(weight-stationary)),或者保持输出累加结果静止,让输入和权重都流动(输出固定(output-stationary))。每种选择都会产生不同的数据复用模式和内存流量。一个糟糕的选择可能导致内存传输的灾难性爆炸,因为部分结果会在片上缓冲区和片外 DRAM 之间不断地来回移动,这完全违背了加速器的设计初衷。正确的数据流,与合适的片上存储器大小相匹配,是最小化片外流量和最大化性能的关键。
CPU 的指令集庞大且富有表现力,拥有用于加法、乘法、分支和以无数种方式移动数据的指令。而 DSA 的指令集通常小而强大。你不是一步步地告诉硬件如何做某事,而是给它一个单一的命令来完成一个复杂的、领域特定的任务。
例如,神经网络中一个常见的操作是 卷积,它涉及九个权重和九个输入值的点积。CPU 会用一个标量指令循环来执行此操作:加载、相乘、相加、重复。而一个 DSA 可能拥有一条 9-tap MAC 指令,一次性执行整个操作。这极大地减少了用于取指和译码的能量与时间,这是一种“控制开销”。
设计者甚至可能融合多个步骤。许多神经网络层后面会跟一个激活函数,如修正线性单元(ReLU)。DSA 可能会包含一条融合的 accumulate-ReLU 指令,在单一步骤中完成最终的累加并应用 ReLU,从而避免了存储中间结果再读回的需要。
这种专业化甚至延伸到处理稀疏性等特性。如果一个神经网络中的许多权重为零,人们可能认为跳过它们总是更好的选择。DSA 可以包含一条 gather 指令,只从列表中获取非零权重。然而,这是一个微妙的权衡。稀疏格式需要为每个非零值存储一个索引,这增加了内存流量。仔细分析揭示了一个简单的条件:只有当非零元素的比例 小于一个值的大小与一个值及其索引组合大小之比时,稀疏格式才是有益的。如果不满足这个条件,使用 gather 指令的“优化”实际上会增加内存流量并损害性能。每一个设计选择都必须经过严谨的论证。
CPU 使用复杂的、由硬件管理的缓存层次结构来隐藏内存延迟。它们试图预测你将需要什么数据并将其保存在近处。这对于许多程序效果很好,但对于具有可预测的流式访问模式的算法,缓存管理硬件的开销可能是不必要的。
DSA 通常选择一种更简单、更明确的方法:软件管理的便笺式存储器(scratchpad memory)。这是一种高速的片上 SRAM,但与缓存不同,程序员或编译器可以完全控制哪些数据移入和移出它。这使得数据的移动可以被完美地协同调度。
这种软硬件协同设计是 DSA 的核心。一种常见的技术是分块(tiling)(或 blocking)。一个巨大的计算,比如两个大的 矩阵相乘,被分解成小的、分块大小的块,这些块可以完全容纳在片上便笺式存储器中。例如,为了计算输出矩阵的一个 的分块,算法会加载输入矩阵对应的 分块,进行所有必要的计算,并在此过程中大量复用这些数据,最后才将最终的结果分块写回 DRAM。
分块大小 的选择并非任意;它取决于片上 SRAM 的大小 。要容纳三个矩阵(、 和 )的各一个分块,你需要的 SRAM 容量至少为 。为了最小化片外数据总流量(其主要由一个与 成正比的项决定),必须选择尽可能大的分块尺寸。因此,最优的分块边长就是能容纳下的最大整数:。这个优美而简单的公式完美地体现了算法与架构之间的紧密配合。
构建 DSA 的决定不是一个单一的选择,而是在一个谱系上的导航。一端是完全定制的专用集成电路(ASIC)。这是一种为单一任务从头设计的芯片,提供最高的性能和能效。然而,它的设计和制造成本(即非经常性工程成本,NRE)高得惊人,而且完全没有灵活性。如果算法改变,这个芯片就成了一个杯垫。
另一端是现场可编程门阵列(FPGA)。FPGA 是由可重构逻辑块和布线通道组成的海洋,可以通过编程来实现任何数字电路。这提供了巨大的灵活性——通过发送新的配置比特流就可以部署新的规则或算法——但由于可重构结构的开销,其性能和效率低于 ASIC。
在这两个极端之间,存在着混合方法,如粗粒度可重构阵列(CGRA),它提供更复杂的可编程单元块;或者带有微码控制器的系统,这些控制器可以在不改变底层硬件的情况下进行重编程,用几个周期的性能换取快速更新功能的能力。
正确的选择取决于对整个系统的仔细分析:所需的性能、预期的产量(以分摊 NRE 成本),以及对未来灵活性的需求。DSA 并非万能灵药。它是一个经过深思熟虑、有量化依据的决定,旨在为特定工作打造完美的工具,用 CPU 无限的通用性换取专家级工具专注而惊人的效率。
在我们之前的讨论中,我们可谓是“拆解”了机器,以理解其内部工作原理。我们看到了如何利用专业化和并行化的原则来构建效率非凡的计算引擎。但是,一堆原理就像盒子里的精美工具集,只有当我们把它们拿出来建造宏伟之物时,它们的真正目的和优雅才能显现。
那么,现在让我们开始一段旅程。我们将从架构理论的无菌洁净室,走向现代科学与工程的繁忙车间。我们将看到领域专用架构(DSA)如何不仅仅是深奥的奇珍,而是正在成为人工智能、网络安全和基础科学发现等不同领域进步的基石。正是在这里,设计原则的抽象之美绽放为可触及的现实。
如果说现代计算机体系结构有一条核心戒律,那就是:汝不可不必要地移动数据。从主存中获取一个数字所花费的能量和时间,可能是对其进行一次算术运算成本的数百甚至数千倍。通用 CPU 尽管设计精巧,却常常将大部分时间花在等待数据从遥远的 DRAM 到来,而不是计算。而 DSA 的核心在于它是一位物流大师,其主要天才之处在于将这种行程最小化。
考虑一下处理图像的任务——比如锐化、边缘检测,然后再应用一个滤波器。在传统处理器(如 CPU 甚至 GPU)上,这可能会分阶段进行。芯片读取整个图像,应用第一个滤波器,然后将整个中间结果写回内存。接着,它再读取那个中间图像,应用第二个滤波器,然后再次写出。这是一种巨大的浪费!芯片就像一个厨师,切完胡萝卜后,先把它们放回储藏室,然后再取出来加入汤中。
为图像处理设计的 DSA 采用了一种不同且聪明得多的方法。它使用一种“行缓冲”的流式数据流。想象一下图像数据像一条河流一样流过芯片。DSA 只在其高速片上存储器中保留图像的几行——即河流的一个小的、局部的“切片”。当数据流过时,第一个处理阶段对其进行处理,并立即将其结果传递给第二阶段,第二阶段再将其结果传递给第三阶段。这被称为算子融合(kernel fusion)。中间数据从不接触片外那片缓慢而浩瀚的 DRAM 海洋。通过消除这种中间流量,DSA 从根本上改变了问题的性质。在一颗强大的 GPU 上,这个任务可能是“带宽受限”的——GPU 强大的算术单元因等待数据而处于饥饿状态。而 DSA 通过其巧妙的数据流,使同样的任务变为“计算受限”,从而确保其专用单元始终繁忙且高效,即使其以每秒万亿次运算(TOPS)计的总峰值性能较低。
同样的理念正在革新人工智能。现代大型语言模型(如 Transformer)核心的“注意力”机制对内存有着贪婪的需求。计算注意力分数涉及矩阵乘法,其规模随输入序列的长度呈二次方增长。一种朴素的方法会不断地在处理器和内存之间穿梭巨大的矩阵——查询()、键()和值()。
专注于 AI 的 DSA 通过实施一种称为分块(tiling)的策略来解决这个问题。它无法将整个数据海洋容纳在片上,但可以巧妙地选择要加载的数据。它可能会将整个 和 矩阵(或它们的大分块)加载到其大的片上便笺式存储器中。一旦加载,这些矩阵就可以在不同的查询批次流式输入时被反复重用。从慢速片外存储器加载的每个字节在被丢弃前都会用于成百上千次的计算。数据复用率的这种急剧增加提升了计算强度——即每次移动数据字节所执行的计算次数之比——并释放了芯片并行处理单元的全部能力。其原理是相同的:聪明地选择你所获取的数据,一旦获取,就尽可能多地使用它,然后再放手。
DSA 的第二个伟大优点是它能将算法智能直接嵌入硬件中。这不仅仅是更快地完成同样的工作,而是从根本上减少工作量。
想一想在一个庞大的数据库中进行搜索。假设我们有一个包含十亿条目的表,我们想找到所有对应“加州客户”的记录。一个通用系统可能需要读取整个表——数十亿条记录,包括它们的位置和所有其他相关数据——到内存中,然后进行过滤。而为数据库分析设计的 DSA 则可以更加精妙。它可以直接在压缩数据上操作,并执行“谓词下推”。它不是向内存系统请求“所有东西”,而是请求:“为我扫描位置列,只给我指向显示‘加州’的行的指针。”然后,加速器使用这些指针只获取它实际需要的有效载荷数据。
这种在压缩数据上操作和在源头进行过滤的组合,创造了我们所说的有效内存带宽放大。对于一个高选择性(意味着只有极小一部分行匹配,比如 )的查询,DSA 可能只读取总数据的一小部分。如果数据还以 的压缩比被压缩,那么 DSA 从内存中读取的数据量将远少于基准系统。总放大效应可以用一个简单而优雅的公式来建模:。在我们的例子中,这将是近 8 倍的放大!DSA 的胜利不是因为它有更快的内存总线,而是因为它足够聪明,懂得不去使用总线。
这一原则也延伸到了更复杂的领域,如网络安全。现代防火墙和入侵检测系统需要实时扫描网络流量,以查找数千种不同的模式(正则表达式)。将数千个表达式编译成一个 CPU 可以执行的单一确定性有限自动机(DFA)通常会导致“状态爆炸”——由此产生的状态机可能达到千兆字节级别的大小,完全不切实际。
用于此任务的 DSA 可能会使用一个完全不同的工具:三态内容寻址存储器(TCAM)。TCAM 是一种存储器,你向它提供数据,它会在一个时钟周期内告诉你存储的条目中哪些匹配。它是一个大规模并行的硬件搜索引擎。通过将正则表达式直接编码到 TCAM 中,DSA 在硬件中有效地实现了一个非确定性有限自动机(NFA)。这种表示方法不会遭受状态爆炸。DSA 避免了 CPU 不得不执行的昂贵且有时不可能完成的“编译”步骤,直接将问题的逻辑映射到硅片上,并通过对每个传入的数据字节同时检查所有模式来实现极高的吞吐量。
有时,一个领域的精髓被封装在一种特定的数据结构中。DSA 可以通过创建该数据结构的物理实现来获得优势,这种物理实现远比在通用处理器上运行的任何软件版本都高效。
一个简单的例子来自数字信号处理(DSP)。有限脉冲响应(FIR)滤波器是 DSP 的主力,其本质是一系列的乘加(MAC)操作。DSA 可以通过创建一个由 MAC 单元组成的物理流水线来实现这一点。数据从一端进入,从一个阶段流向下一个阶段,在每一步计算出部分结果。通过仔细平衡每个流水线阶段的逻辑以匹配目标时钟速度,硬件可以维持每个时钟周期处理一个新输入样本的吞吐量。这是一种在硅片上锻造的数据结构——流水线累加器。
一个更深刻的例子来自图分析。像用于寻找图中最短路径的 Dijkstra 算法严重依赖于优先队列。通用 CPU 会使用像二叉堆这样的基于软件的数据结构。二叉堆是一个很好的通用工具,但更新它需要 的时间,其中 是项目的数量。DSA 设计者会问:我们能否通过利用问题的特性来做得更好?
例如,如果我们知道图中的边权重是小整数(这在像路线规划这样的应用中非常常见),我们可以使用一种优越得多的数据结构:基数堆(radix heap)。基数堆使用一个桶数组,每个可能的权重一个桶。在硬件中,这转化为一组简单的先进先出(FIFO)队列和一个称为优先编码器的非常快速的电路,用于找到下一个非空桶。对于 Dijkstra 算法产生的特定工作负载,这个硬件基数堆的每次操作平均时间可以远远低于硬件二叉堆。基数堆是一种专用工具,对于合适的工作,它是无与伦比的。这就是 DSA 设计的核心:将数据结构、算法和硬件与问题领域的独特属性相匹配。
到目前为止,我们一直将 DSA 视为独立工作的英雄。但实际上,加速器必须存在于一个更大的计算机系统中。它是宿主 CPU 家里的客人,必须进行通信和共享资源。它如何做到这一点对其整体效用至关重要。
传统上,加速器通过像外围组件互连快速总线(PCIe)这样的总线连接到主机。卸载任务是一个繁琐的过程。CPU 必须首先将数据复制到一个特殊的“固定”内存区域,命令加速器获取它,等待计算完成,然后再将结果复制回来。这整个过程引入了显著的延迟。对于小任务,这种通信的开销可能比通过加速计算节省的时间还要大!
像计算快速链接(CXL)这样的新型互连标准正在改变游戏规则。通过 CXL.mem,加速器可以获得对主机内存的直接、一致性访问。复杂的过程被一个简单的命令所取代。加速器可以像 CPU 中的另一个核心一样读取其输入和写入其输出。这极大地减少了延迟和软件开销。因此,“盈亏平衡点”——即加速值得的最小问题规模——可以小得多。通过 CXL 连接的加速器比通过传统 PCIe 连接的加速器,对于 CPU 来说是一个更敏捷、更有用的伙伴。
但这种更紧密的集成也带来了自身的挑战。现在加速器更直接地共享内存系统,它可能成为一个“吵闹的邻居”。一个高性能的 DSA 可能会用请求淹没共享内存控制器,造成交通堵塞,从而减慢 CPU 的速度。这是一个严重的问题,因为 CPU 通常在处理像运行操作系统这样对延迟敏感的任务。我们不能让救护车被一群工程卡车堵在路上。
正是在这里,系统级性能建模变得至关重要。利用排队论的工具,架构师可以将共享内存通道建模为一个排队系统。他们可以预测 CPU 请求的等待时间,作为 CPU 和 DSA 共同产生的流量的函数。基于这些模型,他们可以设计节流策略。如果预测到 DSA 的内存流量会导致 CPU 的延迟超过服务质量(QoS)目标,内存控制器可以暂时减慢 DSA 的速度。这确保了整个系统保持响应性和平衡性。这是一个绝佳的例子,说明了架构师必须超越优化单个组件的范畴,转而设计一个协作的、高性能的生态系统。
领域专用架构的历程是一个协同设计的故事,它将来自算法、物理学和系统工程的洞见编织在一起。它标志着对过去“一刀切”范式的背离,并引领计算机体系结构进入一个新的复兴时代——一个由丰富多样、量身定制、极致高效的计算工具所定义的时代。理解它们,就是领悟到最深刻的进步往往不仅来自原始的力量,更来自对我们希望解决的问题结构的深刻而优雅的洞察。