LDPC为什么会成为当下SSD的主流纠错方式
上一篇我们讲到,ECC通过增加冗余、建立校验关系,让SSD具备了发现和纠正错误的能力。最简单的奇偶校验可以发现部分错误。而通过增加更多校验方程,再配合合理的编码结构,纠错能力还能进一步提升。
但随着NAND Flash不断向更高存储密度发展,一个新的问题出现了:
当数据越来越容易出错,ECC本身也需要越来越强。
而这正是LDPC逐渐成为主流纠错方案的重要原因。
NAND越来越“密”,ECC为什么也要越来越强?
从SLC到MLC、TLC,再到QLC,一个NAND存储单元能够表示的状态越来越多。
SLC只有2种状态,MLC有4种,TLC有8种,QLC则有16种。

存储状态增加的好处很明显:在相同的物理空间里,可以存储更多数据。
但与此同时,不同状态之间的区分也会变得更加困难。读取时,只要实际状态与判断结果之间出现偏差,就可能产生bit错误。
所以,NAND存储密度不断提升的同时,ECC也面临着更大的纠错压力。
这也是为什么SSD的纠错技术一直在演进。
早期的SSD主控更多采用BCH等纠错码,随着NAND存储密度不断提升,LDPC逐渐成为更重要的选择。
那么,LDPC究竟有什么特别之处?

LDPC到底是什么?
LDPC的全称是Low Density Parity-Check Code,中文通常称为低密度奇偶校验码。
看到这里,可以先回想上一篇讲过的H矩阵。
我们知道,H矩阵本质上是一张校验规则表,它规定:哪些bit参与哪些校验。
而LDPC做的事情,就是让这张校验表呈现出一个非常重要的特征:里面大部分位置都是0,只有少量位置是1。
注意,这里的“低密度”指的是:H矩阵中1的密度较低。
例如,一个很大的矩阵中可能只有少量位置为1。
这些1虽然不多,但它们并不是随意分布的,而是经过专门设计,让不同bit之间形成大量有效的校验关系。
所以,LDPC可以简单理解为:用一个稀疏的H矩阵,建立大规模的校验关系。

为什么“稀疏”反而能带来强大的纠错能力?
乍一看,这似乎有些反直觉。
既然增加校验关系可以提升纠错能力,那么H矩阵里的1是不是越多越好?
实际上并不是。
如果让每个bit都参与大量复杂的校验,虽然校验关系会变得非常密集,但随之而来的计算量和硬件复杂度也会快速增加。
LDPC采取了另一种思路:让每个bit只参与有限数量的校验,但通过大量bit和大量校验之间的连接,形成一个整体的约束网络。
这样既能够构建复杂的校验关系,又能保持H矩阵相对稀疏。
更重要的是,这种结构非常适合后面的迭代式解码。
也就是说,LDPC的优势并不只是“校验矩阵里0很多”。
真正重要的是:稀疏的结构,让大规模校验关系可以被组织起来,并通过消息传递逐步完成纠错。
那么问题来了。一个矩阵里只有一堆0和1,怎样才能直观看出这些bit之间到底是怎么联系的?这就要引出LDPC中的另一个重要概念:Tanner图。
把H矩阵“画出来”:Tanner图
H矩阵虽然能够准确表示校验关系,但当矩阵越来越大时,仅靠数字很难直观看出其中的结构。于是,工程师们把H矩阵转换成一种图。这就是Tanner图。
Tanner图中有两类节点:bit节点(b节点)和 校验节点(check节点,也称c节点)。

bit节点代表具体的bit。校验节点则代表一条校验方程。
如果某个bit参与某条校验方程,就在对应的bit节点和校验节点之间连一条线。
例如:某个bit参与3条校验方程,那么它就会与3个校验节点相连。
某个校验方程涉及4个bit,那么对应的校验节点就会与4个bit节点相连。
于是,原本藏在H矩阵中的关系,就被变成了一张清晰的“关系网络”。
可以简单理解为:H矩阵告诉我们“谁和谁有关系”。Tanner图则把这种关系直接画出来。
而Tanner图真正重要的意义,还不只是方便观察。因为到了LDPC解码阶段,信息就会沿着这些连线在bit节点和校验节点之间不断传递。
LDPC的强大,来自“很多次判断”
到了这里,我们已经可以大致想象LDPC的工作方式了。
某个bit发生错误后,它参与的多个校验可能出现异常。这些校验结果又会反馈给相关bit。bit根据多个校验提供的信息重新判断自己的状态。然后再进行下一轮校验。
经过多轮判断之后,错误逐渐被定位和修正。
换句话说,LDPC并不是依靠某一个校验方程直接找出错误,而是利用大量稀疏的校验关系,让不同节点之间不断交换信息。
这也是为什么LDPC通常采用迭代式解码。
而我们前面讲到的H矩阵、Tanner图,实际上都在为这种解码方式服务。
正则LDPC和非正则LDPC
LDPC还可以进一步分为正则LDPC(Regular LDPC)和非正则LDPC(Irregular LDPC)。
正则LDPC中,每一行通常包含固定数量的1,每一列也包含固定数量的1。也就是说,不同校验节点连接的bit数量基本一致,不同bit参与的校验数量也基本一致。

非正则LDPC则没有这样的固定限制,不同节点的连接数量可以不同。
这种差异,本质上来自对校验矩阵结构的不同设计。
实际的LDPC系统需要综合考虑纠错能力、解码复杂度等因素,选择合适的矩阵结构。
因此,LDPC真正值得关注的地方,并不是简单的“矩阵很稀疏”,而是:怎样设计一个足够优秀的稀疏校验矩阵,让它既能够提供强大的纠错能力,又适合后续的解码实现。
从一个“矩阵”到一套纠错机制
现在回头看,我们就能把LDPC和上一篇的内容接起来了。
上一篇,我们从最简单的奇偶校验出发,知道了:校验关系越合理,越有机会发现和定位错误。进一步,我们用H矩阵把大量校验关系组织起来。
而LDPC则进一步要求:H矩阵保持低密度,并通过合理的结构设计形成大规模的校验网络。
再把这张矩阵画成Tanner图后,原本复杂的数学关系就变成了:bit节点 ↔ 校验节点 ↔ bit节点
这样,一套能够不断交换信息的纠错网络就建立起来了。
不过,到这里我们实际上只解决了“结构”的问题。我们知道哪些bit互相存在校验关系,也知道LDPC为什么需要Tanner图。
但还有关键的问题没有解答:
当SSD读回的数据真的出现错误时,这些bit节点和校验节点到底是怎么协同工作的?
答案就在LDPC解码。
下一篇,我们就沿着Tanner图继续往下走,看看LDPC如何通过一次次的信息传递和判断,把那些已经“读错”的bit尽可能找回来。
▎相关文章