與cache相關的一些問題和思考

2021-05-24 08:01:24 字數 1597 閱讀 5853

submitted by droplet on fri, 2010-12-10 14:58

cache在效能優化裡面占有很重要的地位,在效能優化的不同層次上,都會用到與cache相關的知識,下面是一些問題和思考。

1)很顯然,cache的容量是有限的,所以就會有cache miss,cache miss一般有三種原因:

a: 當cache為空的時候,需要把內容調入cache。

b: 當超出cache容量的時候,需要淘汰一些舊的內容,騰出空間給新的內容。

c: cache conflict,在有衝突的時候,需要用舊的覆蓋新的。

第一種情況對任何cache都是適用的;第二種情況,比如cpu的l2 cache,如果是全關聯的cache,那麼超出容量是,任何乙個舊的都可能被踢出去;第三種情況一般是在n-way 關聯的時候,對映到相同cache line的內容之間有衝突。

一般來說cpu有如下的cache型別:

l1 i-cache, l1 d-cache, tlb, l2 cache, l3 cache。l1 cache和tlb cache容量較小,可以做成全關聯的,l2, l3 cache一般是n-way關聯的。cache在正常情況下,應該是可以提高效能的,但是在cache thrashing (pingpong)的時候,對效能卻是有害的。在這種情況下,所有的訪問都不能從cache裡得到資料,而是需要到main memory裡去拿資料,所以程式設計的時候要比較cache thrashing。

2)如果避免cache thrashing,如何提高效能?

一般來說,跨邊界的資料結構都是有害的。比如乙個小於32 bytes的資料結構跨兩個cache line,比如程式**太大,正好在這個路徑上,發生了cache conflict。一般來說l1 cache有64k,而l2 cache有1m或者更大。**路徑的長度不太可能有這麼大的跨度。但是,最好是把相關的**放在一起,最好減小**的體積,最好把資料結構cache line對齊等等一下基本規則還是從一開始就遵守的好。

解決這個問題使用的技巧就是coloring。page coloring比較好理解,相同color的page會對映到相同的cache上去,所以在分配的時候,盡量比較給同乙個process分配相同color的page。但是對於slab allocator的color就有點不太明白了。如果color的偏移是cache line大小還好理解,如果是其他的大小,感覺就沒什麼用。而且在slab allocator的**裡面提到memory channel,這個和cache沒什麼關係。memory channel是特定的實體地址在特定的記憶體片裡面,如果是dual channel,最好資料位址能夠分配到兩個channel上,這樣就可以並行讀入,而不是順序讀入。這個是用來提高記憶體頻寬的(當然可以可以說是避免衝突,因為如果是順序訪問,就說明兩次讀入是有衝突的)

3)l1 cache或者tlb裡面,是虛位址,還是實體地址。這個和cache本身沒有關係,這涉及到乙個轉換的問題。所以我認為在cache裡面應該是實體地址,也就是說cpu在訪問記憶體時,mmu是首先執行的,首先解決了tlb miss的問題,才能解決cache miss的問題,順序不能亂。

與cache相關的一些問題和思考

submitted by droplet on fri,2010 12 10 14 58 cache在效能優化裡面占有很重要的地位,在效能優化的不同層次上,都會用到與cache相關的知識,下面是一些問題和思考。1 很顯然,cache的容量是有限的,所以就會有cache miss,cache miss...

與cache相關的一些問題和思考

submitted by droplet on fri,2010 12 10 14 58 cache在效能優化裡面占有很重要的地位,在效能優化的不同層次上,都會用到與cache相關的知識,下面是一些問題和思考。1 很顯然,cache的容量是有限的,所以就會有cache miss,cache miss...

phpstudy相關的一些問題

phpstudy相關 phpstudy for linux lnmp lamp一鍵安裝包 如何切換php版本 假如你先安裝的apache php5.3 想切換成nginx php5.4 你就再走一次.phpstudy.bin 但是你會發現有一行是否安裝mysql提示選不安裝 這樣只需要編譯nginx...