今日的行程:
辦公室:10:00 - 19:00
讀書室:21:00 - 21:30
今日的記錄:
記錄公司禮拜五的讀書會內容
以思考題目的第一題來說明:
CPU 0 CPU 1
----------------------------------------------------
void func0 () void func1()
{ {
a = 1; while (b == 0) continue;
b = 1; assert (a == 1);
} }
以 MESI protocol 為例,並且初始狀態是:
CPU0 | CPU1 | |
---|---|---|
cache line: a = 0 | Invalid | Exclusive |
cache line: b = 0 | Exclusive | Invalid |
CPU 0 CPU 1
T0 ----------------------------------------------------------------------
寫 "a = 1" 到 store buffer
送寫訊號到 bus 上
T1 ----------------------------------------------------------------------
讀 b 的值
送 read 訊號到 bus 上
T2 ----------------------------------------------------------------------
執行 "b = 1"
T3 ----------------------------------------------------------------------
收到 bus 來的 read 訊號
把 b 的值送到 bus 上
T4 ----------------------------------------------------------------------
收到 b 的值,b == 1
跳出 while
T5 ----------------------------------------------------------------------
讀取 a 的值(從自己的 cache 讀)
a == 0,assert!!
T6 ----------------------------------------------------------------------
收到 bus 來的寫訊號
invalidate a
T7 ----------------------------------------------------------------------
以 MESI protocol 為例,並且初始狀態是:
CPU0 | CPU1 | |
---|---|---|
cache line: a = 0 | Shared | Shared |
cache line: b = 0 | Exclusive | Invalid |
CPU 0 CPU 1
T0 ----------------------------------------------------------------------
寫 "a = 1" 到 store buffer
送寫訊號到 bus 上
T1 ----------------------------------------------------------------------
讀 b 的值
送 read 訊號到 bus 上
T2 ----------------------------------------------------------------------
收到寫訊號,把 inval. a 加入 inval. queue
回覆 ACK
T3 ----------------------------------------------------------------------
把 "a = 1" 從 store buffer 寫入 cache
狀態變成 Modified,a == 1
T4 ----------------------------------------------------------------------
執行 "b = 1",狀態為 Modified
T5 ----------------------------------------------------------------------
收到讀訊號,把 b 的值送到 bus 上
T6 ----------------------------------------------------------------------
收到 b 的值,b == 1
跳出 while
T7 ----------------------------------------------------------------------
讀取 a,inval. a 還在 inval. queue
a == 0,assert!!
T8 ----------------------------------------------------------------------
以上兩例都會使,思考題第一題的程式邏輯,有不預期的狀況發生,所以思考題第一題的答案是會!!
在 Memory model 允許 program order 和 memory order (memory access order) 不一致的話,就有可能會發生上述的問題,所以需要 ISA 提供相應的解決辦法。