
在我们日益数字化的世界中,电子系统的可靠性至关重要。然而,这种可靠性面临着一个持续存在的无形威胁:软错误。这些是瞬态故障,是由来自太空或芯片自身材料的高能粒子撞击敏感电路所导致的瞬间数据损坏。随着技术进步,晶体管尺寸的缩小和工作电压的降低,矛盾的是,我们的设备反而更容易受到这些随机事件的影响。这就提出了一个关键问题:我们如何用那些天生就易受宇宙杂散辐射影响的组件来构建可靠的系统?
本文全面概述了软错误现象,弥合了基础物理学与实际系统设计之间的鸿沟。它将引导您了解核心概念,这些概念使工程师能够将这种随机威胁转化为可管理的工程参数。第一章“原理与机制”深入探讨了位翻转的物理学,解释了软错误的原因以及如何对其发生率进行建模和测量。随后的“应用与跨学科联系”一章将探讨为对抗这些错误而开发的巧妙解决方案,从存储器中的纠错码到容错超级计算机的设计,揭示了在可靠性、性能和成本之间的优雅权衡。
想象一下我们的数字世界,它建立在数以亿计的微小电子开关——晶体管之上,每个开关都维持着一个脆弱的状态:一个“1”或一个“0”。现在,想象宇宙正在玩一场无休止的飞镖游戏,将微观的高能粒子——遥远超新星的残骸,或芯片封装材料自身的辐射——掷向我们的电路。大多数粒子会无害地穿过。但偶尔,会有一颗粒子直接命中一个晶体管,沉积的能量刚好足以将其状态从“0”翻转为“1”,反之亦然。
这就是软错误的本质。晶体管没有损坏或永久性损伤;它只是被瞬间扰动到了错误的状态。这是一种瞬态故障。如果那个开关是一个电灯开关,软错误就好比有人把它关上又马上打开。相比之下,永久性故障则像是开关完全坏掉,卡在某个位置。 虽然这似乎是一个遥远而抽象的问题,但这场宇宙飞镖游戏是现代计算领域的一个根本性挑战,影响着从大型数据中心到卫星制导系统的一切。要理解它,我们必须首先审视那一次致命翻转的剖析。
一个位需要多大的“推力”才能翻转?在每个数字存储单元的核心,比如 SRAM 中的一个位,都有一对交叉耦合的反相器,形成一个双稳态锁存器。一侧保持高电压(,代表“1”),另一侧保持低电压(地,或“0”)。这种稳定性由一种微妙的平衡维持。要打破这种平衡,粒子撞击必须注入或移走足够的电荷,以将节点的电压推过相对反相器的开关阈值()。一旦越过该阈值,电路自身的反馈机制就会启动,并再生性地将该单元驱动到相反的状态。
实现这一点所需的最小电荷量被称为临界电荷,或 。从第一性原理出发,电容 上的电荷 与其电压 的关系为 。因此,要将一个节点的电压从 提升到触发点 ,所需电荷的一阶近似为 ,其中 是该节点的总电容。 更大的电容或更高的开关电压意味着更稳健的单元——一个需要更大电荷沉积才能被翻转的单元。
这就是进步的悖论所在。几十年来,摩尔定律推动了晶体管的小型化。随着尺寸缩小,它们的电容 自然会减小。与此同时,为了应对飞涨的功耗,工程师们被迫降低电源电压 。由于反相器的开关阈值 与 内在相关(通常 ),它也随之下降。这两种趋势——减小的 和减小的 ——共同导致了临界电荷 的急剧降低。 每一代新技术,虽然更快、更高效,但其构成的组件在个体上却更加脆弱,更容易受到宇宙杂散辐射的影响。一个曾经主要困扰宇航员的问题,如今已成为地面电子设备的基本设计约束。
知道单个位可以翻转后,下一个自然的问题是:这种情况发生的频率有多高?这由软错误率 (SER) 来量化。我们可以从头开始为这个率建立一个直观的模型。一个设备中每秒的总翻转次数必须取决于三个简单因素:
将这些因素结合起来,我们得到原始翻转率 的基本方程:
这个异常简单的公式是 SER 预测的基石。它告诉我们,一个大型存储器阵列( 很大)在宇宙射线通量 很高的高海拔地区运行时,将经历大量的错误。
因为对于单个设备而言,这些率可能非常小,但在考虑数百万设备数年的运行时却很显著,工业界通常使用一个更方便的单位:FIT (Failures In Time)。一个 FIT 对应于每十亿()设备小时一次故障。这只是一种将该比率缩放到一个更易于管理的数字的方法,让工程师可以说一个设备的可靠性为,比如 100 FIT,而不是每小时 的故障率。
模型提供了一个极好的一阶估计,但物理现实更为丰富和微妙。并非所有的粒子“飞镖”都是一样的。
首先,粒子引起翻转的能力关键取决于其能量。低能粒子可能无法沉积足够的电荷来超过 。因此,翻转截面不是一个常数,而是能量的函数,。它通常在某个阈值能量以下为零,然后随着能量的增加而上升并饱和。同样,粒子通量也不是单能的,而是一个连续的能量谱,。更准确地计算 SER 需要将这两个函数的乘积在所有能量上进行积分:
这个积分揭示了 SER 主要由一个特定的粒子能量带主导——在这个区域,既有显著的通量,又有很高的引起翻转的概率,形成了一个“最佳点”。对于海平面的大气中子来说,这个关键窗口通常在几十到几百兆电子伏特 (MeV) 的范围内。 这种理解对于设计有效的屏蔽至关重要,屏蔽的目的是减慢粒子速度,将它们移出这个关键能量窗口,以免它们撞击芯片。
其次,粒子源并不总是来自外部。有时,敌人在内部。用于制造和封装芯片的材料中可能含有痕量的放射性同位素。一个经典的例子是同位素硼-10 (B),它有非常高的概率捕获一个低能(热)中子并释放出一个α粒子——一种高电离性粒子,很容易导致软错误。这迫使半导体制造商使用高度纯化的硼,几乎完全去除 B 同位素,以满足可靠性目标。
最后,软错误并不仅限于存储单元(单粒子翻转,或 SEU)。粒子也可能撞击组合逻辑电路中的一个节点,产生一个瞬态电压脉冲,或称“毛刺”。这被称为单粒子瞬态 (SET)。毛刺本身是无害的。然而,如果这个毛刺传播到一个存储元件,如锁存器或触发器,并在一个精确的错误时刻——在其“建立时间”窗口内,即时钟信号锁存数据之前——到达,这个毛刺就可能被捕获并存储为一个稳定但不正确的逻辑值。因此,逻辑电路的脆弱性是时序的微妙舞蹈,取决于时钟频率、毛刺的持续时间以及锁存器的建立时间。这引入了时间屏蔽的概念:一个太短或在“安全”时间到达的毛刺会被屏蔽,不会造成任何伤害。
我们已经确定,位可以并且确实会翻转。一个简单的计算可能表明我们的计算机应该会持续崩溃。然而,在大多数情况下,它们以惊人的可靠性工作。这是因为物理层面的原始位翻转不会自动转化为系统崩溃。一个巨大而优雅的屏蔽效应层次结构阻碍了大多数错误,使其永远不会变得可见。
一些屏蔽发生在电路层面。一个错误可能被逻辑屏蔽;例如,如果一个与非门的一个输入已经是“0”,那么另一个输入上的位翻转就无关紧要,因为无论如何输出都将保持为“0”。一个 SET 毛刺可能被电气屏蔽,其脉冲太弱或太短,无法通过后续的逻辑门传播。
但最深刻和美妙的屏蔽形式发生在微架构层面。一个现代处理器是受控混乱的风暴中心。它沿着预测的程序路径推测执行指令,处理可能需要也可能不需要的数据。一个错误可能击中属于错误预测代码分支的一部分的位,这些数据本来就是要被丢弃的。或者它可能破坏一个寄存器中的值,而这个值在被读取之前就被一个新值覆盖了——一个所谓的“死”值。
一个故障在经受了所有底层屏蔽效应后,最终实际破坏了机器的最终提交状态或用户可见输出的概率,被称为架构脆弱性因子 (AVF)。关键的洞见在于 AVF 并非硬件的固定属性;它强烈地依赖于工作负载。一个执行密集科学计算的程序,其中每一份数据都至关重要,可能会有很高的 AVF。另一个充满条件分支和数据相关操作的程序,可能因为其内部状态在任何给定时刻有很大一部分是推测性的或临时的,而具有低得多的 AVF。这解释了为什么在完全相同的硬件上、完全相同的条件下运行不同的软件,会导致可观察到的故障率大相径庭。[@problem_-id:4299200]
AVF 的概念揭示了关于稳健性的深刻真理。系统级的可靠性不仅来自于完善单个组件,还来自于整个系统的巧妙组织和动态行为。这是一种类似于生物系统稳健性的韧性,生物系统本身也是由大量嘈杂且不完美的组件(如神经元)构成的。 这一理解开辟了新的前沿领域,例如近似计算,我们有意设计能够容忍一定程度错误的系统,以换取速度和能效的大幅提升,因为我们确信并非每一个微小的翻转都意味着灾难。
在我们之前的讨论中,我们深入微观世界,去理解软错误的物理起源——那些由杂散辐射引起的、转瞬即逝、如幽灵般的数据损坏。我们看到一个高能粒子如何能对一个晶体管造成严重破坏,将一个位从 0 翻转为 1。这是一个引人入胜的故事,但也有点令人不安。这是否意味着我们庞大的数字世界建立在沙堡之上,任由每一个偶然经过的宇宙射线摆布?
幸运的是,答案是否定的。软错误的故事并非无奈的故事;它是一曲人类智慧的赞歌。它是一个绝佳的例子,说明了我们如何通过理解一种物理现象,来设计工程方案绕过它,将一个看似随机的麻烦转变为一个可量化、可管理的风险。本章讲述的就是这段旅程。我们将探索工程师、物理学家和计算机科学家学会驯服机器中幽灵的美妙而巧妙的方法。这是一个从单个晶体管的设计延伸到全球计算机网络运行的故事,充满了优雅的权衡和惊人的联系。
当你遇到错误时,你会怎么做?你可能会再试一次。这个简单而直观的想法是抗击软错误的第一步。想象一下从存储设备读取一个大文件。偶尔,一个磁畴可能会被误读,产生一个软错误。操作系统不会就此放弃并崩溃。相反,它会识别出错误(也许通过校验和),然后简单地重读故障块。这次重试会花费一点时间。如果我们知道任何给定块的读取错误概率为 ,重试的时间代价为 ,我们就能精确计算出读取该文件的预期总时间。它将不只是理想的传输时间;它将是那个时间加上重试带来的惩罚项;总预期时间可以建模为 。关键的洞见在于,错误并不会导致灾难;它引入了一个可预测的性能开销。可靠性被换取了速度上的一个小的、可管理的下降。
这种“再试一次”的策略对存储设备有效,但对于计算机快速、易失的核心——内存,又该怎么办呢?内存中一个翻转的位可能在我们有机会“再试一次”之前就被用于计算了。我们需要一种更主动的防御。这就是纠错码 (ECC) 的魔力所在。
ECC 的思想是为我们的数据增加一些额外的位——称为奇偶校验位或校验位。这些位不是随机的;它们是根据数据位本身巧妙计算出来的函数。当我们读回数据时,我们可以重新计算校验位,并与存储的进行比较。如果它们不匹配,我们就知道发生了错误!一个简单的码可能只能告诉我们有错误发生,但一个更复杂的码,如单错纠正、双错检测 (SECDED) 码,可以精确定位单个翻转位的位置并动态地纠正它。
当然,这种能力不是免费的。ECC 在存储(用于奇偶校验位)和时间(用于执行检查和纠正)上都引入了开销。但它也给了我们一个强大的新工具:内存擦洗。来自宇宙射线的错误会随着时间累积。如果我们长时间不理会内存,第二个位可能会在一个已经有一个错误的字中翻转。大多数常见的 ECC 方案无法处理两个错误,所以这会导致一个不可纠正的故障。解决方案是什么?我们定期“擦洗”内存,读取每个位置,让 ECC 逻辑修复它发现的任何单比特错误,然后将纠正后的数据写回。
但我们应该多久擦洗一次?如果我们擦洗得太频繁,就会浪费电力和内存带宽。如果我们等得太久,就有累积不可纠正错误的风险。这是一个美妙的优化问题,可以用我们学到的物理学来解决。通过将软错误建模为泊松过程,我们可以计算出在给定时间间隔内累积双比特错误的概率。由此,我们可以推导出最大允许的擦洗周期 ,以保证在系统整个生命周期内发生不可纠正错误的概率低于某个微小的阈值,比如说,十亿分之一。最优的擦洗率是辐射物理学与系统性能需求之间的一场精妙舞蹈。
一旦我们决定使用错误保护,一个充满设计选择的全新世界便开启了,每个选择都有其自身的成本和收益。这就是架构师的困境。很少有单一的“最佳”解决方案;相反,存在一个在可靠性、性能、功耗和芯片物理面积之间进行复杂权衡的景观。
考虑保护静态随机存取存储器 (SRAM),即处理器内部用于快速缓存的类型。我们可以使用按字的 SECDED 码,即一次性检查整个 64 位字。或者,我们可以使用一种不同的、更粗暴的技术:三模冗余 (TMR)。使用 TMR,我们为每个位存储三个副本,并使用“多数表决”来决定正确的值。如果一个副本被宇宙射线击中,另外两个会以票数胜出。
哪种更好?要回答这个问题,我们必须像电路设计师一样思考。按字的 ECC 解码器是复杂的逻辑,只有在从存储器阵列的不同部分组装完整个 64 位字之后才能运行。这给读取路径增加了显著的延迟。另一方面,TMR 表决器很简单,可以放置在存储单元旁边,在本地并行地执行纠错,在最终的字被组装之前。在典型场景中,TMR 可能要快得多。然而,它需要将存储单元增加三倍,这在面积和功耗上是巨大的成本。分析揭示了一个经典的工程选择:优雅、逻辑复杂的 ECC 对比简单、粗暴的 TMR,这是速度、面积和设计复杂度之间的权衡。
当你看到数字时,TMR 的威力确实惊人。因为 TMR 故障需要两个独立的、随机的软错误在同一个微小的时间窗口内发生在同一个位的两个不同副本上,所以故障的概率被极大地降低了。使用 TMR 的系统级故障率可以比未受保护的电路小许多个数量级——减少因子可以极端到 。这项分析还引入了一个关键概念:架构脆弱性因子 (AVF),它承认处理器中的每一次位翻转并非都至关重要。许多位在能导致错误结果之前就被覆盖了。AVF 是一个位翻转实际导致可见错误的概率,是任何现实可靠性模型中的关键因素。
权衡可能更加深刻。与其添加 ECC 逻辑,为什么不直接构建更坚固的晶体管呢?我们可以使用一种称为“器件级加固”的技术,改变位单元的物理尺寸和结构,使其不易受粒子撞击影响。这同样有成本:一个更大、更坚固的位单元占用更多面积,消耗更多能量,而且可能稍慢一些。所以现在架构师面临一个更丰富的选择:添加 ECC 逻辑,还是使用没有 ECC 的加固单元?或者两者都用?通过创建一个结合所有这些成本的综合指标——能量-延迟-面积乘积 (EDAP)——我们可以进行复杂的分析。这样的研究可能会揭示,例如,对于一个固有原始错误率较低的系统,加固更有效率。但随着原始错误率的增加,在某个盈亏平衡点,ECC 卓越的纠错能力成为满足系统可靠性目标的唯一途径,尽管其开销更高,但它仍是更好的选择。
到目前为止,我们主要考虑的是独立的、单比特的翻转。但如果整个内存芯片都失效了呢?这可能导致单个数据字中出现突发错误,从而压垮标准的 SECDED 码。对于依赖大型 DRAM 模块的任务关键型系统,需要更强大的保护方案。这就是“Chipkill” ECC 背后的动机。Chipkill 码被设计用来纠正任何局限于单个内存芯片的错误。通过将一个码字的各位分布在多个芯片上,系统即使失去一整个芯片也能恢复数据。当我们分析可靠性时,我们发现对于标准的 SECDED,不可纠正错误的概率主要由单个芯片失效的几率决定。对于 Chipkill,这个事件是可纠正的,所以主要的失效模式变成了在两个不同芯片中发生两次随机位翻转的更为罕见的事件。Chipkill 提供了可靠性的显著提升,说明了一个关键原则:你必须设计你的保护方案来匹配你的主要失效模式。
但故事在这里发生了意想不到的转折,将可靠性的世界与硬件安全的阴影领域联系起来。那些旨在报告和计数已纠正错误的机制,本身可能被用来对付系统。攻击者可以尝试在内存中诱发错误(使用像“Rowhammer”这样的巧妙技术),然后监控公共的 ECC 错误计数器。如果计数器是细粒度的,攻击者就能知道哪些物理内存位置是脆弱的。这种信息泄露,或称*侧信道*,将一个诊断工具变成了安全漏洞。解决方案包括粗化计数器——将它们在更大的内存区域或更长的时间窗口内聚合——以模糊特定行为与报告错误之间的联系。这是一个美丽而发人深省的例子,说明了一个领域中的特性如何成为另一个领域中的缺陷。
这种不同领域之间相互作用的主题是现代芯片设计的核心。考虑动态电压频率调整 (DVFS),这是一种通过在处理器不忙时降低其电压和时钟速度来节省功耗的普遍技术。降低电源电压 () 对可靠性有巨大影响。翻转一个位所需的临界电荷 () 与 成正比,因此较低的电压使芯片更容易受到软错误的影响。同时,较低的电压使逻辑门变慢,这会减少可用于吸收瞬态毛刺的时序裕度。一个捕捉所有这些效应——器件物理、电路时序和架构脆弱性——的综合模型,允许设计者在这个复杂的权衡空间中导航。他们可以找到一个最佳操作点,在满足性能目标的同时,最小化每次操作的预期故障次数,这是功耗、性能和可靠性之间的真正平衡艺术。
在最宏大的尺度上,这些原则指导着世界上最大的高性能计算 (HPC) 系统的设计。对于一台拥有数百万处理器的机器来说,故障不是一种可能性;它们是家常便饭。总故障率是所有可能故障的叠加:节点硬件故障、内存中不可纠正的软错误等等。这里的主要防御是检查点/重启:定期将模拟的完整快照保存到稳定存储中。检查点之间的最佳时间 是总系统故障率 的直接函数。找到这个最佳间隔,使用像 这样的经典公式(其中 是写入检查点的时间),对于整个数百万美元的机器的效率至关重要。它需要一个整体的故障模型,该模型正确地考虑了每种类型错误的发生率,从逃脱 ECC 的单个位翻转到整个节点故障,以及它们相应的恢复操作。
软错误的挑战不会消失。随着我们推动计算的前沿,同样的基本原则找到了新的应用。向基于芯粒 (chiplet) 的设计转变,即大型处理器由更小的裸片组装而成,依赖于高带宽的裸片间互连。这些链路和内存一样容易受到软错误的影响,它们的可靠性至关重要。工程师们使用相同的建模技术,从一个工业标准的故障率单位 (FIT) 率开始,计算所需的 ECC 强度 (),以确保链路达到其目标错误概率。
此外,当我们探索超越传统硅的新材料和新器件时,软错误的问题也随之而来。像阻变存储器 (RRAM) 这样的新兴技术,它使用氧化物层中的微小导电细丝来存储数据,也容易受到环境辐射的影响。通过运用粒子通量 () 和相互作用截面 () 的基本物理学,我们可以估算这些新型器件的每位软错误率,并确定使它们变得实用所需的 ECC 和擦洗策略。
这引出了一个最终的、统一的思想:可靠性工程是一门系统的、定量的学科。面对大量的抗辐射设计 (RHBD) 技术,设计师如何选择?我们可以通过计算每种可能措施的“单位预防错误的能量成本”,将经济学思维引入问题中。这使我们能够按成本效益从高到低对选项进行排序,并构建一个贪心成本效益曲线。这种方法将加固芯片的艺术转变为一门科学,允许设计师做出理性的、数据驱动的决策,以最佳地分配有限的功耗和面积预算,从而实现最高的可靠性。
从磁盘读取的简单重试到内存控制器的安全性,从单个 CPU 的功耗管理到超级计算机的效率,软错误的研究是贯穿所有现代计算的一条线索。它完美地诠释了物理学家的格言:我们能理解的,我们就能控制。机器中那个随机、不可预测的幽灵,一旦被理解,就变成了另一个可以被测量、建模和管理的工程参数。