x87 の方が内部精度が高いことはわかっています。これは、おそらく x87 と SSE 操作の最大の違いです。しかし、x87 を使用する利点は他にあるのでしょうか? 私はどのプロジェクトでも自動的に入力する習慣があり-mfpmath=sse
、x87 FPU が提供する他の機能が欠けているのではないかと考えています。
5 に答える
手書きの asm の場合、x87 には SSE 命令セットに存在しない命令がいくつかあります。
私の頭の上から、それはすべてfsin、fcos、fatan、fatan2、およびいくつかの指数/対数のもののような三角関数のものです。
を使用すると、libm の実装が何を使用したかに関係なくgcc -O3 -ffast-math -mfpmath=387
、GCC9はsin(x)
実際には命令としてインライン化されます。fsin
( https://godbolt.org/z/Euc5gp )。
__libm_sse2_sin_precise
32 ビット x86 用にコンパイルすると、 MSVC が呼び出されます。
fsin
コードがほとんどの時間を三角法に費やしている場合、x87 を使用すると、SSE1/SSE2 を使用する標準の数学ライブラリの実装がどの CPUの遅いマイクロコードよりも速いか遅いかによって、わずかなパフォーマンスの向上または低下が見られる場合があります。使用しています。
CPU ベンダーは、最新世代の CPU の x87 命令用にマイクロコードを最適化することにあまり力を入れていません。(最近の世代の CPU におけるAgner Fog の命令テーブルで、複雑な x87 命令の uop カウントとスループットを見てください: 古い CPU よりも多くのサイクル)。CPU が新しいほど、x87 は log、exp、pow、または trig 関数を計算する多くの SSE または AVX 命令よりも遅くなる可能性が高くなります。
x87 が利用可能であっても、すべての数学ライブラリが のようなfsin
関数を実装するための複雑な命令を使用することを選択するわけではありませんsin()
。特に、ログベースの FP ビットパターンを操作するための整数のトリックが役立つ exp/log が役立ちます。
一部の DSP アルゴリズムは多くの三角関数を使用しますが、通常、SIMD 数学ライブラリを使用した自動ベクトル化から多くの恩恵を受けます。
ただし、ほとんどの時間を加算、乗算などに費やす数学コードの場合、通常は SSE の方が高速です。
また関連:インテルはエラー境界を 1.3 京で過小評価します- ( piに非常に近い入力fsin
の壊滅的なキャンセル)の最悪のケースは非常に悪いです。ソフトウェアはより良い結果を出すことができますが、低速の拡張精度技術を使用する場合に限られます。fsin
- それは本当に古いマシンに存在します。
EOF
FPU 命令は SSE 命令よりも小さいため、デモシーンに最適です。
x87 にはかなりのレガシー システムと小規模システムの互換性があります。SSE は比較的新しいプロセッサ機能です。コードを組み込みマイクロコントローラーで実行する場合、SSE 命令をサポートしない可能性が高くなります。
FPU がインストールされていないシステムでさえ、多くの場合、コードを透過的に (多かれ少なかれ) 実行する 80x87 エミュレーターを提供します。私は SSE エミュレーターを知りません。確かに、私のシステムの 1 つにはエミュレーターがありません。そのため、最新の Adobe Photoshop 要素バージョンは実行を拒否します。
80x87命令は、1982年頃に導入されて以来、徹底的に調査および分析されてきた優れた並列操作特性を備えています。x86 のさまざまなクローンが、SSE 命令で停止する可能性があります。
float
との間の変換はdouble
、SSE よりも x87 (通常は無料) の方が高速です。float
x87 では、 、double
またはをレジスタ スタックに読み込んだり、レジスタ スタックから格納したりできます。またlong double
、追加コストなしで拡張精度に変換したり、拡張精度から変換したりできます。SSE では、型が混在している場合、型変換を行うために追加の命令が必要になります。これは、レジスターにfloat
ordouble
値が含まれているためです。これらの変換命令はかなり高速ですが、余分な時間がかかります。
もちろん、本当の解決策は、混合を控えfloat
、double
過度にx87を使用しないことです。