<超標量處理器概覽> 第 4 章 - 分支預測 (Part 1)
4.1 - 概述 分支預測和 Cache 左右著 CPU 的效能,對於 superscalar CPU 來說,準確度高的分支預測更為重要 在一般的 RISC 指令集中,分支指令包含兩個要素: 方向: 分支指令的方向只有兩種:跳轉 (taken),或是不跳轉 (not taken) 有些跳轉指令是無條件執行的 (e.g. jmp 指令),有些跳轉指令則是需要根據指令中攜帶的條件是否成立來決定是否發生跳轉 (e.g. beq 指令) 目標位址: 對於一般的 RISC 指令集,目標位址在指令中有兩種形式: 直接跳轉 (direct): 目標位址 = 當前分支指令 (或分支指令的下一條指令) 的 PC 值 + immediate PC offset 由於指令通常只有 32/64 bits,因此 immediate PC offset 的值範圍也就有限,因此也限制了直接跳轉能夠跳轉的範圍 因為 immediate PC offset 值是 encode 在分支指令中,因此在 pipeline 的 decode stage 就可以直接將 immediate PC offset 給解析出來,因此這種類型的指令是很容易進行分支預測的 這種跳轉指令的執行效能也比較好 間接跳轉 (indirect): 目標位址是來自於 register 的內容,由於 register 是 32/64 bits,因此可以跳轉到任何位址 由於跳轉位址來自於 register,因此此類的分支指令的目標位址需要等待一段時間才能獲得 (e.g. 要等到 pipeline 的 execute stage) 在確認目標位址前進到 pipeline 的指令,有可能都會是無效的 (if taken),因此增大了 mis-prediction penalty 且由於 register 的內容是會動態變化的,因此這類的分支指令很難對目標位址進行預測 不過慶幸的是,這類指令通常都是 call 或是 return 類型的指令,這類指令都有很強的規律性,是容易被預測的 MIPS R3000 只使用了 5 級的 pipeline,在第二個階段的 decode stage,就可以得到分支指令跳轉的目標位址,即使發生了跳轉 (taken),也只需要丟棄一道仍在 fetch stage 的指令,misprediction penalty 並不高 ...