在第七屆云計(jì)算大會(huì)的PMC技術(shù)專(zhuān)場(chǎng)上演講嘉賓連續(xù)進(jìn)行了七場(chǎng)技術(shù)演講,其中,PMC數(shù)據(jù)中心存儲(chǔ)架構(gòu)師張冬沒(méi)有過(guò)多談?wù)撌袌?chǎng)和行業(yè)問(wèn)題,而是從底層技術(shù)出發(fā),對(duì)OpenPowerCAPI進(jìn)行了分析和闡述,為我們介紹了CAPI為什么能這么快。
之前,POWER CPU只是IBM在做小型機(jī)的時(shí)候使用,OpenPOWER開(kāi)放后,成立了OpenPower基金會(huì),基金會(huì)大部分成員都非常專(zhuān)注于CAPI(相干加速器處理器接口)上的利用,比如將外置的網(wǎng)絡(luò)、GPU、閃存等設(shè)備通過(guò)CAPI直接與CPU相連接,并在此基礎(chǔ)上根據(jù)不同的主流應(yīng)用場(chǎng)景進(jìn)行開(kāi)放的、定制化的系統(tǒng)設(shè)計(jì),PMC除了關(guān)注這些外,還關(guān)注CAPI與NVMe進(jìn)行協(xié)作的問(wèn)題。
傳統(tǒng)架構(gòu)的缺點(diǎn)和瓶頸
現(xiàn)在無(wú)論是2路、4路、8路還是32路服務(wù)器,他們架構(gòu)中的CPU之間的互聯(lián)有的是直聯(lián),有的通過(guò)NC(NC就類(lèi)似以太網(wǎng)絡(luò)里面的網(wǎng)橋)。核心之間要傳輸數(shù)據(jù)方式中,最高效的是共享內(nèi)存,代碼里寫(xiě)死。最低效的方法就是走網(wǎng)絡(luò),封裝一堆的包出去,發(fā)送一個(gè)數(shù)據(jù)給遠(yuǎn)端的某個(gè)線程,調(diào)用一堆接口,走到協(xié)議棧,再到設(shè)備驅(qū)動(dòng),然后到網(wǎng)絡(luò),接著收包解析,這個(gè)過(guò)程非常慢。所以超級(jí)計(jì)算機(jī)沒(méi)法做到CPU之間進(jìn)行高速網(wǎng)絡(luò)共享內(nèi)存因?yàn)槌杀咎?,沒(méi)法將幾萬(wàn)個(gè)CPU連接起來(lái),只能走網(wǎng)絡(luò)了,這也是松耦合系統(tǒng)的一個(gè)妥協(xié)。
沒(méi)有CAPI的FPGA為什么也不太行
面對(duì)現(xiàn)在大數(shù)據(jù)分析、模式匹配、熱點(diǎn)識(shí)別等,要求非常大的計(jì)算量,傳統(tǒng)CPU出現(xiàn)瓶頸。普通的CPU其實(shí)也能計(jì)算,但是計(jì)算速度太慢,比如,只有64位寬來(lái)處理1GB數(shù)據(jù),那便需要循環(huán)拆分N次才能算完,普通的CPU無(wú)法迅速處理這么大的運(yùn)算量。
在多路CPU系統(tǒng)中,線程看到的都是單一的虛擬地址空間,這個(gè)虛擬地址空間會(huì)被操作系統(tǒng)映射到真實(shí)的物理空間里,但是所有的CPU看到都是同一份物理地址空間。
所有CPU看到單一物理地址空間;
所有Threads看到單一虛擬地址空間;
PCIE物理地址空間映射到CPU物理地址空間;
CPU物理地址空間也映射到PCIE物理地址空間。
有人想到硬件加速,做法就是把某個(gè)專(zhuān)業(yè)計(jì)算在電路層面展開(kāi),展開(kāi)成更寬的位寬,更多的并行計(jì)算單元,去除一些不必要的緩存優(yōu)化和流水線優(yōu)化等,其實(shí)這就是專(zhuān)用運(yùn)算芯片所做的,F(xiàn)PGA(Field-ProgrammableGate Array,即現(xiàn)場(chǎng)可編程門(mén)陣列)是現(xiàn)場(chǎng)可編程的專(zhuān)用芯片上述就是所謂的硬加速。
在CAPI之前的FPGA怎么接入系統(tǒng)使用的呢?它是把FPGA做到一塊PCIe卡里,F(xiàn)PGA通過(guò)CPU的PCIe控制器訪問(wèn)到主機(jī)內(nèi)存空間。PCIe和CPU各自有各自的地址空間,CPU不能直接訪問(wèn)PCIe的地址,要先訪問(wèn)自己的地址,PCIE物理地址空間映射到CPU物理地址空間,反之CPU物理地址空間也需要映射到PCIE物理地址空間,這是個(gè)很費(fèi)勁的過(guò)程。
在CAPI之前的FPGA怎么接入系統(tǒng)使用的呢?它是把FPGA做到一塊PCIe卡里,F(xiàn)PGA通過(guò)CPU的PCIe控制器訪問(wèn)到主機(jī)內(nèi)存空間。PCIe和CPU各自有各自的地址空間,CPU不能直接訪問(wèn)PCIe的地址,要先訪問(wèn)自己的地址,PCIE物理地址空間映射到CPU物理地址空間,反之CPU物理地址空間也需要映射到PCIE物理地址空間,這是個(gè)很費(fèi)勁的過(guò)程。
數(shù)據(jù)出了ALU,面對(duì)復(fù)雜的路由網(wǎng)絡(luò),目的地址為內(nèi)存地址,但是其相對(duì)外部網(wǎng)絡(luò)的復(fù)雜性在于,目標(biāo)的位置是不固定的,還可能有多份拷貝。Need Coherency!硬件透明搞定Cache Coherency。CC不負(fù)責(zé)多線程并發(fā)訪問(wèn)cache line時(shí)的互斥,互斥需要程序顯式發(fā)出lock,底層硬件會(huì)鎖住總線訪問(wèn)周期。
如圖所示是個(gè)四核CPU,每個(gè)CPU內(nèi)部還有很多東西,每一個(gè)CPU的每個(gè)核心都有各自的緩存控制器,三級(jí)緩存控制器,每個(gè)CPU還包含內(nèi)存控制器,PCIe控制器,QPI控制器(互聯(lián)CPU相關(guān)),還有緩存一致性的控制器,他們?nèi)冀尤胍粋€(gè)高速的總線里面。多個(gè)線程看到的數(shù)據(jù)應(yīng)該是時(shí)刻一致的,需要廣播許多信息,這就是CacheCoherency,Cache Coherency Agent 負(fù)責(zé)把消息推送出去以及接受其他CPU發(fā)出的探尋。
多CPU之間廣播量非常大,所以需要一個(gè)目錄來(lái)記錄本地的核心里面都有哪些緩存地址被緩存下來(lái)了。其他的CPU如果發(fā)廣播來(lái)探尋,本地直接把目錄查一下,如果沒(méi)有命中緩存就直接不再往后端核心緩存控制器發(fā)消息,這樣可以提升性能。所以說(shuō)CC(Cache Coherency)很重要的,要確保線程看到同樣的東西,同一個(gè)時(shí)刻,這叫實(shí)時(shí)一致性,且不允許異步。但是它不負(fù)責(zé)兩個(gè)線程,如果互相都在寫(xiě)這份數(shù)據(jù),會(huì)出現(xiàn)相互覆蓋,這要靠(CacheConsistancy)軟件解決。PCIe寫(xiě)內(nèi)存也需要做CC(Cache Coherency),寫(xiě)入數(shù)據(jù)到某一地址,這個(gè)地址在其他的CPU緩存里,要把它作廢掉。
在把FPGA做在一張PCIe卡上,PCIe卡總線接到CPU的情況下,PCIe要做哪些工作呢?
PCIe設(shè)備與CPU交互
BusDriver將PCIE設(shè)備地址空間映射到CPU物理地址空間并將PCIE地址空間寫(xiě)入PCIE設(shè)備寄存器;
HostDriver讀出PCIE設(shè)備寄存器獲取該設(shè)備對(duì)應(yīng)的PCIE物理地址空間并ioremap()到內(nèi)核虛擬地址空間;
HostDriver 申請(qǐng)DMA緩存并向PCIE設(shè)備映射的虛擬地址空間寫(xiě)入控制字、基地址等,這些信息便被寫(xiě)入設(shè)備寄存器,從而觸發(fā)PCIE設(shè)備根據(jù)基地址從主存DMA拿到需要的指令和數(shù)據(jù)后進(jìn)行處理;
PCIE設(shè)備對(duì)主存DMA時(shí),RC自動(dòng)執(zhí)行Probe操作以保證Cache Coherency。
按照上面的過(guò)程走下來(lái),缺點(diǎn)非常明顯:
首先執(zhí)行路徑長(zhǎng)而且全軟件參與:應(yīng)用call、傳輸協(xié)議棧、Host驅(qū)動(dòng)、PCIe設(shè)備、DMA、中斷服務(wù)、Host驅(qū)動(dòng)、傳輸協(xié)議棧(如有)、應(yīng)用buffer。
再就是PCIE設(shè)備和CPU看到不同的物理地址空間,RC進(jìn)行映射和轉(zhuǎn)換。驅(qū)動(dòng)程序申請(qǐng)內(nèi)存之后得用pci_map_single()映射成PCIE物理地址。雖然對(duì)于諸如Intel體系下,兩個(gè)空間映射成一樣的地址,但是仍需要在軟件里做映射,這對(duì)性能有一定的影響。
另外,用戶(hù)態(tài)程序必須主動(dòng)從內(nèi)核地址空間mmap()才可以直接與PCIE設(shè)備DMA互傳數(shù)據(jù)。用戶(hù)態(tài)程序必須區(qū)分不同的地址段,要分清哪一塊內(nèi)存是DMA映射的,哪一塊是自己私有的的。
最后,F(xiàn)PGA上不能有Cache(緩存),F(xiàn)PGA自己可以有自己的Cache,但是不能把主存里的數(shù)據(jù)放在自己這邊,每次訪問(wèn)內(nèi)存都要用復(fù)雜的過(guò)程訪問(wèn)主存里,這也是一個(gè)關(guān)鍵的缺點(diǎn)。
所以我們看到為了讓FPGA做一件事,進(jìn)行了太多操作,開(kāi)銷(xiāo)很大,很費(fèi)時(shí)間,這需要?jiǎng)e的技術(shù)來(lái)解決之。
有了CAPI的FPGA是怎么做的?
首先認(rèn)識(shí)一下這個(gè)體系里的三個(gè)角色:
AFU(Acceleration Function Unit),主加速邏輯部分就是FPAG的加速芯片,用戶(hù)可以把自己的加速邏輯和Firmware寫(xiě)進(jìn)去。
PSL—Power Service Layer,提供接口給AFU用于讀寫(xiě)主存和V2P地址翻譯(與CPU側(cè)使用同一個(gè)頁(yè)表,并包含TLB),同時(shí)負(fù)責(zé)Probe CAPP實(shí)現(xiàn)全局cc,并提供Cache。PSL由IBM作為硬核IP提供給FPGA開(kāi)發(fā)者。
CAPP—Coherent Attached Processor Proxy,相當(dāng)于FPGA側(cè)的ccAgent,但是被放在了CPU側(cè),其維護(hù)一個(gè)filter目錄并接受來(lái)自其他CPU的Probe,未過(guò)濾掉的Probe轉(zhuǎn)發(fā)PSL。
操作要點(diǎn)可以簡(jiǎn)要的概括為以下6點(diǎn):
針對(duì)專(zhuān)用場(chǎng)景、PCIE專(zhuān)用加速卡進(jìn)行優(yōu)化;
FPGA直接訪問(wèn)當(dāng)前進(jìn)程的全部虛擬地址空間,無(wú)需轉(zhuǎn)成PCIE地址;
加速卡上可以使用Cache并通過(guò)CAPP的Probe操作自動(dòng)與主存cc;
加速卡與CPU看到同樣的地址空間并且cc;
提供API,包括打開(kāi)設(shè)備、傳遞任務(wù)描述信息等,相當(dāng)于驅(qū)動(dòng)程序;
PSL由IBM提供,硬核IP。AFU通過(guò)opcode及地址控制PSL收發(fā)數(shù)據(jù)。
在此過(guò)程中,CAPI致力于把FPGA當(dāng)成CPU的對(duì)等端,但這是一個(gè)特殊的CPU,對(duì)計(jì)算加速非常快的,非常高效的一個(gè)CPU。優(yōu)勢(shì)在于:兩邊看到了一樣的地址空間,F(xiàn)PGA看到的不再是PCIe空間了,所以就省去了映射地址這一環(huán)節(jié)。再就是FPGA一側(cè)可以有Cache,可以緩存主存里的數(shù)據(jù),而且Cache是與主存一致的。
現(xiàn)在FPGA可直接訪問(wèn)主存空間,但它不會(huì)訪問(wèn)所有的物理空間,因?yàn)镃API 1.0每個(gè)時(shí)刻只能給一個(gè)進(jìn)程來(lái)用,CAPI會(huì)為進(jìn)程會(huì)提供一個(gè)接口,打開(kāi)FPGA之后發(fā)數(shù)據(jù)和指令。CAPI 2.0會(huì)讓FPGA有一個(gè)分時(shí)復(fù)用機(jī)制,比如,每10毫秒跳一個(gè)線程,但是當(dāng)前的FPGA不具備這個(gè)功能,只能是誰(shuí)用誰(shuí)打開(kāi)。誰(shuí)打開(kāi)了FPGA就看到誰(shuí)的虛擬空間。有了這種機(jī)制以后就不需要映射了,再就是可以直接訪問(wèn)內(nèi)存地址了。還有Cache,基本就融入了所有的CPU了,就是一個(gè)對(duì)等、對(duì)稱(chēng)的關(guān)系。
性能能提高多少?
硬件配置是這樣的:
IBM Power8 Server, S822L
Ubuntu, kernel 3.18.0-14-generic
Nallatech 385 CAPI card
Samsung SM1715 1.6TB NVM ExpressSSD
測(cè)試時(shí),?PMC工程師用FPGA制作了一個(gè)文本搜索引擎,如上圖。
測(cè)試過(guò)程中,Host端主程序從NVMe SSD讀入數(shù)據(jù),并生成任務(wù)描述鏈表,?AFU采用pooling的方式訪問(wèn)主存獲取任務(wù)描述鏈表并執(zhí)行搜索任務(wù),Snooper用來(lái)debug和性能監(jiān)控。
性能 – P8<->AFU
當(dāng)隊(duì)列深度60時(shí)的時(shí)候,獲得一個(gè)極限吞吐量,接近6GB/s的帶寬,帶寬非常大。
CAPI1.0暫時(shí)做不到的事情
現(xiàn)在CPU的線程看不到AFU上的地址空間(MMIO控制寄存器地址除外)。而且,AFU只能給一個(gè)進(jìn)程使用。如果未來(lái)可以把FPGA直接接入CPU的FSB,是不是會(huì)更快?
延時(shí)也很小,只有1.5微秒,平均90%讀寫(xiě)在1.5微秒完成。
張冬,《大話存儲(chǔ)》系列圖書(shū)作者,PMC公司數(shù)據(jù)中心存儲(chǔ)架構(gòu)師。張冬先生是《大話存儲(chǔ)》系列圖書(shū)作者,該書(shū)屢次獲獎(jiǎng),包括2008年十大IT暢銷(xiāo)書(shū)排名第一,2009年全國(guó)技術(shù)品種暢銷(xiāo)書(shū)。張冬在存儲(chǔ)領(lǐng)域有多年的從業(yè)經(jīng)驗(yàn),主持并參與過(guò)多項(xiàng)創(chuàng)新存儲(chǔ)技術(shù)的設(shè)計(jì)。
評(píng)論
查看更多