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