try ai
科普
编辑
分享
反馈
  • 传播与产生:高速计算机算术的基础

传播与产生:高速计算机算术的基础

SciencePedia玻尔百科
核心要点
  • “产生”(一个位片自身创建进位)和“传播”(一个位片将进位传递过去)的概念是并行预测进位的基础。
  • 超前进位加法器(CLA)使用传播和产生信号来同时计算所有进位,与顺序执行的行波进位加法器相比,极大地加快了加法速度。
  • 采用层次化设计,为比特块定义组传播和组产生信号,可以在控制电路复杂性的同时,高效地构建大型快速加法器。
  • 传播/产生原理的应用超越了简单的加法,构成了减法、高级并行加法器设计的基础,甚至与理论计算机科学中的抽象模型相联系。

引言

在每一次数字计算的核心,无论是简单的计算器还是超级计算机,都存在着最基本的操作——加法。虽然概念上很简单,但在现代处理器所要求的极高速度下执行加法,却是一个重大的工程挑战。最直观的方法,即逐列相加并“逢十进一”,会产生一种顺序依赖关系,这成为一个关键的瓶颈,拖慢了整个过程。我们如何才能在不等待64个独立步骤的连锁反应的情况下,执行一次64位的加法呢?本文将探讨解决这一问题的优雅方案:进位“传播”与“产生”的概念。

本次探索分为两个主要部分。在“原理与机制”部分,我们将解构加法的逻辑,定义传播和产生信号,展示它们如何让我们能够并行预测进位,打破顺序链条。随后,“应用与跨学科联系”部分将演示这一核心思想如何被实现在实际的高速加法器中,扩展到其他算术运算,通过层次化设计进行规模扩展,甚至与理论计算机科学中的抽象概念建立联系。读完本文,您将理解使现代高性能计算机算术成为可能的基础原理。

原理与机制

要领略现代计算机算术的精妙之处,我们必须首先理解它所解决的问题。想象一下你正在计算两个长数字相加,比如 587 + 634。当你计算最右边一列,7+4=117+4=117+4=11,你会写下‘1’并向下一列进位一个‘1’。现在你计算 8+38+38+3 再加上进位的‘1’,得到12。同样,你写下‘2’并进位一个‘1’。这个过程持续下去,每一列的计算都依赖于其右边一列的结果。

一个简单的计算机加法器,即​​行波进位加法器(Ripple-Carry Adder, RCA)​​,正是这样做的。它就像一排多米诺骨牌:第一张骨牌(第一位的进位输出)必须先倒下,才能推倒下一张,如此依次传递下去。对于一个32位或64位的数字,在纳秒级的电子世界里,这种连锁反应可能慢得令人痛苦。整个加法运算都被这一串进位的“行波”所牵制。我们如何打破这条链条呢?解决方案不是等待进位,而是预测它。这就是​​超前进位加法器(Carry-Lookahead Adder, CLA)​​的精髓,其机制是建立在两个简单思想上的一首优美的逻辑诗篇:​​产生(Generate)​​和​​传播(Propagate)​​。

进位的“个性”:产生与传播

让我们聚焦于单一一列,或称​​位片(bit-slice)​​,在这里我们对两个比特 AiA_iAi​ 和 BiB_iBi​ 进行相加。我们可以就这个位片关于进位的“个性”提出一个简单的问题:在什么条件下它会产生一个进位输出 Ci+1C_{i+1}Ci+1​?

事实证明,只有两种情况会发生这种情况。

首先,该位片可能凭借自身​​产生(generate)​​一个进位。这种情况当且仅当 AiA_iAi​ 和 BiB_iBi​ 均为1时发生。此时,二进制中 1+1=101+1=101+1=10,因此无论前一级是否有进位输入(CiC_iCi​),都保证会有一个为1的进位输出。我们可以用一个简单的逻辑与操作来捕捉这一点。我们称之为​​产生​​信号,GiG_iGi​:

Gi=Ai⋅BiG_i = A_i \cdot B_iGi​=Ai​⋅Bi​

其次,该位片可能​​传播(propagate)​​一个进位。想象一下,输入 AiA_iAi​ 或 BiB_iBi​ 中只有一个是1。如果此时有一个进位输入 Ci=1C_i=1Ci​=1 到达,那么和就变成 1+0+1=101+0+1=101+0+1=10(或 0+1+1=100+1+1=100+1+1=10),这个输入的进位就被忠实地传递出去,成为一个进位输出 Ci+1=1C_{i+1}=1Ci+1​=1。如果没有进位输入(Ci=0C_i=0Ci​=0),那么和就是 1+0+0=011+0+0=011+0+0=01,没有进位输出。该位片就像一个进位的条件通道。“只有一个输入是1”这个条件恰好可以用异或(XOR)操作来描述。我们称之为​​传播​​信号,PiP_iPi​:

Pi=Ai⊕BiP_i = A_i \oplus B_iPi​=Ai​⊕Bi​

还有第三种可能:AiA_iAi​ 和 BiB_iBi​ 均为0。在这种情况下,该位片既不能自行产生进位,也不能传播进位。它实际上“杀死”了任何输入的进位,确保 Ci+1C_{i+1}Ci+1​ 为0。此时,GiG_iGi​ 和 PiP_iPi​ 均为0。

因此,对于任意一对输入比特,该位片的行为完全由这两个信号描述。这些定义带来了一个优美而关键的特性:GiG_iGi​ 和 PiP_iPi​ 是​​互斥的​​。逻辑上它们不可能同时为1。如果 Gi=1G_i=1Gi​=1,意味着 Ai=1A_i=1Ai​=1 且 Bi=1B_i=1Bi​=1。但如果这样,那么 Ai⊕Bi=1⊕1=0A_i \oplus B_i = 1 \oplus 1 = 0Ai​⊕Bi​=1⊕1=0,所以 PiP_iPi​ 必须为0。一个位片可以是源头(产生),也可以是通道(传播),但绝不能同时两者都是。这个基本约束避免了逻辑上的模糊性,并极大地简化了电路设计。

进位的语言:一个通用方程

有了这两个信号,我们现在可以陈述一个关于进位的深刻而简单的真理。一个进位输出 Ci+1C_{i+1}Ci+1​ 将为1,当且仅当……

  1. 该位片产生了一个进位(Gi=1G_i=1Gi​=1),或者
  2. 该位片传播了一个输入的进位(Pi=1P_i=1Pi​=1 且 Ci=1C_i=1Ci​=1)。

这直接转化为基本的超前进位方程:

Ci+1=Gi+Pi⋅CiC_{i+1} = G_i + P_i \cdot C_iCi+1​=Gi​+Pi​⋅Ci​

这里,+ 是逻辑或,· 是逻辑与。这个简单的方程是高速加法器的基石。它掌握着打破行波链的关键。

伟大的飞跃:超前预测

请注意,公式 Ci+1=Gi+PiCiC_{i+1} = G_i + P_i C_iCi+1​=Gi​+Pi​Ci​ 似乎仍然依赖于前一个进位 CiC_iCi​。但是,如果我们把这个公式应用到 CiC_iCi​ 本身呢?让我们从整个加法器的初始进位 C0C_0C0​ 开始,展开前几位的逻辑:

对于第一个进位输出 C1C_1C1​: C1=G0+P0C0C_1 = G_0 + P_0 C_0C1​=G0​+P0​C0​

对于第二个 C2C_2C2​,我们代入 C1C_1C1​ 的表达式: C2=G1+P1C1=G1+P1(G0+P0C0)=G1+P1G0+P1P0C0C_2 = G_1 + P_1 C_1 = G_1 + P_1(G_0 + P_0 C_0) = G_1 + P_1 G_0 + P_1 P_0 C_0C2​=G1​+P1​C1​=G1​+P1​(G0​+P0​C0​)=G1​+P1​G0​+P1​P0​C0​

让我们再多展开一个,C3C_3C3​: C3=G2+P2C2=G2+P2(G1+P1G0+P1P0C0)=G2+P2G1+P2P1G0+P2P1P0C0C_3 = G_2 + P_2 C_2 = G_2 + P_2(G_1 + P_1 G_0 + P_1 P_0 C_0) = G_2 + P_2 G_1 + P_2 P_1 G_0 + P_2 P_1 P_0 C_0C3​=G2​+P2​C2​=G2​+P2​(G1​+P1​G0​+P1​P0​C0​)=G2​+P2​G1​+P2​P1​G0​+P2​P1​P0​C0​

仔细观察这些展开的方程。C2C_2C2​ 的表达式仅依赖于第0级和第1级的 PPP 和 GGG 信号,以及初始进位 C0C_0C0​。它不依赖于 C1C_1C1​!类似地,C3C_3C3​ 的表达式仅依赖于第0、1、2级的 PPP 和 GGG 信号,以及 C0C_0C0​。它不依赖于 C1C_1C1​ 或 C2C_2C2​。

这就是奇迹发生的时刻——“超前预测”。我们可以直接从原始输入(AAA 和 BBB,它们给出了所有的 PiP_iPi​ 和 GiG_iGi​ 信号)和唯一的初始进位 C0C_0C0​ 来计算任何比特位的进位。我们不必等待。所有进位都可以并行计算。多米诺骨牌链被打破了!

让我们来看一个实例。假设我们要计算 A=10112A = 1011_2A=10112​ 和 B=01102B = 0110_2B=01102​ 的和,且 C0=0C_0=0C0​=0。我们首先计算从0到3每个比特位的P/G信号:

  • i=0:A0=1,B0=0  ⟹  P0=1,G0=0i=0: A_0=1, B_0=0 \implies P_0=1, G_0=0i=0:A0​=1,B0​=0⟹P0​=1,G0​=0
  • i=1:A1=1,B1=1  ⟹  P1=0,G1=1i=1: A_1=1, B_1=1 \implies P_1=0, G_1=1i=1:A1​=1,B1​=1⟹P1​=0,G1​=1
  • i=2:A2=0,B2=1  ⟹  P2=1,G2=0i=2: A_2=0, B_2=1 \implies P_2=1, G_2=0i=2:A2​=0,B2​=1⟹P2​=1,G2​=0
  • i=3:A3=1,B3=0  ⟹  P3=1,G3=0i=3: A_3=1, B_3=0 \implies P_3=1, G_3=0i=3:A3​=1,B3​=0⟹P3​=1,G3​=0

现在,要找到最终的进位输出 C4C_4C4​,我们可以使用完全展开的公式: C4=G3+P3G2+P3P2G1+P3P2P1G0+P3P2P1P0C0C_4 = G_3 + P_3 G_2 + P_3 P_2 G_1 + P_3 P_2 P_1 G_0 + P_3 P_2 P_1 P_0 C_0C4​=G3​+P3​G2​+P3​P2​G1​+P3​P2​P1​G0​+P3​P2​P1​P0​C0​ 代入我们的值(注意任何包含 P1=0P_1=0P1​=0 或 C0=0C_0=0C0​=0 的项都将消失): C4=0+(1⋅0)+(1⋅1⋅1)+(1⋅1⋅0⋅0)+(1⋅1⋅0⋅1⋅0)=0+0+1+0+0=1C_4 = 0 + (1 \cdot 0) + (1 \cdot 1 \cdot 1) + (1 \cdot 1 \cdot 0 \cdot 0) + (1 \cdot 1 \cdot 0 \cdot 1 \cdot 0) = 0 + 0 + 1 + 0 + 0 = 1C4​=0+(1⋅0)+(1⋅1⋅1)+(1⋅1⋅0⋅0)+(1⋅1⋅0⋅1⋅0)=0+0+1+0+0=1 这个计算直接给出了最终的进位,无需逐位传递。这种并行计算提供了惊人的速度优势。对于一个32位加法器,设计良好的CLA可以比简单的RCA快许多倍。在一个理论比较中,一个层次化的CLA架构比其行波进位对应物实现了8倍的加速。

登峰造极:逻辑的层次结构

你可能已经注意到了一个问题。当我们为更高位的进位展开方程时,公式变得非常长。直接实现一个32位的CLA将需要具有大量输入的逻辑门,这在实际中是不可行的。似乎,自然界为我们提供了另一个优雅的解决方案:​​层次结构​​。

“传播”和“产生”的概念是美妙地递归的。我们可以将一组比特——比如说一个4比特的块——视为一个单一的实体,并为其定义​​组传播​​(PGP_GPG​)和​​组产生​​(GGG_GGG​)信号。

  • 一个4比特块​​产生​​一个进位,是指其内部某处产生了一个进位,并且这个进位成功地传到了块的末端。这可能发生在最后一级(第3位)产生了一个进位(G3G_3G3​),或者最后一级传播了由第2级产生的进位(P3G2P_3 G_2P3​G2​),依此类推。
  • 一个4比特块​​传播​​一个进位,当且仅当一个输入的进位 C0C_0C0​ 能够一路穿过它,成为进位输出 C4C_4C4​。这只有在块内的每一级都传播进位时才可能发生:P3P_3P3​ 与 P2P_2P2​ 与 P1P_1P1​ 与 P0P_0P0​。

这就产生了块级的P/G表达式: PG=P3P2P1P0P_G = P_3 P_2 P_1 P_0PG​=P3​P2​P1​P0​ GG=G3+P3G2+P3P2G1+P3P2P1G0G_G = G_3 + P_3 G_2 + P_3 P_2 G_1 + P_3 P_2 P_1 G_0GG​=G3​+P3​G2​+P3​P2​G1​+P3​P2​P1​G0​

然后我们可以用八个这样的4比特CLA块来构建一个32位加法器。我们可以让进位在这些块之间行波传递,从而创建一个“块内快、块间慢”的混合加法器。这是一个很好的折衷方案,但我们可以做得更好。我们可以将相同的超前逻辑应用于块级的 PGP_GPG​ 和 GGG_GGG​ 信号!一个第二级的超前进位单元可以接收这八对组信号,并同时计算出每个块的进位输入。这种层次化的方法——CLA内嵌CLA——使我们能够构建极大且极快的加法器,同时保持硬件复杂度的可管理性。这证明了一个良好抽象的力量。在这种设计中,关键延迟路径是一个精心编排的序列:生成局部信号,生成组信号,跨组进行超前计算,最后在最后一个块内计算结果。

设计的优雅与机器中的幽灵

传播/产生概念的美妙之处延伸到了它的实际实现中。例如,你可能会发现传播信号有时被定义为 Pi=Ai+BiP_i = A_i + B_iPi​=Ai​+Bi​(逻辑或)。就进位计算而言,这样做同样有效。然而,通常更倾向于使用异或的定义(Pi=Ai⊕BiP_i = A_i \oplus B_iPi​=Ai​⊕Bi​)。为什么呢?因为最终的和比特是这样计算的:Si=Ai⊕Bi⊕CiS_i = A_i \oplus B_i \oplus C_iSi​=Ai​⊕Bi​⊕Ci​。通过定义 Pi=Ai⊕BiP_i = A_i \oplus B_iPi​=Ai​⊕Bi​,我们可以在计算和以及超前进位时复用这部分逻辑,从而得到一个更高效、更优雅的电路。这种资源共享是巧妙数字设计的标志。同样,这种P/G逻辑可以干净地集成到一个更大的算术逻辑单元(ALU)中,只在进行加法和减法(通常只是加法的一种巧妙形式)等算术运算时才被启用。

最后,我们必须记住,我们完美的布尔逻辑存在于一个混乱的物理世界中。信号通过门电路需要有限的时间。在我们的超前表达式中,比如 C2=G1+P1G0C_2 = G_1 + P_1 G_0C2​=G1​+P1​G0​,想象一种情况:输出应该保持为'1',但一个输入的变化导致维持'1'的责任从 G1G_1G1​ 项转移到 P1G0P_1 G_0P1​G0​ 项。由于信号路径延迟不同,可能会有一个瞬间,两个项都为'0',导致输出 C2C_2C2​ 出现一个毛刺,短暂地变为'0'后又恢复为'1'。这被称为​​静态险象(static hazard)​​。对于特定的输入转换,这些瞬间的毛刺可能在超前进位逻辑中发生,这是一个迷人的提醒:即使是最优雅的数学构造,在变为现实时也必须与物理定律抗衡。从抽象概念到功能完备的硅片的旅程,充满了这样微妙而有趣的挑战。

应用与跨学科联系

在我们之前的讨论中,我们揭示了高速加法背后那个优雅的小秘密:“传播”(PPP)和“产生”(GGG)的概念。我们看到,通过预先判断一对比特是会产生一个新的进位,还是仅仅传播一个输入的进位,我们就能摆脱行波进位加法器的束缚——在行波进位加法器中,每个比特位都必须耐心地等待其邻居完成。这是一个绝妙的逻辑,本身就是一个美丽的思想。但在物理学和工程学中,真正的乐趣不仅在于欣赏一个思想,更在于看它能做什么。这个原理将我们引向何方?它打开了哪些大门?

事实证明,这不仅仅是构建一个4位加法器的巧妙技巧。它是一项基本原理,并由此衍生出广阔的应用天地,构成了每一台现代计算机的算术核心。它的影响范围从处理器设计和时序分析的实际细节,延伸到理论计算机科学的抽象之美。让我们踏上探索这片领域的旅程,看看简单的 PPP 和 GGG 概念如何成为速度的缔造者。

机器之心:构建超前逻辑

当然,最直接的应用就是构建我们最初打算创造的东西:一个超前进位加法器(CLA)。实现这一目标的核心部件是超前进位生成器(Carry-Lookahead Generator, CLG)。它的任务是接收所有按位的 PiP_iPi​ 和 GiG_iGi​ 信号作为输入,并一次性并行地计算出所有的进位比特 C1,C2,C3,…C_1, C_2, C_3, \dotsC1​,C2​,C3​,…。

它是如何做到这一点的呢?我们不使用递归公式 Ci+1=Gi+PiCiC_{i+1} = G_i + P_i C_iCi+1​=Gi​+Pi​Ci​,而是将其展开。例如,进位 C2C_2C2​ 并非通过等待 C1C_1C1​ 来得到。相反,我们这样推理:“如果第1级本身产生一个进位(G1G_1G1​),或者第1级传播一个来自第0级的进位(P1C1P_1 C_1P1​C1​),我们就会得到一个来自第1级的进位输出。”但 C1C_1C1​ 是什么呢?它就是 G0+P0C0G_0 + P_0 C_0G0​+P0​C0​。通过代入这个式子,我们得到了一个完全依赖于初始进位 C0C_0C0​ 和输入比特本身的 PPP 和 GGG 信号的 C2C_2C2​ 的完整表达式:

C2=G1+P1(G0+P0C0)=G1+P1G0+P1P0C0C_2 = G_1 + P_1(G_0 + P_0 C_0) = G_1 + P_1 G_0 + P_1 P_0 C_0C2​=G1​+P1​(G0​+P0​C0​)=G1​+P1​G0​+P1​P0​C0​

如果你为一个4位加法器继续这样做,你会得到一组可以同时计算所有进位的方程。例如,最终的进位输出 C4C_4C4​ 有一个看起来很复杂的表达式:

C4=G3+P3G2+P3P2G1+P3P2P1G0+P3P2P1P0C0C_4 = G_3 + P_3 G_2 + P_3 P_2 G_1 + P_3 P_2 P_1 G_0 + P_3 P_2 P_1 P_0 C_0C4​=G3​+P3​G2​+P3​P2​G1​+P3​P2​P1​G0​+P3​P2​P1​P0​C0​

这个方程可能看起来复杂,但它也是一件美物。它代表了纯粹的并行逻辑。它可以直接在硬件中实现为一个两级电路:一组与门后跟一个或门。所有的输入(PiP_iPi​, GiG_iGi​, C0C_0C0​)同时到达,仅仅经过两级门的延迟,结果就准备好了。没有行波,没有排队等待。

当然,这些抽象的方程必须变成真实的电路。在现代数字设计中,我们使用像Verilog或VHDL这样的硬件描述语言(HDL)来描述我们的逻辑。最基本的构建模块,即为单个比特计算 PiP_iPi​ 和 GiG_iGi​ 的逻辑,简单得惊人。产生信号 Gi=Ai⋅BiG_i = A_i \cdot B_iGi​=Ai​⋅Bi​ 只是一个 and 门,而传播信号 Pi=Ai⊕BiP_i = A_i \oplus B_iPi​=Ai​⊕Bi​ 只是一个 xor 门。一个仅包含这两个门的微小Verilog模块,就是高速处理器算术单元这棵参天大树生长的种子。

特化与泛化之艺

一个科学原理的真正威力体现在其灵活性上。在构建了一个通用加法器之后,我们现在可以问:我们能调整它吗?在特殊情况下会发生什么?

考虑一个在计算中非常常见的操作:将一个数增一,即计算 S=A+1S = A + 1S=A+1。这只是一个加法,其中第二个操作数 BBB 是数字 00...0100...0100...01。我们的传播和产生信号会变成什么样?对于除了第一位(第0位)以外的所有比特位,Bi=0B_i=0Bi​=0,所以逻辑大大简化:Gi=Ai⋅0=0G_i = A_i \cdot 0 = 0Gi​=Ai​⋅0=0 和 Pi=Ai⊕0=AiP_i = A_i \oplus 0 = A_iPi​=Ai​⊕0=Ai​。对于第一位,B0=1B_0=1B0​=1,所以 G0=A0G_0=A_0G0​=A0​ 和 P0=A0‾P_0=\overline{A_0}P0​=A0​​。

将这些值代入我们的进位方程,并设初始进位 C0=0C_0=0C0​=0,会得到一个非常简单的结果。进入第1级的进位 C1C_1C1​ 就是 A0A_0A0​。进入第2级的进位 C2C_2C2​ 变成 A1A0A_1 A_0A1​A0​。总的来说,进位 Ci+1C_{i+1}Ci+1​ 仅仅是到该点为止所有输入比特的逻辑与:Ci+1=AiAi−1⋯A0C_{i+1} = A_i A_{i-1} \cdots A_0Ci+1​=Ai​Ai−1​⋯A0​。这完全符合直觉!一个进位能够传播过低位,当且仅当它们全都是1。我们通用而强大的超前进位框架,对于一个专门的任务,自动简化为这种优雅、优化的形式。

那么反方向呢?我们能泛化我们的加法器来做更多事情吗?一个经典的例子是减法。我们在数字逻辑中学到,减去 BBB 等同于加上它的2的补码。而 BBB 的2的补码是通过将其所有比特取反(Bˉ\bar{B}Bˉ)再加1得到的。所以,操作 A−BA - BA−B 就变成了 A+Bˉ+1A + \bar{B} + 1A+Bˉ+1。

这太了不起了!我们可以用我们的加法器硬件来执行减法。我们所需要的只是一排XOR门在输入端,以便有选择地反转 BBB 的比特(因为 Bi⊕1=Bi‾B_i \oplus 1 = \overline{B_i}Bi​⊕1=Bi​​),以及一种将初始进位 C0C_0C0​ 设置为1的方法。在第 iii 级,减法操作的传播和产生信号就变成了 Pi=Ai⊕Bi‾P_i = A_i \oplus \overline{B_i}Pi​=Ai​⊕Bi​​ 和 Gi=Ai⋅Bi‾G_i = A_i \cdot \overline{B_i}Gi​=Ai​⋅Bi​​。通过这个微小的修改,我们的快速加法器就变成了一个快速的加减法器,这是任何算术逻辑单元(ALU)的基石。我们几乎以一个操作的代价得到了两个至关重要的操作。

规模扩展:从比特到处理器

一个4位加法器是一个很好的教学工具,但现代处理器处理的是64位数字。如果我们试图像写 C4C_4C4​ 那样写出 C64C_{64}C64​ 的完整方程,公式将是巨大的,由此产生的电路也将复杂到无法实现。门的扇入(fan-in)会变得极大!自然界不是这样构建事物的,我们也不应该。解决方案是层次化。

就像我们为单个比特定义 PPP 和 GGG 一样,我们可以为一个完整的4位块定义“组产生”(GGG_GGG​)和“组传播”(PGP_GPG​)信号。

  • 一个4位块产生一个进位(GG=1G_G=1GG​=1),如果它能自行产生一个进位输出 C4C_4C4​,即使输入进位 C0C_0C0​ 为0。
  • 一个4位块传播一个进位(PG=1P_G=1PG​=1),如果一个输入进位 C0=1C_0=1C0​=1 能够成功地穿过整个块,产生一个进位输出 C4=1C_4=1C4​=1。这当然只在块内所有四个比特都设置为传播时才会发生:PG=P3P2P1P0P_G = P_3 P_2 P_1 P_0PG​=P3​P2​P1​P0​。

有了这个强大的抽象,我们可以把整个4位CLA当作一个“超级比特”。现在,要构建一个64位加法器,我们可以使用16个我们的4位CLA块,然后用一个第二层的、顶级的超前进位单元(Lookahead Carry Unit, LCU)来操作这些组 PGP_GPG​ 和 GGG_GGG​ 信号,从而并行地计算块间的进位(C4,C8,C12,…C_4, C_8, C_{12}, \dotsC4​,C8​,C12​,…)。

这种层次化设计是构建大型、快速算术电路的关键。它还为性能分析提供了一个完美的框架。得到答案的总时间——即关键路径延迟——是任何信号从输入到输出所必须经过的最长路径。让我们为一个以这种方式构建的64位加减法器追踪这条路径。

  1. 首先,B 输入可能被反转,这需要一个门延迟。
  2. 接下来,为所有64个比特并行计算按位的 PiP_iPi​ 和 GiG_iGi​ 信号。
  3. 然后,16个块计算它们的组 PGP_GPG​ 和 GGG_GGG​ 信号,同样是并行的。
  4. 这16对信号馈入顶层 LCU,该 LCU 并行计算主要进位 C4,C8,…,C60C_4, C_8, \dots, C_{60}C4​,C8​,…,C60​。
  5. 一旦一个块从 LCU 接收到其输入进位,它会并行计算其内部的进位(例如,C5,C6,C7C_5, C_6, C_7C5​,C6​,C7​)。
  6. 最后,当所有进位都已知后,并行计算和比特 Si=Pi⊕CiS_i = P_i \oplus C_iSi​=Pi​⊕Ci​。

最慢的路径决定了加法器的速度。注意这个主题:并行,并行,再并行。延迟不是随着64位线性增长的;它随着层次结构的数量增长,而这是对数级的。对于一个64位加法器,一个行波进位设计可能需要64个门延迟,而一个层次化的CLA可能只需要12个,。这种对数级的扩展是 sluggish calculator 和高性能CPU之间的区别。这不仅仅是一种改进;它是一种范式转变,使现代计算成为可能。即使是混合设计,即在块内使用超前进位,但用行波进位连接它们,也在速度和电路复杂性之间提供了一个实际的权衡。

先进架构与理论视野

层次化CLA只是更广泛的“并行前缀”加法器家族中的一种设计。核心问题是高效地计算所有 iii 的前缀 Ci+1=Gi:0+Pi:0C0C_{i+1} = G_{i:0} + P_{i:0}C_0Ci+1​=Gi:0​+Pi:0​C0​。像Brent-Kung加法器这样的架构使用优雅的树状结构,在 O(log⁡N)O(\log N)O(logN) 时间内计算出所有组 (G,P)(G, P)(G,P) 前缀,通常具有更规则的布局,非常适合硅芯片制造。组合相邻 (G,P)(G, P)(G,P) 对的基本数学原理保持不变,但组合的模式不同。这将数字设计的具体问题与并行算法设计的更抽象领域联系起来。

也许最令人惊讶的联系是与理论计算机科学的联系。让我们退后一步,重新描述每个比特级的工作。它可以‘产生’(Generate)一个进位(G),‘传播’(Propagate)一个进位(P),或者‘杀死’(Kill)一个进位(K,当两个输入都为0时)。一次N位加法就像处理一个来自字母表 {G,P,K}\{G, P, K\}{G,P,K} 的N个符号的字符串。我们从一个为0的进位状态开始。如果我们读到一个‘G’,进位状态变为1。如果我们读到一个‘K’,它变为0。如果我们读到一个‘P’,状态保持不变。

“最终的进位输出是1吗?”这个问题等价于问:“在读取整个输入字符串后,机器是否处于‘进位=1’的状态?”这正是自动机理论的语言。整个进位传播过程可以用一个简单的两状态机(确定性有限自动机或DFA)来建模,其中状态是“进位为0”和“进位为1”。这是一个深刻的见解。在硅芯片内部展开的物理过程在数学上等同于识别一种正则语言。电脉冲遵循的抽象规则与控制符号串模式的规则是相同的。

从一个简单地想要更快地进行加法运算的愿望出发,我们穿越了实际的硬件设计、处理器架构、性能分析、并行算法,最终到达了计算理论的抽象领域。这段旅程揭示了,传播和产生的原理不仅仅是一种工程上的便利。它们是关于层次结构和并行性的更深层次思想的体现,而这一思想对计算本身至关重要。理解它们,就是理解了计算机之所以快速的灵魂的一小部分。