今日的行程:
讀書室:19:30-20:30
今日的記錄:
記錄公司禮拜五的讀書會內容
- 請問下列程式嗎? assert(a == 1) 有沒有可能失敗?
CPU 0 CPU 1
----------------------------------------------------
void func0 () void func1()
{ {
a = 1; while (b == 0) continue;
b = 1; assert (a == 1);
} }
- 什麼是儲存緩衝區 (store buffer)?
- 什麼是無效隊列 (invalidate queue)?
現今的 CPU 運作速度和記憶體的存取速度存在著不小的落差,所以通常會用快取 (cache) 來嘗試隱藏記憶體的存取延遲,但由於各自 CPU 可能會有各自的私有快取 (private cache),為了避免不同 CPU 的 cache 之間,對同一份資料有不同的副本,所以需要快取一致性協定 (cache coherence protocol),來維護各個快取間的資料正確性。常見的有 MESI、MEOSI 等等。
cache coherence protocl 通常分為兩大類,directory based 和 snooping based,snooping based 會需要送出 broadcasting 的訊號到 bus 上,然後監聽 bus 訊號,會占用很多的 bus 資源,所以擴展性較 directory based 的差,但實作相對簡單,所以在相對小型的系統上,主流還是使用 snooping based 的 coherence protocol。
在 snooping based 的 cache coherence protocol 運作的過程,可能會因為訊息頻繁的傳遞、Bus 繁忙,而 CPU 需要等某些訊號發生才能繼續執行,導致 CPU 性能下降,這稱為 CPU stall。
具體來說可能是這樣的情境,CPU0 要修改 cache 的內容但是其餘的 CPU 也有這條 cache line,這時候會發生的事情是,CPU0 送出一個請 CPU{1...N} invalidate cache 的訊息,而 CPU0 需要等到 CPU{1...N} 回了一個 ACK 訊息才能繼續往下執行。
為了解決以上性能問題,引進了 store buffer 和 invalidate queue 的機制。
store buffer 是 CPU 尚未收到 ACK 訊號之前,可以先將資料寫入 store buffer 中,等到收到 ACK 訊號之後,再把 store buffer 中的資料寫入 cache 中;
而因為 store buffer 的空間也不會太多,如果空間用完了,還是會有相同的問題,所以引進了 invalidate queue 的機制,當 CPU 收到 invalidate 訊號時,可以先把這個訊號記錄在 invalidate queue 中,就先回 ACK 訊號,以加速整個訊息交換的過程。