INTELとAMD(RYZEN)のCPUによる計算誤差問題2023年05月23日 18:33

 手元に2種類のパソコンがあり、両方ともWINDOWS10の64ビット版なのだが、CPUが一つはINTELi7でもう一つはRYZEN7である。RYZENのほうが安くて、早いため、RYZENに移行しようとしたためである。
 しかし、困ったことにこの両者で、まったく同じデータ、プログラムを使っても結果に0.01%程度の差が生じる。(本ブログ4月7日付参照)

 その理由がほぼ分かってきた。主要因は

浮動小数点データ(Eタイプデータ)に対するINTEL(i7)とRYZEN7の二進数への換算方式の差によるものである。
(計算速度を上げるために各社2進数への換算方法に独特の工夫をしている。一般に同世代ではRYZENの方がちょっと早くなる。)


 検討した例題の計算において、入力データや途中の計算値に概ねE-10以下の小さな数値が含まれていなければ、INTELとRYZENで同一の結果を得ることができる。
しかし、この計算の途中で概ねE-10よりも小さいデータが生じたため、最終的な計算結果にCPU依存性が生じたものと推定できる。

その原因として、データ数値は10進数で入出力されるが、計算機内部では2進数になる。数値が小さいと、その換算時に必ず誤差が生じるが、上述のように換算方式がCPUにより異なるため
浮動小数点数値については、CPUの依存性が生じることになる。(整数値のみの計算、又は2進数換算値が一致するような比較的大きなEタイプの数値であれば、両者は一致する。)

この問題については、下記のサイトに説明されているように概ねE-10程度より小さい数値では2進数換算の影響が10進数表示において差として表れるようである。この問題はプログラマーがシステムを構築する際に注意すべき問題となっている。(INTELでもi5世代CPUとi7世代CPUでも差があるようだ。)

https://jpdscore.github.io/blog/vs/what-developers-should-know-about-floating-point/#:~:text=%E3%81%95%E3%82%89%E3%81%AB%E3%80%81CPU,%E3%81%AE%E6%BC%94%E7%AE%97%E5%91%BD%E4%BB%A4%E8%87%AA%E4%BD%93%E3%81%AE%E6%80%A7%E8%B3%AA%E3%82%84%E9%A0%86%E5%BA%8F%E3%80%81%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%E3%81%AE%E6%9C%80%E9%81%A9%E5%8C%96%E5%87%A6%E7%90%86%E3%81%AB%E3%82%88%E3%82%8B%E5%BD%B1%E9%9F%BF%E7%AD%89%E3%80%81%E8%A4%87%E6%95%B0%E3%81%AE%E8%A6%81%E5%9B%A0%E3%81%8C%E9%96%A2%E9%80%A3%E3%81%97%E3%81%A6%E3%80%8110%20%E9%80%B2%E6%95%B0%E3%81%AE%E3%81%BE%E3%81%BE%E3%81%AE%E6%BC%94%E7%AE%97%E3%81%A7%E8%80%83%E3%81%88%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AB%E3%81%AF%E5%90%8C%E6%A7%98%E3%81%AE%E5%80%A4%E3%81%8C%E5%BE%97%E3%82%89%E3%82%8C%E3%82%8B%E3%81%A8%E6%9C%9F%E5%BE%85%E3%81%95%E3%82%8C%E3%82%8B%E7%8A%B6%E6%B3%81%E3%81%A7%E3%82%82%E3%80%81%E5%AE%9F%E9%9A%9B%E3%81%AB%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%BC%E3%81%AE%E6%BC%94%E7%AE%97%E7%B5%90%E6%9E%9C%E3%81%A7%E3%81%AF%E8%AA%A4%E5%B7%AE%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%99%E3%82%8B%E5%8F%AF%E8%83%BD%E6%80%A7%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82

 また、積和計算(FMA計算)においてもこれに関連してCPU差がしょうじるとのことで、詳しくは下記サイトに説明されている。
 https://qiita.com/mod_poppo/items/e6577df362f44a3ef8dd

 このようなCPUによる計算値の差は、工学的計算において、高精度計算を行う場合、Eタイプの小さな数値は普通に扱われるので、特に系統的なサーベイ計算では注意すべきポイントである。
 また、パソコンメーカー、CPUメーカーもその差を互いに表示することで将来的なトラブルの発生を予防できるだろう。
 
 これは本質的に浮動小数点の10進数表示を2進数表示した場合の有効桁数に関わる原理的な誤差なので、どちらが正しいということは言えない。しかし、結果に差があることは確かなので、異なるCPUによる結果を同一条件での計算結果と見なすことはできない。組織的で大規模なサーベイ計算やそれらの比較を行う場合には特に留意すべき点である。