0

Agner Fog's "Optimizing Assembly" guide 12.7節ループの例依存チェーン解析

[...] Pentium Mの分析:1クロックあたり13μs= 4.33cの退役時間あたり1回の繰り返し。

ループに依存関係があります。レイテンシは、 のメモリ読取り、5は乗算、3は減算、メモリは3の合計で13クロックサイクルの 書込みの場合は2です。これは、退役の時間の の3倍ですが、各繰返しの結果が のメモリに保存され、次の繰返しで に再利用されないため、ループに依存する依存性ではありません。アウト・オブ・オーダー実行メカニズムと パイプライン化により、前の計算が完了してから までの各計算を開始できるようになります。唯一のループ運搬 依存チェーンは、依存チェーン全体のスループットを増加させない理由を私は理解できないだけで1

## Example 12.6b. DAXPY algorithm, 32-bit mode 
[...] ; not shown: initialize some regs before the loop 
L1: 
    movapd xmm1, [esi+eax] ; X[i], X[i+1] 
    mulpd xmm1, xmm2  ; X[i] * DA, X[i+1] * DA 
    movapd xmm0, [edi+eax] ; Y[i], Y[i+1] 
    subpd xmm0, xmm1  ; Y[i]-X[i]*DA, Y[i+1]-X[i+1]*DA 
    movapd [edi+eax], xmm0 ; Store result 
    add eax, 16    ; Add size of two elements to index 
    cmp eax, ecx    ; Compare with n*8 
    jl L1     ; Loop back 

の待ち時間を有するadd eax,16です。私は、最悪のボトルネックを見つけることが重要であることを知っています。依存関係チェーンを考慮する前に識別された最悪のボトルネックは、反復ごとに4.33サイクルで融合されたドメインのuopスループットでした。なぜ私は依存関係のチェーンがそれより大きなボトルネックではないのか理解できません。

  1. 著者は、アウトオブオーダーの実行とパイプラインで接続されているが、私はそれを見ることはできないと説明しています。しかし、乗算だけが5サイクルのレイテンシを引き起こすので、この値は4サイクルよりも大きいことを意味します。著者はここで依存関係を気にしない理由を私も理解できない

  2. :すべての後に add eax, 16 -> cmp eax, ecx -> jl L1 を、さらにはcmp前に実行されなければならないとcmpjl前に実行する必要があります。


PS:128BベクターOPSは、2つのuop毎にデコードするので、後の段落は、図6Cごとに反復することを制限する、デコードなどのPentium Mの最大のボトルネックを特定します。分析の残りの部分についてはAgner Fogのガイド、Core2、FMA4 Bulldozer、Sandybridgeの分析+チューニングを参照してください。

+0

比較/分岐のペアは予測されるため、実際にはカウントされません。それ以外はあなたが何を求めているのか分かりません – harold

+1

あなたはAgnerの文書をリンクし、あなたが参照しているセクションと例を述べてください。 –

答えて

2
  1. MULはループ運搬依存チェーンの一部ではないので、一度に飛行中の複数の反復からmulpdのinsnが存在し得ます。 1つの命令のレイテンシはここでは全く問題ではなく、のチェーンの依存関係です。各反復には、の別個の 13c依存関係のチェーン、mulpd、subpd、storeがあります。アウトオブオーダー実行とは、複数の反復からのuopを一度に飛行させることです。各反復において

  2. cmp/jlその反復からaddに依存するが、次の反復でaddcmpに依存しません。推測的実行と分岐予測は、制御依存関係(条件分岐と間接ジャンプ/呼び出し)がではなく、のデータ依存関係の一部であることを意味します。このため、1つの反復からの命令は、前の反復からのjlがリタイアする前に実行を開始することができます。比較依存性ではなくデータ依存性であるため、ブランチレスループはループに依存する依存性チェインを持つ傾向があります。分岐がうまく予測される場合、これは分岐よりも遅くなる傾向があります。

    各ループの反復には、FP依存関係チェーンと同様に、別のcmp/jl依存関係チェーンがあります。


依存チェーン全体のスループットを増加させない理由を私は理解できません。

私はこの文が何を意味するのか分かりません。私はあなたの他のすべての言葉とフレーズが混じっていることを理解することができたと思う。 (例えば、 "依存関係連鎖"ではなく "連鎖依存関係")。あなたの質問に対する私の編集内容を見てください。それらの中にはあなたの理解を助けるものもあります。

+0

ありがとう:)最初のポイント:OK、一度に複数の反復が飛行できることは明らかです。しかし、それは1回の反復、特定の反復のみになるとき。なぜmulpdのレイテンシ(5サイクル)が重要ではないのですか?結局、 'subpd xmm0、xmm1'の後に' mulpd xmm1、xmm2'(1回の反復のための1つの依存関係チェイン)が続かなければなりません。私の英語は申し訳ありませんが、問題があるかもしれません。 2. Agner Fogは、「add eax、16」はループで運ばれ、1サイクル(待ち時間)かかることを示しています。 – Gilgamesz

+1

@Gilgamesz:2.それは正しいです。 'add' - >' add'は 'add - > cmp - > jl - > add'ではなく、ループが持つ依存関係の連鎖です。 –

+1

re:最初のポイント:なぜそれが問題であると思われるのか、より具体的に考えることはできますか?我々はスループットを計算しています*単一反復のレイテンシではありません。アウト・オブ・オーダーのinsnスケジューラーと再オーダー・バッファーが反復間の並列性を十分に示す大きさであれば、反復内のデポ・チェーンの待ち時間は無関係です。 (本当に長いデパインチは大きなスケジューラとROBを必要とします)。そのデパインチェーンの特定の命令のレイテンシはそれほど重要ではありません。 –

関連する問題