0

來自Agner Fog's "Optimizing Assembly" guide,第12.7節:循環示例。其中一段討論的示例代碼:依賴鏈分析

[...]奔騰M分析:... 13 uops在每時鐘3 =一個迭代每4.33c退休時間。

循環中有一個依賴鏈。等待時間爲:對於 存儲器讀取有2個,對於乘法有5個,對於相減有3個,對於存儲器 寫有3個,總計13個時鐘週期。這是退休時間的三倍,但它不是循環攜帶的依賴關係,因爲每次迭代的結果都保存到內存中,並且在下一次迭代中不會重複使用 。無序執行機制和 流水線使得每個計算可以在前面的計算完成之前 之前開始。唯一的循環進行 依賴鏈是add eax,16擁有的只有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 

等待時間我不明白爲什麼依賴鏈不增加整體吞吐量。我知道只有找到最壞的瓶頸纔是重要的。在考慮依賴鏈之前確定的最糟糕的瓶頸是融合域uop吞吐量,每次迭代4.33個週期。我不明白爲什麼依賴鏈不是比那更大的瓶頸。

  1. 我看到作者解釋說它與無序執行和流水線連接,但我看不到它。不過,我的意思是,只有乘法會導致延遲5個週期,所以只有這個值大於4個週期。

  2. 我也無法理解爲什麼筆者不關心的依賴性在這裏: add eax, 16 -> cmp eax, ecx -> jl L1 畢竟,之前cmpcmp必須jl之前執行除了必須執行。


PS:後面的段落標識最大的瓶頸爲奔騰M作爲解碼,將其限制到每6C一次迭代,因爲128B矢量OPS進行解碼,以每兩個微指令。請參閱Agner Fog的指南以瞭解其他分析,以及Core2,FMA4推土機和Sandybridge的分析+調整。

+0

比較/分支對將被預測,因此它不會真正計數。除此之外,我不知道你在問什麼 – harold

+1

你能否把Agner的文檔鏈接起來,並陳述你所引用的部分和範例? –

回答

2
  1. 的MUL不是循環搬運依賴關係鏈的一部分,因此可以有從多個迭代mulpd的insn在飛行中一次。單條指令的延遲根本就不是問題,它依賴於鏈條。每次迭代都有一個單獨的13c依賴鏈的load,mulpd,subpd,store。無序執行是允許來自多個迭代的uops一次處於運行狀態。

  2. 在每個迭代的cmp/jl取決於add從迭代,但在接下來的迭代中add不依賴於cmp。推測性執行和分支預測意味着控制依賴性(條件分支和間接跳轉/調用)不是數據依賴鏈的一部分。這就是爲什麼來自一次迭代的指令可以在來自前一次迭代的jl退役之前開始運行。

    通過比較,cmov數據依賴性,而不是控制依賴關係,因此無分支循環傾向於具有循環承載的依賴關係鏈。如果分支預測得好,這往往比分支慢。

    與FP依賴關係鏈一樣,每個循環迭代都有一個獨立的依賴關係鏈,其中包括獨立的cmp/jl依賴關係鏈。


我不明白爲什麼依賴鏈不增加整體吞吐量。

我不知道這句話的意思。我想我能弄清楚所有其他的混合詞和措辭。 (例如,「鏈依賴」而不是「依賴鏈」)。看看我對你的問題的編輯;其中一些也可能有助於你的理解。

+0

謝謝:)。首先你的觀點:好的,很明顯,多次迭代可以同時進行。但是,當涉及到只有一次迭代時,特定的迭代。爲什麼mulpd的延遲(5個週期)無關緊要?畢竟,'subpd xmm0,xmm1'必須跟着'mulpd xmm1,xmm2'(在一個迭代中的一個依賴鏈中)。對不起,我的英文,我知道它可能有問題。 2. Agner Fog說'add eax,16'是循環傳送的,它需要1個週期(等待時間)。 – Gilgamesz

+1

@Gilgamesz:2.沒錯。 'add' - >'add'是循環攜帶的依賴鏈,不是'add - > cmp - > jl - > add''。 –

+1

回覆:第一點:你能更具體地說明你爲什麼認爲它*很重要嗎?我們正在計算吞吐量,而不是單次迭代的延遲。只要無序insn調度程序和ReOrder緩衝區足夠大以暴露迭代之間的並行性,迭代中dep鏈的延遲是無關緊要的。 (一個真正長的dep鏈需要一個大的調度器和ROB)。該dep鏈中任何特定指令的延遲甚至不太重要。 –