CPU性能優化手段—— 緩存
多級緩存
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佔用,爲了提高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與主內存保持一致,避免了緩存導致的一致性問題。