syslog 向内存中缓存_漫谈缓存(Cache)、大规模芯片系统的存储层次结构优化以及开源仿真工具ZSim...
這次的話題將從緩存開(kāi)始,以一種易于理解的方式向大家呈現(xiàn)緩存的基本概念,然后拓展至大規(guī)模芯片系統(tǒng)的非均一訪問(wèn)延時(shí)的緩存訪問(wèn)問(wèn)題,最后簡(jiǎn)要介紹一種緩存仿真工具——ZSim。
緩存的概念
處理器和內(nèi)存之間存在巨大的速度差距。
處理器可以稱得上是整個(gè)計(jì)算系統(tǒng)中最勤勞的成員:它的終生目標(biāo)就是每個(gè)周期不停地取指令、解決依賴、計(jì)算、存取數(shù)據(jù)。然而,當(dāng)處理器伸手向內(nèi)存索取數(shù)據(jù)時(shí),內(nèi)存卻需要讓它等待上百個(gè)周期。巧婦難為無(wú)米之炊,在等待內(nèi)存返回?cái)?shù)據(jù)之前,處理器只能干等著,或者嘗試完成其他的計(jì)算(亂序執(zhí)行處理器)。
毫無(wú)疑問(wèn)的是,如果每次處理器訪問(wèn)內(nèi)存均需等待上百個(gè)周期,那這處理器的最終表現(xiàn)也好不到哪去了。為了“喂飽”處理器的數(shù)據(jù)需求,架構(gòu)師們向處理器中添加了緩存結(jié)構(gòu)。
緩存(Cache)是利用處理器訪問(wèn)內(nèi)存的局部性而設(shè)計(jì)的硬件結(jié)構(gòu),緩存的基石是概率,緩存比內(nèi)存小得多,多采用SRAM。一般地,處理器訪問(wèn)地址會(huì)有以下規(guī)律:時(shí)間局部性,即訪問(wèn)了該地址之后,還有較大可能會(huì)訪問(wèn)該地址;空間局部性,即訪問(wèn)了該地址之后,還有較大可能會(huì)訪問(wèn)相鄰地址。緩存的終極目標(biāo)是盡可能把處理器將要訪問(wèn)的所有內(nèi)存地址上的數(shù)據(jù)都準(zhǔn)備好:一旦處理器需要這些數(shù)據(jù),緩存可以在幾個(gè)周期內(nèi)就將數(shù)據(jù)雙手奉上,也就是緩存命中。如果處理器需要的數(shù)據(jù)不在緩存中,就會(huì)發(fā)生緩存缺失。
用一個(gè)形象的比喻:小明想在家里看書(shū)。當(dāng)他想閱讀某系列的某一本書(shū)時(shí),需要從一千米遠(yuǎn)的圖書(shū)館找到該書(shū),然后拿著書(shū)回到家并開(kāi)始閱讀。于是每次他都要去圖書(shū)館拿書(shū),閱讀后返回圖書(shū)館,將書(shū)放回,還要加上二千米的路程。如此操作實(shí)再太過(guò)麻煩,以至于小明終于想到了一個(gè)辦法:每次取書(shū)都抱著整個(gè)系列的書(shū)回家,把多余的書(shū)放在自己的書(shū)柜上,拿起一本并開(kāi)始閱讀。假設(shè)圖書(shū)館沒(méi)有借書(shū)限制。
在這個(gè)比喻中,小明好比處理器,小明的書(shū)柜充當(dāng)著緩存的角色,而圖書(shū)館就算內(nèi)存了。書(shū)柜中放著整個(gè)系列的書(shū),是因?yàn)樾∶髟谧x完當(dāng)前這一本后,還有很大的可能讀系列中其余幾本(空間局部性);小明讀完當(dāng)前這一本后,還有很大的可能還要再回顧這一本書(shū)(時(shí)間局部性)。而一旦小明能夠在自己的書(shū)柜上拿到接下來(lái)要讀的書(shū),就無(wú)需再到圖書(shū)館去取(緩存命中),節(jié)省了時(shí)間;而小明讀完了整個(gè)系列的書(shū),想要讀其他系列的書(shū),就無(wú)法從書(shū)柜上獲得(緩存缺失),于是還要前往圖書(shū)館。
回到緩存本身。緩存中保存的數(shù)據(jù)實(shí)際是所有內(nèi)存數(shù)據(jù)的一個(gè)子集。這個(gè)子集的厲害之處在于經(jīng)常能覆蓋處理器所需要訪問(wèn)的地址。為了使這個(gè)子集能夠生效,緩存還需要做到以下幾點(diǎn):
對(duì)以上第三點(diǎn)作一個(gè)說(shuō)明。還是小明,如果他想閱讀的書(shū)的系列或者種類發(fā)生了變化,就還是必須去圖書(shū)館取書(shū),而不是從書(shū)架上找。
正如從書(shū)柜上取書(shū)很快一樣,緩存的快速正是因?yàn)榫彺姹葍?nèi)存小得多,譯碼電路簡(jiǎn)單;此外,緩存所采用的SRAM本身的速度也遠(yuǎn)遠(yuǎn)快于內(nèi)存常使用的DRAM。如果小明的書(shū)柜與圖書(shū)館一樣大,那找本書(shū)估計(jì)也會(huì)相當(dāng)費(fèi)時(shí)。但是緩存的小容量同樣也容易導(dǎo)致緩存缺失。增大緩存會(huì)增加緩存命中延時(shí),但有助于減少緩存缺失,因而形成了一個(gè)折中問(wèn)題:要保證命中延時(shí)不太大的同時(shí),緩存缺失的頻率也可以接受。該折中問(wèn)題常常受處理器周期長(zhǎng)度的影響。
有一天,小明覺(jué)得自己的書(shū)柜太小,以至于他還是要經(jīng)常跑圖書(shū)館。聰明的小明在自家的倉(cāng)庫(kù)里又放了一個(gè)大書(shū)柜。當(dāng)小明無(wú)法在自己的書(shū)柜上找到想要的書(shū)時(shí),他會(huì)去倉(cāng)庫(kù)的書(shū)柜中尋找。如此,小明去圖書(shū)館的次數(shù)更少了。
這就形成兩級(jí)緩存:小明的書(shū)柜是一級(jí)緩存,而倉(cāng)庫(kù)里的大書(shū)柜是二級(jí)緩存。一般地,從最靠近處理器流水線的緩存開(kāi)始,每一級(jí)的緩存都依次增大,命中延時(shí)也相應(yīng)增加。在當(dāng)前緩存中發(fā)生了緩存缺失的地址,有可能在下一級(jí)緩存發(fā)生緩存命中,就能避免造訪內(nèi)存。
對(duì)于大規(guī)模芯片系統(tǒng),緩存結(jié)構(gòu)需要解決什么問(wèn)題?
在大規(guī)模芯片系統(tǒng)(核心數(shù)量巨大)的情況下,為了提高緩存的利用率,通常多個(gè)核心會(huì)共享最外層緩存。核心的增多,使得共享的緩存不斷增大,以至于該級(jí)緩存命中延時(shí)太高、功耗明顯增加,使得該級(jí)緩存失去了意義。
以上所述的情況,緩存均為一整塊,而訪問(wèn)緩存中的某個(gè)數(shù)據(jù),發(fā)生緩存命中時(shí)均造成固定的延時(shí)。因此這種鐵板一塊的緩存也被稱為均一訪問(wèn)延時(shí)(Uniform Cache Access, UCA)的緩存。
為了降低這個(gè)臃腫的最外層共享緩存的命中延時(shí),架構(gòu)師們將它掰成多塊,每個(gè)處理器核心附近都放一塊。處理器核心和它的私有緩存和一部分的共享緩存形成了一個(gè)可以重復(fù)的單元,就好像整齊平鋪的瓦片(Tile)一樣。一個(gè)片上網(wǎng)絡(luò)連接這些不同的瓦片,實(shí)現(xiàn)消息互通。因?yàn)槠暇W(wǎng)絡(luò)帶來(lái)的不確定延時(shí),緩存的這種組織方式稱為非均一訪問(wèn)延時(shí)(Non-Uniform Cache Access,NUCA)。具體表現(xiàn)在:在發(fā)生緩存命中時(shí),某核心訪問(wèn)它本地的這部分共享緩存,與訪問(wèn)其它核心擁有的共享緩存的延時(shí)不同;某核心訪問(wèn)與它較接近的共享緩存,與訪問(wèn)與它較遠(yuǎn)的共享緩存的延時(shí)不同。
既然NUCA擁有一個(gè)分布式的最外側(cè)緩存,如何將地址映射到這些可重復(fù)的單元(Tile)上,是一個(gè)問(wèn)題。經(jīng)典的做法是將數(shù)據(jù)以地址交錯(cuò)(Address-Interleaved)的形式,依次落到不同核心所在的Tile。
此例中,對(duì)于特定的地址,NUCA只會(huì)將其映射到一個(gè)邏輯上確定的Tile上,因而稱為靜態(tài)(Static)NUCA。既然有靜態(tài)NUCA那就必然有動(dòng)態(tài)(Dynamic)NUCA——基本思路是打破地址與Tile的確定關(guān)系,“動(dòng)態(tài)”體現(xiàn)在要依靠程序運(yùn)行期間被緩存收集的信息來(lái)完成地址到Tile的映射。動(dòng)態(tài)NUCA,以引入一層額外邏輯的代價(jià),以優(yōu)化地址映射的形式,達(dá)到減少NUCA訪問(wèn)延時(shí)的目的。動(dòng)態(tài)NUCA的具體實(shí)現(xiàn)方式千差萬(wàn)別,有興趣的小伙伴可以尋找一些相關(guān)文獻(xiàn)深入研究。緩存一致性(Cache Coherency)在多/眾核的情形下,也是一個(gè)需要額外注意的問(wèn)題,但此處篇幅所限,暫且留作日后討論。
緩存仿真工具——ZSim
大規(guī)模芯片系統(tǒng)的開(kāi)發(fā)周期很長(zhǎng),我們不能等到整個(gè)系統(tǒng)的電路都確定之后,再回過(guò)頭去修改并優(yōu)化緩存的層次。也就是說(shuō),我們需要一個(gè)方法能夠快速得到某個(gè)多/眾核系統(tǒng)的大致性能表現(xiàn)。在這種需求的推動(dòng)下,Daniel Sanchez在斯坦福大學(xué)開(kāi)發(fā)了ZSim,用于快速實(shí)現(xiàn)大型異構(gòu)芯片的架構(gòu)探索和設(shè)計(jì)[1]。之后,ZSim又陸續(xù)經(jīng)過(guò)幾次功能增強(qiáng)。ZSim以一種垂直的方式對(duì)多級(jí)緩存構(gòu)成的存儲(chǔ)器層次結(jié)構(gòu)建模,每級(jí)緩存之間均以父子關(guān)系相互指向,因而能用于多核甚至眾核情形下的仿真。
現(xiàn)在,ZSim是一個(gè)開(kāi)源的,基于Pin的x86緩存仿真工具,它的優(yōu)勢(shì)有:
筆者從ZSim提供的Vagrant file中總結(jié)了搭建方法:
系統(tǒng)要求:Ubuntu 12(理論上其他Ubuntu系統(tǒng)也可,但Ubuntu12搭建不容易出錯(cuò))
export DEBIAN_FRONTEND=noninteractive apt-get -y update apt-get -y dist-upgrade安裝依賴
apt-get -y install build-essential g++ git scons apt-get -y install libelfg0-dev libhdf5-serial-dev libconfig++-dev apt-get -y install gfortran openjdk-7-jdk安裝vim
apt-get -y install vim安裝pin
sudo wget http://software.intel.com/sites/landingpage/pintool/downloads/pin-2.14-71313-gcc.4.4.7-linux.tar.gz sudo tar xzf pin-2.14-71313-gcc.4.4.7-linux.tar.gz echo "export PINPATH=~/pin-2.14-71313-gcc.4.4.7-linux" >> ~YOUR_USERNAME/.bashrc注意pin的版本,以及設(shè)置環(huán)境變量時(shí)你的用戶名
設(shè)置Linux內(nèi)存參數(shù),以及進(jìn)程監(jiān)視權(quán)限
sysctl -w kernel.shmmax=1073741824 sysctl -w kernel.yama.ptrace_scope=0安裝ZSim
git clone https://github.com/s5z/zsim.git cd zsim scons -jN運(yùn)行例程
./build/opt/zsim tests/simple.cfgZSim將打印出一個(gè)out.cfg文件,其中記載了仿真的系統(tǒng)的詳細(xì)配置情況。同時(shí)ZSim也提供HDF5格式的輸出,供數(shù)據(jù)處理之用。
注意安裝ZSim時(shí)要保證gcc版本至少為4.6。篇幅所限,更詳細(xì)的配置和運(yùn)行指導(dǎo)請(qǐng)參閱ZSim目錄的md文件。此外,要設(shè)計(jì)額外的緩存模型需要先閱讀源碼。幾句話送給準(zhǔn)備閱讀ZSim源碼(C++)的小伙伴們:
本篇小結(jié)
緩存的設(shè)計(jì),與內(nèi)存、地址翻譯等問(wèn)題交雜在一起,形成體系結(jié)構(gòu)中一塊很大的領(lǐng)域——存儲(chǔ)器層次結(jié)構(gòu)。通過(guò)閱讀本篇文章,小伙伴們應(yīng)該對(duì)緩存的存在意義和基本工作原理有了一定的認(rèn)識(shí)。然而,正如某位大牛說(shuō)的,"The devil is in the details.",緩存的狀態(tài)更新并不是原子的,因而需要面臨過(guò)渡態(tài)和冒險(xiǎn)等等實(shí)際問(wèn)題。所以還是那句話:千里之行,始于足下。
參考
總結(jié)
以上是生活随笔為你收集整理的syslog 向内存中缓存_漫谈缓存(Cache)、大规模芯片系统的存储层次结构优化以及开源仿真工具ZSim...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 心电图前波过多_心电图写着:T波倒置,就
- 下一篇: #模拟触手机屏幕_从操作系统的改变谈手机