2 存儲器
存儲器是用來進行數據存儲的(指令也是一種數據),按使用類型可分為只讀存儲器ROM(Read Only Memory)和隨機訪問存儲器RAM(Random Access Memory),RAM是其中最為常見的一種形式。
2.1 半導體存儲器
2.1.1 RAM:可讀寫并支持隨機訪問的存儲器
靜態(tài)隨機訪問存儲器(SRAM)
由MOS組成觸發(fā)器實現(xiàn),快速,可保持電平,昂貴,讀寫速度快,所用管子數目多,單個器件容量小,面積大,相同比特下是DRAM面積的幾倍
動態(tài)隨機訪問存儲器(DRAM)
比較慢,不可保持電平,需要刷新,相對廉價,所用管子少,芯片位密度高,存取速度慢。
DRAM采用電容來存儲帶來的問題:
- 充電的效果將在讀取時被消耗,所以必須在讀取后重新充電
- 更糟糕的是,即便不讀,也會有漏電
- 每個單元都必須定期被刷新
解決方案和產生的問題:
DRAM電容容量的trade-off:
- 我們需要大的C以便于它不要太容易泄漏完
- 但是大的C會帶來大的時間常數和延遲
DRAM相較于SRAM的主要優(yōu)缺點
- DRAMs 可以做得很大,lots of bits in the same area
- 但是它們比SRAM慢
2.1.2 存儲器的基本參數
容量——以字節(jié)或比特數表示速度——以訪問時間TA、存儲周期TM或帶寬BM表示
- TA——從接收讀申請到將信息讀出存儲器輸出端的時間
- TM——連續(xù)兩次啟動存儲器訪問所需的最小時間間隔
- BM——單位時間內讀取到或寫入的數據量
, w為數據總線寬度
成本——以每位價格表示
2.2 存儲器層次結構
存儲器的層次結構是依靠存儲器訪問的局部性實現(xiàn)的。現(xiàn)代計算機大多采用寄存器-高速緩存-主存(內存)-輔助存儲器(磁盤)結構
- 目前正在使用的指令或數據或者將要用到指令或數據應該在高速緩存中過一段時間才會用到的
- 指令或數據應該在主存儲器中
- 暫時用不到的程序或數據應該在磁盤中
- 如果大部分訪問都是對高速緩存進行的,那么我們就不大感覺到主存儲器和磁盤的速度慢,好像我們有一個又大又快的存儲器
層次結構存儲系統(tǒng)的性能一般由命中率來衡量
- 命中(hit)——對層次結構存儲系統(tǒng)中的某一級高層存儲器來說,要訪問的數據正好在這一層
- 缺失(miss)——對層次結構存儲系統(tǒng)中的某一級高層存儲器來說,要訪問的數據不在這一層,而在下面的層次
- 追求訪問效率e盡可能接近1
2.3 Cache
容量小,比寄存器慢、比內存快,保存最近操作過的內存數據副本,對于程序員透明的通常與處理器在同一芯片上。
2.3.1 局部性原理
處理器訪問存儲器時,無論取指令還是取數據,所訪問的存儲單元都趨向于聚集在一個較小的連續(xù)單元區(qū)域中。
時間局部性 (如循環(huán)語句)——如果一個位置被訪問,很有可能馬上再次被訪問
空間局部性 (如程序順序執(zhí)行、數組順序訪問)——地址相近的一些單元在最近也將被訪問
2.3.2 Cache結構
Cache 由 Cache 存儲體、地址映象與變換機構、 Cache 替換機構幾大模塊組成。以行( Cache Line )為單位進行存儲的,一個緩存行對應主存的一個數據塊。N個行,每行K字節(jié)數據。通過標簽來知道這一行存的是內存中哪一段地址對應的數據。有效位用于確定 Cache 行是否含有有效地址。平均訪問時間= tc+(1 - H)tm。
統(tǒng)一結構 ——指令和數據用同一個Cache,根據當前程序的需要自動調整指令在Cache中的比例,能夠獲得比固定劃分更好的性能
哈佛結構 ——指令和數據采用分開的兩組Cache,使load/store指令能夠單周期執(zhí)行
2.3.3 Cache地址映象與變換
全相聯(lián)
主存中的每一塊能夠裝入到 Cache 中的任意一行中 ,數據在主存中的地址由“主存塊號”和“主存的塊內地址”兩部分組成?!爸鞔娴膲K內地址”位寬與一個 Cache Line 的位寬相同,地址中剩余位寬為“主存塊號”在 Cache 中被當作“標簽”存儲下來。當 CPU 訪問某一地址的數據項時,該地址的主存塊號將與 Cache 內所有行的標記相比較,若無有相同項,則不命中,若有相同項,則檢查該行的有效位是否為 1 ,若有效則命中,同時根據塊內地址讀出行內對應地址的數據,若無效則不命中。對于 Cache 不命中的情況,則需訪問主存以讀取相應數據。
需要并行的搜索匹配標簽方法(相聯(lián)搜索比較所有標記)、電路復雜;命中率較高 、Cache 的空間利用率較高 。
直接映像
主存中的每一塊只能裝入到 Cache 中唯一的特定行中,Cache行號 ==(主存塊號 mod Cache 的行數),主存地址中中間幾位即為 Cache 行號。訪問某一地址的數據時,只需檢查對應 Cache 行號所存儲的標記是否與當前地址的主存標簽一致,若一致且該 Cache Line 有效,則命中,否則不命中。
搜索匹配標簽方法相對簡單、電路易于設計;命中率低、 Cache 的空間利用率也低。
組相聯(lián)
每個塊可以存放在 Cache 中的 n(≥ 2) 個固定的位置上,稱為 n 路組相聯(lián)映像 。這有相互關聯(lián)的 n 行被稱為 1 組 Set。組間直接映像,組內全相聯(lián)映像 。訪問某一地址的數據時,只需并行檢查該組內對應Cache 行號所存儲的標記是否有與當前地址的主存標簽一致的標記,若有且該 Cache Line 有效,則命中,否則不命中。
直接映像 1 路組相聯(lián) ,全相聯(lián)N 路組相聯(lián),優(yōu)缺點介于全相聯(lián)和直接映像之間 。
2.3.4 Cache數據替換與更新
數據替換是指緩存中沒有合適的空余位置,必須將已有的緩存行從緩存中清除,代之以新的緩存行的過程。
數據更新是指寫操作將已有緩存行中數據更新為新值的過程。
數據替換
隨機法 ——從所有緩存行中隨機挑選一個替換掉。實現(xiàn)簡單,不需要存儲關于緩存行的任何信息。
先進先出 (FIFO)——選擇最先放入緩存中的行進行替換。
最近最少使用 ( LRU )——選擇所有緩存行中距離上次被訪問時間最久的行進行替換。
后兩種方法較為高效,需要記錄各緩存行被放入或訪問的時間等信息。
數據更新
寫通過 (Write-Through)——在寫入時同時訪問緩存和主存,寫入時間是訪問主存時間(慢)。設計簡單,不需要記錄額外的信息,緩存與主存始終一致,不需要維護一致性,替換時無需將調出的塊寫回主存;每次訪問需要的時間長。
一種緩解機制是使用 帶緩沖區(qū)的寫通過 ,在寫入主存時通過一個很快的緩沖區(qū),當緩沖區(qū)未滿的時候就不需要等待主存完成寫入。所有寫操作仍然直接對主存操作,但數據不是直接寫入主存,而是將要寫的地址及數據保存到可以高速接收寫信息的寫緩沖器中。使用緩沖區(qū)可以一次寫入大量的數據,在此后一段時間內慢慢地將數據寫回內存。但同時,由于緩沖區(qū)內容與主存不一致,在讀操作前,需要確認被讀取的內容是否在緩沖區(qū)內。
寫回 (Write-Back)——在寫入時只訪問緩存,當被修改過的緩存行被替換掉時才寫回主存。需要為緩存行維護一個臟( dirty )位,并在寫回時訪問主存,以此保證緩存中數據與主存的一致性。緩存行由于讀取而被存入緩存中時,臟位是 0 ,表示緩存內容與主存一致;當緩存行被寫入或由于寫入操作存入緩存中時,臟位是 1 ,表示緩存內容與主存不一致,如果該行被替換,必須將數據寫回主存。在被替換之前,臟的緩存行可以直接讀取、寫入,而不需要訪問主存。
2.3.5 Cache缺失
引起cache 缺失的原因有三種:強制(compulsory )缺失,容量 capacity )缺失和沖突(conflict )缺失 3C。關聯(lián)度越高,沖突失效就越少;強迫性失效和容量失效不受相聯(lián)度的影響;強迫性失效不受Cache容量的影響,但容量失效卻隨著容量的增加而減少。
強制缺失
由于某段數據從未被訪問過而不得不產生的缺失。強制缺失只在首次訪問某段數據時產生,無法避免。增大塊大小可以在一定程度上緩解強制缺失,但會使得缺失損失增大。
-
增加塊尺寸
-
對指令cache非常有用的辦法
-
弊端
l 如果不命中, 損失變大l 更大的塊尺寸意味著可能更多的沒有必要的事先讀入的數據
l 如果塊尺寸太大,會造成更多的沖突性缺失
容量缺失
由于 cache 容量有限導致的缺失。當 cache 被完全占滿而必須進行數據替換時即發(fā)生容量缺失。無窮大的(理想) cache 不會發(fā)生容量缺失。增加 cache 容量可以降低容量缺失。
-
增加Cache容量
-
弊端
l 大的Cache導致命中時間增加
沖突缺失
由于 cache 相聯(lián)性不足而導致的缺失。當 cache 沒被占滿,但是由于相聯(lián)性不夠,導致必須發(fā)生數據替換時即為沖突缺失。全相聯(lián) cache 不會發(fā)生沖突缺失。對于沖突缺失,增加相聯(lián)性可以降低沖突缺失,因為增加相聯(lián)性就是增加了緩存行可以存放的位置數目,使得沖突可能性降低。增加 cache 中的塊數也可以降低沖突缺失,因為這樣一來相聯(lián)性劃分得更細,原來的塊 訪問將映像到不同的組 ,降低了沖突的可能。
-
增加相聯(lián)性
-
一個全相聯(lián)的Cache將沒有沖突引起的缺失
-
但是
l 更多的相聯(lián)意味著更復雜的硬件l 更長的訪問延遲
2.4 Cache性能評估
2.4.1 性能方程
其中第一項與硬件無關,第三項只與時鐘頻率有關,Cache 所影響的只有第二項 CPI 。在引入 Cache 之前,我們給出了各種指令所需要的執(zhí)行周期數,對于訪存指令,我們認為所有的訪存時間都相同,這實際上假定了所有訪存指令都 Cache 命中。存儲器停頓時鐘周期數可以分為讀、 寫操作引起的停頓。
2.4.2 多級Cache
L1 Cache致力于減少命中時間,以獲得較短的時鐘周期;L2 Cache致力于降低缺失率,以減少訪問主存的缺失損失。
評論