try ai
科普
编辑
分享
反馈
  • 并行前缀加法器

并行前缀加法器

SciencePedia玻尔百科
核心要点
  • 并行前缀加法器使用“生成”(generate)和“传播”(propagate)信号以及一个满足结合律的运算符来并行计算所有进位信号,从而实现对数时间复杂度(O(log⁡n)\mathcal{O}(\log n)O(logn))。
  • Kogge-Stone、Brent-Kung 和 Sklansky 等加法器设计代表了在速度(逻辑深度)、面积(门数量和布线)和功耗之间的基本工程权衡。
  • 并行前缀模式是一种通用的计算原理,应用于硬件(乘法器、浮点运算单元)、软件(并行算法)乃至量子计算(Shor 算法)。
  • 通过克服行波进位加法器的线性时间瓶颈,并行前缀加法器对现代高速处理器的性能至关重要。

引言

加法是计算中最基本的操作,但要快速执行它却是一个重大的挑战。我们在学校学到的直接方法,在硬件中实现时被称为行波进位加法器,其速度之慢出人意料。它的串行特性——每一位都必须等待前一位的计算结果——造成了一个瓶颈,限制了整个处理器的速度。本文通过探索一种截然不同的方法——并行前缀计算——来解决这一关键的性能差距。我们将首先深入探讨“原理与机制”,揭示如何通过使用“生成”(generate)和“传播”(propagate)信号以及一个关键的数学性质——结合律(associativity)——来巧妙地重构进位逻辑,从而打破串行依赖链。随后,“应用与跨学科联系”一章将揭示这个强大的思想如何远远超出了简单的加法运算,构成了高性能乘法器、高能效电路,乃至量子计算前沿算法的支柱。

原理与机制

行波进位的“暴政”

我们如何将两个数相加?回想一下小学的情景。你将两个数上下对齐,从最右边的一列开始,将数字相加。如果和大于等于10,你就写下个位数,并将“1”进位到左边的下一列。你一列一列地重复这个过程,直到结束。这个简单的串行过程,正是最基本的计算机加法器——​​行波进位加法器​​的工作方式。

它忠实地模仿了我们的手动方法,并且异常简单。但它的简单性背后隐藏着一个深层问题:它很慢,非常慢。想象一下将两个 64 位数相加,这是现代处理器的标准。要计算出第 64 位的结果,你首先需要知道第 63 位是否有进位。但第 63 位的进位又取决于第 62 位,第 62 位又取决于第 61 位,以此类推,一直回溯到第一位。进位必须像“涟漪”一样“行波”穿过整个数字的长度。这就形成了一个依赖链,获得最终答案所需的时间与位数 nnn 成正比。对于一个 64 位数,这意味着 64 个串行步骤。在一个每秒执行数十亿次操作的处理器世界里,这简直是天长地久。每当处理器需要进行加法运算时,它都不得不停下来等待。

一定有更好的方法。我们能更聪明些吗?例如,我们能否在计算第 32 位的进位时,无需等待前 31 位完成计算?答案是肯定的,而这源于对问题的彻底重构。

一种新的思维方式:生成与传播

我们不再仅仅问“进位是什么?”,而是提出一个更细致的问题。对于任意一列比特,比如具有输入 aia_iai​ 和 bib_ibi​ 的第 iii 位,在什么条件下它会产生一个向高位的进位输出 ci+1c_{i+1}ci+1​?稍加思考就会发现两种不同的情况。

首先,进位可以在当前位置被创造出来。如果 aia_iai​ 和 bib_ibi​ 都是 1,它们的和就是 2(二进制为 10),所以无论输入进位是什么,我们都必须生成一个进位输出。我们称之为​​生成​​(generate)条件:gi=ai∧big_i = a_i \land b_igi​=ai​∧bi​。

其次,一个进位可能从前一位传来(输入进位 ci=1c_i=1ci​=1)并穿过当前位。当输入 aia_iai​ 和 bib_ibi​ 中恰好有一个为 1 时,就会发生这种情况。此时,ai+bi=1a_i + b_i = 1ai​+bi​=1,再加上输入进位 ci=1c_i=1ci​=1 会使总和为 2(二进制为 10),因此进位就被传递下去了。我们称之为​​传播​​(propagate)条件:pi=ai⊕bip_i = a_i \oplus b_ipi​=ai​⊕bi​。(⊕\oplus⊕ 是异或运算符,当两个输入中只有一个为真时,其结果为真)。

有了这两个简单的概念,我们可以为进位提出一个新的、更强大的规则:

ci+1=gi∨(pi∧ci)c_{i+1} = g_i \lor (p_i \land c_i)ci+1​=gi​∨(pi​∧ci​)

用通俗的话说:“第 iii 位有进位输出,要么是因为进位是在这里生成的,要么是因为有一个输入进位并且它被传播了。”这个方程式是所有现代快速加法器的核心。它与之前的逻辑相同,只是用一种新的语言来表达。但正是这种新语言,将为我们打开并行化的大门。

结合律的魔力

乍一看,我们并没有解决速度问题。方程 ci+1=gi∨(pi∧ci)c_{i+1} = g_i \lor (p_i \land c_i)ci+1​=gi​∨(pi​∧ci​) 仍然表明 ci+1c_{i+1}ci+1​ 依赖于 cic_ici​,而 cic_ici​ 又依赖于 ci−1c_{i-1}ci−1​,依此类推。我们仍然被束缚在依赖链上。

真正的突破发生在我们开始考虑比特组的时候。让我们取两个相邻的块,一个“高位”块(我们称其组属性为 (g,p)(g, p)(g,p))和一个“低位”块(属性为 (g′,p′)(g', p')(g′,p′))。那么,合并后的大块的属性是什么?

  • 合并后的块在什么情况下会自己​​生成​​一个进位?当高位块生成一个进位(ggg)时,或者当高位块传播(ppp)一个由低位块生成的进位(g′g'g′)时,就会发生这种情况。所以,新的组生成是 g∨(p∧g′)g \lor (p \land g')g∨(p∧g′)。

  • 合并后的块在什么情况下会​​传播​​一个进位?这个条件更严格。一个输入到合并块的进位,只有当它被低位块传播(p′p'p′)并且随后也被高位块传播(ppp)时,才能完全穿过。所以,新的组传播是 p∧p′p \land p'p∧p′。

这给了我们一个用于组合块的规则,一个运算符。我们称之为​​前缀运算符​​,用 ∘\circ∘ 表示。给定两个由其 (G,P)(G, P)(G,P) 对表示的块,合并后的块为:

(g,p)∘(g′,p′)=(g∨(p∧g′),p∧p′)(g, p) \circ (g', p') = (g \lor (p \land g'), p \land p')(g,p)∘(g′,p′)=(g∨(p∧g′),p∧p′)

现在是关键的飞跃。这个源于简单进位逻辑的运算符,拥有一个深刻的数学性质:它是​​满足结合律的​​(associative)。这意味着对于任意三个块 A、B 和 C:

(A∘B)∘C=A∘(B∘C)(A \circ B) \circ C = A \circ (B \circ C)(A∘B)∘C=A∘(B∘C)

这可能看起来像一个抽象的奇特性质,但它正是打破依赖链的关键。结合律意味着运算的分组方式无关紧要。就像 (2+3)+4(2+3)+4(2+3)+4 等同于 2+(3+4)2+(3+4)2+(3+4) 一样,我们现在可以自由地以任何我们希望的顺序来计算我们的先行进位组。

从链到树:并行化的诞生

没有结合律,计算一个 8 位数的进位,比如说,需要一个线性的运算链:先计算第 0 位的前缀,然后用它来计算第 1 位的前缀,接着是第 2 位,以此类推。这是一个步调一致的前进过程,所需时间与 nnn 成正比。

(((((x0∘x1)∘x2)∘x3)∘x4)∘x5)∘…(((((x_0 \circ x_1) \circ x_2) \circ x_3) \circ x_4) \circ x_5) \circ \dots(((((x0​∘x1​)∘x2​)∘x3​)∘x4​)∘x5​)∘…

但有了结合律,我们就可以发挥创造力了。我们可以并行计算成对的组合:(x0∘x1)(x_0 \circ x_1)(x0​∘x1​)、(x2∘x3)(x_2 \circ x_3)(x2​∘x3​)、(x4∘x5)(x_4 \circ x_5)(x4​∘x5​) 和 (x6∘x7)(x_6 \circ x_7)(x6​∘x7​),所有这些都在一个步骤中同时完成。在下一步中,我们可以再次并行地组合这些结果:((x0∘x1)∘(x2∘x3))((x_0 \circ x_1) \circ (x_2 \circ x_3))((x0​∘x1​)∘(x2​∘x3​)) 和 ((x4∘x5)∘(x6∘x7))((x_4 \circ x_5) \circ (x_6 \circ x_7))((x4​∘x5​)∘(x6​∘x7​))。再一步将这两个结果组合起来,得到所有 8 位的最终结果。

我们将一个长而瘦的 7 步链条,转变成了一个只有 3 层的短而茂密的树。所需时间现在与树的高度成正比,即 log⁡2n\log_2 nlog2​n。对于我们的 64 位加法器,时间从 63 个串行步骤减少到仅仅 6 个。这是一个指数级的加速,是对行波进位加法器“暴政”的巨大胜利。这,本质上就是​​并行前缀加法器​​的原理。

加法器“动物园”:工程上的权衡

结合律这一美妙的数学洞见为电路设计师打开了一个充满可能性的世界。它告诉我们,前缀运算的任何括号组合方式都会产生正确的结果,这对应于硅芯片上不同的网络拓扑。这种选择的自由导致了名副其实的加法器设计“动物园”,每种设计都有其独特的优缺点。没有唯一的“最佳”加法器;只有权衡。

Sklansky 加法器:短跑选手

Sklansky 加法器,也被称为分治加法器,是最激进的设计。其结构旨在实现 ⌈log⁡2n⌉\lceil \log_2 n \rceil⌈log2​n⌉ 的绝对最小逻辑深度。然而,这种原始速度是有代价的。为了如此快速地计算所有前缀,一些中间信号必须广播到大量的其他逻辑门。这被称为​​高扇出​​(high fanout)。对于一个 32 位的 Sklansky 加法器,计算低 16 位前缀的节点可能需要驱动高 16 位中的 16 个独立逻辑门。在物理芯片上,这意味着一个门的输出必须对大量的导线电容进行充电和放电,从而形成一个可能速度缓慢且耗电的电气“热点”。为了缓解这个问题,工程师通常必须插入称为​​缓冲器​​(buffers)的特殊驱动电路来处理负载。

Brent-Kung 加法器:马拉松选手

在另一端是 Brent-Kung 加法器。它将效率和结构简单性置于原始速度之上。它的设计是一个优美的两阶段过程:一个“上扫”(up-sweep)或归约树,它将组前缀信息汇集到逐渐增大的块中;随后是一个“下扫”(down-sweep)或扩展树,它利用这些信息高效地计算每个比特位的最终进位。这种结构保证了低扇出(每个门最多驱动两个其他门),并且使用的逻辑单元和导线要少得多。其代价是电路更深,逻辑深度约为 2⌈log⁡2n⌉−12\lceil \log_2 n \rceil - 12⌈log2​n⌉−1。它的速度几乎是 Sklansky 的一半,但它更小、在芯片上布局更简单、功耗也更低。通过重定向边来消除高扇出热点,从而重构 Sklansky 加法器的图,实质上是将其转换为 Brent-Kung 拓扑,用增加的深度换取减少的扇出。

Kogge-Stone 加法器:全能选手

Kogge-Stone 加法器提供了一个引人注目的折衷方案。与 Sklansky 一样,它实现了 ⌈log⁡2n⌉\lceil \log_2 n \rceil⌈log2​n⌉ 的最小可能逻辑深度。但它通过一种巧妙的、高度规则的结构来实现这一点,该结构保持了低且有界的扇出。它如何能两全其美呢?它付出了面积和复杂度的代价。Kogge-Stone 加法器是常见拓扑中迄今为止最大的,需要大量的逻辑单元,更重要的是,需要一个密集的、纵横交错的长导线网络。

让我们把这一点具体化。对于一个 32 位加法器,Kogge-Stone 设计可能比 Brent-Kung 设计多需要约 74% 的晶体管。当考虑一个物理布局模型,其中长导线对总面积有显著贡献时,一个 16 位 Kogge-Stone 加法器的面积成本可能是 Brent-Kung 加法器的近三倍。工程师面临的选择是严峻的:你是想要以高昂的面积和功耗成本换取最快的速度(Kogge-Stone),还是想要以较慢的速度换取最佳的效率(Brent-Kung),或是介于两者之间?

更深层次的原理与现代现实

故事并没有随着这个加法器动物园而结束。并行前缀计算的原理触及了电路设计和计算中一些最深层的概念。

一个基本限制

人们可能会想,是否存在一种神奇的第四种设计,它既超快(对数延迟)又超便宜(门和导线成本呈线性)。事实证明,答案是否定的。似乎存在一个基本的权衡,一种电路的“复杂度守恒”定律。虽然具体的界限取决于物理计算模型,但一个关键结果是,人们无法同时最小化电路成本(面积)和延迟。例如,要实现像 Kogge-Stone 加法器那样的最快对数延迟,需要的电路成本增长速度要快于线性(具体为 O(Nlog⁡N)O(N \log N)O(NlogN))。相反,像 Brent-Kung 加法器那样实现线性成本的设计,必须接受一个更大但仍为对数级的延迟。没有免费的午餐;你无法同时优化成本和延迟,超越这个基本的权衡。

真实世界是复杂的:工艺偏差

我们简洁的模型假设每个逻辑门都是完美且相同的。硅制造的现实是复杂的。由于微观上的不完美,任何给定门的延迟不是一个固定数值,而是一个随机变量。一个电路路径更深,比如 Brent-Kung 加法器,是更多这些随机变量的总和。虽然这显然增加了平均延迟,但它也增加了延迟的*方差*。这意味着一个更深的加法器不仅平均速度更慢,其性能也更难预测。这种对​​工艺偏差​​(process variation)的敏感性是现代芯片设计中的一个关键问题,为权衡分析增加了另一个复杂的维度 [@problem_gpid:3619374]。

如果出现故障怎么办?

最后,当这个复杂机器的一个微小部分发生故障时会怎样?前缀网络内部的一根导线“卡在”值 1 上,就可能引发一连串错误的计算。例如,单个传播信号上的一个故障可能会从该点开始破坏进位链,导致最终总和中出现多个错误。但是,为我们带来速度的同一个数学框架也能提供可靠性。通过利用和、进位、生成和传播信号之间的关系,工程师可以设计出巧妙的在线​​错误检测​​电路。这些电路持续监控加法器的运行,一旦检测到不一致——即故障的迹象——便能立即发出警报,使系统能够采取纠正措施。

从一个如何快速相加数字的简单问题出发,我们穿越了抽象代数、图论、复杂性理论,以及制造和可靠性的复杂现实。并行前缀加法器不仅仅是一个电路;它是一个美丽的例证,展示了如何利用深奥的数学原理来解决具体的工程挑战,揭示了现代计算核心中速度、成本和鲁棒性之间错综复杂的博弈。

应用与跨学科联系

在经历了并行前缀加法器原理与机制的旅程之后,人们可能会倾向于将这些知识归档为数字逻辑设计师的一个巧妙但小众的技巧。但这就像只看到一个齿轮而未能看到它所驱动的宏伟钟表机械。并行前缀计算的概念并非一个孤立的奇特现象;它是一种基本的模式,一条“金线”,贯穿于众多令人惊叹的科学和工程学科。这个思想是如此强大和普遍,以至于我们发现它被蚀刻在硅片上,嵌入在抽象的计算理论中,甚至被写入量子计算机的蓝图。现在,让我们来探索这个更广阔的世界,看看这一个美妙的思想能带我们走多远。

机器之心:锻造更快、更高效的计算机

并行前缀加法器最直接的用武之地,当然是在现代处理器的算术逻辑单元(ALU)内部。我们之前探讨过的由节点和连接组成的抽象图,必须被转化为物理电路。在硬件设计领域,这是通过硬件描述语言(HDL)完成的。设计工程师不是焊接单个的门电路,而是编写描述电路结构的代码。并行前缀网络(如 Kogge-Stone 加法器)的优雅递归结构,只需几行代码即可捕捉,利用生成式结构自动实例化并连接成千上万个门电路,形成精确的对数深度模式。这里的精妙之处在于,一个简单的局部规则——一个节点如何组合两个输入——如何生成一个具有巨大计算能力的复杂全局结构。

但所有这些速度是为了什么?一个加法器,无论多快,都只是一个组件。它的真正价值在于它成为更大规模运算中的关键环节。考虑整数乘法,这几乎是所有计算的基石。构建快速乘法器的一种常见方法是使用 Wallace 树,它接收乘法过程中产生的所有部分积,并有效地将它们归约为仅需相加的两个数。问题在于,这最后的加法是一个潜在的瓶颈。如果我们使用一个简单的、缓慢的行波进位加法器,进位信号必须尽职尽责地从数字的一端 plod 到另一端,那么我们就会浪费掉通过巧妙的归约树节省的所有时间。这时,并行前缀加法器就闪亮登场了。通过用一个对数时间的 Kogge-Stone 加法器替换慢速的行波进位加法器,最后的加法变得快如闪电,从而显著减少了执行一次乘法所需的总时间。

你可能认为故事到速度这里就结束了,但在现代计算中,真正的魔鬼是能耗。我们的设备不仅受限于计算速度,还受限于它们产生的热量和电池的续航时间。在这里,并行前缀加法器展现出一个令人惊讶且深刻的好处。并行前缀加法器有多种类型;一些像 Kogge-Stone 那样,结构密集且速度极快,而另一些,如 Brent-Kung 加法器,使用的导线和门更少,使得它们稍慢一些,但更小且更“稀疏”。

假设你的处理器有一个时钟周期目标。你可以使用一个速度中等的进位选择加法器,它刚好能满足时限。或者,你可以使用一个更快的 Brent-Kung 加法器,它在时限之前就完成了工作。你如何处理这多出来的时间,即“时序裕量”?你可以做一件很棒的事:降低处理器的供电电压。随着电压下降,晶体管变慢,但由于 Brent-Kung 加法器本来就很快,它仍然能满足时序目标。回报是巨大的。电路消耗的动态能量与电压的平方成正比(Edyn∝VDD2E_{\text{dyn}} \propto V_{\text{DD}}^2Edyn​∝VDD2​)。通过支持更低的工作电压,更快的加法器带来了能耗的大幅降低。这是一个深刻的工程权衡的优美例证:有时,最快的设计也是最节能的设计。这一原则允许工程师创建复杂的混合设计,为数字的不同部分精心选择不同的加法器类型,以完美地平衡特定任务的面积、延迟和功耗。

当我们审视更复杂的算术运算时,并行前缀逻辑的影响力愈发深远。

  • ​​浮点运算:​​ 科学世界运行在浮点数之上。将两个这样的数相加是一个多步骤的过程,涉及对齐数字、相加它们的尾数(有效数字)、归一化结果和舍入。在这个流水线中,尾数加法很容易成为主要的延迟环节。如果使用线性时间的行波进位加法器,整个浮点运算的性能会随着精度的增加而变差,其延迟会随着尾数宽度 mmm 以 O(m)\mathcal{O}(m)O(m) 的速度增长。通过替换为并行前缀加法器,尾数加法变成一个对数时间的步骤,即 O(log⁡m)\mathcal{O}(\log m)O(logm)。这一个改变从根本上改变了整个浮点运算单元的性能特征,使得高精度算术运算速度显著加快。

  • ​​积和熔加(FMA):​​ 从超级计算机到手机,现代处理器都包含专门的积和熔加单元,以加速机器学习和图形学等任务,这些任务大量依赖于 a⋅b+ca \cdot b + ca⋅b+c 形式的点积。一种朴素的方法是先计算 a⋅ba \cdot ba⋅b 再加上 ccc,这需要两次独立的、缓慢的、有进位传播的加法。然而,一个熔加单元巧妙地将 ccc 注入到乘法器归约树内的进位保留表示法中。这避免了一次完整的进位传播加法,节省了大量时间和能量。解决结果的最后一次加法仍然依赖于快速的并行前缀加法器才能高效。

  • ​​微妙的优势:​​ 并行前缀结构的力量不仅仅在于最终的和。它还在于能够并行地访问所有中间进位。这些信息可以用于一些巧妙的技巧。例如,在数字信号处理器中,通常希望算术运算在溢出时“饱和”而不是回绕。二进制补码加法中的溢出当且仅当进入最后一位的进位 cn−1c_{n-1}cn−1​ 与其进位输出 cnc_{n}cn​ 不同时发生。在并行前缀加法器中,cn−1c_{n-1}cn−1​ 和 cnc_ncn​ 都由前缀网络计算,并且与和的各位几乎同时可用。这意味着溢出条件 V=cn⊕cn−1V = c_n \oplus c_{n-1}V=cn​⊕cn−1​ 几乎可以免费检查,而不会给关键路径增加任何延迟——这是更简单的加法器设计无法做到的。

一种通用模式:从硅片到软件与理论

到目前为止,我们已经看到并行前缀原理是工程师构建更好硬件的工具。但这个思想远比这更基本。让我们从电路图的视角放大,看看理论计算机科学的世界。在这里,研究人员根据问题内在的并行潜力对其进行分类。​​NC​​ 类,即“Nick's Class”,包含了被认为是“可高效并行化”的问题——那些可以用多项式数量的门和仅为输入大小的多对数深度的电路解决的问题。

我们的加数问题处于什么位置?计算二进制字符串中“1”的数量(这等同于将一列 1 和 0 相加)可以通过一个由简单加法器组成的树和一个最终的并行前缀加法器来解决。这个电路的总深度是对数级的,O(log⁡n)O(\log n)O(logn)。这证明了整数加法属于 NC1NC^1NC1 类,从而牢固地确立了它作为所有计算问题中最基本和高度可并行化的问题之一的地位。我们设计的硬件结构直接影响了我们对并行计算抽象极限的理解。

这种抽象模式,在软件中通常被称为“扫描”(scan)或“前缀和”(prefix sum),并不局限于理论。它在高性能计算的世界中不断出现。想象一个程序员编写一个看似简单的循环来对一个大矩阵的每一行求和。代码看起来是内在串行的。然而,一个聪明的编译器(或程序员)可以转换这个循环,这个过程称为循环交换。这种转换可以揭示计算实际上是一组独立的前缀和操作,矩阵的每一行对应一个。一旦被识别为扫描操作,它就可以用一种并行算法来实现,在像 GPU 这样的并行机器上以对数时间运行。

但在这里,我们遇到了一个来自数值分析领域的美丽而具有警示意义的故事。在理想化的数学世界里,加法是满足结合律的:(a+b)+c=a+(b+c)(a+b)+c = a+(b+c)(a+b)+c=a+(b+c)。但在计算机浮点运算的有限精度世界里,这并不成立!一个串行的、从左到右的求和与一个并行的、基于树的前缀和算法以不同的顺序相加数字。因此,它们可能产生略微不同的结果。令人惊讶的是,并行前缀方法,它将求和重排成一个平衡树,通常会产生更准确的结果。其最坏情况下的误差以 O(εlog⁡M)\mathcal{O}(\varepsilon \log M)O(εlogM) 的速度增长,而串行求和的误差为 O(εM)\mathcal{O}(\varepsilon M)O(εM),其中 ε\varepsilonε 是机器精度。所以,那个在硬件中为我们带来速度的模式,同样在软件中为我们提供了通往更高数值稳定性的路径——这是一个深刻而出乎意料的联系。

量子前沿

我们这个简单思想的旅程最后一次令人惊叹的飞跃是:进入量子力学的奇特世界。当我们试图用量子比特和量子门构建计算机时会发生什么?事实证明,我们仍然需要进行算术运算。最著名的量子算法之一是 Shor 算法,它可以比任何已知的经典算法以指数级速度分解大数,对现代密码学构成了威胁。

Shor 算法的核心在于需要执行模幂运算,而这又是由模乘法构建的。如何在量子计算机上构建一个计算 a⋅b(modN)a \cdot b \pmod Na⋅b(modN) 的电路?一种方法是使用一系列受控的模加法。而一个快速量子模加法器的核心,你猜对了,就是一个量子版本的 Kogge-Stone 并行前缀加法器。在量子领域,最“昂贵”的门是非 Clifford 门,比如 T 门,它们对于通用计算至关重要,但噪声大且难以容错实现。“量子电路”的“成本”通常用其 T 门深度来衡量。并行前缀加法器的对数深度直接转化为一个 T 门深度按 O(nlog⁡n)\mathcal{O}(n \log n)O(nlogn) 扩展的量子电路,这相比于较慢的设计是一个显著的改进。一个为 20 世纪的经典硅片构思的架构原则,为 21 世纪构建大规模量子计算机提供了关键优化,这证明了一个伟大思想的永恒性。

从芯片上晶体管的具体布局,到乘法器和浮点单元的性能,到能效的权衡,到并行算法的抽象分类,到科学代码的数值稳定性,最后到容错量子计算机的设计——并行前缀计算的原理是一个具有非凡广度的统一概念。它教给我们一个美丽的道理:科学和工程中最深刻的真理往往是简单、优雅的模式,它们在最意想不到的地方重现,将我们技术的织物编织在一起。