SWIFT: Software Implemented Fault Tolerance

George A. Reis, Jonathan Chang, Neil Vachharajani, Ram Rangan, and David I. August. In Proceedings of the 3rd International Symposium on Code Generation and Optimization (CGO), pages 243-254. 2005.

少し落ち着いて自分の時間が出来てきたので、久しぶりに論文なんぞを読んでみる。今年のCGOの"Best Paper Award"だが、結論から言えば何故これがbestなのかよくわからない。

特別なハードウェアを用いず、ソフトウェアのみで"transient fault"*1を見つけたい、というのが動機。コンパイラが命令を全て二重化して生成し(ただしストアと分岐は除く)、ストアと分岐の直前で引数を比較して同一であることを確認する。つまり、全く同じ内容のレジスタセットを二つ持つことになる。ストアは二重化されないので、メモリ内容は一つしか持たない。メモリのエラー検出についてはECCに任せることにする。分岐が正しい方向へジャンプしていることをより確実にするために基本ブロック毎に「シグネチャ」を定義する。あるレジスタ一個をGlobal Signature Register(GSR)として用い、基本ブロックの入口で実行時シグネチャを計算してそのブロックのシグネチャと一致しているかを確認する。Itanium 2の上で評価し、実行時間は1.41倍の増加で抑えられた。また、故意にあるレジスタのビットをある頻度で反転させる実験も行った。何も用いないと平均で15.04%の実行が正しくない結果を返したが、SWIFTによってそれが0%になった。

基本的にEDDI*2という手法を改良した研究らしい。特別にグッとくるアイデアは無いのだが……。レジスタを2倍食うのでIA-64でないと現実的でないんちゃうんかぃ、とも思う。コンパイラの最適化フェーズどの段階で命令を二重化するのか、も問題だろう。レジスタのスピルが出たらどうするんだ。引数をチェックしてから実行するまでの間にエラーが起きてしまう可能性もあるわけで、結局どの程度の確率までエラーを減らせるのかを定量的に評価する枠組みを作るだけで研究になりそうだが。

*1:物理的にどこかが恒久的に壊れるのではなく、たまたまどこかの信号線やメモリのビットが反転してしまうエラーのこと。

*2:N. Oh, P. P. Shirvani, E. J. McCluskey. Error detection by duplicated instructions in super-scalar processors. IEEE Transactions on Reliability, 51(1):63-75, 2002