タグ付けされた質問 「fast-math」

12
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)。) 私は好奇心だと、私は交換したときにということであるpow(a,6)とa*a*a*a*a*aGCC 4.5.1とオプション「を使用して-O3 -lm -funroll-loops -msse4」、それは5つの使用mulsd説明書を: movapd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 私が書いた場合(a*a*a)*(a*a*a)、それは生成されます movapd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm13, %xmm13 乗算命令の数を3に減らすと、icc同様の動作になります。 コンパイラがこの最適化トリックを認識しないのはなぜですか?

2
gccのffast-mathは実際に何をしますか?
gccの--ffast-mathフラグを使用すると、浮動小数点演算の速度が大幅に向上し、IEEE標準の範囲外になることを理解していますが、オンになっているときに実際に何が起こっているかについての情報を見つけることができません。誰かが詳細のいくつかを説明して、フラグがオンまたはオフの場合に何かがどのように変化するかについての明確な例を示すことができますか? 同様の質問についてSOを掘り下げてみましたが、ffast-mathの仕組みを説明するものは何も見つかりませんでした。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.