14

C/C++ で特定のアルゴリズムを実装することによって解決する必要がある科学計算の問題の大部分は、倍精度よりもはるかに低い精度を必要とします。たとえば1e-61e-7精度は99%ODE ソルバーまたは数値積分のケースをカバーしています。より高い精度が必要なまれなケースであっても、通常、倍精度に近い精度に到達することを夢見る前に、数値法自体が失敗します。例: 単純なルンゲ・クッタ法では、丸め誤差のために、標準的な堅固な常微分方程式を解く場合でも、1e-16 の精度は期待できません。この場合、倍精度の要件は、間違った答えをより適切に近似するよう求めることに似ています。

次に、積極的な浮動小数点の最適化は、ほとんどの場合、コードを高速化 (はるかに高速化) し、特定の問題の目標精度に影響を与えないため、双方にとって有利な状況のようです。とはいえ、特定の実装/コードが fp 最適化に対して安定していることを確認するのは非常に難しいようです。古典的な (そしてやや不穏な) 例: GSL (GNU 科学ライブラリ) は、市場で標準的な数値ライブラリであるだけでなく、非常によく書かれたライブラリでもあります (自分自身がより良い仕事をしているとは思えません)。ただし、GSL は fp の最適化に対して安定していません。実際、たとえば intel コンパイラで GSL をコンパイルすると、-fp-model strictfp 最適化をオフにするフラグをオンにしない限り、内部テストは失敗します。

したがって、私の質問は次のとおりです。積極的な浮動小数点の最適化に対して安定したコードを記述するための一般的なガイドラインはありますか。これらのガイドラインは言語 (コンパイラ) 固有のものですか。もしそうなら、C/C++ (gcc/icc) のベストプラクティスは何ですか?

注 1: この質問は、gcc/icc の fp 最適化フラグを尋ねているのではありません。

注 2: この質問は、C/C++ 最適化の一般的なガイドラインについて尋ねているわけではありません (頻繁に呼び出される小さな関数に仮想関数を使用しないなど)。

注 3: この質問は、ほとんどの標準的な fp 最適化 (x/x -> 1 など) のリストを尋ねているわけではありません。

注 4: これは、古典的な「最もクールなサーバー名」のような主観的/トピック外の質問ではないと強く信じています。同意しない場合 (具体的な例/コード/問題を提供していないため)、コミュニティ wiki としてフラグを立ててください。私は、いくつかのステータスポイントを獲得するよりも、答えにはるかに興味があります(それらは重要ではありません-あなたはその点を理解しています!)。

4

1 に答える 1