質問
x87 の内部精度が高いことはわかっています。これが、x87 と SSE 操作の最大の違いだと思われます。しかし、x87 を使用することに他に利点があるのでしょうか?タイピングする癖がある -mfpmath=sse
どのプロジェクトでも自動的に実行されますが、x87 FPU が提供するもの以外に何かが欠けているのではないかと思います。
解決
手書きのASMの、のx87は、SSE命令セットに存在しないいくつかの命令を持っています。
私の頭の上から、それはFSIN、FCOS、fatan、fatan2およびいくつかの指数/対数のもののようなすべての三角ものです。
gcc -O3 -ffast-math -mfpmath=387
で、GCC9 のsin(x)
命令などの、まだ実際にインラインfsin
、意志に関わらずのlibmで実装が使用しているだろうかの。 ( https://godbolt.org/z/Euc5gp に)。
MSVCは__libm_sse2_sin_precise
を呼び出します。
あなたのコードは三角法をやってほとんどの時間を費やしている場合は、あなたがのx87を使用している場合、あなたはSSE1 / SSE2を使用して、標準数学ライブラリの実装が速いか遅いのための遅いマイクロコードよりもあるかどうかに応じて、若干の性能差損益が表示されることがありあなたが使っているものは何でもCPUにfsin
ます。
CPUベンダーは、CPUの最新世代でのx87命令のためのマイクロコードの最適化に多くの労力を入れないでください。より:( Agner霧の命令表はCPUの最近の世代にの中に複雑なのx87命令のためのUOP数とスループットを見てください古いCPUのに比べてサイクル)。 CPUより新しい、より多くの可能性が高いのx87はログ、EXP、POW、または三角関数を計算するために多くのSSEまたはAVX命令をより遅くなります。
のx87が利用可能な場合でも、すべてではない数学ライブラリはfsin
のような機能を実現するためsin()
のような複雑な命令を使用することを選択するか、ログ・ベースのFPビット・パターンを操作するための整数のトリックは便利です場合に特にEXP /ログます。
一部のDSPアルゴリズムは、TRIGの多くを使用しますが、一般的にSIMD数学ライブラリと自動ベクトルからの多くの利益をもたらすます。
ただし、追加を行って、あなたの時間の大半を過ごす数学・コード、乗算などのためにSSEは、通常は高速です。
<時間>また関連:<のhref = "https://randomascii.wordpress.com/2014/10/09/intel-underestimates-error-bounds-by-1-3-quintillion/" のrel = "nofollowをnoreferrer" > 1.3京のことでインテル過小評価エラー境界 - (非常にのパイの近くfsin
入力のための致命的な取消)fsin
のための最悪のケースは非常に悪いです。ソフトウェアはだけ遅い拡張精度の技術とのより良い行うことができます。
他のヒント
- かなり古いマシンには存在します。
EOF
FPUの命令は、SSE命令よりも小さくなっているので、彼らは理想的ですデモシーンもののための
x87 とのかなりのレガシーおよび小規模システムの互換性があります。SSE は比較的新しいプロセッサ機能です。コードが組み込みマイクロコントローラー上で実行される場合、SSE 命令がサポートされない可能性が高くなります。
FPU がインストールされていないシステムでも、多くの場合、コードを (多かれ少なかれ) 透過的に実行する 80x87 エミュレーターを提供します。私は SSE エミュレーターを知りません。確かに私のシステムの 1 つは SSE エミュレーターを持っていないため、Adobe Photoshop Elements の最新バージョンは実行を拒否します。
80x87 命令は、1982 年頃の導入以来、徹底的に調査および分析されてきた優れた並列演算特性を備えています。x86 のさまざまなクローンが SSE 命令で停止する可能性があります。
float
とdouble
間の変換が速くSSEと比べてのx87(通常は無料)です。 x87を使用すると、ロードすることができ、またはレジスタスタックからfloat
、double
またはlong double
を保存し、それが余計なコストをかけずに、または拡張精度から変換されます。タイプが混在している場合、レジスタはfloat
またはdouble
値が含まれているためSSEでは、追加の命令は、型変換を行うために必要とされています。これらの変換命令はかなり速いですが、余分な時間がかかりません。
実際の修正はもちろんのx87を使用しない、過度float
とdouble
を混合控えることである。