Cache

爲什麼要引入Cache

①大容量主存一般採用 DRAM,相對SRAM速度慢,而SRAM速度快,但價格高。

②程序和數據具有侷限性,即在一個較短的時間內,程序或數據往往集中在很小的存儲器地址範圍內。

因此,在主存和CPU之間可設置一個速度很快而容量相對較小的存儲器,如下圖所示。在其中存放CPU 當前正在使用以及一個較短的時間內將要使用的程序和數據,這樣,可大大加快 CPU 訪問存儲器的速度,提高機器的運行效率。

Cache其實是我們分出來的特定的存儲器,爲了優化處理器處理速度,Cache具有一些優秀的特點。事實上從引入理由可以看到Cache必須存儲速度快並且不是那麼大容量對於系統也會有很大幫助。尋找這樣的存儲器,SRAM簡直是量身定做,該存儲器採用晶體單元,集成度不高所以做不到容量大;但是它相比DRAM速度就快了,另外掉電後數據也保存,對於一些重複的應用而言第一次命中就很好了,似乎都不需要提前讀寫(預熱)。既然Cache實質存儲器,也應該滿足存儲器的層次結構。

存儲器的層次結構

l  越靠近CPU的層次,其特性必須

–   安裝容量小(節約成本)

–   速度更快(提高訪問速度)

–   包含下一個層次的數據的一個子集

–   包含以上所有層次所存儲的數據

l  最高的層次應與CPU速度相同

l  最低的層次(通常是磁盤)包含所有的數據

 

數據訪問的局部特性(Cache代碼優化)

l  時間局部特性

–   現在訪問的數據,在不久的將來可能再次使用

l  空間局部特性

–   此處的數據被訪問,其附近的數據可能即將被訪問

內存Cache的設計

–   定位:指定的內存單元映射到哪個Cache地址?

–   確認:某Cache地址中存儲的數據是否是需要的?

–   速度:如何快速得到數據?

直接映射Cache

–   指定內存單元映射到一個確定的Cache單元;

–   多個內存單元可以映射到同一個Cache單元

          

l 多個內存地址可以映射到同一Cache塊:如何知道Cache當前存儲的是哪個?

l 如果Cache塊大於1字節(空間局部特性)如何處理?

l 解決方案:把地址分解爲3個域

             標記Tag                        塊指針Index       字指針Offset

 

l 所有域作爲無符號數使用

l Index:需要的Cache塊

l Offset:Cache塊內字節偏移

l Tag:標準當前在Cache塊中存儲的數據是映射到哪個內存地址

 

字指針Offset設置(DM642)

設每次從Cache中取出一個字(B),L1P採用直接映射,也就是塊大小等於行大小,所以塊大小爲32B=25B,所以需要5Bits來描述塊內字偏移量。佔據地址0-4低5

塊指針Index設置

選擇合適Cache行(叫做:Cache Row)

Cache大小:16 KB = 214 bytes

塊大小: 25 bytes (8 words)

Cache行數 =   Cache塊數/每行快數(=1)            

         =   Cache大小 /行大小(=塊大小)                   

         =    2^14 /2^5                            

         =   2^9 行

需要9bits第5-13

標誌位:剩餘的位數爲32-5-9=18Bits第14-31

3類事件

l  cache miss:Cache塊無數據,從內存讀入

l  cache hit:Cache塊包含合適的數據,直接從Cache中讀出數據

l  cache miss, block replacement:錯誤的數據在Cache塊中,拋棄現有數據,並從內存中讀入合適的數據

Valid bit:標準Cache塊是否有數據

Cache的性能

平均訪問時間(Average Access Time )

= Hit Time +  Miss Penalty × Miss Rate

未命中產生的原因:1)加載程序時,Cache裏面還沒有任何信息或數據有誤;2)採用兩個內存地址映射到同一Cache塊(允許的),且同時訪問;會產生衝突。(直接映射很容易導致衝突,因爲概率上而言映射關係不多出錯的可能性就大了?)。

Cache塊大小

–   大於1Byte的塊可以利用程序的空間局部特性

–   對指令,此特性非常重要

–   對數據,也有很大的好處

塊大小對Cache性能指標的影響

–   Miss Penalty = Block Size/Memory Bandwidth

–   Block Number = Cache Size/Block Size

要改善Cache的性能,可以通過兩個途徑實現,1)增加命中率,2)減少缺失開銷

減少衝突可以有效增加命中率,讓映射關係更自由可以降低衝突發生的概率,就可以增加命中率從而改善Cache性能,因此引入了全相關的概念,Index不再操作。內存地址單元可以映射到任意的Cache塊。

有了全相關的概念自然的引出了多路聯合集,每個集包含多個Cache塊,集內是全相關的,必須並行比較Tag,集間相當於直接映射,直接映射到集,然後用全相關。

Cache的替換策略

如果所有可用Cache塊都已經佔用,新的程序/數據來到,必須廢棄一個,然後存儲在此處,這就是替換策略。

LRU(Least Recently Used)近來最少使用塊,找一個最空閒的,存儲新數據。

 

 

Cache模塊API
         CACHE_clean(CACHE_L2ALL, 0, 0);
    CACHE_setL2Mode(CACHE_256KCACHE);
    CACHE_enableCaching(CACHE_EMIFA_CE00);
    CACHE_enableCaching(CACHE_EMIFA_CE01);
 
轉自:

http://blog.sina.com.cn/s/blog_4a709f280100x1on.html

 

cache miss分爲3個種類:
conflict miss
capacity  miss
compulsory miss 

Compulsory misses are those misses caused by the first reference to a location in memory. Cache size and associativity make no difference to the number of compulsory misses. Prefetching can help here, as can larger cache block sizes (which are a form of prefetching). Compulsory misses are sometimes referred to as cold misses.

Capacity misses are those misses that occur regardless of associativity or block size, solely due to the finite size of the cache. The curve of capacity miss rate versus cache size gives some measure of the temporal locality of a particular reference stream. Note that there is no useful notion of a cache being "full" or "empty" or "near capacity": CPU caches almost always have nearly every line filled with a copy of some line in main memory, and nearly every allocation of a new line requires the eviction of an old line.

Conflict misses are those misses that could have been avoided, had the cache not evicted an entry earlier. Conflict misses can be further broken down into mapping misses, that are unavoidable given a particular amount of associativity, and replacement misses, which are due to the particular victim choice of the replacement policy.



 

發佈了61 篇原創文章 · 獲贊 33 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章