趙陽洋 陳明宇 金 旭 阮 元 張雪琳
(*中國科學院計算技術(shù)研究所計算機體系結(jié)構(gòu)國家重點實驗室 北京 100190) (**中國科學院大學 北京 100049) (***鵬城實驗室 深圳 518055)
計算機領(lǐng)域已進入以數(shù)據(jù)為中心的大數(shù)據(jù)時代,大數(shù)據(jù)所催生的內(nèi)存計算和具有越來越多核心的處理器,對內(nèi)存的速度、容量、功耗和可靠性等提出了更高的要求。近年來新興非易失性隨機存儲介質(zhì)(non-volatile memory, NVM) 的訪問性能在逐步逼近動態(tài)隨機訪問存儲器(dynamic random-access memory, DRAM),因此產(chǎn)生了越來越多的基于新型存儲器件和傳統(tǒng)DRAM設(shè)計新型混合內(nèi)存的研究[1,2],旨在實現(xiàn)內(nèi)存的擴展和加速。
新型內(nèi)存系統(tǒng)需要在總線上接入不同延遲的部件,方便實現(xiàn)網(wǎng)絡(luò)化或混合存儲,為此往往選用異步傳輸總線,每個事務(wù)的請求階段和響應(yīng)階段是相互獨立的,以提供更好的靈活性。例如,Intel、AMD和Sun等公司早期曾推出支持全緩沖內(nèi)存(fully buffered DIMM, FBDIMM)[3]的處理器,但因其無法兼容市場上的通用內(nèi)存模塊,因此沒有普及。
在主板芯片組上完成總線事務(wù)轉(zhuǎn)換,可以實現(xiàn)兼容通用內(nèi)存,目前服務(wù)器市場的很多公司采用了類似的技術(shù)。Intel可擴展內(nèi)存緩沖(scalable memory buffer, SMB)應(yīng)用于其高端服務(wù)器系統(tǒng)[4]。IBM公司 Power8處理器的內(nèi)存控制器通過高速串行總線與一個Centaur緩沖芯片相連[5]。這類板上緩沖提供了良好的內(nèi)存擴展能力,但是處理器與板上緩沖芯片之間的總線事務(wù)傳輸還未形成標準,一是緩沖芯片與其他廠商的處理器不兼容,二是緩沖芯片之間互相不兼容。
混合內(nèi)存立方體(hybrid memory cube, HMC)[6]是內(nèi)存顆粒廠商Micron 聯(lián)合Intel 提出的一種新型內(nèi)存總線標準,處理器與內(nèi)存之間只有異步傳輸總線,內(nèi)存顆粒采用3維堆疊封裝技術(shù)將類似緩沖芯片的邏輯晶粒和存儲晶粒封裝到一個芯片中。HMC提供了良好的帶寬和功能擴展性,并可支持存儲顆粒的級聯(lián)。但是HMC架構(gòu)下的處理器和內(nèi)存都無法與之前的器件兼容。
綜上,各種新型內(nèi)存系統(tǒng)在異步傳輸事務(wù)時缺乏統(tǒng)一標準,導致兼容性問題。當前主流計算機系統(tǒng)基本仍采用雙倍速率(double data rate,DDR)總線協(xié)議,為此,產(chǎn)業(yè)界一直在積極探索通過DDR總線實現(xiàn)新型內(nèi)存系統(tǒng)訪問的方法,異步傳輸DDR有可能在未來幾年被市場所接受。
利用DDR總線訪問閃存(flash) 的產(chǎn)品已經(jīng)面世,Diablo Technologies[7]公司提出了基于DDR3接口訪問閃存的內(nèi)存通道存儲(memory channel storage, MCS) 技術(shù),這套技術(shù)被JEDEC 組織采納為NVDIMM-F標準[8]。但MCS訪問閃存依然是按照存儲資源的方式讀寫,只是利用DDR 總線傳輸數(shù)據(jù),還不能被處理器識別為內(nèi)存。UniMA[9]通過一個修改的DDR總線擴展內(nèi)存容量,支持不同延遲的存儲介質(zhì)如相變存儲器(phase change memory, PCM) 等。該方案雖然基于DDR總線,但修改了協(xié)議,內(nèi)存控制器需要相應(yīng)做修改。
Intel一種新的內(nèi)存模組(Apache Pass) 通過DDR4物理兼容的總線與處理器相連[10]。DDR4物理兼容總線DDR-T修改了一組不用的使能、片選信號方向,變成由緩沖端驅(qū)動才實現(xiàn)異步傳輸請求。Samsung也與Netlist聯(lián)合推出了NVDIMM-P[11],以兼容DDR4的方式實現(xiàn)高性能閃存訪問。
上述研究都不可避免地對現(xiàn)有DDR協(xié)議做了修改,難以直接應(yīng)用到當前主流計算機系統(tǒng)中。本文提出了一種在現(xiàn)有的標準DDRx協(xié)議上實現(xiàn)異步傳輸事務(wù)的方案,解決新型內(nèi)存系統(tǒng)的兼容性問題,并進行了流片驗證。
根據(jù)上一節(jié)分析,本文的主要目標是在不修改現(xiàn)有的DDR時序協(xié)議基礎(chǔ)上,實現(xiàn)基于DDR總線的異步數(shù)據(jù)傳輸,以使當前主流處理器可以通過標準DDR總線接口,連接支持可變延遲訪問的新型內(nèi)存系統(tǒng)。內(nèi)存擴展芯片的外部連接和內(nèi)部主要功能模塊如圖1 所示。
圖1 系統(tǒng)整體架構(gòu)
其中,處理器通過標準DDR總線接口與內(nèi)存擴展芯片連接。DDR從設(shè)備接收來自主機的訪存命令,經(jīng)過芯片內(nèi)部的事務(wù)處理緩沖模塊后,由片上集成的內(nèi)存控制器訪問新型內(nèi)存。
從圖1 中可以看到,處理器的從設(shè)備不再是標準內(nèi)存顆粒,而是自定制的內(nèi)存擴展芯片,其訪問新型內(nèi)存的請求延遲不是固定的。為滿足DDR協(xié)議的時序要求,即在等待一個固定的延遲(如讀命令該延遲為tCL)之后及時返回請求信息,在內(nèi)存擴展芯片中設(shè)計了DDR從設(shè)備模塊。該模塊嚴格滿足DDR協(xié)議讀寫時序要求[12]。
另外,處理器在開機后,首先會進入基本輸入輸出系統(tǒng)(basic input output system, BIOS)。BIOS會按照DDR協(xié)議完成內(nèi)存的初始化,執(zhí)行一些標準讀寫操作,訓練好DDR總線,確保可以根據(jù)DDR總線上DQS信號采樣到準確的數(shù)據(jù)(DQ)。在內(nèi)存初始化階段,DDR從設(shè)備模塊負責處理讀寫命令,使內(nèi)存擴展芯片通過讀寫訓練過程,為此在芯片上增加1個8 kB大小的片上隨機存儲器(random access memory, RAM),在初始化完成后,該片上RAM又可用于存儲配置或調(diào)試信號。對處理器來講,訪問內(nèi)存擴展芯片和訪問標準內(nèi)存顆粒的時序是一樣的。
但是DDR從設(shè)備模塊返回數(shù)據(jù)僅能保證滿足DDR總線的時序要求,卻無法保證數(shù)據(jù)的正確性。例如,在讀新型內(nèi)存或者調(diào)用內(nèi)存擴展功能時,獲取到讀請求數(shù)據(jù)的延遲通常會超過tCL這一DDR總線讀延遲要求,即DDR從設(shè)備按時序要求返回的讀數(shù)據(jù)是自定義的無效數(shù)據(jù)。
為保證數(shù)據(jù)正確性,采用twin-load (2次訪存)的方法[13]。2次訪存是處理器端用一個完整的DDR命令作為訪問請求的請求階段,然后根據(jù)請求類型等待合適的時間,再用一個DDR命令作為訪問請求的響應(yīng)階段。2個DDR命令配對實現(xiàn)異步傳輸事務(wù)。在處理器端,僅需要對發(fā)送訪問請求的軟件做修改,產(chǎn)生可以獲取正確數(shù)據(jù)的DDR讀寫命令序列。
為支持2次訪存方法,內(nèi)存擴展芯片在事務(wù)處理緩沖模塊中,分別為讀事務(wù)和寫事務(wù)定制專屬的狀態(tài)機,以響應(yīng)DDR訪存命令序列中不同階段的命令,且負責產(chǎn)生與各階段匹配的訪存命令發(fā)送給內(nèi)存控制器。
異步傳輸事務(wù)由不同的DDR命令序列組合而成,處理時不能只看當前命令信息,必須考慮其上下文。而且,同一命令序列中,各訪存請求并沒有固定的延遲,內(nèi)存擴展芯片無法預(yù)測下一條命令會在何時到達。
為保證數(shù)據(jù)正確性,需要為每一個處理中的事務(wù)建立一條記錄,維護其狀態(tài)和處理時占用的資源。針對未完成的請求,事務(wù)處理緩沖模塊維護一個事務(wù)信息表(transaction info table, TIT),TIT記錄了每一個訪存命令的狀態(tài),根據(jù)其對應(yīng)表項,確定每個DDR命令的返回數(shù)據(jù)。
傳統(tǒng)內(nèi)存一直被DDR協(xié)議的讀寫時序限定成一種簡單、被動的裝置,缺乏有效的擴充功能的手段。如上節(jié)所述,應(yīng)用2次訪存的方法后,處理器將單一的讀寫請求拆分為異步傳輸?shù)腄DR讀寫命令序列,內(nèi)存擴展芯片按照每一條事務(wù)記錄的狀態(tài),響應(yīng)訪存請求。該方法同樣適用于實現(xiàn)復雜訪存指令。為了區(qū)別于常規(guī)的讀寫請求,處理器可以為每一種類別的復雜訪存指令設(shè)定特殊的訪存地址,則內(nèi)存擴展芯片根據(jù)訪存地址即可判斷復雜訪存指令類別,并啟動相應(yīng)的狀態(tài)機響應(yīng)請求。
為實現(xiàn)訪存指令的擴展,內(nèi)存擴展芯片還需要完成復雜訪存指令的解析和處理。為此,在事務(wù)處理緩沖模塊中設(shè)置了一個簡單的可編程事務(wù)處理單元(transaction processing unit, TPU),用以解析和處理復雜訪存指令[14]。
TPU將一條復雜指令看作一個需完整執(zhí)行的事務(wù),也就是在當前事務(wù)完成前不接收其他指令。這樣設(shè)計的好處是,事務(wù)處理單元一旦啟動一條復雜指令的處理,就可以按照一個預(yù)先設(shè)定好的流程進行,期間無需考慮其他訪存請求的干擾,功能簡單,易于硬件實現(xiàn)。若要支持同時處理多條復雜指令,只需支持事務(wù)級的并行,即硬件實例化多個事務(wù)處理單元,簡單方便。
目前實現(xiàn)的版本中,內(nèi)存擴展芯片支持的復雜訪存指令,包括內(nèi)存拷貝(memcpy)、預(yù)取讀(prefetch)、沖刷寫(flush)、分散聚集讀寫(scatter-gather)、清除(clear)、原子加(atom-add)、測試并置位(test & set)、比較并交換(compare & swap)。
上述復雜訪存操作在主流計算機系統(tǒng)中經(jīng)常使用,往往由處理器維護一個訪存指令序列,序列中每一條指令的處理都要處理器讀源數(shù)據(jù)或?qū)懭肽康臄?shù)據(jù),數(shù)據(jù)經(jīng)由復雜存儲層次進出處理器。但在內(nèi)存擴展芯片中增加TPU后,處理器僅需將復雜訪存指令處理所需的信息,用一個DDR寫命令寫入特殊的訪存地址,然后在一段時間之后,用一個DDR讀命令獲取該地址的響應(yīng)信息即可。對指令序列的解析和處理,全部交由TPU完成,避免處理器大量讀寫動作,從而提高帶寬利用率,降低數(shù)據(jù)進出處理器的功耗。
內(nèi)存擴展芯片基于DDR總線實現(xiàn)了異步傳輸訪存請求,支持新型內(nèi)存可變的訪問延遲,其代價是增加了單條訪存指令的訪問延遲。但是當訪存指令序列批量傳輸時,仍有可能通過優(yōu)化訪存請求序列,或應(yīng)用預(yù)取、分散聚集讀寫等復雜訪存指令,實現(xiàn)批量訪存請求的加速。
為此,在事務(wù)處理緩沖模塊中,增加了命令調(diào)度模塊,以調(diào)度所有訪存請求并轉(zhuǎn)發(fā)給內(nèi)存控制器。同時,增加了一個以64字節(jié)為單位的內(nèi)部RAM作為行緩存(讀寫位寬是標準的DDR突發(fā)長度),以存儲從內(nèi)存中讀入的數(shù)據(jù),加速處理器端的訪問請求。
本文基于DDR3 SDRAM標準內(nèi)存接口,設(shè)計內(nèi)存擴展芯片,命名為Memory Extension Chip,可用于內(nèi)存加速和內(nèi)存擴展。芯片內(nèi)部結(jié)構(gòu)如圖2 所示,其中DDR從設(shè)備部分按照DDR協(xié)議讀寫時序響應(yīng)訪存請求,事務(wù)處理緩沖部分實現(xiàn)讀寫事務(wù)異步傳輸以及復雜訪存指令擴展。
圖2 內(nèi)存擴展芯片內(nèi)部結(jié)構(gòu)圖
內(nèi)存擴展芯片除上述功能模塊外,為方便測試和調(diào)試,片內(nèi)集成了一個單發(fā)射32位結(jié)構(gòu)的GS132處理器核,一個反向DDR3的PHY(物理層)控制器,一個SPI(串行外設(shè)接口)控制器,一個UART(串口)控制器。另外,還包含一個用于控制測試信號的寄存器測試模塊。
整個芯片工作流程如下,芯片接收DDR3命令及數(shù)據(jù),然后經(jīng)過緩沖,發(fā)送相應(yīng)的訪存命令及數(shù)據(jù)到標準內(nèi)存條;從標準內(nèi)存條返回的數(shù)據(jù)存放在緩沖中,下次DDR訪問命令到達后直接返回結(jié)果。該過程中內(nèi)存擴展芯片可以進行重發(fā)送操作,從而實現(xiàn)內(nèi)存加速功能。
基于DDR3 SDRAM標準接口的內(nèi)存擴展芯片,采用中芯國際40 nm工藝,經(jīng)流片得到芯片基本信息如表1 所示。芯片正常工作表面溫度區(qū)間為-40~85 ℃。
表1 內(nèi)存擴展芯片基本信息
內(nèi)存擴展芯片板卡如圖3 所示。其底部可以直接插入標準內(nèi)存插槽,頂部可連接標準內(nèi)存條。中間方框部分為內(nèi)存擴展芯片。
圖3 內(nèi)存擴展芯片板卡
本文主要驗證DDR從設(shè)備和事務(wù)處理緩沖兩部分的功能,因此當前芯片版本未選用新型NVM內(nèi)存。如果要連接新型內(nèi)存,只要適配專門的控制器和總線接口即可。
芯片測試在龍芯3A2000主板進行,主頻950 MHz,測試平臺如圖4 所示,共占用2個內(nèi)存通道(memory channel,MC),MC1槽和MC0槽都是靠近風扇的通道。其中MC1槽插入標準2 GB內(nèi)存條,用于啟動操作系統(tǒng);MC0槽插入內(nèi)存擴展芯片子卡,有4 GB尋址空間,子卡上又插了4 GB標準內(nèi)存條,作為2次訪存操作的實際內(nèi)存。過程監(jiān)控裝置(Process Monitor, PMON) 為閃存芯片,存儲3A2000開機啟動時的BIOS源碼。
圖4 龍芯3A2000測試平臺
測試結(jié)果表明,在DDR3-1066頻率下,內(nèi)存擴展芯片的全部邏輯模塊功能正確,運行穩(wěn)定。性能評估結(jié)果如表2~表5所示。
表2列出了內(nèi)存擴展芯片單次訪存請求獲取正確數(shù)據(jù)的延遲。在大量(大于5 000次)隨機讀請求測試下,單個讀請求的平均延遲時間約為400 ns。在大量連續(xù)地址訪存時,單個讀請求的平均延遲時間小于100 ns。在2次訪存機制下,單個讀請求需連續(xù)讀取同一地址,而內(nèi)存控制器處理相同地址的連續(xù)讀間隔要遠大于不同地址的連續(xù)讀間隔。因此,讀請求并行執(zhí)行可以降低平均延遲。經(jīng)測試,當并行度為4時,單個讀請求的平均延遲為300 ns。
因2次訪存機制,內(nèi)存擴展芯片單個讀請求的平均延遲大于標準DDR3 SDRAM讀延遲。但相比PCIe接口約800 ns的延遲,內(nèi)存擴展芯片約300 ns的讀延遲仍有優(yōu)勢。
表2 單個讀請求平均延遲
Random Access是高性能計算挑戰(zhàn)基準(HPC challenge benchmark, HPCC) 中用于評測內(nèi)存隨機訪問性能的程序。它測量了計算機對隨機生成的內(nèi)存地址每秒可以進行多少次更新操作。測試數(shù)據(jù)量為1 GB,測試結(jié)果單位為每秒千兆更新(Giga-uPdates per second, GUPS)。內(nèi)存系統(tǒng)在訪存請求序列為大量隨機讀寫時,性能最差。因為針對大量訪存序列的優(yōu)化調(diào)度基本失效,而應(yīng)用2次訪存(twin-load)方法又會造成額外訪存開銷,導致性能下降。在測試時,軟件將標準測試程序中對目標數(shù)據(jù)元素的讀寫操作改為twin-load 2次訪存方式。如表3 所示,加入內(nèi)存擴展芯片后,隨機訪問性能僅能達到原系統(tǒng)的17%。但考慮到新型NVM內(nèi)存系統(tǒng)的讀延遲大約是DRAM的3~4倍,寫延遲更是大了一個數(shù)量級,因此內(nèi)存擴展芯片如果用于NVM擴展,即便在其性能最差的場景下,仍然不會成為系統(tǒng)的性能瓶頸。
表3 Random Access性能測試
應(yīng)用復雜訪存指令會提升訪存性能。在芯片設(shè)計中,scatter-gather一次讀操作可以讀出8個隨機64字節(jié)的數(shù)據(jù)。雖然在建立TIT(1次訪存)、配置TPU(1次訪存)和讀回數(shù)據(jù)(2次訪存)階段增加了訪存操作,但理論上仍然會有性能提升。為此,進行了數(shù)據(jù)量為1 GB的隨機讀測試,比較scatter-gather讀和使用本地內(nèi)存讀數(shù)據(jù)的效率,結(jié)果如表4所示,時間單位是時鐘周期數(shù)(T),加入內(nèi)存擴展芯片后,scatter-gather隨機訪問性能為原系統(tǒng)的2.32倍。
表4 Scatter-gather性能測試
復雜訪存指令在內(nèi)存擴展芯片上獨立執(zhí)行,有可能避免CPU大量數(shù)據(jù)的讀寫動作,從而提高帶寬的利用率。為此,進行了內(nèi)存拷貝(memcpy)帶寬測試,其功能為從源地址的起始位置開始,拷貝若干字節(jié)到目標地址中。結(jié)果如表5 所示,其中,基準(baseline)為處理器運行函數(shù)memcpy()訪問本地內(nèi)存;過芯片內(nèi)存拷貝(Chip_memcpy)為加入內(nèi)存擴展芯片后,處理器向芯片發(fā)送內(nèi)存拷貝復雜指令訪問內(nèi)存,數(shù)據(jù)不經(jīng)過CPU和高速緩存。在基準情況下,分別測試了8 kB、128 kB、1 MB、4 MB、32 MB、256 MB等多種數(shù)據(jù)量的帶寬,隨數(shù)據(jù)量增加,帶寬會有所下降,達到32 MB數(shù)據(jù)量以后,帶寬趨于穩(wěn)定。這是高速緩沖(cache)容量有限導致的。而在過芯片內(nèi)存拷貝時,帶寬基本不受數(shù)據(jù)量影響。表5中基準選擇穩(wěn)定帶寬測試結(jié)果,過芯片內(nèi)存拷貝選擇4MB帶寬測試結(jié)果,可見利用芯片加速內(nèi)存拷貝可以將性能提升67%。
表5 Memcpy性能測試
本文基于現(xiàn)有的DDR協(xié)議,設(shè)計實現(xiàn)了內(nèi)存擴展芯片,在滿足DDR總線標準時序要求的同時,支持可變延遲的擴展內(nèi)存訪問,支持訪存加速指令的擴展,實現(xiàn)了為內(nèi)存端增加智能性,可用于內(nèi)存加速和內(nèi)存擴展。經(jīng)過測試驗證,該芯片邏輯功能正確,運行穩(wěn)定。在DDR3-1066頻率下,該芯片可滿足標準DDR3 SDRAM讀寫時序,并在龍芯3A系列主板上順利啟動Linux內(nèi)核。其性能評估結(jié)果為,單次訪存請求獲取正確數(shù)據(jù)的平均延遲約為300 ns。增加內(nèi)存擴展芯片后,隨機訪問性能可達到原系統(tǒng)的17%。在應(yīng)用復雜指令訪存后,隨機訪問性能則可達原系統(tǒng)的2.32倍。與系統(tǒng)函數(shù)實現(xiàn)軟件內(nèi)存拷貝相比,內(nèi)存擴展芯片獨立執(zhí)行內(nèi)存拷貝,帶寬可達其1.67倍。
內(nèi)存擴展芯片主要面向數(shù)據(jù)中心領(lǐng)域應(yīng)用,板卡通過連接標準內(nèi)存插槽,可以方便地接入系統(tǒng)。未來的工作可以修改更多應(yīng)用程序,將讀寫事務(wù)分解為內(nèi)存擴展芯片可以識別的復雜訪存序列,以使用內(nèi)存擴展芯片的加速功能;進一步擴展復雜訪存指令,以提升內(nèi)存智能性;適配新的控制器和總線接口,以連接新型內(nèi)存。