張冬:OpenPOWER CAPI爲什麼這麼快?(二)
PMC公司數據中心存儲架構師張冬
有了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
測試時,ŸPMC工程師用FPGA製作了一個文本搜索引擎,如上圖。
測試過程中,Host端主程序從NVMe SSD讀入數據,並生成任務描述鏈表,ŸAFU採用pooling的方式訪問主存獲取任務描述鏈表並執行搜索任務,Snooper用來debug和性能監控。
性能 – P8<->AFU
當隊列深度60時的時候,獲得一個極限吞吐量,接近6GB/s的帶寬,帶寬非常大。
延時也很小,只有1.5微秒,平均90%讀寫在1.5微秒完成。
CAPI1.0暫時做不到的事情
現在CPU的線程看不到AFU上的地址空間(MMIO控制寄存器地址除外)。而且,AFU只能給一個進程使用。如果未來可以把FPGA直接接入CPU的FSB,是不是會更快?