張冬:OpenPOWER CAPI爲什麼這麼快?(一)



張冬:OpenPOWER CAPI爲什麼這麼快?(一)

PMC公司數據中心存儲架構師張冬

     張冬,《大話存儲》系列圖書作者,PMC公司數據中心存儲架構師。張冬先生是《大話存儲》系列圖書作者,該書屢次獲獎,包括2008年十大IT暢銷書排名第一,2009年全國技術品種暢銷書。張冬在存儲領域有多年的從業經驗,主持並參與過多項創新存儲技術的設計。


       在第七屆雲計算大會的PMC技術專場上演講嘉賓連續進行了七場技術演講,其中,PMC數據中心存儲架構師張冬沒有過多談論市場和行業問題,而是從底層技術出發,對OpenPowerCAPI進行了分析和闡述,爲我們介紹了CAPI爲什麼能這麼快。

       之前,POWER CPU只是IBM在做小型機的時候使用,OpenPOWER開放後,成立了OpenPower基金會,基金會大部分成員都非常專注於CAPI(相干加速器處理器接口)上的利用,比如將外置的網絡、GPU、閃存等設備通過CAPI直接與CPU相連接,並在此基礎上根據不同的主流應用場景進行開放的、定製化的系統設計,PMC除了關注這些外,還關注CAPINVMe進行協作的問題。

傳統架構的缺點和瓶頸

      現在無論是2路、4路、8路還是32路服務器,他們架構中的CPU之間的互聯有的是直聯,有的通過NCNC就類似以太網絡裏面的網橋)。核心之間要傳輸數據方式中,最高效的是共享內存,代碼裏寫死。最低效的方法就是走網絡,封裝一堆的包出去,發送一個數據給遠端的某個線程,調用一堆接口,走到協議棧,再到設備驅動,然後到網絡,接着收包解析,這個過程非常慢。所以超級計算機沒法做到CPU之間進行高速網絡共享內存因爲成本太高,沒法將幾萬個CPU連接起來,只能走網絡了,這也是松耦合系統的一個妥協。

沒有CAPIFPGA爲什麼也不太行

      面對現在大數據分析、模式匹配、熱點識別等,要求非常大的計算量,傳統CPU出現瓶頸。普通的CPU其實也能計算,但是計算速度太慢,比如,只有64位寬來處理1GB數據,那便需要循環拆分N次才能算完,普通的CPU無法迅速處理這麼大的運算量。

 

       在多路CPU系統中,線程看到的都是單一的虛擬地址空間,這個虛擬地址空間會被操作系統映射到真實的物理空間裏,但是所有的CPU看到都是同一份物理地址空間

  • 所有CPU看到單一物理地址空間;

  • 所有Threads看到單一虛擬地址空間;

  • PCIE物理地址空間映射到CPU物理地址空間;

  • CPU物理地址空間也映射到PCIE物理地址空間。

       有人想到硬件加速,做法就是把某個專業計算在電路層面展開,展開成更寬的位寬,更多的並行計算單元,去除一些不必要的緩存優化和流水線優化等,其實這就是專用運算芯片所做的,FPGAFieldProgrammableGate Array,即現場可編程門陣列)是現場可編程的專用芯片上述就是所謂的硬加速。

      CAPI之前的FPGA怎麼接入系統使用的呢?它是把FPGA做到一塊PCIe卡里,FPGA通過CPUPCIe控制器訪問到主機內存空間。PCIeCPU各自有各自的地址空間,CPU不能直接訪問PCIe的地址,要先訪問自己的地址,PCIE物理地址空間映射到CPU物理地址空間,反之CPU物理地址空間也需要映射到PCIE物理地址空間,這是個很費勁的過程。


       CAPI之前的FPGA怎麼接入系統使用的呢?它是把FPGA做到一塊PCIe卡里,FPGA通過CPUPCIe控制器訪問到主機內存空間。PCIeCPU各自有各自的地址空間,CPU不能直接訪問PCIe的地址,要先訪問自己的地址,PCIE物理地址空間映射到CPU物理地址空間,反之CPU物理地址空間也需要映射到PCIE物理地址空間,這是個很費勁的過程。

      數據出了ALU,面對複雜的路由網絡,目的地址爲內存地址,但是其相對外部網絡的複雜性在於,目標的位置是不固定的,還可能有多份拷貝。Need Coherency!硬件透明搞定Cache CoherencyCC不負責多線程併發訪問cache line時的互斥,互斥需要程序顯式發出lock,底層硬件會鎖住總線訪問週期。

      如圖所示是個四核CPU,每個CPU內部還有很多東西,每一個CPU的每個核心都有各自的緩存控制器,三級緩存控制器,每個CPU還包含內存控制器,PCIe控制器,QPI控制器(互聯CPU相關),還有緩存一致性的控制器,他們全都接入一個高速的總線裏面。多個線程看到的數據應該是時刻一致的,需要廣播許多信息,這就是CacheCoherencyCache Coherency Agent 負責把消息推送出去以及接受其他CPU發出的探尋。

      CPU之間廣播量非常大,所以需要一個目錄來記錄本地的核心裏面都有哪些緩存地址被緩存下來了。其他的CPU如果發廣播來探尋,本地直接把目錄查一下,如果沒有命中緩存就直接不再往後端核心緩存控制器發消息,這樣可以提升性能。所以說CCCache Coherency)很重要的,要確保線程看到同樣的東西,同一個時刻,這叫實時一致性,且不允許異步。但是它不負責兩個線程,如果互相都在寫這份數據,會出現相互覆蓋,這要靠(CacheConsistancy)軟件解決。PCIe寫內存也需要做CCCache Coherency),寫入數據到某一地址,這個地址在其他的CPU緩存裏,要把它作廢掉。

      在把FPGA做在一張PCIe卡上,PCIe卡總線接到CPU的情況下,PCIe要做哪些工作呢?

PCIe設備與CPU交互

  • BusDriverPCIE設備地址空間映射到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做一件事,進行了太多操作,開銷很大,很費時間,這需要別的技術來解決之。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章