並列処理時代の演算の一意性


 足し算の答えが一意に決まるなんて昔話になるかも、というお話。


 確認した範囲では、MATLAB 7.8 (2009a, 64bit) に足し算をさせる(たとえばサイズが500,000x1の行列の各要素を全部足す)と、その答えは一意に決まらない。全く同一のデータについて同じPC・環境で繰り返し計算させて、ほぼ毎回違う答えが返ってくる。


 これについてMathWorks社(の少なくとも一社員)の見解が書かれているページを見つけた。


Comparing Single-threaded vs. Multithreaded Floating Point Calculations

Loren on the Art of MATLAB
December 4th, 2009


 彼女の見解を要約すると、

  • 浮動小数点数を用いた演算において、足し算は結合法則を満たさない( a+(b+c) ≠ (a+b)+c )。
  • 演算の順序は処理系任せである。
  • 特にマルチコアで並列演算をする場合、演算順序の任意性は高まる。

よって足し算の答えが非決定論的になるのはバグではなくて仕様ですと。(・・・とか言いながら最新バージョン(7.9, 2009b)はこういう挙動を示さない(足し算の答えが一意に決まる)ので、MathWorks社もやっぱりこれはまずいと思っていたのかもしれない。)


 個人的には、処理系が異なれば演算結果が違ってくる可能性はあるだろうな、とは思っていた。でも同じ処理系に同じ計算をやらせて、一秒前の答えと今の答えが異なるとは思っていなかった。そしてうっかり演算の一意性を見込んだ(怠惰な)コードを一部書いていたので、しばらく何が起きているのか判らなかった。


 彼女の言うことも、理解は出来る。効率を最優先させる場合には順序に任意性を持たせた方が良い場面というのはあるだろうから、もしかしたら将来的には「演算結果は一意に決まらないけれど高速」か「演算結果は一意に決まるけど低速」な演算のどちらかを選ぶという時代が来るのかもしれない。あるいはもう数値計算の結果は確率的に決まるというのが常識になり、足し算の答えが一意に決まるなんて21世紀初頭までの牧歌的な考え方と見なされるようになるのかも。

      • -

 データの統計的な性質によっては足し算結果の「確率分布」も結構変な形になるような気がするけど、その辺はどう扱われるようになるんだろうか。10回計算して平均を取るとかになったら結構シュールだ。

      • -

 並列演算装置の効率性と非決定論的な性質は不可分なのだ! たとえば脳み(以下略)