なぜsqrtsd命令変化のレイテンシは、入力に基づいていますか?Intelプロセッサ

Tommy95:

まあ上でインテル固有のガイドには、「sqrtsd」と呼ばれる命令は18サイクルのレイテンシーを持っていることが述べられています。

私は自分のプログラムでそれをテストし、例えば、我々は、入力として0.15を取り、場合それは正しいです。我々は256を取る(または任意の2 ^ x)の数は、その後、待ち時間があるときだけ13.それはなぜですか?

私が持っていた一つの理論は、13が「sqrtsd」と同じですが、ポイントを浮動32ビットで行われている「sqrtss」の待ち時間が多分プロセッサはtaht 256を理解するためのスマート十分だったであるため、32ビットに収まるので、そのバージョンを使用することができるということです0.15は完全な64ビットを必要としながら、それは有限な方法で表現できないからです。

私はここで、インラインアセンブリ使用してそれをやっていることはgcc -O3と-fno-ツリーベクトル化してコンパイルrelveant一部です。

static double sqrtsd (double x) {
    double r;
    __asm__ ("sqrtsd %1, %0" : "=x" (r) : "x" (x));
    return r;
}
ピーター・コルド:

SQRT *とDIV *は、現代のIntel / AMDのCPUにデータ依存スループットやレイテンシを持っている2つだけ「単純な」ALU命令(単一UOP、ルーピング/分岐マイクロコードではない)です。(のためのマイクロコードアシストを数えていない非正規、非正規別名の追加/乗算/ FMAでFP値)。アウトオブオーダーUOPスケジューリング機構が、結果は、いくつかのサイクル準備ができていた、それはちょうどそれがになります知っていることの確認を待つ必要がないので、他のすべては、ほとんど固定されています。

いつものように、インテルの組み込みガイドは、パフォーマンスのオーバー簡略化された画像を提供します。実際の待ち時間はSkylakeマイクロアーキテクチャ上の倍精度固定18サイクルではありません。(あなたが引用に選んだ番号に基づいて、私はあなたがSkylakeマイクロアーキテクチャを持っていると仮定します。)

DIV / SQRT実装するのは難しいです。でも、ハードウェアでは、我々ができる最善のは、反復改良法です。(Broadwellマイクロアーキテクチャので基数-1024デバイダ)一度に多くのビットを精製する(参照、それをスピードアップハードウェアについては、このQ&Aを)。しかし、それはまだ早いアウトは簡単な例高速化するために使用されていることを十分に遅いです(それとも高速化のメカニズムはただ部分的にパイプライン化されたDIV / SQRTユニットを備えたモダンなCPU上ですべてゼロの仮数のためのセットアップ手順を飛ばしている。古いCPUがスループットを持っていましたFP DIV / SQRTため=待ち時間、実行ユニットは、硬いパイプラインにあること)。


https://www.uops.info/html-instr/VSQRTSD_XMM_XMM_XMM.htmlは SkylakeマイクロアーキテクチャSQRTSD 13から19サイクルの待ち時間に変化させることができる示しています。SKL(クライアント)の数字はわずか13サイクルのレイテンシを示したが、我々は詳細に説明から見ることができますSKLのvsqrtsdページ 13-19サイクルのレイテンシを示し、彼らは唯一の入力= 0 SKX(サーバー)の数字でテストすることを。このページは、彼らが試験のためにバイナリビットパターンを含む、使用したテストコードの詳細な内訳を有する。)で行った(0のみクライアントコアのと)同様の試験非VEXのsqrtsd xmm, xmmページ。:/

InstLatx64の結果はSkylakeマイクロアーキテクチャ-X上の13〜18サイクルの最良/最悪の場合の待ち時間を示す(Skylakeマイクロアーキテクチャ・クライアントと同じコアを使用するが、AVX512で有効)。

Agner霧の命令テーブルは、 Skylakeマイクロアーキテクチャ上の15〜16サイクルのレイテンシを示しました。(Agnerは、通常、異なる入力値の範囲を使用してテストを行います。)彼のテストがあまり自動化されていると、時々は正確に他の結果と一致していません。

何がいくつかのケースが速いのですか?

使用(x86のを含む)ほとんどのISAことに留意されたいバイナリ浮動小数点
ビット線形仮数(別名仮数)×2として値を表すEXP、及び符号ビット。

それだけで(少なくともハスウェル以降)現代インテルの2速があるかもしれないと思われる(コメント欄に@haroldで見るの議論。)例えば、2の偶数乗は、すべての速い、0.25、1、4、および16のように、これらは些細持っています仮数= 0x0の1.0を表します。https://www.h-schmidt.net/FloatConverter/IEEE754.htmlは、仮数と指数が表すものの組のビットおよび注釈のチェックボックスと、単精度のビットパターン変換、< - >素敵なインタラクティブ小数を有します。

Skylakeマイクロアーキテクチャ上で、私は簡単なチェックで見つけた唯一の速いケースがあるにも 2のべき乗 2.0〜4.0のようにではなく。これらの数は、入力と出力の両方が1.0仮数(のみ暗黙1ビット・セット)を有する正確なSQRT結果を有します。9.0それは正確に表現だとそうであっても、速くない3.0結果。3.0は、バイナリ表現における仮数セットのちょうど最上位ビットと仮数= 1.5を有しています。9.0の仮数部は1.125(0b00100 ...)です。だから非ゼロのビットが非常に近い上部にあるが、どうやらのに十分な、それを失格していること。

+-InfNaN。も速くされるように、通常、負の番号は:結果= -NaN私は同じ、i7-6700kにこれらの13サイクルの待ち時間を測定する。4.0遅い場合の対18サイクルの待ち時間。)。

x = sqrt(x)間違いなく速いとされx = 1.0(暗黙の主要な1ビットを除いてすべてゼロ仮数部)。これは、単純な入力と簡単な出力を持っています。

2.0と入力は、単純な(全ゼロ仮数および指数1以上)であるが、出力はラウンド数ではありません。SQRT(2)は不合理であり、したがって、任意の塩基における無限非ゼロのビットを有します。これは明らかに、それはSkylakeマイクロアーキテクチャに遅くなります。

Agner霧の命令テーブルは、 AMD K10の整数と言うdiv命令のパフォーマンスが有効ビット数に依存配当(入力)、ない商が、AgnerのmicroarchのPDFと命令テーブルを検索するとSQRTは、具体的方法についての脚注や情報を見つけることができませんでしたデータ依存。

さらに遅いFPの平方根と古いCPUで、速度の範囲のためのより多くの部屋があるかもしれません。私が考えるの仮数部の有効ビット数の入力は、おそらく関連になります。少ない上位ビット(仮のその他の末尾のゼロ)は、これが正しければ、それはより速くなります。しかし、再び、ハスウェル/ Skylakeマイクロアーキテクチャに速いだけのケースが2の偶数乗であるように見えます。


あなたはこれをテストすることができ、データの依存関係を壊すことなく、カップルの入力に対する出力の背中を、例えばことを何かにandps xmm0, xmm1/ orps xmm0, xmm2sqrtsd出力に依存しますXMM0内の固定値を設定します。

または試験待ち時間に簡単な方法は、偽の出力依存の「利点」を取ることであるsqrtsd xmm0, xmm1ことと- sqrtss従って、出力レジスタは、そのマージするための入力であり、修飾されていない先の上位32分の64ビット(それぞれ)を残します。私はこれがあなたの素朴なインラインアセンブラの試みが、待ち時間の代わりに、スループットにボトルネック終わった方法であると仮定し、それだけでループ内で同じ入力を再度読むことができるように、コンパイラは、出力用の異なるレジスタを選んで。あなたがあなたの質問に追加インラインアセンブラが完全に壊れているとも、コンパイルされませんが、おそらくあなたの本当のコードが使用され"x"(XMMレジスタ)の入力と出力の制約を代わりに"i"(即時)?

このNASM源静的実行可能なテストループの(下で実行するようにperf stat)非VEXと偽依存性を符号化することを使用sqrtsd

このISAの設計のいぼは、Pentium III上SSE1と短期のために最適化インテルのおかげです。P3は、内部に2つの64ビットの半分として128ビットレジスタを扱います。上半分のままにすると、スカラ命令は、単一のuopにデコードしてみましょう変更されていません。(しかし、それはまだPIIIに与えsqrtss偽の依存関係を)。AVXは最終的に私たちがしてこの問題を回避することができますvsqrtsd dst, src,srcレジスタ源のために、少なくとも、同様にvcvtsi2sd dst, cold_reg, eax同様に近いsightedly設計されたスカラーINT-> FPの変換手順について。(GCCは、レポートの最適化逃し:805868907180571を。)


多くの以前のCPU上でも変動したスループットが、Skylakeマイクロアーキテクチャは、スケジューラは常にそれが新しいDIV / SQRT UOP 3サイクル後、最後の単精度の入力を開始することができます知っていることを十分に仕切りを強化し。

場合は、最後の倍精度入力UOP後4〜6サイクル:かかわらず、可変であってもスループットSkylakeマイクロアーキテクチャ倍精度Agner霧の指示テーブルが正しいです。https://uops.info/はフラット6cは相互のスループットを示しています。(または、その倍の長256ビットのベクトルについて、128ビットのスカラは、よりスループットが、同じ遅延を広いSIMDデバイダの別個の半体を使用することができる。)も参照浮動小数点乗算対浮動小数点除算抽出一部スループット/レイテンシ番号についてのAgner霧の指示テーブルから。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=369903&siteId=1