CPU快取與指令重排所存在的問題與解決辦法

2021-10-06 01:22:12 字數 1394 閱讀 1367

cpu一級快取

第一層快取記憶體,分為資料快取和指令快取,大小在32~4096kb

cpu二級快取

再次提高cpu的運算速度

cpu**快取

進一步降低記憶體延遲,提公升大資料量計算時處理器的效能。多核共享乙個l3快取。cpu在讀取時,查詢的順序l1->l2->l3->記憶體->外儲存器。

快取同步協議(mesi協議

修改態(modified)

此cache已被修改,內容不同於主存,為此cache專有

專有態(exclusive)

此cache內容同於主存,但不出現其它cache中

共享態(shared)

此cache同於主存,但也出現其它cache中

無效態(invalid)

此cache內容無效

多處理器時,單個cpu對快取資料進行改動,需要通知給其它cpu。

cpu處理要控制自己的讀寫操作,還要監聽其它cpu發出的通知,從而保證最終一致性

指令重排的場景:當cpu寫快取時發現快取被其他cpu占用,為了提高cpu處理效能,可能將後面的讀快取命令優先執行,並非隨便重排,需要遵守as-if-serial語義

as-if-serial語義:不管怎麼重排序(編譯器和處理器為了提高並行度),(單執行緒)程式的執行結果不能被改變。

也就是說:編譯器和處理器不會對存在資料依賴關係的操作做重排序。

1.cpu快取記憶體下存在的問題:

快取中的資料和主記憶體的資料並不是實時同步的,各個cpu間的快取資料也不是實時同步的。在同乙個時間點,各cpu所看到同一記憶體位址的資料值可能是不一致的。

2.cpu執行指令重排優化存在的問題:

遵守了as-if_serial,但僅在單cpu自己執行的情況能保證結果正確,多核多執行緒中,指令邏輯無法分辨因果關聯,可能出現亂序執行,導致程式執行結果錯誤。

cpu提供了兩個記憶體屏障指令(memory barrier)用於解決上述兩個問題:

寫記憶體屏障

在指令後插入store barrier,能讓寫入快取中的最新資料更新寫入主記憶體,讓其它執行緒可見。強制寫入主內幕才能,這種顯示呼叫,cpu就不會因為效能考慮而去對指令重排。

讀記憶體屏障

在指令前插入load barrier,可以讓快取記憶體中的資料失效,強制重新從主記憶體中載入,讓cpu與主記憶體保持一致,避免了快取導致的一致性問題。

cpu指令重排序的原理

目錄 1.重排序場景 2.追根溯源 3.快取一致性協議 4.重排序原因 一 重排序場景 class resortdemo public void reader 當兩個執行緒 a 和 b,a 首先執行writer 方法,隨後 b 執行緒接著執行 reader 方法。執行緒b在執行操作4時,能否看到執行...

CPU指令重排序與MESI快取一致性

一 重排序場景 class resortdemo public void reader 當兩個執行緒 a 和 b,a 首先執行writer 方法,隨後 b 執行緒接著執行 reader 方法。執行緒b在執行操作4時,能否看到執行緒 a 在操作1對共享變數 a 的寫入?答案是 不一定能看到。由於操作1...

CPU的重排序與MESI快取一致性

一 重排序場景 class resortdemo public void reader 當兩個執行緒 a 和 b,a 首先執行writer 方法,隨後 b 執行緒接著執行 reader 方法。執行緒b在執行操作4時,能否看到執行緒 a 在操作1對共享變數 a 的寫入?答案是 不一定能看到。由於操作1...