2016-07-13 22 views
4

Agnerのinstruction tablesによれば、単一の逆数演算と1回の積和演算よりも遅いです。 (これは、測定されたx86アーキテクチャ間で共通するように思われる)なぜfp除算は逆数よりも遅く、積算よりも遅い

これは、piledriverアーキテクチャのテーブルからの抜粋です。

MULSS MULSD x,x/m 1 5-6 0.5 P01 fma 
MULPS MULPD x,x/m 1 5-6 0.5 P01 fma 
VMULPS VMULPD y,y,y/m 2 5-6 1  P01 fma 
DIVSS DIVPS x,x/m 1 9-24 5-10 P01 fp 
VDIVPS   y,y,y/m 2 9-24 9-20 P01 fp 
DIVSD DIVPD x,x/m 1 9-27 5-10 P01 fp 
VDIVPD   y,y,y/m 2 9-27 9-18 P01 fp 
RCPSS/PS  x,x/m 1 5  1  P01 fp 

第4番目の値はレイテンシです。したがって、乗算演算子は5-6、除算演算子は9-24、逆演算子演算子は5サイクルかかる。 24> 6 + 5以降、私は2つの別々の操作が1つの単一の操作よりも速く、なぜ本質的に同じ結果を得るのか不思議です。

この質問に対する回答は、エラーの測定に関係すると思われます。おそらく、分裂が逆数と乗算よりはるかに正確である場合があります。これが当てはまる場合、エラー測定はどのように比較されますか?例えば、線形の関係はありますか?除算は逆数+乗算の2倍近く遅く、精度も2倍ですか?

+6

を参照してください。 ['rpcss'は11.5バイナリの場所に適しています](http://www.felixcloutier.com/x86/RCPSS.html)。一方、 'divss'はIEEEの除算ですので、24バイナリの場所には良いです。 –

+0

インテルのドキュメントでは、「RCPSS(スカラ単精度浮動小数点値の逆数を計算する)命令は、ソースオペランド内の***単精度浮動小数点値の近似*** ***35逆数を計算します。結果をデスティネーションオペランドのダブルワードの に格納します。 (強調鉱山) –

+0

平方根とその相反操作に関する関連する質問を参照してください:http://stackoverflow.com/questions/1528727/why-is-sse-scalar-sqrtx-slower-than-rsqrtx-x –

答えて

4

IIRCでは、高速近似の逆数除算とsqrt命令は基本的に(内部テーブルからの)テーブル検索であり、正確な除算/ sqrtは遅くパイプラインが難しくなりません。これは、1つのクロックスループットで実装される理由/方法です。

divssのスループットは、最近のマイクロアーキテクチャまでレイテンシに比べて格段に優れているわけではなく、Skylakeの非常に印象的なFP divide/sqrtユニットでさえ完全にパイプライン化されていないことに注意してください。あなたの質問の残りの部分については


、答えはrsqrtと同じですので、エラーが文書化されているこの質問Why is SSE scalar sqrt(x) slower than rsqrt(x) * x?

(リンクを掘り起こしてくれてありがとうロス)

関連する問題