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