インテルとAMD(RYZEN)の計算誤差問題2024年07月26日 06:21

全く同じ入力データであっても、パソコンのCPUが違うと計算結果が異なる。

これに気がついたのは数億回レベルの乱数発生を行って計算するモンテカルロコードを異なるCPUのパソコンで比較した時である。計算コードはすでにバイナリー化されており、同じ64ビットパソコンで内部表現は同じはずである。入力データも同じ数値である。

この謎をあるIBMの専門家に聞いてみた。その答えは

CPUにより10進数を2進数に変換する組み込みプログラムが異なるため

とのことだった。
入力データがすべて整数値ならば10進数も2進数も正確に同じ値となるが、科学技術計算では、浮動小数点数値を扱うので、例えば、

1.23456789

と入力したとき、我々は

1.234567890000000000000・・・・

と入力したつもりなのかもしれないが、計算機であっても無限の数値を扱うことはできない。メーカーによって、CPUの2進数変換プログラムは高速化などを狙い、変換方法が異なる。その結果、ビット表現ではCPU依存性が出てくるということになる。即ち、入力した有効桁数以下に対応する部分のビット表現部分は0000000……となると保証してはいないし、それは原理的に不可能なのである。

 実際、現在使用しているモンテカルロ計算コードは、時間を追った計算をしており、途中まではインテルとAMDの結果は一致している。

 しかし、ある程度、モンテカルロ計算が進むと、突然二つのCPUで結果が異なってくるのである。いずれにせよその差はモンテカルロ計算における統計誤差よりは小さいのだが、例えば、インテルとAMDの二つの計算機を使ってパラメトリックサーベイなどをしている場合には、一つの計算機だけを使った場合と異なる傾向を示すこともありうるということになり、注意が必要だ。

 その専門家にインテルとAMDのどちらを使うべきか尋ねたが、インテルが世界の主流なのでインテルだろうという話だった。しかし、最近はAMD(RYZEN)の方が売れているようだし、2バイト変換方法もCPUの世代により異なるようなので、この問題の根は深いと思う。