為了提高程式的執行效能, 現代cpu在很多方面對程式進行了優化。
例如: cpu快取記憶體, 盡可能的避免處理器訪問主記憶體的時間開銷, 處理器大多會利用快取以提高效能
多級快取
l1 cache (一級快取)是cpu第一層快取記憶體, 分為資料快取和指令快取, 一般伺服器cpu的l1快取的容量通常在32-4096kb
l2 cache (二級快取)由於l1快取記憶體的容量限制, 為了再次提高cpu的運算速度, 在cpu外部放置一快取記憶體儲存器, 即二級快取
l3 cache(**快取)現在都是內建的, 而它的實際作用既是,l3快取的應用可以進一步降低記憶體延遲, 同時提公升大資料量計算時處理器的效能. 具有較大l3快取的處理器更有效的檔案系統快取行為及較短訊息和處理器佇列長度. 一般是多核共享乙個l3快取
查詢順序
cpu在讀取資料時, 先在l1中尋找, 再從l2中尋找, 再從l3中尋找, 然後是記憶體, 最後是外儲存器
多cpu讀取同樣的資料進行快取, 進行不同運算之後, 最終寫入主記憶體以哪個cpu為準?
在這種快取記憶體回寫的場景下, 有乙個快取一致性協議, 多數cpu廠商對它進行了實現.即mesi協議, 它規定每條快取有個狀態位, 同時定義了下面四種狀態:
修改態(modified):此cache行已被修改過(髒行), 內容已不同於主記憶體, 為此cache專有
專有態(exclusive):此cache行同於主存, 但它不出現於其他cache中
共享態(shared):此cache行同於主存, 但也出現於其他cache中
無效態(invalid):此cache行無效(空行)
多處理時, 單個cpu對快取中的資料進行了改動, 需要通知給其他cpu, 也就意味著, cpu處理要控制自己的讀寫操作, 還要監聽其他cpu發出的通知, 從而保證最終一致
cpu效能優化手段 - 執行時指令重排
指令重排的場景:當cpu寫快取時發現快取區塊正被其它cpu占用,為了提高cpu處理效能, 可能將後面的讀快取命令優先執行.當然也並非隨便重排, 需要遵循as-if-serial語義
as-if-serial語義的意思指: 不管怎麼重排序, 程式的執行結果不能被改變
編譯器,runtime和處理器都必須遵守as-if-serial語義, 也就是說,編譯器和處理器不會對存在資料依賴關係的操作做重排序
cpu快取記憶體下有乙個問題:
快取中的資料與主記憶體的資料並不是實時同步的,各cpu間快取的資料也不是實時同步. 在同一時間點, 各cpu所看到的同一記憶體位址的資料的值可能是不一致的.
cpu執行指令重排序優化的乙個問題:
雖然遵守了as-if-serial語義, 但僅在單cpu自己執行的情況下能保證結果正確. 多核多執行緒中,指令邏輯無法分辨因果關聯, 可能出現亂序執行, 導致程式執行結果錯誤
處理器提供了兩個記憶體屏障指令(memory barrier)用於解決上述兩個問題:
寫記憶體屏障(store memory barrier):在指令後插入store barrier, 能讓寫入快取中的最新資料更新寫入主記憶體, 讓其他執行緒可見,強制寫入主記憶體, 這種顯示呼叫, cpu就不會因為效能考慮而進行指令重排
讀記憶體屏障(load memory barrier):在指令前插入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快取...