2017-02-20 25 views
1

我得到了2位分支預測器,我的出發狀態,弱採用,我需要計算的預測準確度:與我2位分支預測器有兩個for循環

for (int i=0; i < 100; i++) 
{ 
    for (int j=0; j < 50; j++) 
    { 
    ... 
    } 
} 

所以= 0,我們採取的分支,所以我們在i = 0和j = 0,並設置我們的預測器強烈採取,對吧?所以如果我們現在迭代j,這是否意味着我們沒有采取新的分支?因爲我們仍然在i = 0分支中,或者每個迭代都算作一個新的分支嗎?

+0

試圖清楚表明它是關於分支預測的。其他我的閱讀,不明白,這是一個明確的主題... – xMRi

回答

0

讓我們手動將其編譯成x86彙編第一更好地瞭解(任何其他會做):

mov ebx, 0  // this is our var i 
.L0: 
# /------------ inner loop start -----------\ 
    mov eax, 0  // this is our var j 
.L1: 
    // ... 
    add  eax, 1 
    cmp  eax, 50 
    jl  .L1  // jump one 
# \------------ inner loop end -------------/ 
    add  ebx, 1 
    cmp  ebx, 100 
    jl  .L0  // jump two 

我覺得這個代碼是非常簡單的,即使你不熟悉彙編:

  • 套裝EBX0
  • 跳2回來這裏
    • 套裝EAX0
    • 跳一個回來這裏
      • 執行我們的循環代碼// ...
      • 添加1EAX
      • 比較EAX50(這會在標誌中設置一些位註冊)
      • 跳轉到label .L1:如果EAX不是50
    • 添加1EBX
    • 比較EBX50(這個參數設置一些比特的標誌寄存器)
    • 跳如果ebx不是100,則標記.L0:
  • 結束lo OPS

所以在第一次循環,我們到達跳一個並預測它會採取。由於eax < 50我們把它和更新到強烈採取。現在我們再做48次。在50次迭代中,我們不跳,因爲eax == 50。這是一個單錯預測,我們更新爲弱取。

現在我們到達跳2首次。因爲ebx < 100我們把它和更新它強採用。現在我們通過跳到L0開始所有內部循環。我們再做98次。在內循環的100次迭代中,我們不跳,因爲ebx == 100。這是一個單錯預測,我們更新爲弱取。

所以我們執行innerloop 100次單錯誤預測每共計100預測失誤跳一個100 * 49 = 4900正確的預測。外循環只執行一次,只有1錯誤預測99正確的預測

+0

我很抱歉我遲到的答覆我完全忘記檢查這個,因爲我已經寫了考試,但我會再次需要它下學期。非常感謝您的幫助。 – lllllIIIIll

+0

@lllllIIIIll如果您認爲它是一個很好的答案,請隨時註冊它;) – Christoph