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スループットでした。なぜ私は依存関係のチェーンがそれより大きなボトルネックではないのか理解できません。
著者は、アウトオブオーダーの実行とパイプラインで接続されているが、私はそれを見ることはできないと説明しています。しかし、乗算だけが5サイクルのレイテンシを引き起こすので、この値は4サイクルよりも大きいことを意味します。著者はここで依存関係を気にしない理由を私も理解できない
:すべての後に
add eax, 16 -> cmp eax, ecx -> jl L1
を、さらにはcmp
前に実行されなければならないとcmp
はjl
前に実行する必要があります。
PS:128BベクターOPSは、2つのuop毎にデコードするので、後の段落は、図6Cごとに反復することを制限する、デコードなどのPentium Mの最大のボトルネックを特定します。分析の残りの部分についてはAgner Fogのガイド、Core2、FMA4 Bulldozer、Sandybridgeの分析+チューニングを参照してください。
比較/分岐のペアは予測されるため、実際にはカウントされません。それ以外はあなたが何を求めているのか分かりません – harold
あなたはAgnerの文書をリンクし、あなたが参照しているセクションと例を述べてください。 –