C++ で記述された高精度 ODE (常微分方程式) ソルバーがあります。私はすべての計算をユーザー定義型で行いますreal_type
。ヘッダーにこの型を宣言する typedef があります。
typedef long double real_type;
__float128
より精度を上げるために、ロングダブルタイプに変更することにしました。これに加えて、quadmath.h
すべての標準数学関数を含め、libquadmath のものに置き換えました。
「long double」バージョンが最適化フラグなしでビルドされた場合、一部の参照 ODE は 77 秒で解決されます。このバージョンが -O3 フラグでビルドされている場合、同じ ODE が 25 秒で解決されます。したがって、-O3 フラグは計算を 3 倍高速化します。
しかし、フラグなしでビルドされた "__float 128" バージョンでは、同様の ODE が 190 秒で解決され、-O3 を使用すると 160 秒で解決されます (~ 15% の差)。-O3 最適化が 4 倍精度の計算に弱い影響を与えるのはなぜですか? 他のコンパイラフラグを使用するか、他のライブラリを含める必要がありますか?