|
英文原文:,翻譯:開(kāi)源中國(guó) [編輯的話(huà): Ulrich Drepper最近問(wèn)我們,是不是有興趣發(fā)表一篇他寫(xiě)的內(nèi)存方面的長(zhǎng)文。我們不用看太多就已經(jīng)知道,LWN的讀者們會(huì)喜歡這篇文章的。內(nèi)存的使用常常是軟件性能的決定性因子,而如何避免內(nèi)存瓶頸的好文章卻不好找。這篇文章應(yīng)該會(huì)有所幫助。 他的原文很長(zhǎng),超過(guò)100頁(yè)。我們把它分成了7篇,每隔一到兩周發(fā)表一篇。7篇發(fā)完后,Ulrich會(huì)把全文發(fā)出來(lái)。 對(duì)原文重新格式化是個(gè)很有挑戰(zhàn)性的工作,但愿結(jié)果會(huì)不錯(cuò)吧。為了便于網(wǎng)上閱讀,我們把Ulrich的腳注{放在了文章里},而互相引用的超鏈接(和[參考書(shū)目])要等到全文出來(lái)才能提供。 非常感謝Ultich,感謝他讓LWN發(fā)表這篇文章,期待大家在不久的將來(lái)都能寫(xiě)出內(nèi)存優(yōu)化很棒的軟件。 1 概述 早期,計(jì)算機(jī)曾經(jīng)很簡(jiǎn)單。它的各種組件,比如CPU、內(nèi)存、大容量存儲(chǔ)和網(wǎng)絡(luò)接口,都是一起開(kāi)發(fā)的,所以性能差不多。舉個(gè)例子來(lái)說(shuō),內(nèi)存和網(wǎng)絡(luò)接口提供數(shù)據(jù)的速度不會(huì)比CPU快多少。 這種情況隨著計(jì)算機(jī)構(gòu)造的固化和各子系統(tǒng)的優(yōu)化慢慢地發(fā)生了改變。其中一些組件的性能開(kāi)始落后,成為系統(tǒng)的瓶頸。特別是大容量存儲(chǔ)和內(nèi)存子系統(tǒng),由于代價(jià)的原因,它們的發(fā)展嚴(yán)重滯后了。 大容量存儲(chǔ)的性能問(wèn)題往往靠軟件來(lái)改善: 操作系統(tǒng)將常用(且最有可能被用)的數(shù)據(jù)放在主存中,因?yàn)楹笳叩乃俣纫焐蠋讉€(gè)數(shù)量級(jí)?;蛘邔⒕彺婕尤氪鎯?chǔ)設(shè)備中,這樣就可以在不修改操作系統(tǒng)的前提下提升性能。{然而,為了在使用緩存時(shí)保證數(shù)據(jù)的完整性,仍然要作出一些修改。}這些內(nèi)容不在本文的談?wù)摲秶畠?nèi),就不作贅述了。 而解決內(nèi)存的瓶頸更為困難,它與大容量存儲(chǔ)不同,幾乎每種方案都需要對(duì)硬件作出修改。目前,這些變更主要有以下這些方式:
本文主要關(guān)心的是CPU緩存和內(nèi)存控制器的設(shè)計(jì)。在討論這些主題的過(guò)程中,我們還會(huì)研究DMA。不過(guò),我們首先會(huì)從當(dāng)今商用硬件的設(shè)計(jì)談起。這有助于我們理解目前在使用內(nèi)存子系統(tǒng)時(shí)可能遇到的問(wèn)題和限制。我們還會(huì)詳細(xì)介紹RAM的分類(lèi),說(shuō)明為什么會(huì)存在這么多不同類(lèi)型的內(nèi)存。 本文不會(huì)包括所有內(nèi)容,也不會(huì)包括最終性質(zhì)的內(nèi)容。我們的討論范圍僅止于商用硬件,而且只限于其中的一小部分。另外,本文中的許多論題,我們只會(huì)點(diǎn)到為止,以達(dá)到本文目標(biāo)為標(biāo)準(zhǔn)。對(duì)于這些論題,大家可以閱讀其它文檔,獲得更詳細(xì)的說(shuō)明。 當(dāng)本文提到操作系統(tǒng)特定的細(xì)節(jié)和解決方案時(shí),針對(duì)的都是Linux。無(wú)論何時(shí)都不會(huì)包含別的操作系統(tǒng)的任何信息,作者無(wú)意討論其他操作系統(tǒng)的情況。如果讀者認(rèn)為他/她不得不使用別的操作系統(tǒng),那么必須去要求供應(yīng)商提供其操作系統(tǒng)類(lèi)似于本文的文檔。 在開(kāi)始之前最后的一點(diǎn)說(shuō)明,本文包含大量出現(xiàn)的術(shù)語(yǔ)“經(jīng)?!焙蛣e的類(lèi)似的限定詞。這里討論的技術(shù)在現(xiàn)實(shí)中存在于很多不同的實(shí)現(xiàn),所以本文只闡述使用得最廣泛最主流的版本。在闡述中很少有地方能用到絕對(duì)的限定詞。 1.1文檔結(jié)構(gòu) 這個(gè)文檔主要視為軟件開(kāi)發(fā)者而寫(xiě)的。本文不會(huì)涉及太多硬件細(xì)節(jié),所以喜歡硬件的讀者也許不會(huì)覺(jué)得有用。但是在我們討論一些有用的細(xì)節(jié)之前,我們先要描述足夠多的背景。 在這個(gè)基礎(chǔ)上,本文的第二部分將描述RAM(隨機(jī)寄存器)。懂得這個(gè)部分的內(nèi)容很好,但是此部分的內(nèi)容并不是懂得其后內(nèi)容必須部分。我們會(huì)在之后引用不少之前的部分,所以心急的讀者可以跳過(guò)任何章節(jié)來(lái)讀他們認(rèn)為有用的部分。 第三部分會(huì)談到不少關(guān)于CPU緩存行為模式的內(nèi)容。我們會(huì)列出一些圖標(biāo),這樣你們不至于覺(jué)得太枯燥。第三部分對(duì)于理解整個(gè)文章非常重要。第四部分將簡(jiǎn)短的描述虛擬內(nèi)存是怎么被實(shí)現(xiàn)的。這也是你們需要理解全文其他部分的背景知識(shí)之一。 第五部分會(huì)提到許多關(guān)于Non Uniform Memory Access (NUMA)系統(tǒng)。 第六部分是本文的中心部分。在這個(gè)部分里面,我們將回顧其他許多部分中的信息,并且我們將給閱讀本文的程序員許多在各種情況下的編程建議。如果你真的很心急,那么你可以直接閱讀第六部分,并且我們建議你在必要的時(shí)候回到之前的章節(jié)回顧一下必要的背景知識(shí)。 本文的第七部分將介紹一些能夠幫助程序員更好的完成任務(wù)的工具。即便在徹底理解了某一項(xiàng)技術(shù)的情況下,距離徹底理解在非測(cè)試環(huán)境下的程序還是很遙遠(yuǎn)的。我們需要借助一些工具。 第八部分,我們將展望一些在未來(lái)我們可能認(rèn)為好用的科技。 1.2 反饋問(wèn)題 作者會(huì)不定期更新本文檔。這些更新既包括伴隨技術(shù)進(jìn)步而來(lái)的更新也包含更改錯(cuò)誤。非常歡迎有志于反饋問(wèn)題的讀者發(fā)送電子郵件。 1.3 致謝 我首先需要感謝Johnray Fuller尤其是Jonathan Corbet,感謝他們將作者的英語(yǔ)轉(zhuǎn)化成為更為規(guī)范的形式。Markus Armbruster提供大量本文中對(duì)于問(wèn)題和縮寫(xiě)有價(jià)值的建議。 1.4 關(guān)于本文 本文題目對(duì)David Goldberg的經(jīng)典文獻(xiàn)《What Every Computer Scientist Should Know About Floating-Point Arithmetic》[goldberg]表示致敬。Goldberg的論文雖然不普及,但是對(duì)于任何有志于嚴(yán)格編程的人都會(huì)是一個(gè)先決條件。 2 商用硬件現(xiàn)狀 鑒于目前專(zhuān)業(yè)硬件正在逐漸淡出,理解商用硬件的現(xiàn)狀變得十分重要。現(xiàn)如今,人們更多的采用水平擴(kuò)展,也就是說(shuō),用大量小型、互聯(lián)的商用計(jì)算機(jī)代替巨大、超快(但超貴)的系統(tǒng)。原因在于,快速而廉價(jià)的網(wǎng)絡(luò)硬件已經(jīng)崛起。那些大型的專(zhuān)用系統(tǒng)仍然有一席之地,但已被商用硬件后來(lái)居上。2007年,Red Hat認(rèn)為,未來(lái)構(gòu)成數(shù)據(jù)中心的“積木”將會(huì)是擁有最多4個(gè)插槽的計(jì)算機(jī),每個(gè)插槽插入一個(gè)四核CPU,這些CPU都是超線(xiàn)程的。{超線(xiàn)程使單個(gè)處理器核心能同時(shí)處理兩個(gè)以上的任務(wù),只需加入一點(diǎn)點(diǎn)額外硬件}。也就是說(shuō),這些數(shù)據(jù)中心中的標(biāo)準(zhǔn)系統(tǒng)擁有最多64個(gè)虛擬處理器。當(dāng)然可以支持更大的系統(tǒng),但人們認(rèn)為4插槽、4核CPU是最佳配置,絕大多數(shù)的優(yōu)化都針對(duì)這樣的配置。在不同商用計(jì)算機(jī)之間,也存在著巨大的差異。不過(guò),我們關(guān)注在主要的差異上,可以涵蓋到超過(guò)90%以上的硬件。需要注意的是,這些技術(shù)上的細(xì)節(jié)往往日新月異,變化極快,因此大家在閱讀的時(shí)候也需要注意本文的寫(xiě)作時(shí)間。這么多年來(lái),個(gè)人計(jì)算機(jī)和小型服務(wù)器被標(biāo)準(zhǔn)化到了一個(gè)芯片組上,它由兩部分組成: 北橋和南橋,見(jiàn)圖2.1。
CPU通過(guò)一條通用總線(xiàn)(前端總線(xiàn),F(xiàn)SB)連接到北橋。北橋主要包括內(nèi)存控制器和其它一些組件,內(nèi)存控制器決定了RAM芯片的類(lèi)型。不同的類(lèi)型,包括DRAM、Rambus和SDRAM等等,要求不同的內(nèi)存控制器。為了連通其它系統(tǒng)設(shè)備,北橋需要與南橋通信。南橋又叫I/O橋,通過(guò)多條不同總線(xiàn)與設(shè)備們通信。目前,比較重要的總線(xiàn)有PCI、PCI Express、SATA和USB總線(xiàn),除此以外,南橋還支持PATA、IEEE 1394、串行口和并行口等。比較老的系統(tǒng)上有連接北橋的AGP槽。那是由于南北橋間缺乏高速連接而采取的措施?,F(xiàn)在的PCI-E都是直接連到南橋的。這種結(jié)構(gòu)有一些需要注意的地方:
上面這種設(shè)計(jì)中,瓶頸馬上出現(xiàn)了。第一個(gè)瓶頸與設(shè)備對(duì)RAM的訪(fǎng)問(wèn)有關(guān)。早期,所有設(shè)備之間的通信都需要經(jīng)過(guò)CPU,結(jié)果嚴(yán)重影響了整個(gè)系統(tǒng)的性能。為了解決這個(gè)問(wèn)題,有些設(shè)備加入了直接內(nèi)存訪(fǎng)問(wèn)(DMA)的能力。DMA允許設(shè)備在北橋的幫助下,無(wú)需CPU的干涉,直接讀寫(xiě)RAM。到了今天,所有高性能的設(shè)備都可以使用DMA。雖然DMA大大降低了CPU的負(fù)擔(dān),卻占用了北橋的帶寬,與CPU形成了爭(zhēng)用。 第二個(gè)瓶頸來(lái)自北橋與RAM間的總線(xiàn)。總線(xiàn)的具體情況與內(nèi)存的類(lèi)型有關(guān)。在早期的系統(tǒng)上,只有一條總線(xiàn),因此不能實(shí)現(xiàn)并行訪(fǎng)問(wèn)。近期的RAM需要兩條獨(dú)立總線(xiàn)(或者說(shuō)通道,DDR2就是這么叫的,見(jiàn)圖2.8),可以實(shí)現(xiàn)帶寬加倍。北橋?qū)?nèi)存訪(fǎng)問(wèn)交錯(cuò)地分配到兩個(gè)通道上。更新的內(nèi)存技術(shù)(如FB-DRAM)甚至加入了更多的通道。由于帶寬有限,我們需要以一種使延遲最小化的方式來(lái)對(duì)內(nèi)存訪(fǎng)問(wèn)進(jìn)行調(diào)度。我們將會(huì)看到,處理器的速度比內(nèi)存要快得多,需要等待內(nèi)存。如果有多個(gè)超線(xiàn)程核心或CPU同時(shí)訪(fǎng)問(wèn)內(nèi)存,等待時(shí)間則會(huì)更長(zhǎng)。對(duì)于DMA也是同樣。除了并發(fā)以外,訪(fǎng)問(wèn)模式也會(huì)極大地影響內(nèi)存子系統(tǒng)、特別是多通道內(nèi)存子系統(tǒng)的性能。關(guān)于訪(fǎng)問(wèn)模式,可參見(jiàn)2.2節(jié)。在一些比較昂貴的系統(tǒng)上,北橋自己不含內(nèi)存控制器,而是連接到外部的多個(gè)內(nèi)存控制器上(在下例中,共有4個(gè))。
這種架構(gòu)的好處在于,多條內(nèi)存總線(xiàn)的存在,使得總帶寬也隨之增加了。而且也可以支持更多的內(nèi)存。通過(guò)同時(shí)訪(fǎng)問(wèn)不同內(nèi)存區(qū),還可以降低延時(shí)。對(duì)于像圖2.2中這種多處理器直連北橋的設(shè)計(jì)來(lái)說(shuō),尤其有效。而這種架構(gòu)的局限在于北橋的內(nèi)部帶寬,非常巨大(來(lái)自Intel)。{出于完整性的考慮,還需要補(bǔ)充一下,這樣的內(nèi)存控制器布局還可以用于其它用途,比如說(shuō)「內(nèi)存RAID」,它可以與熱插拔技術(shù)一起使用。}使用外部?jī)?nèi)存控制器并不是唯一的辦法,另一個(gè)最近比較流行的方法是將控制器集成到CPU內(nèi)部,將內(nèi)存直連到每個(gè)CPU。這種架構(gòu)的走紅歸功于基于A(yíng)MD Opteron處理器的SMP系統(tǒng)。圖2.3展示了這種架構(gòu)。Intel則會(huì)從Nehalem處理器開(kāi)始支持通用系統(tǒng)接口(CSI),基本上也是類(lèi)似的思路——集成內(nèi)存控制器,為每個(gè)處理器提供本地內(nèi)存。
通過(guò)采用這樣的架構(gòu),系統(tǒng)里有幾個(gè)處理器,就可以有幾個(gè)內(nèi)存庫(kù)(memory bank)。比如,在4 CPU的計(jì)算機(jī)上,不需要一個(gè)擁有巨大帶寬的復(fù)雜北橋,就可以實(shí)現(xiàn)4倍的內(nèi)存帶寬。另外,將內(nèi)存控制器集成到CPU內(nèi)部還有其它一些優(yōu)點(diǎn),這里就不贅述了。同樣也有缺點(diǎn)。首先,系統(tǒng)仍然要讓所有內(nèi)存能被所有處理器所訪(fǎng)問(wèn),導(dǎo)致內(nèi)存不再是統(tǒng)一的資源(NUMA即得名于此)。處理器能以正常的速度訪(fǎng)問(wèn)本地內(nèi)存(連接到該處理器的內(nèi)存)。但它訪(fǎng)問(wèn)其它處理器的內(nèi)存時(shí),卻需要使用處理器之間的互聯(lián)通道。比如說(shuō),CPU 1如果要訪(fǎng)問(wèn)CPU 2的內(nèi)存,則需要使用它們之間的互聯(lián)通道。如果它需要訪(fǎng)問(wèn)CPU 4的內(nèi)存,那么需要跨越兩條互聯(lián)通道。使用互聯(lián)通道是有代價(jià)的。在討論訪(fǎng)問(wèn)遠(yuǎn)端內(nèi)存的代價(jià)時(shí),我們用「NUMA因子」這個(gè)詞。在圖2.3中,每個(gè)CPU有兩個(gè)層級(jí): 相鄰的CPU,以及兩個(gè)互聯(lián)通道外的CPU。在更加復(fù)雜的系統(tǒng)中,層級(jí)也更多。甚至有些機(jī)器有不止一種連接,比如說(shuō)IBM的x445和SGI的Altix系列。CPU被歸入節(jié)點(diǎn),節(jié)點(diǎn)內(nèi)的內(nèi)存訪(fǎng)問(wèn)時(shí)間是一致的,或者只有很小的NUMA因子。而在節(jié)點(diǎn)之間的連接代價(jià)很大,而且有巨大的NUMA因子。目前,已經(jīng)有商用的NUMA計(jì)算機(jī),而且它們?cè)谖磥?lái)應(yīng)該會(huì)扮演更加重要的角色。人們預(yù)計(jì),從2008年底開(kāi)始,每臺(tái)SMP機(jī)器都會(huì)使用NUMA。每個(gè)在NUMA上運(yùn)行的程序都應(yīng)該認(rèn)識(shí)到NUMA的代價(jià)。在第5節(jié)中,我們將討論更多的架構(gòu),以及Linux內(nèi)核為這些程序提供的一些技術(shù)。除了本節(jié)中所介紹的技術(shù)之外,還有其它一些影響RAM性能的因素。它們無(wú)法被軟件所左右,所以沒(méi)有放在這里。如果大家有興趣,可以在第2.1節(jié)中看一下。介紹這些技術(shù),僅僅是因?yàn)樗鼈兡茏屛覀兝L制的RAM技術(shù)全圖更為完整,或者是可能在大家購(gòu)買(mǎi)計(jì)算機(jī)時(shí)能夠提供一些幫助。以下的兩節(jié)主要介紹一些入門(mén)級(jí)的硬件知識(shí),同時(shí)討論內(nèi)存控制器與DRAM芯片間的訪(fǎng)問(wèn)協(xié)議。這些知識(shí)解釋了內(nèi)存訪(fǎng)問(wèn)的原理,程序員可能會(huì)得到一些啟發(fā)。不過(guò),這部分并不是必讀的,心急的讀者可以直接跳到第2.2.5節(jié)。 2.1 RAM類(lèi)型 這些年來(lái),出現(xiàn)了許多不同類(lèi)型的RAM,各有差異,有些甚至有非常巨大的不同。那些很古老的類(lèi)型已經(jīng)乏人問(wèn)津,我們就不仔細(xì)研究了。我們主要專(zhuān)注于幾類(lèi)現(xiàn)代RAM,剖開(kāi)它們的表面,研究一下內(nèi)核和應(yīng)用開(kāi)發(fā)人員們可以看到的一些細(xì)節(jié)。第一個(gè)有趣的細(xì)節(jié)是,為什么在同一臺(tái)機(jī)器中有不同的RAM?或者說(shuō)得更詳細(xì)一點(diǎn),為什么既有靜態(tài)RAM(SRAM {SRAM還可以表示「同步內(nèi)存」。}),又有動(dòng)態(tài)RAM(DRAM)。功能相同,前者更快。那么,為什么不全部使用SRAM?答案是,代價(jià)。無(wú)論在生產(chǎn)還是在使用上,SRAM都比DRAM要貴得多。生產(chǎn)和使用,這兩個(gè)代價(jià)因子都很重要,后者則是越來(lái)越重要。為了理解這一點(diǎn),我們分別看一下SRAM和DRAM一個(gè)位的存儲(chǔ)的實(shí)現(xiàn)過(guò)程。在本節(jié)的余下部分,我們將討論RAM實(shí)現(xiàn)的底層細(xì)節(jié)。我們將盡量控制細(xì)節(jié)的層面,比如,在「邏輯的層面」討論信號(hào),而不是硬件設(shè)計(jì)師那種層面,因?yàn)槟呛翢o(wú)必要。 2.1.1 靜態(tài)RAM
圖2.4展示了6晶體管SRAM的一個(gè)單元。核心是4個(gè)晶體管M1-M4,它們組成兩個(gè)交叉耦合的反相器。它們有兩個(gè)穩(wěn)定的狀態(tài),分別代表0和1。只要保持Vdd有電,狀態(tài)就是穩(wěn)定的。當(dāng)需要訪(fǎng)問(wèn)單元的狀態(tài)時(shí),升起字訪(fǎng)問(wèn)線(xiàn)WL。BL和BL上就可以讀取狀態(tài)。如果需要覆蓋狀態(tài),先將BL和BL設(shè)置為期望的值,然后升起WL。由于外部的驅(qū)動(dòng)強(qiáng)于內(nèi)部的4個(gè)晶體管,所以舊狀態(tài)會(huì)被覆蓋。更多詳情,可以參考[sramwiki]。為了下文的討論,需要注意以下問(wèn)題:一個(gè)單元需要6個(gè)晶體管。也有采用4個(gè)晶體管的SRAM,但有缺陷。維持狀態(tài)需要恒定的電源。升起WL后立即可以讀取狀態(tài)。信號(hào)與其它晶體管控制的信號(hào)一樣,是直角的(快速在兩個(gè)狀態(tài)間變化)。狀態(tài)穩(wěn)定,不需要刷新循環(huán)。SRAM也有其它形式,不那么費(fèi)電,但比較慢。由于我們需要的是快速RAM,因此不在關(guān)注范圍內(nèi)。這些較慢的SRAM的主要優(yōu)點(diǎn)在于接口簡(jiǎn)單,比動(dòng)態(tài)RAM更容易使 2.1.2 動(dòng)態(tài)RAM 動(dòng)態(tài)RAM比靜態(tài)RAM要簡(jiǎn)單得多。圖2.5展示了一種普通DRAM的結(jié)構(gòu)。它只含有一個(gè)晶體管和一個(gè)電容器。顯然,這種復(fù)雜性上的巨大差異意味著功能上的迥異。
動(dòng)態(tài)RAM的狀態(tài)是保持在電容器C中。晶體管M用來(lái)控制訪(fǎng)問(wèn)。如果要讀取狀態(tài),升起訪(fǎng)問(wèn)線(xiàn)AL,這時(shí),可能會(huì)有電流流到數(shù)據(jù)線(xiàn)DL上,也可能沒(méi)有,取決于電容器是否有電。如果要寫(xiě)入狀態(tài),先設(shè)置DL,然后升起AL一段時(shí)間,直到電容器充電或放電完畢。動(dòng)態(tài)RAM的設(shè)計(jì)有幾個(gè)復(fù)雜的地方。由于讀取狀態(tài)時(shí)需要對(duì)電容器放電,所以這一過(guò)程不能無(wú)限重復(fù),不得不在某個(gè)點(diǎn)上對(duì)它重新充電。更糟糕的是,為了容納大量單元(現(xiàn)在一般在單個(gè)芯片上容納10的9次方以上的RAM單元),電容器的容量必須很小(0.000000000000001法拉以下)。這樣,完整充電后大約持有幾萬(wàn)個(gè)電子。即使電容器的電阻很大(若干兆歐姆),仍然只需很短的時(shí)間就會(huì)耗光電荷,稱(chēng)為「泄漏」。這種泄露就是現(xiàn)在的大部分DRAM芯片每隔64ms就必須進(jìn)行一次刷新的原因。在刷新期間,對(duì)于該芯片的訪(fǎng)問(wèn)是不可能的,這甚至?xí)斐砂霐?shù)任務(wù)的延宕。(相關(guān)內(nèi)容請(qǐng)察看【highperfdram】一章)這個(gè)問(wèn)題的另一個(gè)后果就是無(wú)法直接讀取芯片單元中的信息,而必須通過(guò)信號(hào)放大器將0和1兩種信號(hào)間的電勢(shì)差增大。最后一個(gè)問(wèn)題在于電容器的沖放電是需要時(shí)間的,這就導(dǎo)致了信號(hào)放大器讀取的信號(hào)并不是典型的矩形信號(hào)。所以當(dāng)放大器輸出信號(hào)的時(shí)候就需要一個(gè)小小的延宕,相關(guān)公式如下 這就意味著需要一些時(shí)間(時(shí)間長(zhǎng)短取決于電容C和電阻R)來(lái)對(duì)電容進(jìn)行沖放電。另一個(gè)負(fù)面作用是,信號(hào)放大器的輸出電流不能立即就作為信號(hào)載體使用。圖2.6顯示了沖放電的曲線(xiàn),x軸表示的是單位時(shí)間下的R*C 與靜態(tài)RAM可以即刻讀取數(shù)據(jù)不同的是,當(dāng)要讀取動(dòng)態(tài)RAM的時(shí)候,必須花一點(diǎn)時(shí)間來(lái)等待電容的沖放電完全。這一點(diǎn)點(diǎn)的時(shí)間最終限制了DRAM的速度。 當(dāng)然了,這種讀取方式也是有好處的。最大的好處在于縮小了規(guī)模。一個(gè)動(dòng)態(tài)RAM的尺寸是小于靜態(tài)RAM的。這種規(guī)模的減小不單單建立在動(dòng)態(tài)RAM的簡(jiǎn)單結(jié)構(gòu)之上,也是由于減少了靜態(tài)RAM的各個(gè)單元獨(dú)立的供電部分。以上也同時(shí)導(dǎo)致了動(dòng)態(tài)RAM模具的簡(jiǎn)單化。 綜上所述,由于不可思議的成本差異,除了一些特殊的硬件(包括路由器什么的)之外,我們的硬件大多是使用DRAM的。這一點(diǎn)深深的影響了咱們這些程序員,后文將會(huì)對(duì)此進(jìn)行討論。在此之前,我們還是先了解下DRAM的更多細(xì)節(jié)。 2.1.3 DRAM 訪(fǎng)問(wèn) 一個(gè)程序選擇了一個(gè)內(nèi)存位置使用到了一個(gè)虛擬地址。處理器轉(zhuǎn)換這個(gè)到物理地址最后將內(nèi)存控制選擇RAM芯片匹配了那個(gè)地址。在RAM芯片去選擇單個(gè)內(nèi)存單元,部分的物理地址以許多地址行的形式被傳遞。它單獨(dú)地去處理來(lái)自于內(nèi)存控制器的內(nèi)存位置將完全不切實(shí)際:4G的RAM將需要 232 地址行。地址傳遞DRAM芯片的這種方式首先必須被路由器解析。一個(gè)路由器的N多地址行將有2N 輸出行。這些輸出行能被使用到選擇內(nèi)存單元。使用這個(gè)直接方法對(duì)于小容量芯片不再是個(gè)大問(wèn)題但如果許多的單元生成這種方法不在適合。一個(gè)1G的芯片容量(我反感那些SI前綴,對(duì)于我一個(gè)giga-bit將總是230 而不是109字節(jié))將需要30地址行和230 選項(xiàng)行。一個(gè)路由器的大小及許多的輸入行以指數(shù)方式遞增當(dāng)速度不被犧牲時(shí)。一個(gè)30地址行路由器需要一大堆芯片的真實(shí)身份另外路由器也就復(fù)雜起來(lái)了。更重要的是,傳遞30脈沖在地址行同步要比僅僅傳遞15脈沖困難的多。較少列能精確布局相同長(zhǎng)度或恰當(dāng)?shù)臅r(shí)機(jī)(現(xiàn)代DRAM類(lèi)型像DDR3能自動(dòng)調(diào)整時(shí)序但這個(gè)限制能讓他什么都能忍受) 圖2.7展示了一個(gè)很高級(jí)別的一個(gè)DRAM芯片,DRAM被組織在行和列里。他們能在一行中對(duì)奇但DRAM芯片需要一個(gè)大的路由器。通過(guò)陣列方法設(shè)計(jì)能被一個(gè)路由器和一個(gè)半的multiplexer獲得{多路復(fù)用器(multiplexer)和路由器是一樣的,這的multiplexer需要以路由器身份工作當(dāng)寫(xiě)數(shù)據(jù)時(shí)候。那么從現(xiàn)在開(kāi)始我們開(kāi)始討論其區(qū)別.}這在所有方面會(huì)是一個(gè)大的存儲(chǔ)。例如地址linesa0和a1通過(guò)行地址選擇路由器來(lái)選擇整個(gè)行的芯片的地址列,當(dāng)讀的時(shí)候,所有的芯片目錄能使其縱列選擇路由器可用,依據(jù)地址linesa2和a3一個(gè)縱列的目錄用于數(shù)據(jù)DRAM芯片的接口類(lèi)型。這發(fā)生了許多次在許多DRAM芯片產(chǎn)生一個(gè)總記錄數(shù)的字節(jié)匹配給一個(gè)寬范圍的數(shù)據(jù)總線(xiàn)。對(duì)于寫(xiě)操作,內(nèi)存單元的數(shù)據(jù)新值被放到了數(shù)據(jù)總線(xiàn),當(dāng)使用RAS和CAS方式選中內(nèi)存單元時(shí),數(shù)據(jù)是存放在內(nèi)存單元內(nèi)的。這是一個(gè)相當(dāng)直觀(guān)的設(shè)計(jì),在現(xiàn)實(shí)中——很顯然——會(huì)復(fù)雜得多,對(duì)于讀,需要規(guī)范從發(fā)出信號(hào)到數(shù)據(jù)在數(shù)據(jù)總線(xiàn)上變得可讀的時(shí)延。電容不會(huì)像前面章節(jié)里面描述的那樣立刻自動(dòng)放電,從內(nèi)存單元發(fā)出的信號(hào)是如此這微弱以至于它需要被放大。對(duì)于寫(xiě),必須規(guī)范從數(shù)據(jù)RAS和CAS操作完成后到數(shù)據(jù)成功的被寫(xiě)入內(nèi)存單元的時(shí)延(當(dāng)然,電容不會(huì)立刻自動(dòng)充電和放電)。這些時(shí)間常量對(duì)于DRAM芯片的性能是至關(guān)重要的,我們將在下章討論它。另一個(gè)關(guān)于伸縮性的問(wèn)題是,用30根地址線(xiàn)連接到每一個(gè)RAM芯片是行不通的。芯片的針腳是非常珍貴的資源,以至數(shù)據(jù)必須能并行傳輸就并行傳輸(比如:64位為一組)。內(nèi)存控制器必須有能力解析每一個(gè)RAM模塊(RAM芯片集合)。如果因?yàn)樾阅艿脑蛞蟛l(fā)行訪(fǎng)問(wèn)多個(gè)RAM模塊并且每個(gè)RAM模塊需要自己獨(dú)占的30或多個(gè)地址線(xiàn),那么對(duì)于8個(gè)RAM模塊,僅僅是解析地址,內(nèi)存控制器就需要240+之多的針腳。在很長(zhǎng)一段時(shí)間里,地址線(xiàn)被復(fù)用以解決DRAM芯片的這些次要的可擴(kuò)展性問(wèn)題。這意味著地址被轉(zhuǎn)換成兩部分。第一部分由地址位a0和a1選擇行(如圖2.7)。這個(gè)選擇保持有效直到撤銷(xiāo)。然后是第二部分,地址位a2和a3選擇列。關(guān)鍵差別在于:只需要兩根外部地址線(xiàn)。需要一些很少的線(xiàn)指明RAS和CAS信號(hào)有效,但是把地址線(xiàn)的數(shù)目減半所付出的代價(jià)更小??墒堑刂窂?fù)用也帶來(lái)自身的一些問(wèn)題。我們將在2.2章中提到。2.1.4 總結(jié)如果這章節(jié)的內(nèi)容有些難以應(yīng)付,不用擔(dān)心??v觀(guān)這章節(jié)的重點(diǎn),有:
接下來(lái)的章節(jié)會(huì)涉及更多的有關(guān)訪(fǎng)問(wèn)DRAM存儲(chǔ)器的實(shí)際操作的細(xì)節(jié)。我們不會(huì)提到更多有關(guān)訪(fǎng)問(wèn)SRAM的具體內(nèi)容,它通常是直接尋址。這里是由于速度和有限的SRAM存儲(chǔ)器的尺寸。SRAM現(xiàn)在應(yīng)用在CPU的高速緩存和芯片,它們的連接件很小而且完全能在CPU設(shè)計(jì)師的掌控之下。我們以后會(huì)討論到CPU高速緩存這個(gè)主題,但我們所需要知道的是SRAM存儲(chǔ)單元是有確定的最大速度,這取決于花在SRAM上的艱難的嘗試。這速度與CPU核心相比略慢一到兩個(gè)數(shù)量級(jí)。 2.2 DRAM訪(fǎng)問(wèn)細(xì)節(jié) 在上文介紹DRAM的時(shí)候,我們已經(jīng)看到DRAM芯片為了節(jié)約資源,對(duì)地址進(jìn)行了復(fù)用。而且,訪(fǎng)問(wèn)DRAM單元是需要一些時(shí)間的,因?yàn)殡娙萜鞯姆烹姴⒉皇撬矔r(shí)的。此外,我們還看到,DRAM需要不停地刷新。在這一節(jié)里,我們將把這些因素拼合起來(lái),看看它們是如何決定DRAM的訪(fǎng)問(wèn)過(guò)程。我們將主要關(guān)注在當(dāng)前的科技上,不會(huì)再去討論異步DRAM以及它的各種變體。如果對(duì)它感興趣,可以去參考[highperfdram]及[arstechtwo]。我們也不會(huì)討論Rambus DRAM(RDRAM),雖然它并不過(guò)時(shí),但在系統(tǒng)內(nèi)存領(lǐng)域應(yīng)用不廣。我們將主要介紹同步DRAM(SDRAM)及其后繼者雙倍速DRAM(DDR)。同步DRAM,顧名思義,是參照一個(gè)時(shí)間源工作的。由內(nèi)存控制器提供一個(gè)時(shí)鐘,時(shí)鐘的頻率決定了前端總線(xiàn)(FSB)的速度。FSB是內(nèi)存控制器提供給DRAM芯片的接口。在我寫(xiě)作本文的時(shí)候,F(xiàn)SB已經(jīng)達(dá)到800MHz、1066MHz,甚至1333MHz,并且下一代的1600MHz也已經(jīng)宣布。但這并不表示時(shí)鐘頻率有這么高。實(shí)際上,目前的總線(xiàn)都是雙倍或四倍傳輸?shù)模總€(gè)周期傳輸2次或4次數(shù)據(jù)。報(bào)的越高,賣(mài)的越好,所以這些廠(chǎng)商們喜歡把四倍傳輸?shù)?00MHz總線(xiàn)宣傳為“有效的”800MHz總線(xiàn)。以今天的SDRAM為例,每次數(shù)據(jù)傳輸包含64位,即8字節(jié)。所以FSB的傳輸速率應(yīng)該是有效總線(xiàn)頻率乘于8字節(jié)(對(duì)于4倍傳輸200MHz總線(xiàn)而言,傳輸速率為6.4GB/s)。聽(tīng)起來(lái)很高,但要知道這只是峰值速率,實(shí)際上無(wú)法達(dá)到的最高速率。我們將會(huì)看到,與RAM模塊交流的協(xié)議有大量時(shí)間是處于非工作狀態(tài),不進(jìn)行數(shù)據(jù)傳輸。我們必須對(duì)這些非工作時(shí)間有所了解,并盡量縮短它們,才能獲得最佳的性能。 2.2.1 讀訪(fǎng)問(wèn)協(xié)議
圖2.8展示了某個(gè)DRAM模塊一些連接器上的活動(dòng),可分為三個(gè)階段,圖上以不同顏色表示。按慣例,時(shí)間為從左向右流逝。這里忽略了許多細(xì)節(jié),我們只關(guān)注時(shí)鐘頻率、RAS與CAS信號(hào)、地址總線(xiàn)和數(shù)據(jù)總線(xiàn)。首先,內(nèi)存控制器將行地址放在地址總線(xiàn)上,并降低RAS信號(hào),讀周期開(kāi)始。所有信號(hào)都在時(shí)鐘(CLK)的上升沿讀取,因此,只要信號(hào)在讀取的時(shí)間點(diǎn)上保持穩(wěn)定,就算不是標(biāo)準(zhǔn)的方波也沒(méi)有關(guān)系。設(shè)置行地址會(huì)促使RAM芯片鎖住指定的行。CAS信號(hào)在tRCD(RAS到CAS時(shí)延)個(gè)時(shí)鐘周期后發(fā)出。內(nèi)存控制器將列地址放在地址總線(xiàn)上,降低CAS線(xiàn)。這里我們可以看到,地址的兩個(gè)組成部分是怎么通過(guò)同一條總線(xiàn)傳輸?shù)?。至此,尋址結(jié)束,是時(shí)候傳輸數(shù)據(jù)了。但RAM芯片任然需要一些準(zhǔn)備時(shí)間,這個(gè)時(shí)間稱(chēng)為CAS時(shí)延(CL)。在圖2.8中CL為2。這個(gè)值可大可小,它取決于內(nèi)存控制器、主板和DRAM模塊的質(zhì)量。CL還可能是半周期。假設(shè)CL為2.5,那么數(shù)據(jù)將在藍(lán)色區(qū)域內(nèi)的第一個(gè)下降沿準(zhǔn)備就緒。既然數(shù)據(jù)的傳輸需要這么多的準(zhǔn)備工作,僅僅傳輸一個(gè)字顯然是太浪費(fèi)了。因此,DRAM模塊允許內(nèi)存控制指定本次傳輸多少數(shù)據(jù)??梢允?、4或8個(gè)字。這樣,就可以一次填滿(mǎn)高速緩存的整條線(xiàn),而不需要額外的RAS/CAS序列。另外,內(nèi)存控制器還可以在不重置行選擇的前提下發(fā)送新的CAS信號(hào)。這樣,讀取或?qū)懭脒B續(xù)的地址就可以變得非???,因?yàn)椴恍枰l(fā)送RAS信號(hào),也不需要把行置為非激活狀態(tài)(見(jiàn)下文)。是否要將行保持為“打開(kāi)”狀態(tài)是內(nèi)存控制器判斷的事情。讓它一直保持打開(kāi)的話(huà),對(duì)真正的應(yīng)用會(huì)有不好的影響(參見(jiàn)[highperfdram])。CAS信號(hào)的發(fā)送僅與RAM模塊的命令速率(Command Rate)有關(guān)(常常記為T(mén)x,其中x為1或2,高性能的DRAM模塊一般為1,表示在每個(gè)周期都可以接收新命令)。在上圖中,SDRAM的每個(gè)周期輸出一個(gè)字的數(shù)據(jù)。這是第一代的SDRAM。而DDR可以在一個(gè)周期中輸出兩個(gè)字。這種做法可以減少傳輸時(shí)間,但無(wú)法降低時(shí)延。DDR2盡管看上去不同,但在本質(zhì)上也是相同的做法。對(duì)于DDR2,不需要再深入介紹了,我們只需要知道DDR2更快、更便宜、更可靠、更節(jié)能(參見(jiàn)[ddrtwo])就足夠了。 2.2.2 預(yù)充電與激活 圖2.8并不完整,它只畫(huà)出了訪(fǎng)問(wèn)DRAM的完整循環(huán)的一部分。在發(fā)送RAS信號(hào)之前,必須先把當(dāng)前鎖住的行置為非激活狀態(tài),并對(duì)新行進(jìn)行預(yù)充電。在這里,我們主要討論由于顯式發(fā)送指令而觸發(fā)以上行為的情況。協(xié)議本身作了一些改進(jìn),在某些情況下是可以省略這個(gè)步驟的,但預(yù)充電帶來(lái)的時(shí)延還是會(huì)影響整個(gè)操作。
圖2.9顯示的是兩次CAS信號(hào)的時(shí)序圖。第一次的數(shù)據(jù)在CL周期后準(zhǔn)備就緒。圖中的例子里,是在SDRAM上,用兩個(gè)周期傳輸了兩個(gè)字的數(shù)據(jù)。如果換成DDR的話(huà),則可以傳輸4個(gè)字。即使是在一個(gè)命令速率為1的DRAM模塊上,也無(wú)法立即發(fā)出預(yù)充電命令,而要等數(shù)據(jù)傳輸完成。在上圖中,即為兩個(gè)周期。剛好與CL相同,但只是巧合而已。預(yù)充電信號(hào)并沒(méi)有專(zhuān)用線(xiàn),某些實(shí)現(xiàn)是用同時(shí)降低寫(xiě)使能(WE)線(xiàn)和RAS線(xiàn)的方式來(lái)觸發(fā)。這一組合方式本身沒(méi)有特殊的意義(參見(jiàn)[micronddr])。發(fā)出預(yù)充電信命令后,還需等待tRP(行預(yù)充電時(shí)間)個(gè)周期之后才能使行被選中。在圖2.9中,這個(gè)時(shí)間(紫色部分)大部分與內(nèi)存?zhèn)鬏數(shù)臅r(shí)間(淡藍(lán)色部分)重合。不錯(cuò)。但tRP大于傳輸時(shí)間,因此下一個(gè)RAS信號(hào)只能等待一個(gè)周期。 如果我們補(bǔ)充完整上圖中的時(shí)間線(xiàn),最后會(huì)發(fā)現(xiàn)下一次數(shù)據(jù)傳輸發(fā)生在前一次的5個(gè)周期之后。這意味著,數(shù)據(jù)總線(xiàn)的7個(gè)周期中只有2個(gè)周期才是真正在用的。再用它乘于FSB速度,結(jié)果就是,800MHz總線(xiàn)的理論速率6.4GB/s降到了1.8GB/s。真是太糟了。第6節(jié)將介紹一些技術(shù),可以幫助我們提高總線(xiàn)有效速率。程序員們也需要盡自己的努力。SDRAM還有一些定時(shí)值,我們并沒(méi)有談到。在圖2.9中,預(yù)充電命令僅受制于數(shù)據(jù)傳輸時(shí)間。除此之外,SDRAM模塊在RAS信號(hào)之后,需要經(jīng)過(guò)一段時(shí)間,才能進(jìn)行預(yù)充電(記為tRAS)。它的值很大,一般達(dá)到tRP的2到3倍。如果在某個(gè)RAS信號(hào)之后,只有一個(gè)CAS信號(hào),而且數(shù)據(jù)只傳輸很少幾個(gè)周期,那么就有問(wèn)題了。假設(shè)在圖2.9中,第一個(gè)CAS信號(hào)是直接跟在一個(gè)RAS信號(hào)后免的,而tRAS為8個(gè)周期。那么預(yù)充電命令還需要被推遲一個(gè)周期,因?yàn)閠RCD、CL和tRP加起來(lái)才7個(gè)周期。
當(dāng)然,除以上的參數(shù)外,還有許多其它參數(shù)影響命令的發(fā)送與處理。但以上5個(gè)參數(shù)已經(jīng)足以確定模塊的性能。在解讀計(jì)算機(jī)性能參數(shù)時(shí),這些信息可能會(huì)派上用場(chǎng)。而在購(gòu)買(mǎi)計(jì)算機(jī)時(shí),這些信息就更有用了,因?yàn)樗鼈兣cFSB/SDRAM速度一起,都是決定計(jì)算機(jī)速度的關(guān)鍵因素。喜歡冒險(xiǎn)的讀者們還可以利用它們來(lái)調(diào)優(yōu)系統(tǒng)。有些計(jì)算機(jī)的BIOS可以讓你修改這些參數(shù)。SDRAM模塊有一些可編程寄存器,可供設(shè)置參數(shù)。BIOS一般會(huì)挑選最佳值。如果RAM模塊的質(zhì)量足夠好,我們可以在保持系統(tǒng)穩(wěn)定的前提下將減小以上某個(gè)時(shí)延參數(shù)?;ヂ?lián)網(wǎng)上有大量超頻網(wǎng)站提供了相關(guān)的文檔。不過(guò),這是有風(fēng)險(xiǎn)的,需要大家自己承擔(dān),可別怪我沒(méi)有事先提醒喲。 2.2.3 重充電 談到DRAM的訪(fǎng)問(wèn)時(shí),重充電是常常被忽略的一個(gè)主題。在2.1.2中曾經(jīng)介紹,DRAM必須保持刷新?!性诔潆姇r(shí)是無(wú)法訪(fǎng)問(wèn)的。[highperfdram]的研究發(fā)現(xiàn),“令人吃驚,DRAM刷新對(duì)性能有著巨大的影響”。根據(jù)JEDEC規(guī)范,DRAM單元必須保持每64ms刷新一次。對(duì)于8192行的DRAM,這意味著內(nèi)存控制器平均每7.8125μs就需要發(fā)出一個(gè)刷新命令(在實(shí)際情況下,由于刷新命令可以納入隊(duì)列,因此這個(gè)時(shí)間間隔可以更大一些)。刷新命令的調(diào)度由內(nèi)存控制器負(fù)責(zé)。DRAM模塊會(huì)記錄上一次刷新行的地址,然后在下次刷新請(qǐng)求時(shí)自動(dòng)對(duì)這個(gè)地址進(jìn)行遞增。對(duì)于刷新及發(fā)出刷新命令的時(shí)間點(diǎn),程序員無(wú)法施加影響。但我們?cè)诮庾x性能參數(shù)時(shí)有必要知道,它也是DRAM生命周期的一個(gè)部分。如果系統(tǒng)需要讀取某個(gè)重要的字,而剛好它所在的行正在刷新,那么處理器將會(huì)被延遲很長(zhǎng)一段時(shí)間。刷新的具體耗時(shí)取決于DRAM模塊本身。 2.2.4 內(nèi)存類(lèi)型 我們有必要花一些時(shí)間來(lái)了解一下目前流行的內(nèi)存,以及那些即將流行的內(nèi)存。首先從SDR(單倍速)SDRAM開(kāi)始,因?yàn)樗鼈兪荄DR(雙倍速)SDRAM的基礎(chǔ)。SDR非常簡(jiǎn)單,內(nèi)存單元和數(shù)據(jù)傳輸率是相等的。 在圖2.10中,DRAM單元陣列能以等同于內(nèi)存總線(xiàn)的速率輸出內(nèi)容。假設(shè)DRAM單元陣列工作在100MHz上,那么總線(xiàn)的數(shù)據(jù)傳輸率可以達(dá)到100Mb/s。所有組件的頻率f保持相同。由于提高頻率會(huì)導(dǎo)致耗電量增加,所以提高吞吐量需要付出很高的的代價(jià)。如果是很大規(guī)模的內(nèi)存陣列,代價(jià)會(huì)非常巨大。{功率 = 動(dòng)態(tài)電容 x 電壓2 x 頻率}。而且,提高頻率還需要在保持系統(tǒng)穩(wěn)定的情況下提高電壓,這更是一個(gè)問(wèn)題。因此,就有了DDR SDRAM(現(xiàn)在叫DDR1),它可以在不提高頻率的前提下提高吞吐量。 我們從圖2.11上可以看出DDR1與SDR的不同之處,也可以從DDR1的名字里猜到那么幾分,DDR1的每個(gè)周期可以傳輸兩倍的數(shù)據(jù),它的上升沿和下降沿都傳輸數(shù)據(jù)。有時(shí)又被稱(chēng)為“雙泵(double-pumped)”總線(xiàn)。為了在不提升頻率的前提下實(shí)現(xiàn)雙倍傳輸,DDR引入了一個(gè)緩沖區(qū)。緩沖區(qū)的每條數(shù)據(jù)線(xiàn)都持有兩位。它要求內(nèi)存單元陣列的數(shù)據(jù)總線(xiàn)包含兩條線(xiàn)。實(shí)現(xiàn)的方式很簡(jiǎn)單,用同一個(gè)列地址同時(shí)訪(fǎng)問(wèn)兩個(gè)DRAM單元。對(duì)單元陣列的修改也很小。SDR DRAM是以頻率來(lái)命名的(例如,對(duì)應(yīng)于100MHz的稱(chēng)為PC100)。為了讓DDR1聽(tīng)上去更好聽(tīng),營(yíng)銷(xiāo)人員們不得不想了一種新的命名方案。這種新方案中含有DDR模塊可支持的傳輸速率(DDR擁有64位總線(xiàn)):
于是,100MHz頻率的DDR模塊就被稱(chēng)為PC1600。由于1600 > 100,營(yíng)銷(xiāo)方面的需求得到了滿(mǎn)足,聽(tīng)起來(lái)非常棒,但實(shí)際上僅僅只是提升了兩倍而已。{我接受兩倍這個(gè)事實(shí),但不喜歡類(lèi)似的數(shù)字膨脹戲法。}
為了更進(jìn)一步,DDR2有了更多的創(chuàng)新。在圖2.12中,最明顯的變化是,總線(xiàn)的頻率加倍了。頻率的加倍意味著帶寬的加倍。如果對(duì)單元陣列的頻率加倍,顯然是不經(jīng)濟(jì)的,因此DDR2要求I/O緩沖區(qū)在每個(gè)時(shí)鐘周期讀取4位。也就是說(shuō),DDR2的變化僅在于使I/O緩沖區(qū)運(yùn)行在更高的速度上。這是可行的,而且耗電也不會(huì)顯著增加。DDR2的命名與DDR1相仿,只是將因子2替換成4(四泵總線(xiàn))。圖2.13顯示了目前常用的一些模塊的名稱(chēng)。
在命名方面還有一個(gè)擰巴的地方。FSB速度是用有效頻率來(lái)標(biāo)記的,即把上升、下降沿均傳輸數(shù)據(jù)的因素考慮進(jìn)去,因此數(shù)字被撐大了。所以,擁有266MHz總線(xiàn)的133MHz模塊有著533MHz的FSB“頻率”。DDR3要求更多的改變(這里指真正的DDR3,而不是圖形卡中假冒的GDDR3)。電壓從1.8V下降到1.5V。由于耗電是與電壓的平方成正比,因此可以節(jié)約30%的電力。加上管芯(die)的縮小和電氣方面的其它進(jìn)展,DDR3可以在保持相同頻率的情況下,降低一半的電力消耗?;蛘撸诒3窒嗤碾姷那闆r下,達(dá)到更高的頻率。又或者,在保持相同熱量排放的情況下,實(shí)現(xiàn)容量的翻番。DDR3模塊的單元陣列將運(yùn)行在內(nèi)部總線(xiàn)的四分之一速度上,DDR3的I/O緩沖區(qū)從DDR2的4位提升到8位。見(jiàn)圖2.14。 一開(kāi)始,DDR3可能會(huì)有較高的CAS時(shí)延,因?yàn)镈DR2的技術(shù)相比之下更為成熟。由于這個(gè)原因,DDR3可能只會(huì)用于DDR2無(wú)法達(dá)到的高頻率下,而且?guī)挶葧r(shí)延更重要的場(chǎng)景。此前,已經(jīng)有討論指出,1.3V的DDR3可以達(dá)到與DDR2相同的CAS時(shí)延。無(wú)論如何,更高速度帶來(lái)的價(jià)值都會(huì)超過(guò)時(shí)延增加帶來(lái)的影響。DDR3可能會(huì)有一個(gè)問(wèn)題,即在1600Mb/s或更高速率下,每個(gè)通道的模塊數(shù)可能會(huì)限制為1。在早期版本中,這一要求是針對(duì)所有頻率的。我們希望這個(gè)要求可以提高一些,否則系統(tǒng)容量將會(huì)受到嚴(yán)重的限制。圖2.15顯示了我們預(yù)計(jì)中各DDR3模塊的名稱(chēng)。JEDEC目前同意了前四種。由于Intel的45nm處理器是1600Mb/s的FSB,1866Mb/s可以用于超頻市場(chǎng)。隨著DDR3的發(fā)展,可能會(huì)有更多類(lèi)型加入。
所有的DDR內(nèi)存都有一個(gè)問(wèn)題:不斷增加的頻率使得建立并行數(shù)據(jù)總線(xiàn)變得十分困難。一個(gè)DDR2模塊有240根引腳。所有到地址和數(shù)據(jù)引腳的連線(xiàn)必須被布置得差不多一樣長(zhǎng)。更大的問(wèn)題是,如果多于一個(gè)DDR模塊通過(guò)菊花鏈連接在同一個(gè)總線(xiàn)上,每個(gè)模塊所接收到的信號(hào)隨著模塊的增加會(huì)變得越來(lái)越扭曲。DDR2規(guī)范允許每條總線(xiàn)(又稱(chēng)通道)連接最多兩個(gè)模塊,DDR3在高頻率下只允許每個(gè)通道連接一個(gè)模塊。每條總線(xiàn)多達(dá)240根引腳使得單個(gè)北橋無(wú)法以合理的方式驅(qū)動(dòng)兩個(gè)通道。替代方案是增加外部?jī)?nèi)存控制器(如圖2.2),但這會(huì)提高成本。這意味著商品主板所搭載的DDR2或DDR3模塊數(shù)將被限制在最多四條,這嚴(yán)重限制了系統(tǒng)的最大內(nèi)存容量。即使是老舊的32位IA-32處理器也可以使用64GB內(nèi)存。即使是家庭對(duì)內(nèi)存的需求也在不斷增長(zhǎng),所以,某些事必須開(kāi)始做了。一種解法是,在處理器中加入內(nèi)存控制器,我們?cè)诘?節(jié)中曾經(jīng)介紹過(guò)。AMD的Opteron系列和Intel的CSI技術(shù)就是采用這種方法。只要我們能把處理器要求的內(nèi)存連接到處理器上,這種解法就是有效的。如果不能,按照這種思路就會(huì)引入NUMA架構(gòu),當(dāng)然同時(shí)也會(huì)引入它的缺點(diǎn)。而在有些情況下,我們需要其它解法。Intel針對(duì)大型服務(wù)器方面的解法(至少在未來(lái)幾年),是被稱(chēng)為全緩沖DRAM(FB-DRAM)的技術(shù)。FB-DRAM采用與DDR2相同的器件,因此造價(jià)低廉。不同之處在于它們與內(nèi)存控制器的連接方式。FB-DRAM沒(méi)有用并行總線(xiàn),而用了串行總線(xiàn)(Rambus DRAM had this back when, too, 而SATA是PATA的繼任者,就像PCI Express是PCI/AGP的繼承人一樣)。串行總線(xiàn)可以達(dá)到更高的頻率,串行化的負(fù)面影響,甚至可以增加帶寬。使用串行總線(xiàn)后
FB-DRAM只有69個(gè)腳。通過(guò)菊花鏈方式連接多個(gè)FB-DRAM也很簡(jiǎn)單。FB-DRAM規(guī)范允許每個(gè)通道連接最多8個(gè)模塊。在對(duì)比下雙通道北橋的連接性,采用FB-DRAM后,北橋可以驅(qū)動(dòng)6個(gè)通道,而且腳數(shù)更少——6×69對(duì)比2×240。每個(gè)通道的布線(xiàn)也更為簡(jiǎn)單,有助于降低主板的成本。全雙工的并行總線(xiàn)過(guò)于昂貴。而換成串行線(xiàn)后,這不再是一個(gè)問(wèn)題,因此串行總線(xiàn)按全雙工來(lái)設(shè)計(jì)的,這也意味著,在某些情況下,僅靠這一特性,總線(xiàn)的理論帶寬已經(jīng)翻了一倍。還不止于此。由于FB-DRAM控制器可同時(shí)連接6個(gè)通道,因此可以利用它來(lái)增加某些小內(nèi)存系統(tǒng)的帶寬。對(duì)于一個(gè)雙通道、4模塊的DDR2系統(tǒng),我們可以用一個(gè)普通FB-DRAM控制器,用4通道來(lái)實(shí)現(xiàn)相同的容量。串行總線(xiàn)的實(shí)際帶寬取決于在FB-DRAM模塊中所使用的DDR2(或DDR3)芯片的類(lèi)型。我們可以像這樣總結(jié)這些優(yōu)勢(shì):
如果在單個(gè)通道上使用多個(gè)DIMM,會(huì)有一些問(wèn)題。信號(hào)在每個(gè)DIMM上都會(huì)有延遲(盡管很小),也就是說(shuō),延遲是遞增的。不過(guò),如果在相同頻率和相同容量上進(jìn)行比較,F(xiàn)B-DRAM總是能快過(guò)DDR2及DDR3,因?yàn)镕B-DRAM只需要在每個(gè)通道上使用一個(gè)DIMM即可。而如果說(shuō)到大型內(nèi)存系統(tǒng),那么DDR更是沒(méi)有商用組件的解決方案。 2.2.5 結(jié)論 通過(guò)本節(jié),大家應(yīng)該了解到訪(fǎng)問(wèn)DRAM的過(guò)程并不是一個(gè)快速的過(guò)程。至少與處理器的速度相比,或與處理器訪(fǎng)問(wèn)寄存器及緩存的速度相比,DRAM的訪(fǎng)問(wèn)不算快。大家還需要記住CPU和內(nèi)存的頻率是不同的。Intel Core 2處理器運(yùn)行在2.933GHz,而1.066GHz FSB有11:1的時(shí)鐘比率(注: 1.066GHz的總線(xiàn)為四泵總線(xiàn))。那么,內(nèi)存總線(xiàn)上延遲一個(gè)周期意味著處理器延遲11個(gè)周期。絕大多數(shù)機(jī)器使用的DRAM更慢,因此延遲更大。在后續(xù)的章節(jié)中,我們需要討論延遲這個(gè)問(wèn)題時(shí),請(qǐng)把以上的數(shù)字記在心里。前文中讀命令的時(shí)序圖表明,DRAM模塊可以支持高速數(shù)據(jù)傳輸。每個(gè)完整行可以被毫無(wú)延遲地傳輸。數(shù)據(jù)總線(xiàn)可以100%被占。對(duì)DDR而言,意味著每個(gè)周期傳輸2個(gè)64位字。對(duì)于DDR2-800模塊和雙通道而言,意味著12.8GB/s的速率。但是,除非是特殊設(shè)計(jì),DRAM的訪(fǎng)問(wèn)并不總是串行的。訪(fǎng)問(wèn)不連續(xù)的內(nèi)存區(qū)意味著需要預(yù)充電和RAS信號(hào)。于是,各種速度開(kāi)始慢下來(lái),DRAM模塊急需幫助。預(yù)充電的時(shí)間越短,數(shù)據(jù)傳輸所受的懲罰越小。硬件和軟件的預(yù)取(參見(jiàn)第6.3節(jié))可以在時(shí)序中制造更多的重疊區(qū),降低延遲。預(yù)取還可以轉(zhuǎn)移內(nèi)存操作的時(shí)間,從而減少爭(zhēng)用。我們常常遇到的問(wèn)題是,在這一輪中生成的數(shù)據(jù)需要被存儲(chǔ),而下一輪的數(shù)據(jù)需要被讀出來(lái)。通過(guò)轉(zhuǎn)移讀取的時(shí)間,讀和寫(xiě)就不需要同時(shí)發(fā)出了。 2.3 主存的其它用戶(hù) 除了CPU外,系統(tǒng)中還有其它一些組件也可以訪(fǎng)問(wèn)主存。高性能網(wǎng)卡或大規(guī)模存儲(chǔ)控制器是無(wú)法承受通過(guò)CPU來(lái)傳輸數(shù)據(jù)的,它們一般直接對(duì)內(nèi)存進(jìn)行讀寫(xiě)(直接內(nèi)存訪(fǎng)問(wèn),DMA)。在圖2.1中可以看到,它們可以通過(guò)南橋和北橋直接訪(fǎng)問(wèn)內(nèi)存。另外,其它總線(xiàn),比如USB等也需要FSB帶寬,即使它們并不使用DMA,但南橋仍要通過(guò)FSB連接到北橋。DMA當(dāng)然有很大的優(yōu)點(diǎn),但也意味著FSB帶寬會(huì)有更多的競(jìng)爭(zhēng)。在有大量DMA流量的情況下,CPU在訪(fǎng)問(wèn)內(nèi)存時(shí)必然會(huì)有更大的延遲。我們可以用一些硬件來(lái)解決這個(gè)問(wèn)題。例如,通過(guò)圖2.3中的架構(gòu),我們可以挑選不受DMA影響的節(jié)點(diǎn),讓它們的內(nèi)存為我們的計(jì)算服務(wù)。還可以在每個(gè)節(jié)點(diǎn)上連接一個(gè)南橋,將FSB的負(fù)荷均勻地分擔(dān)到每個(gè)節(jié)點(diǎn)上。除此以外,還有許多其它方法。我們將在第6節(jié)中介紹一些技術(shù)和編程接口,它們能夠幫助我們通過(guò)軟件的方式改善這個(gè)問(wèn)題。最后,還需要提一下某些廉價(jià)系統(tǒng),它們的圖形系統(tǒng)沒(méi)有專(zhuān)用的顯存,而是采用主存的一部分作為顯存。由于對(duì)顯存的訪(fǎng)問(wèn)非常頻繁(例如,對(duì)于1024×768、16bpp、60Hz的顯示設(shè)置來(lái)說(shuō),需要95MB/s的數(shù)據(jù)速率),而主存并不像顯卡上的顯存,并沒(méi)有兩個(gè)端口,因此這種配置會(huì)對(duì)系統(tǒng)性能、尤其是時(shí)延造成一定的影響。如果大家對(duì)系統(tǒng)性能要求比較高,最好不要采用這種配置。這種系統(tǒng)帶來(lái)的問(wèn)題超過(guò)了本身的價(jià)值。人們?cè)谫?gòu)買(mǎi)它們時(shí)已經(jīng)做好了性能不佳的心理準(zhǔn)備。繼續(xù)閱讀:
|
|
|
來(lái)自: pphsy > 《待分類(lèi)1》