在把FPGA做在一張PCIe卡上,PCIe卡總線接到CPU的情況下,PCIe要做哪些工作呢?
PCIe設備與CPU交互
BusDriver將PCIE設備地址空間映射到CPU物理地址空間并將PCIE地址空間寫入PCIE設備寄存器;
HostDriver讀出PCIE設備寄存器獲取該設備對應的PCIE物理地址空間并ioremap()到內核虛擬地址空間;
HostDriver 申請DMA緩存并向PCIE設備映射的虛擬地址空間寫入控制字、基地址等,這些信息便被寫入設備寄存器,從而觸發PCIE設備根據基地址從主存DMA拿到需要的指令和數據后進行處理;
PCIE設備對主存DMA時,RC自動執行Probe操作以保證Cache Coherency。
按照上面的過程走下來,缺點非常明顯:
首先執行路徑長而且全軟件參與:應用call、傳輸協議棧、Host驅動、PCIe設備、DMA、中斷服務、Host驅動、傳輸協議棧(如有)、應用buffer。
再就是PCIE設備和CPU看到不同的物理地址空間,RC進行映射和轉換。驅動程序申請內存之后得用pci_map_single()映射成PCIE物理地址。雖然對于諸如Intel體系下,兩個空間映射成一樣的地址,但是仍需要在軟件里做映射,這對性能有一定的影響。
另外,用戶態程序必須主動從內核地址空間mmap()才可以直接與PCIE設備DMA互傳數據。用戶態程序必須區分不同的地址段,要分清哪一塊內存是DMA映射的,哪一塊是自己私有的的。
最后,FPGA上不能有Cache(緩存),FPGA自己可以有自己的Cache,但是不能把主存里的數據放在自己這邊,每次訪問內存都要用復雜的過程訪問主存里,這也是一個關鍵的缺點。
所以我們看到為了讓FPGA做一件事,進行了太多操作,開銷很大,很費時間,這需要別的技術來解決之。
有了CAPI的FPGA是怎么做的?
首先認識一下這個體系里的三個角色:
AFU(Acceleration Function Unit),主加速邏輯部分就是FPAG的加速芯片,用戶可以把自己的加速邏輯和Firmware寫進去。
PSL—Power Service Layer,提供接口給AFU用于讀寫主存和V2P地址翻譯(與CPU側使用同一個頁表,并包含TLB),同時負責Probe CAPP實現全局cc,并提供Cache。PSL由IBM作為硬核IP提供給FPGA開發者。
CAPP—Coherent Attached Processor Proxy,相當于FPGA側的ccAgent,但是被放在了CPU側,其維護一個filter目錄并接受來自其他CPU的Probe,未過濾掉的Probe轉發PSL。
操作要點可以簡要的概括為以下6點:
針對專用場景、PCIE專用加速卡進行優化;
FPGA直接訪問當前進程的全部虛擬地址空間,無需轉成PCIE地址;
加速卡上可以使用Cache并通過CAPP的Probe操作自動與主存cc;
加速卡與CPU看到同樣的地址空間并且cc;
提供API,包括打開設備、傳遞任務描述信息等,相當于驅動程序;
PSL由IBM提供,硬核IP。AFU通過opcode及地址控制PSL收發數據。
在此過程中,CAPI致力于把FPGA當成CPU的對等端,但這是一個特殊的CPU,對計算加速非??斓?,非常高效的一個CPU。優勢在于:兩邊看到了一樣的地址空間,FPGA看到的不再是PCIe空間了,所以就省去了映射地址這一環節。再就是FPGA一側可以有Cache,可以緩存主存里的數據,而且Cache是與主存一致的。
現在FPGA可直接訪問主存空間,但它不會訪問所有的物理空間,因為CAPI 1.0每個時刻只能給一個進程來用,CAPI會為進程會提供一個接口,打開FPGA之后發數據和指令。CAPI 2.0會讓FPGA有一個分時復用機制,比如,每10毫秒跳一個線程,但是當前的FPGA不具備這個功能,只能是誰用誰打開。誰打開了FPGA就看到誰的虛擬空間。有了這種機制以后就不需要映射了,再就是可以直接訪問內存地址了。還有Cache,基本就融入了所有的CPU了,就是一個對等、對稱的關系。
性能能提高多少?
硬件配置是這樣的:
IBM Power8 Server, S822L
Ubuntu, kernel 3.18.0-14-generic
Nallatech 385 CAPI card
Samsung SM1715 1.6TB NVM ExpressSSD
評論