彭福來,于治樓,陳乃闊,耿士華,李凱一
山東超越數控電子股份有限公司,山東省特種計算機重點實驗室,濟南 250104
現代社會信息量的暴增對計算機的計算性能提出了更高的要求,通過縱向提高CPU的處理性能已經遇到了制作工藝、功耗等技術瓶頸。大數據分析、機器學習、圖像與視頻處理、網絡安全等計算密集型領域需要計算能力強大的服務器來支撐,單純采用CPU來完成這些任務已經無法滿足性能要求。為了提高服務器的計算性能,業界通常采用GPU或FPGA等并行處理能力較強的器件作為硬件加速器,形成CPU+協處理器的異構計算系統來對計算密集型任務進行加速。GPU由于具有強大的并行計算能力,已被廣泛應用于圖像處理[1-2]、人工智能[3-5]、數據安全[6-8]等領域。
雖然使用GPU來加速計算任務能夠獲得極佳的加速性能,但是GPU的功耗較高,無法滿足一些空間、散熱條件不足的應用場景。而采用FPGA可以獲得較好的性能功耗比[9],因此許多學者研究利用FPGA來加速計算任務[10-12]。同時,由Khronos Group所維護的異構平臺編程框架標準OpenCL為FPGA提供了高效的開發方式,開發者可以采用高級語言對FPGA進行開發,不僅降低了開發難度,縮短了開發周期,還能夠滿足FPGA的在線可重構功能。這使得FPGA在異構計算加速領域的應用得到了迅速的擴張。目前FPGA兩大供應商Xilinx和Intel均推出了支持OpenCL開發的FPGA器件及軟件開發工具包,且已在很多領域得到了應用[13-15]。
采用FPGA來加速計算任務能夠獲得極佳的性能功耗比,但是目前的CPU+FPGA異構加速系統絕大部分基于x86架構處理器。在國際關系日益嚴峻的形勢下,關鍵核心領域必須能夠自主可控,雖然我國在自主可控計算機基礎軟硬件研發方面已初見成效,但當前的自主服務器性能與x86架構服務器還存在較大差距,難以滿足計算密集型任務對計算資源的需求。為此,本文將采用FPGA對國產CPU的任務進行加速,形成基于國產CPU的可重構計算系統,以提升國產平臺的計算性能。
首先對基于國產CPU的可重構計算系統進行了介紹,然后介紹了本文采用的一個測試用例——AES加密算法,及其OpenCL的實現,最后采用AES加密算法對該系統的性能進行了測試,并與串行CPU的處理性能進行了對比分析。
Open CL(Open Computing Language)[16-17]是由Khronos Group維護的一種為異構平臺提供編程的框架標準。該異構平臺通常由CPU、FPGA、GPU或者其他類型的處理器以及硬件加速器組成。OpenCL包括兩部分:編寫kernel函數(運行于OpenCL設備上)的語言(基于C99標準)和一組用于定義并控制平臺的API。OpenCL將不同類的計算設備組成一個統一的平臺,為軟件開發者提供一種可移植的、高效的編程方法。

圖1 CPU+FPGA異構計算系統框圖
OpenCL的核心思想包括四種方面:平臺模型(Platform model)、內存模型(Memory model)、執行模型(Execution model)和編程模型(Programming model)。平臺模型包括一個Host主機以及與其相連接的一個或多個OpenCL設備(在本文中OpenCL設備為FPGA),每個OpenCL設備可以分割為一個或多個計算單元(CU),每個CU又可以進一步劃分為一個或多個處理單元(PE),PE是OpenCL設備最基本的運行單元。OpenCL將kernel函數運行所用的內存分為四種類型:全局內存、常量內存、局部內存以及私有內存。全局內存:所有工作節點均可以對其進行讀寫,容量較大,但訪問延遲較高;常量內存:存放所有工作節點均可以訪問的常量;局部內存:工作組內部的內存,工作組內的所有工作項均可以進行讀寫操作;私有內存:工作項獨有的內存,只對其相應的工作項可見。執行模型包括兩部分:一部分在Host主機運行的主程序,該程序負責創建上下文、緩存、對OpenCL設備下發任務及數據等,另一部分為運行在OpenCL設備上的kernel函數,kernel函數負責執行相關的計算任務。編程模型支持數據并行和任務并行兩種模型,其中數據并行模式是OpenCL的首要模型。
OpenCL設計的大致流程為[18]:
(1)創建并初始化OpenCL設備和上下文環境,建立命令隊列。
(2)創建并編譯源程序,建立內核kernel句柄。
(3)分配數據所需內存空間,并將數據復制到OpenCL設備上。
(4)設置內核kernel參數。
(5)Host下發并執行內核kernel程序(通過下發不同的kernel程序可以實現不同的功能)。
(6)將計算結果從OpenCL設備復制到主機中。
(7)釋放系統所占資源。
圖1為CPU+FPGA架構的可重構系統框圖,主要包括Host主機部分與FPGA加速單元。Host主機與FPGA加速單元通過PCIe總線進行通信。Host主機負責管理控制相關事務以及調度FPGA加速單元,并處理一些簡單的串行程序。FPGA由于其具有強大的并行計算能力,負責處理Host下發的計算密集型任務。FPGA具有在線可重構功能以實現對不同應用需求的計算加速。FPGA內部分為兩個區域:靜態配置區和動態可重構區,靜態配置區包括PCIe模塊、DMA控制器以及Memory控制器等主要模塊,該區域一方面向外提供PCIe、DDR等的通信接口,另一方面向動態可重構區的kernel IP提供接口。靜態配置區通過AS(Active Serial)配置模式進行配置,系統上電后自動配置,配置完成后FPGA具備了基本的通信功能,能夠接收Host下發的任務。動態可重構區負責布署Host下發的kernel IP并執行數據處理任務,kernel IP為具體應用的算法實現。當應用場景改變時,Host可通過PCIe通道下發新的kernel IP,重新配置動態可重構區,此過程無需FPGA加速單元重啟,整個重配過程耗時僅為毫秒級,完全實現了算法的在線重構。

圖2 基于國產CPU的可重構系統實現框圖
由于kernel函數的編譯時間較長,且kernel函數的編譯需要用到FPGA綜合工具,而這些工具并不支持國產平臺,因此,本文將采用x86平臺對kernel函數進行離線編譯,事先生成FPGA可執行文件。基于國產CPU的可重構計算系統實現框圖如圖2所示,系統的運行環境包括國產飛騰平臺和FPGA加速單元兩部分,國產飛騰平臺負責main函數的編譯、運行以及對FPGA的管理控制、任務分配等工作。Main函數的編譯與運行需要OpenCL運行支持庫支持。當需要對FPGA可重構區進行配置時,Host會將事先生成的FPGA可執行文件通過PCIe總線下發到FPGA中,以實現FPGA的在線可重構功能。
AES是由美國國家標準與技術研究院(NIST)提出的用于替代數據加密標準(Data Encryption Standard,DES)的新一代密碼標準。它采用一種對稱分組密碼算法,加密與解密過程使用相同的密鑰。AES加密對象的數據塊分組長度為128 bit,密鑰長度可以為128 bit、192 bit以及256 bit三種。AES的加密過程是對128 bit的數據塊進行多輪的迭代運算,得出相同長度的密文。不同長度的密鑰所需的輪數不同:128 bit長度的密鑰需要10輪,192 bit長度的密鑰需要12輪,256 bit長度的密鑰需要14輪。由于每輪的運算步驟基本相同,本文以128 bit密鑰長度為例來介紹AES加密過程。每輪加密的對象為16 Byte(128 bit)的數據,可以表示為一個4×4的矩陣。
加密流程如圖3所示,除了第10輪與第1輪前的輪密鑰加,其余各輪的運算步驟相同,包括字節替換(SubBytes)、行移位(ShiftRows)、列混合(MixColumns)以及輪密鑰加(AddRoundKey)四個步驟。字節替換是通過非線性的替換函數,利用查表的方式將每個字節替換成相應的字節;行移位將矩陣的每行進行循環移位;列混合是通過線性變換的方式來混合每列的四個字節數據;輪密鑰是將矩陣中的每個字節與該次的輪密鑰進行異或運算。每個輪次所用的密鑰由上一輪密鑰按照密鑰擴展方法生成,其中第一組密鑰為原始密鑰。

圖3 AES加密流程圖
程序運行過程中,大部分的執行時間往往花費在某些關鍵函數上,這些函數經常具有大量循環、數學計算等操作,這些函數對程序的執行效率有著關鍵性的影響[19]。如果能找到這些性能瓶頸,通過一些加速設備對其進行優化、加速,以縮短執行時間,將會大大提升程序的整體性能。
本文采用Google perftools性能瓶頸剖析軟件對AES加密程序進行性能剖析。該分析軟件通過采樣的方式統計程序中各函數對CPU的使用情況,函數的耗時長短與采樣次數成正比,即采樣次數多的函數耗時較長。通過該分析軟件,可以對程序中各函數的耗時情況一目了然,進而得出程序的瓶頸所在。圖4為采用kcachegrind軟件對Google perftools剖析結果進行顯示的結果圖像,圖中方框內為程序中各函數的名稱以及該函數的執行時間占總時間的百分比,箭頭旁的數字表示箭頭所指向的函數被采樣的次數,采樣次數越大,表示執行時間越長。由圖4可見,占據AES程序執行時間的主要是MixColumns(列混合)、AddRoundKey(輪密鑰加)、SubBytes(字節替換)以及ShiftRows(行移位)四個函數,其中MixColumns執行時間最長,而密鑰擴展函數KeyExpansion在圖中并未出現,表明該函數執行時間非常短。

圖4 AES程序性能瓶頸剖析結果圖
鑒于上述分析,本文將對AES的列混合、輪密鑰加、字節替換和行移位操作函數進行加速,而密鑰擴展函數通過CPU實現。
基于OpenCL的AES程序實現包括兩部分:一部分是運行于Host主機的main函數,另一部分為運行于FPGA上的kernel函數。Main函數主要包括:平臺、設備信息的獲取,上下文的創建,Buffer的創建,命令隊列的創建,kernel參數設置,kernel文件及數據下發等過程。由于密鑰擴展函數執行時間較短,因此將密鑰擴展也放在Host主機運行,并將擴展的密鑰存放在全局內存,以供kernel函數使用。相關程序如圖5所示。

圖5 密鑰擴展及其傳輸代碼示意
Kernel函數為AES加密的關鍵部分,主要包括SubBytes函數、ShiftRows函數、MixColumns函數以及AddRoundKey函數。為了提高加密吞吐率,對kernel函數進行優化設計,采用多級流水并行的方式,保證kernel的每一個處理單元都能全速運行。相關程序如圖6所示。

圖6 Kernel函數代碼示意
本文所用測試環境配置如下:
Host主機參數:CPU型號:phytium FT-1500A
CPU主頻:1 GHz
內存:16 GB DDR3
PCIe接口:PCIe x8 Gen3
FPGA加速單元:NSA-121A,配置參數請見表1。
軟件環境:4.4.13-20170210.kylin.5.desktop,Xilinx SDAccel 2016.3,gcc/g++。

表1 FPGA加速卡NSA-121A配置參數

表2 國產平臺測試環境加密性能對比
實驗對bmp圖片進行加密實驗,為了提高實驗結果的可靠性,每種長度的明文均加密三次,然后取中間值作為最終結果。分別采用本文設計的可重構系統與CPU串行程序對不同長度的明文進行加密,以獲得AES加密性能對比,其中在CPU上運行的加密程序為單線程程序。所得實驗結果如表2所示。
表2中CPU加密采用串行單線程,FPGA kernel加密時間為FPGA執行AES加密任務所占的時間,Host主程序為可重構系統中在Host上運行的程序,包括獲取設備信息、創建上下文、由二進制kernel創建Program、創建Buffer、數據傳輸、密鑰擴展等函數。
由表2可以看出:
(1)FPGA加密時間遠遠小于CPU加密時間。
(2)在明文長度較短的情況下,可重構系統加密的總時間要大于CPU加密時間,但是隨著明文長度的增大,CPU加密所耗的時間要遠遠超過可重構系統。
(3)CPU加密時間隨著明文長度的增加成比例線性增大。
(4)在明文長度較短(小于192 MB)的情況下,Host主程序運行時間沒有顯著增大,但當明文長度繼續增加時,Host主程序運行時間會呈現出增大趨勢。這是由于在明文長度較小時,Host主程序中clCreateProgram-WithBinary和clCreateContext為主要耗時函數,分別耗時6 750 ms和4 400 ms左右,而這兩個函數所占時間與明文長度無關。當明文長度增大時,主程序中的數據拷貝函數clEnqueueWriteBuffer和clEnqueueReadBuffer函數所占時間將會占主導地位,這些函數的執行所占時間與明文長度成比例線性關系。
圖7為可重構系統加密總時間與CPU串行加密時間對比圖,由圖可見,在明文長度較大時,可重構系統的加密總時間要遠遠小于CPU加密時間,且CPU加密時間會隨著明文長度的增加而線性增大,而可重構系統的加密時間增長緩慢。

圖7 可重構系統加密總時間與CPU串行加密時間對比
圖8 為AES串行加密與FPGA并行加密的吞吐率對比圖,由圖可見,明文長度在48 KB~3 MB之間時,FPGA并行加密吞吐率增長較快,明文大于3 MB后,FPGA并行加密吞吐率趨近于穩定,而CPU串行加密吞吐率在整個階段都遠遠小于FPGA并行加密。

圖8 AES串行加密與并行加密吞吐率比較
圖9 為可重構計算系統并行加密相比于CPU串行加密的加速比,可見,加速比隨著明文長度的增加而增大,在明文長度為49 152 MB時,加速比可以達到120多倍。

圖9 可重構計算系統相比FT-1500A串行加密的加速比
為了提升國產計算平臺的處理性能,本文設計了基于國產CPU的可重構計算系統。該系統包括基于國產CPU的主機單元和FPGA可重構加速單元,主機單元負責邏輯判斷與管理調度等任務,FPGA負責對計算密集型任務進行加速,并支持基于OpenCL框架標準的編程方式。通過采用AES加密算法來測試本系統的計算性能,并與CPU串行處理結果進行對比,得出:相比于FT-1500A CPU串行加密,采用可重構計算系統并行加密能夠獲得120多倍的加速比,且在明文長度較大的情況下,可重構系統總的加密時間會遠遠小于CPU串行加密時間。實驗結果表明:本文設計的基于國產CPU的可重構計算系統能夠大幅提升國產平臺的計算性能。