1. cache 介紹
影響Cache缺失的情況有3種:
- Compulsory: 第一次被訪問的指令或者數據肯定不會在cache中,需要通過預取來減少這種缺失
- Capcity: Cache容量越大,缺失就可以更少, 程序頻繁使用的三個數據來源于3個set, 但是,核由于面積的約束,只有2個set
- Conflict, 指多個數據映射到Cache中的同一個位置, 程序頻繁使用的三個數據來源于同一個Cache set;可以使用Victim Cache來緩解這個問題
1.1 cache的結構
cache主要由兩部分組成,Tag部分和Data部分。Data部分用來保存一片連續地址的數據,而Tag部分則是存儲這片連續數據的公共地址,一個Tag和它對應的所有數據組成的一行稱為一個Cache line; 而Cache line中的數據部分稱為數據塊(Cache data block), 如果一個數據塊可以存儲在Cache中的多個地方,這些被同一個地址找到的多個Cache line稱為一個Cache set。如TLB和Victim Cache多采用了全相連結構,而普通的I-cache和D-cache則采用組相連結構
1.2 Cache的實現方式
并行訪問:如果同時訪問Tag SRAM和Data SRAM, 我們稱之為并行訪問。將讀出來的地址和數據都送到一個多路選擇器上,這個多路選擇器受到Tag比較結構的控制。然后根據存儲器地址中的block offset的值選出合適的字節,一般將選擇字節的過程稱為數據對齊。
- 地址計算: 計算得出存儲器的地址
- 沖突檢查: 對load/store指令之間存在的相關性進行檢查
- 并行訪問Tag SRAM和Data SRAM, 并使用結果進行選擇
- 使用存儲器中的block offset 從data block 種選出最終需要的數據
串行訪問:訪問SRAM這一級少了mux, 對于時序較為友好,但是多了一個cycle。串行訪問的功耗也更為友好,因為是根據比較之后的結果進行訪問
Note: 如果處理器是超標量處理器,可以亂序執行,那么我們選擇串行訪問效果更好,因為訪問cache多的這個時鐘周期可以通過執行其它指令來掩蓋掉,并且通過串行訪問,可以減少delay, 提高時鐘頻率。如果是普通的順序執行的處理器,選擇并行訪問比較好。
1.3 cache的寫入
寫通:當數據寫到D-cache的同時,也寫入到它的下級存儲器中
寫回:當數據寫到D-cache時,不會立即寫入到下級存儲器中,只會在cache line中做一個記號,只有當該cache line需要被替換時,才會寫入到下一級存儲器中
上述情況都是默認要寫入的地址總是在D-Cache中,如果發現這個地址不在D-cache上時,就發生了寫缺失(write miss), 此時最簡單的處理方法就是將數據寫到下級存儲器,稱為non-write allocate.
如果發生寫缺失時,將發生缺失的地址對應的整個數據塊取出來,將數據合并到這個數據塊中,然后將被改過的數據塊寫入到D-Cache中(wirte allocate), 之后也需要將這個數據塊寫入到下級存儲器中(write allocate)
NOTE: 寫通方式的優點是結構簡單,方便一致性管理。缺點是執行效率不高,每一次寫入都需要修改下級存儲器。在一般的處理器當中,L2 Cache會采用寫回的方式,但對于L1 cache來看,寫通的方式也是可以接受的,這樣可以簡化流水線的設計,便于在多核的情況下管理內存一致性。
1.4 提高cache的性能
- write buffer
- 多級cache
現在L1 cache一般都做成inclusive的模式,因為實現簡單,并且方便管理
3. victim cache
victim cache可以保存最近被提出cache 的數據, 因此所有的cache set 都可以利用它來提高way 的個數, 通常victim cache 采用全相連的方式,容量都比較小。
- 硬件預取 prefetch
由于程序本身是串行執行的,因此只需要訪問I-Cache中的一個數據塊的時候,將它后面的數據塊也取出放到I-cache中就可以了,但是存在分支指令,使得不會使用的指令進入了I-cache, 這一方面降低了I-Cache實際可用的容量,一方面占用了可能有用的指令,稱為Cache 污染。為了避免這種情況的發生,我們可以將預取的指令放到一個單獨的緩存中
- 多端口cache
5.1 true multi-port
真的使用一個多端口的SRAM來實現多端口的Cache,SRMA中的每個cell支持兩個讀端口和一個寫端口。缺點是多端口的CELL需要驅動多個讀端口,因此需要更多的訪問時間,功耗也會增大。
5.2 Multiple Cache copies
將SRAM進行復制來實現多端口的讀寫,這樣可以基本消除讀處理周期時間的影響,但是,這種方法浪費面積,并且需要保持兩個CAche的同步,功耗也比較大。
5.3 multi-banking
每個bank都只有一個端口,如果在一個周期之內,CACHE的多個訪問地址位于不同的bank, 則不會發生問題,如果處于同一個bank, 則會引起bank 沖突
2. cache的分類
2.1 virtual cache
-
TLB只是加速了從虛擬地址到物理地址的轉換,但是要直接從物理內存中取數據依然很慢,因此可以用cache將物理地址到數據的轉換過程緩存起來。
-
我們可以直接將虛擬地址和物理存儲中的數據對應起來,這樣就簡化了查找TLB的過程。但是會引入兩個問題,一個是不同的虛擬地址對應同一個物理位置,由于不同的虛擬地址會占用不同的cache line, 因此浪費了寶貴的cache空間,造成cache容量的減少,二是執行store指令時,本質上應該對同一個物理地址的cache line都應該修改。
-
由于虛擬地址和物理地址的低12位(4K)是相等的,因此如果cache的容量小于4K, 那么尋址cache的地址就不會大于12位,此時即使兩個不同的虛擬地址對應一個物理位置,他們尋址cache的地址也會相同。
-
當cached的容量大于頁的大小時,我們需要通過bank結構來解決這種重命名的問題,可以使用L2 CAche來實現這個功能,使L2 cache中包括所有的L1 cache的內容,也就是之前的inclusive的方式
小結
cache的內容較多,涉及到cache pipeline的設計(并行結構,串行結構),cache的大小計算,cache 內部結果的設計(multi-bank, 組相連,全相聯等),對于這些分知識點,后續也需要單獨介紹。