問題タブ [fast-math]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
gcc - double および ffast-math での自動ベクトル化
s-ffast-math
を使用してループのベクトル化を実現するために g++ を使用することが必須なのはなぜですか? 精度を落としたくないので嫌いですdouble
。-ffast-math
c++ - 負の NaN は NaN ではありませんか?
いくつかのテストケースを書きながら、いくつかのテストは NaN の結果をチェックします。
使用してみstd::isnan
ましたが、アサートは失敗します:
の値を出力した後、私の場合は完全に受け入れられるx
負の NaN ( ) であることがわかりました。-nan
その事実と を使用しようとした後NaN != NaN
、assert(x == x)
コンパイラは私に「好意」を示し、アサートを最適化します。
独自のisNaN
関数を作成することも最適化されています。
NaNと-NaN の両方が等しいことを確認するにはどうすればよいですか?
c++ - gcc の最適化によりアプリが失敗する
最適化をオンにしてGCC for ARMを使用すると、本当に奇妙な問題が発生します。最適化を行わずに C++ アプリケーションをコンパイルすると、実行時に期待される結果を出力する実行可能ファイルが生成されます。最適化 (-O1) をオンにするとすぐに、アプリケーションが期待どおりの結果を生成できません。問題を特定するために数日間試しましたが、わかりません。初期化されていない変数をコードから削除し、厳密なエイリアシングが問題を引き起こす可能性がある箇所を修正しましたが、それでも適切な結果が得られませんでした。
私は ARM 用に GCC 4.2.0 を使用しており (プロセッサは ARM926ej-s です)、Montavista Linux ディストリビューションでアプリを実行しています。
以下は、私が使用しているフラグです。
-O1 フラグを取り除き、アプリケーションを再コンパイル/再リンクするとすぐに、適切な出力結果が得られます。フラグからわかるように、最適化を無効にしようとしましたが、問題が発生する可能性があると思いましたが、それでもうまくいきません。
この問題にさらに取り組む方法についての指針はありますか?
ありがとう
gcc - gcc、simd 組み込み関数、高速数学の概念
みなさん、こんにちは :)
浮動小数点、SIMD/数学組み込み関数、および gcc の高速数学フラグに関するいくつかの概念を理解しようとしています。より具体的には、x86 CPU で gcc v4.5.0 で MinGW を使用しています。
私はしばらくの間検索してきましたが、それが私が(私が思うに)現時点で理解していることです:
フラグなしでコンパイルすると、fp コードは標準の x87 になり、simd 組み込み関数はなくなり、math.h 関数は msvcrt.dll からリンクされます。
mfpmath、mssen、および/またはmarchを使用して mmx/sse/avx コードを有効にすると、gcc はOnやftree-vectorizeなどの最適化フラグも指定した場合にのみsimd 命令を実際に使用します。その場合、組み込み関数は gcc によって自動的に選択され、一部の数学関数 (math.h の標準の数学関数についてまだ話している) は組み込み関数になるか、インライン コードによって最適化されますが、他のいくつかは msvcrt から取得されます。 dll. 最適化フラグを指定しない場合、これは変更されますか?
特定の simd データ型 ( v4siやv8qiなどの gcc 拡張機能として利用できるもの) を使用する場合、組み込み関数を直接呼び出すか、自動決定を gcc に任せるかを選択できます。適切なフラグを介して simd 命令を有効にしない場合でも、Gcc は標準の x87 コードを選択できます。繰り返しますが、最適化フラグを指定しない場合、これは変化しますか?
私の発言のいずれかが間違っている場合は、私を修正してください:p
今質問:
- 組み込み関数を使用するために x86intrin.h を含める必要はありますか?
- libm をリンクする必要はありますか?
- 速い数学は何かと関係がありますか? それがIEEE標準を緩和することは理解していますが、具体的にはどのように?その他の標準機能は使用されていますか? 他のライブラリがリンクされていますか?それとも、いくつかのフラグがどこかに設定されているだけで、標準の lib の動作が異なるのでしょうか?
助けてくれる人に感謝します:D
gcc - GCC が a*a*a*a*a*a を (a*a*a)*(a*a*a) に最適化しないのはなぜですか?
科学アプリケーションで数値最適化を行っています。私が気づいたことの 1 つは、GCC が呼び出しpow(a,2)
を にコンパイルして最適化することですa*a
が、呼び出しpow(a,6)
は最適化されておらず、実際にはライブラリ関数pow
を呼び出すため、パフォーマンスが大幅に低下します。(対照的に、インテル C++ コンパイラー、実行可能ファイルicc
は、のライブラリー呼び出しを排除しますpow(a,6)
。)
私が興味を持っているのは、 GCC 4.5.1 とオプション " "pow(a,6)
を使用して置き換えた場合、5 つの命令が使用されることです。a*a*a*a*a*a
-O3 -lm -funroll-loops -msse4
mulsd
一方、私が書く(a*a*a)*(a*a*a)
と、それは生成されます
これにより、乗算命令の数が 3 に減りicc
ます。
コンパイラがこの最適化トリックを認識しないのはなぜですか?
g++ - Mingw32 std :: isnan with -ffast-math
次のコードを-ffast-math
オプション付きでコンパイルしています。
出力として0を取得しています。コードを使用してコンパイルしたときに、浮動小数点数がNaNであるかどうかをコードでどのように判断できますか-ffast-math
?
注:Linuxでは、std::isnanは-ffast-mathでも機能します。
performance - gcc の ffast-math は実際に何をしますか?
gcc の--ffast-math
フラグが浮動小数点演算の速度を大幅に向上させ、IEEE 標準の範囲外になることは理解していますが、オンのときに実際に何が起こっているかについての情報を見つけることができないようです。誰か詳細を説明して、フラグがオンまたはオフの場合に何かがどのように変化するかの明確な例を教えてください。
同様の質問についてSOを掘り下げてみましたが、ffast-mathの仕組みを説明するものは見つかりませんでした。
cuda - -use-fast-mathオプションは、SP乗算を組み込み関数に変換しますか?
CUDAプログラミングガイドのwrt-use-fast-math最適化をざっと見ました。付録Cでは、除算を組み込みに変換する方法について言及していますが、乗算については言及していません。私がこの質問をする理由は、私のカーネルにはたくさんの乗算があるからです。NVCCが乗算と加算を融合しようとすることを認識しています(通常の「*」および「+」演算子が使用されている場合、および組み込み関数がFMAD演算にマージされることはありません)。しかし、私のコードが乗算が重い場合、SP組み込み関数のような四捨五入を__fmul_rn
使用すると利点がありますか?
したがって、2つの質問があります。
-use-fast-mathオプションは、「*」演算子を使用した乗算を__fmul_rnのようなSP本能に変換しますか?
__fmul_rnを明示的に使用するために乗算を手動でコーディングすることでパフォーマンス上の利点がありますか?例またはいくつかの数字は私が理解するのに役立ちます。