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

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與主內存保持一致,避免了緩存導致的一致性問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章