在把FPGA做在一張PCIe卡上,PCIe卡總線接到CPU的情況下,PCIe要做哪些工作呢?
PCIe設(shè)備與CPU交互
BusDriver將PCIE設(shè)備地址空間映射到CPU物理地址空間并將PCIE地址空間寫入PCIE設(shè)備寄存器;
HostDriver讀出PCIE設(shè)備寄存器獲取該設(shè)備對(duì)應(yīng)的PCIE物理地址空間并ioremap()到內(nèi)核虛擬地址空間;
HostDriver 申請(qǐng)DMA緩存并向PCIE設(shè)備映射的虛擬地址空間寫入控制字、基地址等,這些信息便被寫入設(shè)備寄存器,從而觸發(fā)PCIE設(shè)備根據(jù)基地址從主存DMA拿到需要的指令和數(shù)據(jù)后進(jìn)行處理;
PCIE設(shè)備對(duì)主存DMA時(shí),RC自動(dòng)執(zhí)行Probe操作以保證Cache Coherency。
按照上面的過程走下來,缺點(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ì)性能有一定的影響。
另外,用戶態(tài)程序必須主動(dòng)從內(nèi)核地址空間mmap()才可以直接與PCIE設(shè)備DMA互傳數(shù)據(jù)。用戶態(tài)程序必須區(qū)分不同的地址段,要分清哪一塊內(nèi)存是DMA映射的,哪一塊是自己私有的的。
最后,F(xiàn)PGA上不能有Cache(緩存),F(xiàn)PGA自己可以有自己的Cache,但是不能把主存里的數(shù)據(jù)放在自己這邊,每次訪問內(nèi)存都要用復(fù)雜的過程訪問主存里,這也是一個(gè)關(guān)鍵的缺點(diǎn)。
所以我們看到為了讓FPGA做一件事,進(jìn)行了太多操作,開銷很大,很費(fèi)時(shí)間,這需要?jiǎng)e的技術(shù)來解決之。
有了CAPI的FPGA是怎么做的?
首先認(rèn)識(shí)一下這個(gè)體系里的三個(gè)角色:
AFU(Acceleration Function Unit),主加速邏輯部分就是FPAG的加速芯片,用戶可以把自己的加速邏輯和Firmware寫進(jìn)去。
PSL—Power Service Layer,提供接口給AFU用于讀寫主存和V2P地址翻譯(與CPU側(cè)使用同一個(gè)頁表,并包含TLB),同時(shí)負(fù)責(zé)Probe CAPP實(shí)現(xiàn)全局cc,并提供Cache。PSL由IBM作為硬核IP提供給FPGA開發(fā)者。
CAPP—Coherent Attached Processor Proxy,相當(dāng)于FPGA側(cè)的ccAgent,但是被放在了CPU側(cè),其維護(hù)一個(gè)filter目錄并接受來自其他CPU的Probe,未過濾掉的Probe轉(zhuǎn)發(fā)PSL。
操作要點(diǎn)可以簡(jiǎn)要的概括為以下6點(diǎn):
針對(duì)專用場(chǎng)景、PCIE專用加速卡進(jìn)行優(yōu)化;
FPGA直接訪問當(dāng)前進(jìn)程的全部虛擬地址空間,無需轉(zhuǎn)成PCIE地址;
加速卡上可以使用Cache并通過CAPP的Probe操作自動(dòng)與主存cc;
加速卡與CPU看到同樣的地址空間并且cc;
提供API,包括打開設(shè)備、傳遞任務(wù)描述信息等,相當(dāng)于驅(qū)動(dòng)程序;
PSL由IBM提供,硬核IP。AFU通過opcode及地址控制PSL收發(fā)數(shù)據(jù)。
在此過程中,CAPI致力于把FPGA當(dāng)成CPU的對(duì)等端,但這是一個(gè)特殊的CPU,對(duì)計(jì)算加速非??斓模浅8咝У囊粋€(gè)CPU。優(yōu)勢(shì)在于:兩邊看到了一樣的地址空間,F(xiàn)PGA看到的不再是PCIe空間了,所以就省去了映射地址這一環(huán)節(jié)。再就是FPGA一側(cè)可以有Cache,可以緩存主存里的數(shù)據(jù),而且Cache是與主存一致的。
現(xiàn)在FPGA可直接訪問主存空間,但它不會(huì)訪問所有的物理空間,因?yàn)镃API 1.0每個(gè)時(shí)刻只能給一個(gè)進(jìn)程來用,CAPI會(huì)為進(jìn)程會(huì)提供一個(gè)接口,打開FPGA之后發(fā)數(shù)據(jù)和指令。CAPI 2.0會(huì)讓FPGA有一個(gè)分時(shí)復(fù)用機(jī)制,比如,每10毫秒跳一個(gè)線程,但是當(dāng)前的FPGA不具備這個(gè)功能,只能是誰用誰打開。誰打開了FPGA就看到誰的虛擬空間。有了這種機(jī)制以后就不需要映射了,再就是可以直接訪問內(nèi)存地址了。還有Cache,基本就融入了所有的CPU了,就是一個(gè)對(duì)等、對(duì)稱的關(guān)系。
性能能提高多少?
硬件配置是這樣的:
IBM Power8 Server, S822L
Ubuntu, kernel 3.18.0-14-generic
Nallatech 385 CAPI card
Samsung SM1715 1.6TB NVM ExpressSSD
評(píng)論
查看更多