3.1 基础纠错算法
3.1.1 SECDED纠错算法
SECDED(Single Error Correction Double Error Detection)是一种经典的ECC方案,能够纠正单比特错误并检测出双比特错误。在图4(a)中,展示了SECDED的编码过程。在这个过程中,使用了原始奇偶校验位P、数据位D以及计算出来的校验位P'。例子中,数据位D有16位,而奇偶校验位P'有5位,形成一个编码词组(16,11),意味着原始数据加上校验位共21位。
编码公式如下:
-
P′0 = P0异或D1异或D2异或D4异或D5异或D7异或D9异或D11
-
P′1 = P1异或D1异或(D3异或D4)异或(D6异或D7)异或(D10异或D11)
-
P′2 = P2异或(D2异或D3异或D4)异或(D8异或D9异或D10异D11)
-
P′3 = P3异或(D5至D11的全部异或)
-
P′4 = (P0至P4的全部异或)异或(D1至D11的全部异或)
这些公式说明了如何基于原始数据位和初始奇偶校验位P0至P4(均设为0)计算出校验位P'0至P'4。如果数据位的每行比特数之和为偶数,则对应的奇偶校验位为0;否则为1。通过这个过程,得到的校验位序列P′4P′3P′2P′1P′0为01100,与图4(a)中的数据值相对应。
图4(b)展示了当第三位数据错误变为1时的情况,这导致E1、E2和E4位产生错误。此时,通过应用SECDED编码,可以检测并纠正这个单比特错误,恢复原始数据的完整性。该例证展示了SECDED在数据保护中的有效性,即使在数据传输或存储过程中出现单个比特的错误,也能确保数据的正确性。
3.1.2 SSCDSD纠错算法
SSCDSD(Single symbol correction double symbol detection )是一种纠正方法,它将4至8位视为一个符号单位进行处理,相较于SECDED,提供了更为强大的错误纠正能力。在多数情况下,SSCDSD能够修正一个符号内所有位的错误。基于SSCDSD的纠错码在某些情况下相比SECDED能提供高达42倍更好的错误避免能力。
图5(a)展示了SSCDSD的实现方式。采用18个符号组成的码字,即(144,128)编码格式,其中包括128位数据和16位ECC,这16位ECC中又包含了8位CRC和8位奇偶校验。四个这样的码字组成一条缓存行。这样的设计使得SSCDSD能够在单一符号内纠正多种位错误,无论8位符号内的错误模式如何,如图5(b)所示。然而,如果错误跨越两个符号,则会被识别为一个不可纠正的符号错误(UE),类似于SECDED处理双比特错误的方式。如果错误影响到两个符号,则只能检测到错误而无法纠正。
SSCDSD能够根据DRAM的类型,将数据和奇偶校验信息以4位符号为单位进行划分。使用这种4位符号单元的ECC类型被称为“chipkill校正”。这种方法特别有效于处理DRAM芯片级别的错误,即使整个芯片失效也能纠正错误,从而增强系统的容错能力。
SSCDSD的实施依赖于CPU的架构和代际。不同的CPU架构可能需要不同的错误纠正覆盖范围和内存配置,以启用高级ECC功能。这意味着在设计支持SSCDSD的系统时,需要考虑CPU的具体型号和其所支持的内存错误纠正机制,确保内存子系统的可靠性和效率。
3.1.3 CRC纠错算法
循环冗余校验(CRC)是一种用于检测计算机数据中意外错误的技术,常应用于数字信号的发送/接收器和存储设备中。它通过利用除法运算和特定的多项式生成器来工作。
图6形象地展示了CRC的工作流程。具体步骤如下:
-
CRC发送端处理(图6a):首先,在发送端,数据被除以一个预定的多项式比特序列(例如,多项式p(x) = x^3 + x + 1,对应的二进制形式为1011)。此过程会产生一个余数,然后将这个余数添加到原始数据的末尾,形成一个新的数据序列进行传输。
-
传输与接收:经过这样处理的数据被发送给接收端,接收端再次用同样的多项式比特序列对收到的数据进行除法运算。
-
错误检测:如果除法运算的结果全为0,则表明在传输过程中没有发生错误,数据被接受;反之,则认为数据在传输中出现了错误。
-
编码示例(图6b):假设使用多项式p(x) = 1011,数据1001进行编码时,除法运算后余数为110。因此,编码后的数据为1001110。
-
解码示例(图6c):接收到的1001110数据同样除以多项式1011,如果结果全为0,则确认数据无误。
3.1.4 Chipkill纠错算法
SECDED技术能够纠正单个比特的错误并检测出两个比特同时出错的情况,但面对多比特错误时就无能为力了。为了解决这一局限性,可以采用一种名为“Chipkill”的纠错方法。
Chipkill 是一种增强型纠错码(ECC)技术,专为解决单个DRAM芯片完全故障或多比特错误而设计。与传统SECDED不同,它能够纠正整个内存芯片失效所导致的错误,而不仅仅局限于单个或双个比特错误。
-
四个72比特的ECC字(包含数据和纠错码)均匀分布在四个DIMMs上。每个DIMM代表了系统内存的一部分,这样的分布增强了错误容忍度。
-
SECDED编码同时应用于这四个不同的数据字,使得理论上每次最多可以纠正四个独立的单比特错误,或是一些组合的错误模式,包括一个DIMM内的多比特错误或一个整个DIMM的失效。
-
服务器需要能够同时利用这四个DIMMs进行数据处理和错误纠正,意味着系统设计上要有相应支持。
-
使用的编码方案为(72, 64)码,意味着在72比特的代码中,有64比特用于实际数据存储,剩余8比特用于纠错码。这种配置提供了至少12.5%的冗余率,即额外的校验比特占总数据量的比例。
Chipkill技术显著提升了系统对于内存错误的抵抗能力,特别是在服务器和高性能计算环境中,能够提高系统的稳定性和可靠性,减少因内存错误导致的数据丢失或系统崩溃的风险。Chipkill通过增加数据冗余和采用特殊的编码及分布策略,克服了SECDED技术不能处理多比特错误的限制,是提升系统内存错误纠正能力的有效手段。
完整分析解读参考:数据中心内存RAS技术全景剖析