多ビットのブロックエラー訂正コード

メインメモリに使われるDIMMは64ビット、あるいは72ビットのデータを並列に読み書きできるようになっているが、通常は、8ビット幅のDRAMチップを8個(72ビットの場合は9個)、または4ビット幅のDRAMチップを16個(あるいは18個)搭載している。

このような構造であるので、例えばDRAMチップのアドレス系に故障が起こって別の番地のデータを読んでしまったりすると、同一チップから読まれる8ビット、あるいは4ビットの中の複数のビットが同時に誤ってしまう。また、DRAMチップの制御系や電源系などの全ビット共通の系に故障が起こった場合も同様である。

このような複数ビットのエラーに対処する方法としては、ブロック誤り訂正コードが用いられる。ハミングコードやHsiaoコードは、データシンボルは2進の1ビットであったが、これを複数ビットに拡張したものにリードソロモンコードがある。

リードソロモンコードはそれぞれのデータがbビットのSECDEDコードであり、全長は「(2b-1)×bビット」で、1つのシンボルの訂正を行う場合は2×bビットのチェック、2シンボルの誤りの検出する場合は3×bビットをチェックに使用する。このコードはbビットのブロックの中では何ビット誤っても1つのシンボルのエラーであり、訂正が可能である。

つまりbをDRAMチップ1個のデータ幅とすると、1個のチップの中のエラーであれば、すべて訂正できる。また、3個のチェックシンボルを付けたコードでは1個のDRAMチップの複数ビットのエラーともう1つのDRAMチップの中のランダムな1ビットのエラーというようなケースでもエラーを検出できる。このようなコードはブロックエラー訂正コードと呼ばれ、SbECコード、2シンボルエラー検出機能を併せ持つものはSbECDbEDコードと呼ばれる。

ここでb=4の場合は、S4ECコードは(68、60)、S4ECD4EDコードは(72、60)となり、32ビットのデータには使用できるが、64ビットのデータには4ビット足りない。b=8とすると、S8ECコードは(2056、2040)、S8ECD8EDコードは(2064、2040)となり、2040ビットまでのデータが使える。しかし、チェックに16ビット、あるいは24ビットを必要とするので、64ビットのデータの場合はチェックビットのオーバヘッドがかなり大きくなる。このため、b=8とする場合はデータ長を128ビットとして(144、128)のS8ECコードを使うのが一般的である。この長さであると72ビット幅のDIMMを2個並列にアクセスすることで必要なデータ幅を実現できる。

このようにして1個のメモリチップからの全ビットが誤っても正常動作を継続できるようにする設計をChip Killと呼んでいる。

このようなメモリエラーの検出と訂正コードに関しては、東京工業大学の藤原英二先生の「Code Design for Dependable Systems: Theory and Practical Applications」という本に詳しく書かれているので、興味ある読者は参照して戴きたい。

大型のサーバ用のメモリでは、 288ビット幅のR/Wを行うシステムが見られる。この場合、256ビットのデータに対してS8ECS8EDのリードソロモンコードを使っても必要なチェックビットは24ビットであり、まだ、8ビットの余裕がある。エラー頻度の高い8ビットブロックが検出された場合は、この余裕の8ビットのスペアに切り替えて使用することにより、高信頼を維持した運転を継続できるというメモリシステムを持つサーバもある。

このようなシステムとすると、メモリに故障が発生しても直ちにメモリを交換するためにフィールドエンジニアを派遣しなくても、スペア部分のメモリを使って運転を継続し、次の定期点検時に交換するということができる。結果として、サーバの予定外のダウンが減るし、保守の人件費も下げることができる。