x87 の方が内部精度が高いことは知っています。これがおそらく、x87 と SSE 操作の最大の違いでしょう。しかし、x87 を使用することで他に何かメリットがあるのだろうかと疑問に思います。私は-mfpmath=sse
どのプロジェクトでも自動的に入力する癖があり、x87 FPU が提供する他の何かを見逃しているのではないかと思います。
ベストアンサー1
手書きの asm の場合、x87 には SSE 命令セットに存在しない命令がいくつかあります。
すぐに思いつくのは、fsin、fcos、fatan、fatan2 などの三角関数と、指数/対数に関するものです。
gcc -O3 -ffast-math -mfpmath=387
、GCC9意思libm の実装が何を使用したかに関係なく、実際には命令sin(x)
としてインラインのままです。(fsin
https://godbolt.org/z/Euc5gp)。
__libm_sse2_sin_precise
32 ビット x86 用にコンパイルするときにMSVC を呼び出します。
コードが三角法の実行にほとんどの時間を費やしている場合、使用しているfsin
CPU の低速マイクロコードよりも SSE1/SSE2 を使用する標準の数学ライブラリ実装が速いか遅いかによって、x87 を使用するとパフォーマンスがわずかに向上または低下する可能性があります。
CPUベンダーは、最新世代のCPUのx87命令のマイクロコードを最適化することにあまり力を入れていません。なぜなら、x87命令は一般的に時代遅れでほとんど使われていないと考えられているからです。(複雑なx87命令のuop数とスループットを見てください。アグナー・フォグの指示表最近の世代の CPU では、古い CPU よりもサイクル数が多くなります。CPU が新しいほど、log、exp、pow、または trig 関数を計算する多くの SSE または AVX 命令よりも x87 の方が遅くなる可能性が高くなります。
x87 が利用可能な場合でも、すべての数学ライブラリが、fsin
などの関数を実装するために のような複雑な命令を使用することを選択するわけではありませsin()
ん。特に、 exp/log では、対数ベースの FP ビットパターンを操作するための整数トリックが役立ちます。
いくつかのDSPアルゴリズムは多くの三角関数を使用しますが、通常は多くSIMD 数学ライブラリによる自動ベクトル化から。
ただし、加算や乗算などにほとんどの時間を費やす数学コードの場合、通常は SSE の方が高速です。
関連:インテルは誤差範囲を1.3京倍も過小評価- 最悪のケース(入力が非常に近い場合fsin
の壊滅的なキャンセル)fsin
円周率) は非常に悪いです。ソフトウェアはより優れたパフォーマンスを発揮できますが、低速の拡張精度技術を使用した場合のみです。