最適化にまつわる注意
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/07/16 00:14 UTC 版)
「カハンの加算アルゴリズム」の記事における「最適化にまつわる注意」の解説
コンパイラが生成するコードは、最適化により、書かれたプログラムと正確に対応しないのが普通である。コンパイラはプログラムの内容を数式処理的に解析して最適化を施すことがあるが、コンパイラの設計によってはカハンの加算アルゴリズムについて間違った最適化を行なうことがある。例えば、以下のコードについて t:=sum + y; c:=(t - sum) - y; コンパイラは、結合法則を適用して以下のように推論することがある。 c = 0 すると補正がなされなくなる。ただし、一般にコンパイラは浮動小数点演算では近似的にしか結合法則が成り立たないとして、明示的に「安全でない」最適化を指示されないかぎり、このような最適化を行わない。なお、Intel C++ Compiler のようにデフォルトで結合法則を適用した最適化を行うコンパイラもある。K&R版の最初のC言語では、結合法則による浮動小数点演算の項の並べ替えを許していたが、ANSI C 規格ではそれが禁止され、C言語を数値解析分野で使いやすくした(FORTRANでも並べ替えが禁止されている)。それでもオプションを指定すれば並べ替えできるようにしてあるコンパイラが多い。 一方、一部の言語では総和機能を提供している(APLの +/input、FORTRANのSUMなど)。これらは最良の手法で総和を計算するような実装であると期待される。しかし、FORTRANのマニュアルを見ても単に入力と同じ精度で計算するとあるだけで詳細は不明である。線型代数学の標準的サブルーチン集であるBLASでは、高速化のための演算順序の並べ替えを明確に避けているが、BLASの実装ではカハンのアルゴリズムを採用していないことが多い。Pythonの標準ライブラリには fsum という総和関数があり、Shewchukのアルゴリズムを使い丸め誤差の蓄積を防いでいる。
※この「最適化にまつわる注意」の解説は、「カハンの加算アルゴリズム」の解説の一部です。
「最適化にまつわる注意」を含む「カハンの加算アルゴリズム」の記事については、「カハンの加算アルゴリズム」の概要を参照ください。
- 最適化にまつわる注意のページへのリンク