cpu效能優化的手段-快取
為了提供程式執行的效能,現代cpu在很多方面對程式進行了優化。
例如cpu快取記憶體。盡可能避免處理器訪問主記憶體的時間開銷,處理器大多數會利用快取以提高效能。
cpu快取分為3級快取,l1,l2,l3,l1的訪問速度最快,然後遞減。
如果機器是多核,則每個cpu對應相對的l1,l2, 而l3一般是多核共享乙個。
cpu在讀取資料時候是按照l1,l2,l3,主記憶體,外部儲存器的順序查詢的。
多個cpu下存在多個高階快取(l1,l2)的情況下,要寫入主記憶體,以哪個為準?
快取一致性協議(mesi):
修改態(modified)-此cache行已被修改過(髒行),內容不同於主存,為此cache專有。
專有態(exclusive)-此cache行內容同於主存,但不出現於其他cache中。
共享態(shared)-此cache行內容同於主存,但也出現於其他cache中。
無效態(invalid)-此cache行內容無效。
多處理器時,單個cpu對快取中的資料做了修改,還要通知其他cpu。也就意味著,cpu處理要控制自己的讀寫操作,還要監聽其他cpu發出的通知,從而保證最終一致。
cpu效能優化手段-執行時指令重排
指令排查的場景: 當cpu寫快取時發現快取區塊正被其他cpu占用,為了提高cpu處理效能,可能將後面的讀快取命令優先執行
指令並非隨便重排,需要遵循as-if-serial語義
不管怎麼重排序(編譯器和處理器為了提高並行度),(單執行緒)程式的執行結果不能被改變。編譯器,runtime和處理器都必須遵守as-if-serial語義
也就是說:編譯器和處理器不會對存在資料依賴關係的操作進行重排序。
出現的兩個問題:
1.多個cpu的時候,在同一時間點通過快取記憶體檢視同乙個記憶體位址的資料有可能是不一致的。
雖然遵守mesi協議,但是並不是實時的,所以會出現資料不一致性。
2.指令重排序,遵守as-if-serial協議,這個是相對於是單執行緒執行不影響執行結果,但是在多執行緒場景下就會對結果有影響,很可能是亂序執行。
解決方法:
處理器提供了兩個記憶體屏障指令(memory barrier)用於解決上述兩個問題
寫記憶體屏障(store memory barrier):在指令後插入store barrier,能讓寫入快取中的最新資料更新至主記憶體,讓其他執行緒可見。
強制寫入主記憶體,這種顯示呼叫,cpu就不會因為效能考慮而去對指令重排序了。
讀記憶體屏障(load memory barrier):在指令前插入load barrier,可以讓快取記憶體的資料失效,強制重新從主記憶體載入資料。
強制讀取主記憶體的內容,讓cpu快取與主記憶體保持一致,避免了快取導致的一致性問題。
CPU快取和記憶體屏障
為了提高程式的執行效能,現代cpu在很多方面對程式進行了優化 例如 cpu快取記憶體,盡可能的避免處理器訪問主記憶體的時間開銷,處理器大多會利用快取以提高效能 l1 cache 一級快取 是cpu第一層快取記憶體,分為資料快取和指令快取,一般伺服器cpu的l1快取的容量通常在32 4096kb l2...
CPU快取和記憶體屏障
cpu效能優化手段 執行時指令重排 為了提高程式的執行效能,現代cpu在很多方面對程式進行了優化 例如 cpu快取記憶體,盡可能的避免處理器訪問主記憶體的時間開銷,處理器大多會利用快取以提高效能 l1 cache 一級快取 是cpu第一層快取記憶體,分為資料快取和指令快取,一般伺服器cpu的l1快取...
CPU快取和記憶體屏障
為了提高程式的執行效能,現代cpu在很多方面對程式進行了優化。例如 cpu快取記憶體,盡可能的避免處理器訪問主記憶體的時間開銷,處理器大多會利用快取以提高效能 多級快取 l1 cache 一級快取 是cpu第一層快取記憶體,分為資料快取和指令快取,一般伺服器cpu的l1快取的容量通常在32 4096...