昨天的指令故意寫得得比較有懸念,留在今天才講
test case 改動的點在於讓 WAW 的指令變得更近
原本 agent 寫的版本差太多道指令
前一道指令都已經 retire 了
字面上的確有 dependency,但沒有太大的意義
像這種也是目前語言模型的弱點
如果這種 CPU 驗證的 test case 沒有人類好好檢查的話,很容易有問題
話又說回來
到底一個 out of order cpu 是怎麼解決 dependency 的問題
讓後面的指令可以優先執行呢?
這就要說到 registre renaming 了
其中的關鍵就是 David Wheeler 說的:
「計算機科學中的任何問題,都可以透過增加一個抽象層來解決。」
白話文就是我們用 x0~x31 的 architecture register 去存取
背後墊了一層維護 physical register 的邏輯
讓指令可以存取到不同版本(被複寫)的 register 內容
舉個例子
addi x1, x0, 1
addi x2, x0, 2
mul x3, x1, x2
add x4, x3, x1
addi x3, x0, 5
addi x5, x3, 6
第四道指令(add)存取到的 x3 和第六道指令(addi)存取到的 x3 是不同的
Out of Order 中第五道指令(addi)比第三道(mul)先執行完,並寫繼續執行第六道(addi)
但它並不會影響到第四道指令(add)讀到的 x3
就是 register renaming 的精妙之處