1 1 4 CPU快取和記憶體屏障

2021-10-02 19:35:34 字數 1193 閱讀 9531

由於cpu的運算速度高出cpu和記憶體之間的資料傳輸速度乙個級別,cpu廠商為了盡可能的利用cpu的效能,在cpu和記憶體之間新增了快取記憶體,盡可能地避免處理器訪問主記憶體的時間開銷。

分**快取:l1 cache , l2 cache , l3 cache。

其中l1 cache 和 l2 cache是每個cpu核心都擁有的,而l3 cache 是所有的cpu所共享的。

並且l1 l2 l3 cache 的大小隨級數增大。

每次資料訪問都會按l1 cache -> l2 cache -> l3 cache -> 記憶體 -> 硬碟 的順序來進行訪問。

指令重排的場景:當cpu寫快取時發現快取區塊正在被其他的cpu占用,為了提高cpu處理效能,可能將後面的讀快取命令優先執行。

並非隨便重排,需要遵循as-if-serial語義

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

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

cpu快取記憶體下的乙個問題:

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

cpu執行指令重排序優化下有乙個問題:

雖然遵守了as-if-serial語義,但僅在單cpu自己執行的情況下能保證結果正確。

多核多執行緒中,指令邏輯無法分辨因果關係,可能出現亂序執行,導致程式執行結果錯誤。

有問題肯定就會有解決方案。

寫記憶體屏障:在指令後插入store barrier , 能讓寫入快取中的最新資料寫入主記憶體,讓其他執行緒可見。

強制寫入主記憶體,這種顯示呼叫,cpu就不會因為效能考慮而去對指令重排。

讀記憶體屏障:在指令前插入load barrier , 可以讓快取記憶體中的資料失效,強制重新從主記憶體載入資料。

強制讀取主記憶體內容,讓cpu快取與主記憶體保持一致,避免了快取導致的一致性問題。

CPU快取和記憶體屏障

cpu效能優化的手段 快取 為了提供程式執行的效能,現代cpu在很多方面對程式進行了優化。例如cpu快取記憶體。盡可能避免處理器訪問主記憶體的時間開銷,處理器大多數會利用快取以提高效能。cpu快取分為3級快取,l1,l2,l3,l1的訪問速度最快,然後遞減。如果機器是多核,則每個cpu對應相對的l1...

CPU快取和記憶體屏障

為了提高程式的執行效能,現代cpu在很多方面對程式進行了優化 例如 cpu快取記憶體,盡可能的避免處理器訪問主記憶體的時間開銷,處理器大多會利用快取以提高效能 l1 cache 一級快取 是cpu第一層快取記憶體,分為資料快取和指令快取,一般伺服器cpu的l1快取的容量通常在32 4096kb l2...

CPU快取和記憶體屏障

cpu效能優化手段 執行時指令重排 為了提高程式的執行效能,現代cpu在很多方面對程式進行了優化 例如 cpu快取記憶體,盡可能的避免處理器訪問主記憶體的時間開銷,處理器大多會利用快取以提高效能 l1 cache 一級快取 是cpu第一層快取記憶體,分為資料快取和指令快取,一般伺服器cpu的l1快取...