1

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 倍精度の計算に弱い影響を与えるのはなぜですか? 他のコンパイラフラグを使用するか、他のライブラリを含める必要がありますか?

4

3 に答える 3

0

同じ最適化により、実質的に同じ利点が得られました。計算自体に時間がかかったという理由だけで、パーセンテージが下がりました。

最適化が同じパーセンテージであると信じるには、計算にかかる時間を長くすると、オプティマイザーがより多くの節約を見つけるようになると信じる必要があります。どうしてそんなことを考えるのか?

于 2015-06-26T07:47:06.213 に答える
0

ターゲットが x86 アーキテクチャの場合、GCC では__float128実際の 4 倍精度の FP タイプでlong doubleあり、x87 では 96 ビット FP タイプ (倍精度拡張) です。

精度の低い型を使用した演算は、精度の高い型を使用した演算よりも高速になる可能性があります。ネイティブのハードウェア型を使用した計算が、非ネイティブの型を使用した計算よりも高速になることも合理的です。

于 2015-06-26T07:47:25.967 に答える