分層存儲體系結構


為什么需要分層存儲?因為我們想要存儲又大又快,但是只用一層存儲無法達到目的,所以我們采用多層存儲讓那些越大越慢的數據距離處理器遠一些,並確保處理器需要的大多數數據存儲在更快的層中。

分層存儲的基本原則

局部性原理

最近使用的代碼或者數據很有可能在不久的將來繼續用到。

局部性原理分為:時間局部性、空間局部性。

一個程序可能在其生命周期中引用不同的內存位置,但不是在同一時間。

避免重復運算

如果計算某個東西計算代價很高,那么可以記住一會兒答案,以防不久之后又需要它。

需要局部性的支持。如果缺乏局部性,會存儲大量不同的數據,同時很可能查詢大量數據的開銷會大於重新計算的開銷。

成本均攤

如果成本可以平攤到多個單元上,那么理論上可以承受較大的成本開銷。

Cache理論基礎

原理

時間局部性:這個數據馬上就會被再次訪問,所以把這個數據放到一個可以快速訪問的內存中。
空間局部性:這個數據周圍的數據馬上也會被訪問,所以把這個數據附近的所有數據(block)放到可以快速訪問的內存中。

流水線中的Cache

我們希望cache的存取盡可能快,而在高頻的流水線中,每個流水段的時間其實也是很快的,那么為了使cache盡可能大並且可以滿足流水線的高頻訪問,所以對cache進行分層處理。目前的處理器都存在着多級的cache(L1,L2 cache等)。

那么誰來管理分層數據遷移?早期的是由程序員來管理的,而現在絕大多數情況是硬件來做的,所以對程序員來說是透明的,但是如果我們能在寫代碼的時候利用一些硬件的性質,就可以讓我們的程序跑得更快。

其中管理cache的硬件就是我們說的內存管理單元(MMU)。

分層的延遲分析

假設一個給定的存儲層次\(i\),它技術上固有的訪問時間是\(t_i\),我們感受到的訪問時間是\(T_i,(T_i>t_i)\)

除了最外層,最外層中包含着數據的源地址,而其他層中都是這些數據的某些拷貝。當訪問一個固定地址時,可能命中也可能缺失,那么:

如果命中(命中率是\(h\%\)),訪問時間是\(t_i\)
如果缺失,訪問時間是\(t_i+T_{i+1}\)\(T_{i+1}\)表示下一層感知到的訪問時間。

因此

\[T_i = h_i*t_i+(1-h_i)*(t_i+T_{i+1})=t_i+(1-h_i)*T_{i+1} \]

因此我們希望\((1-h_i)*T_{i+1}\)盡可能的低,所以我們可以降低缺失率,或者減少下一層的感知訪問時間。

對於降低缺失率,我們可以增加cache的容量,但是這會使得\(t_i\)增加;還可以通過更好的管理降低缺失率,比如更好的替換策略以及更好的預取策略。

對於減少下一層的感知訪問時間,可以從材料上使下一層訪問更快,但是這會使成本增加;或者引入中間層做出折中。

這里看一個Intel Pentium 4的例子:

可以看到減少缺失率帶來的收益是非常顯著的。

關於Cache的詳細內容,且聽下回分解hhh


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM