吳健鳳,鄭博文,聶 一,柴志雷,3
(1.江南大學 人工智能與計算機學院,江蘇 無錫 214122;2.江南大學 物聯網工程學院,江蘇 無錫 214122;3.數學工程與先進計算國家重點實驗室,江蘇 無錫 214215)
將加解密算法用于數字貨幣、區塊鏈、云端數據加密等領域時[1-2],算法應具備高強度計算能力。因此,當前服務器端允許包含異構計算平臺以增強特定工作負載的性能,同時改善整個系統的維護成本。OpenCL 是異構平臺的開放框架,其中內核(Kernel)程序可以在多核CPU 上,同時也可以在GPU、現場可編程門陣列(Field Programmable Gate Array,FPGA)、DSP 上編譯執行[3]。當前服務器端除了采用ASIC 或GPU 處理大批量數據外,考慮到能效等因素也會大規模部署FPGA。
目前,已有許多基于OpenCL 的加解密算法加速器的研究。文獻[4]設計一種基于OpenCL 的MD5算法加速器架構,提出結合優化CPU 端內存分配、復制內核計算單元的方法,其較未經優化方法性能提高了6.1 倍。文獻[5]提出基于OpenCL 內核的Kuznyechik算法流水線架構設計,結合輪密鑰按位模2 加消除依賴、查找表、分解線性變換為布爾函數等方法,在Intel Arria 10 系列實現了41 Gb/s 的吞吐率,同時占用不超過10%的FPGA 資源。文獻[6]評估了可擴展的多FPGA 架構上AES 加密內核的性能,在帶有Stratix A3 FPGA 的單個M506 模塊上,通過使用OpenCL SIMD4 達到了較高的吞吐率。文獻[7]結合OpenCL 工具設計SHA1 哈希算法,與基于硬件的描述語言相比,使用Intel FPGA SDK 工具進行少量的內核代碼更改即可實現電路的改變,有效節省了系統開發時間,其結合循環展開、循環流水等策略,在Altera Stratix V 系列器件上達到3 033 Mb/s 的吞吐率,相比于CPU 性能提升了14 倍。
DES 算法是1972 年美國IBM 公司設計的對稱密碼體制加密算法。隨著軟硬件的快速發展,DES算法已被證實不夠安全。為了克服DES 算法的缺陷,1999 年美國NIST 發布了新版本的DES 標準[8],指出DES 僅能用于遺留的系統,同時3DES 將取代DES 成為新的標準。在國內,中國人民銀行的智能卡技術規范已支持3DES[9],電子支付系統將3DES方案用于數據的加解密[2]。目前3DES 算法在國內外有著廣泛的應用,因此,更高效地實現3DES 加密具有重要意義。
現有針對3DES算法的優化方法以使用硬件描述語言(Hardware Description Language,HDL)居多[10-11]。雖然HDL 仍是在FPGA 上開發時序關鍵型設計的合適選擇,但在HDL 中開發應用程序需要付出較大代價并且容易出錯。高層次綜合工具(High-Level Synthesis,HLS)是高性能計算界針對FPGA 編程的替代解決方案[12]。使用HLS 可以讓幾乎沒有FPGA開發經驗的用戶充分利用FPGA 的優勢。目前,有2 種支持利用FPGA 開發OpenCL 應用的商業編譯器,一個是用于OpenCL 的Intel FPGA 軟件開發套件(Software Development Kit,SDK),支持Cyclone、Stratix 和Arria 系列的FPGA平臺[13-15],另一個是Xilinx,為基于OpenCL 的Kintex 系列和Virtex-7 FPGA 產品提供了完整的SDAccel 開發環境[16]。
本文采用數據存儲調整、數據位寬改進、指令流優化、內核矢量化、計算單元復制等策略,設計并實現一種基于OpenCL 的加解密算法FPGA 加速器架構,以應用廣泛的3DES 算法為例,介紹內核程序的設計過程。
3DES 算法以DES 算法為基礎,其通過進行3 次DES 加密增強算法復雜性,從而保障安全性[17]。DES 算法包含16 輪迭代,使用56 bit 密鑰,而3DES算法包含48 輪迭代,使用168 bit 密鑰。
DES 算法將明文按64 bit 進行分組,參與計算的密鑰長度固定為64 bit(有效位數56 bit)。加密流程主要包括初始置換、16 輪循環迭代、逆初始置換3 個部分。其中,16 輪迭代過程中參與計算的子密鑰由56 bit 密鑰擴展而來[8]。
DES 算法流程如圖1 所示,其中,64 bit 的輸入明文經初始置換分為L0和R0兩部分,然后進行16 輪相同的迭代運算,最后經過逆初始置換得到64 bit 的輸出密文。在每一輪迭代中,包含一次異或運算和f 函數運算。

圖1 DES 算法流程Fig.1 Procedure of DES algorithm
f 函數原理如圖2 所示,其中,輸入為該輪的Ri-1和該輪對應的子密鑰ki,Ri-1經E 盒擴展后的結果與48 bit 的子密鑰ki進行異或運算,之后經S 盒變換、P 盒置換得到32 bit 的輸出。S 盒將6 bit 的輸入轉換為4 bit 的輸出,這也是算法中唯一的非線性變換,極大地提高了算法的安全性。S 盒的置換部分使用查找表實現,其將8 個S 盒的內容存儲于片上ROM,有效提高了算法的計算效率。DES 算法的子密鑰生成模塊輸入為56 bit 的密鑰,經16 輪迭代生成16 個子密鑰ki,分別用于DES 算法的16 輪迭代計算模塊。在子密鑰生成模塊中,每輪迭代包含循環左移和密鑰置換操作。

圖2 f 函數原理示意圖Fig.2 Schematic diagram of f function principle
3DES 算法在DES 算法的基礎上發展而來,其輸入為64 bit 的明文,輸出為64 bit 的密文。與DES 算法不同,3DES 算法包含192 bit(有效長度168 bit)的密鑰。令Eki(I)和Dki(I)分別表示使用DES 密鑰ki對數據塊I的DES 加密和解密運算。3DES 的加密操作如式(1)所示,其將64 bit 的輸入塊I轉換成64 bit的輸出塊O1。3DES 的解密操作如式(2)所示,其將64 bit 的輸入塊I轉換成64 bit 的輸出塊O2。

OpenCL 為開發人員提供了抽象的內存層次結構以生成有效代碼,適合目標設備的內存層次結構。OpenCL 內存結構由全局內存(Global Memory)、常量內存(Constant Memory)、局部內存(Local Memory)、私有內存(Private Memroy)4 種類型構成[18]。工作項在處理單元(Processing Element,PE)上運行,可以訪問對應的私有內存,工作組在一個計算單元(Compute Unit,CU)上運行。同一工作組中的工作項擁有共同的局部內存。
OpenCL 程序包含主機端程序和內核程序兩部分。如圖3 所示,內核程序運行時系統會創建一個整數索引空間,工作項對應執行索引空間的一個實例,工作組是工作項的集合,同一工作組中的工作項共享內存并可以實現組內同步。工作項在全局索引空間中的坐標為該工作項的全局ID,工作項在工作組中的坐標為該工作項的局部ID。

圖3 OpenCL 索引空間示意圖Fig.3 Schematic diagram of OpenCL index space
本文采用IntelFPGA SDK 實現3DES 算法加速器設計。在FPGA 上構建系統之前,SDK 支持在CPU 上仿真OpenCL 應用程序。軟件仿真利用CPU模擬FPGA 硬件特性,通常用于功能驗證。目前,Intel 的工具鏈不支持硬件仿真[16]。Intel FPGA SDK包含一個編譯OpenCL 內核以創建優化硬件鏡像的離線編譯器,該編譯器將內核代碼轉換成為中間Verilog 形式,然后通過Quartus II 軟件將其編譯為二進制鏡像,該鏡像可在程序運行時加載至FPGA端。由于編譯過程需要數小時來應用適當的優化并設計出硬件鏡像,因此編譯過程是離線的,主機程序僅在運行時才加載硬件鏡像。構建完成后,將創建主機可執行文件和二進制文件,以在FPGA 上運行目標程序[19]。
本文基于OpenCL 實現3DES 算法FPGA 加速器的設計,包含主機端(HOST)程序設計與設備端程序設計兩部分:主機端程序結合3DES 算法加密的原理,完成主機端程序對明文數據的讀取、初始化、存儲、OpenCL 運行時環境的創建以及對Kernel 的調度與管理;設備端程序設計針對3DES 算法內核計算模塊進行優化并形成流水線并行架構。同時,采用數據存儲調整、數據位寬改進策略有效提升實際帶寬利用率,采用指令流優化技術針對算法中的循壞迭代進行改進,提高計算的并行度,采用內核矢量化、計算單元復制進一步提升內核性能。
主機端完成明文數據的讀取、初始化、存儲、內核調度、管理等工作。Intel FPGA SDK提供了OpenCL平臺API 及運行時API:平臺API 定義了主機端程序發現OpenCL 設備所用的函數以及這些函數的功能;運行時API 用于管理上下文來創建命令隊列以及運行時發生的其他操作。通過調用OpenCL API 可實現主機端對內核的調度與管理[17],CPU 端程序流程如圖4 所示。

圖4 主機端程序流程Fig.4 Procedure of HOST program
3DES 算法內核模塊包括明文數據輸入緩存、算法加密模塊和密文數據輸出緩存3 個模塊,如圖5 所示。明文數據輸入緩存完成從全局內存讀取明文數據,通過使用數據存儲調整、數據位寬改進提高實際帶寬利用率;算法加密模塊基于FPGA 完成3DES 算法的加密計算,通過數據循環展開、循環流水形成流水線并行計算架構;密文數據輸出緩存模塊將數據從FPGA 片上傳輸至外部DDR 中。

圖5 內核模塊示意圖Fig.5 Schematic diagram of Kernel module
3.2.1 數據存儲調整
由主機端傳輸的數據存儲于片外DDR 中,對應的數據類型為__global;常量內存位于片上緩存單元,對應的數據類型為__constant;局部內存的物理地址為片上RAM 資源,對應的數據類型為__local;私有內存的物理地址為片上寄存器資源,對應的數據類型為__private。由于片上不同資源的大小、延遲、吞吐率存在差異,因此合理分配數據存儲位置對于算法性能提升有較大的影響[19]。
不同內存類型的性能參數如表1 所示。全局內存類型具有最大的吞吐率及容量,但同時也存在較大的訪存延遲,主機端傳輸的數據存儲于全局內存中,因此提高內存帶寬的實際利用率對于系統性能的提升是有效的。局部內存對工作組中的所有工作項可見,與私有內存相比,在訪存延遲相當的情況下,其具有更高的吞吐率及更大的容量,但同一工作組中的工作項執行后需要通過使用屏障保證數據一致性,這在一定程度上增加了延遲。因此,將參與3DES 計算的變量存儲于私有內存中,工作項訪問位于私有內存中相應的明文數據塊并完成3DES 算法加密。針對f 函數計算模塊的S 盒和E 盒變換,由于是頻繁訪問的數據且其值在計算過程中保持不變,因此將其存儲于常量內存,對應的物理地址為片上ROM,從而在加快訪問速度的同時避免訪存沖突。

表1 不同內存類型的性能參數Table 1 Performance parameters of different memory types
3.2.2 數據位寬改進
工作項執行內核程序的一個實例,如果工作項處理的數據位寬不固定,則編譯器會使用更多的資源以滿足可能的數據位寬,但同時也會對程序的優化編譯有所限制。
基于3DES 算法輸入數據長度為64 bit 且輸出數據長度為64 bit 的前提,將單工作項處理的數據長度調整為8 Byte。若將數據長度調整為4 Byte,則需要2 個工作項來完成一個明文塊的加密操作,此時工作項間的數據需要同步以保證數據一致性,這會增加額外的時間開銷;若將數據長度調整為16 Byte,此時單工作項的處理數據量為原來的1 倍,理論上內核執行時間增加1 倍,則將單工作項的行為定義為從全局內存中搬運8 Byte 的數據至私有內存,針對8 Byte 數據進行3DES 加密計算,再將計算的結果從私有內存搬運至全局內存中。通過獲得工作項的全局ID 可實現工作項與明文數據的一一對應,從而避免工作項間的同步操作。
3.2.3 指令流優化
指令流優化主要使用循環展開和循環流水來提高程序的并行度。循環展開可指導離線編譯器將OpenCL Kernel 轉換為硬件鏡像的方式。通過使用循環展開可形成有效的流水,而流水線架構能夠縮短整體的執行時間。如圖6 所示,假設每步操作需要1 個時鐘周期,未形成流水線型設計時,內核在下次計算時延遲了3 個時鐘周期,而在使用流水線型設計后,只延遲了1 個時鐘周期。

圖6 內核計算架構Fig.6 Architecture of Kernel computing
循環展開在消耗一定硬件資源的前提下可降低數據讀取與存儲的次數,節省計算所需的時間,形成流水線型架構,從而提高并行度。如表2 所示,在內存數據Load 模塊,針對8 Byte的明文數據與3 個8 Byte的子密鑰數據讀取進行循環展開形成內存合并,將對內存數據的32 次Load 操作降低為4 次更寬的Load 操作;在內存數據Store 模塊,針對8 Byte 的密文數據存儲進行循環展開形成內存合并,將使內存的8 次Store 操作減少為1 次更寬的Store 操作;在迭代計算模塊,針對子密鑰生成模塊的16 次循環左移和密鑰置換、DES 計算模塊的16 輪輪換計算模塊進行循環展開,指導編譯器生成多套單次迭代所需的硬件結構,節省了迭代計算所需的時間。表2 數據顯示,未進行循環展開時,內核的執行時間為1 110.096 ms,使用循環展開后,內核的執行時間降低為46.620 ms,可見通過循環展開取得了較好的優化效果。

表2 循環展開的優化效果Table 2 Optimization effect of loop unrolling
3.2.4 內核矢量化
內核矢量化允許多個工作項以SIMD 的方式執行內核程序的實例。矢量化指導編譯器生成多個矢量通道,使得工作項可以同時存取并處理多個數據[20]。如圖7 所示,內核矢量化參數設定為2 后編譯器會合并內存訪問。與未經矢量化相比,矢量化后的內核單次Load 和Store 的數據量為原先的2 倍。使用內核矢量化時,需要同時指定工作組大小,且內核矢量化的參數能被工作組大小整除。內核矢量化的參數只能是2 的指數,由于硬件資源的限制,因此實驗中可設定的最大矢量化參數為16。

圖7 內核矢量化示意圖Fig.7 Schematic diagram of kernel vectorization
以加密128 MB 數據量為例描述不同內核矢量化參數下系統內存帶寬及吞吐率的變化情況。在SIMD2方案中,設置矢量化參數為2 后工作組中的工作項平均分布在2 個SIMD 通道中,此時單工作項執行的工作量為原來的2 倍,同時編譯器會合并內存訪問,單工作項一次可從內存中加載2 個明文數據塊進行加密并一次將2 個數據塊的加密結果存儲到全局內存中[19]。如表3 所示,隨著矢量化參數的增加,內核的執行時間得到降低,內存帶寬及系統的吞吐率得到提升。

表3 內核矢量化的優化效果Table 3 Optimization effect of Kernel vectorization
在本文設計中,工作組大小為512,內核矢量化參數為16,每個工作組中的工作項分布在16 個SIMD 通道中。編譯器實現16 個SIMD 通道后,每一個工作項的計算工作量為原先的16 倍,相應的全局工作組大小減少為原來的1/16。
3.2.5 計算單元復制
通過計算單元復制策略可提高具有常規內存訪問模式的內核性能。Intel FPGA SDK 編譯器支持為內核生成多個計算單元,通常每個計算單元可以同時執行多個工作組,從而提高內核的吞吐率。使用計算單元復制后,FPGA 中的硬件調度器將工作組分派到其他可用的計算單元。只要計算單元尚未達到其最大容量,就可以將其用于工作組分配[19]。
如圖8 所示,本結合參數為16 的內核矢量化策略,利用FPGA 硬件調度器將工作組分配至2 個計算單元中執行,理論上可使內核的運行時間縮短為原來的一半。然而,雖然通過使用多個計算單元可提高系統的吞吐率,但也會增加對于全局內存帶寬的競爭以及硬件資源的使用。

圖8 計算單元復制策略示意圖Fig.8 Schematic diagram of compute unit replication strategy
如圖9 所示,基于OpenCL 的3DES 算法加速器架構由主機(HOST)端和設備端2個部分組成,其中,HOST端負責與OpenCL 程序外部環境的數據交互、與設備端的數據交互及Kernel的調度與管理,設備端負責3DES算法的計算任務。
設備端包含明文數據輸入緩存、3DES 算法加密計算、密文數據輸出緩存3 個模塊。其中,明文數據輸入緩存、密文數據輸出緩存位于設備端的全局內存區域,3DES 算法加密的中間數據存儲于設備端的私有內存區域。
在圖9 中,PE 單元為一個工作項的處理單元,每個PE 單元擁有相應的私有內存用于存儲運算的中間數據,一個PE 單元完成一個明文塊的3DES 加密計算。針對全局內存與私有內存的數據傳輸模塊,結合OpenCL 內存模型及全局內存、私有內存存在訪存差異的特點,采用改進數據存儲位置、調整數據位寬策略提高內核實際帶寬利用率;針對算法加密計算模塊,結合3DES 算法加密的原理,采用循環展開、循環流水策略形成流水線并行架構,同時結合使用內核矢量化策略形成更寬的矢量計算通道從而有效提升算法的性能,采用計算單元復制策略進一步提高FPGA 端計算的吞吐率。

圖9 3DES 算法FPGA 加速器總體架構Fig.9 The overall architecture of FPGA accelerator for 3DES algorithm
對本文設計的加速器進行實驗驗證,軟件環境為CentOS Linux release 7.7.1908+GCC V4.8.5,OpenCL 版本為Intel FPGA SDK for OpenCL 19.3,硬件組合為Intel Xeon E5-2650 V2 的CPU+Intel Stratix 10 GX2800 的FPGA,該款FPGA 包含1 866 240 個ALUT,內存帶寬為34 GB/s,資源情況如表4 所示[14]。

表4 FPGA 端資源情況Table 4 FPGA resources
在不同優化策略下,以加密128 MB 數據、單工作項處理8 Byte 明文塊為例,結合FPGA 端內存帶寬、工作頻率、內核執行時間及資源消耗情況描述內核的性能變化。內存帶寬及時鐘頻率通過在編譯器編譯時加入性能計數器(-profile)獲得,通過aocl report 指令調用Intel FPGA Dynamic Profiler for OpenCL 工具獲得內存帶寬及工作頻率的信息,通過clGetEventProfilingInfo 函數獲得內核的執行時間,通過aoc -rtl 指令生成內核的分析報告,獲得資源消耗的詳細信息。實驗中記錄的時間是算法的絕對執行時間,不包含主機與設備之間的數據傳輸時間,時間的統計結果通過多次測試取平均值獲得。
表5 展示了不同優化策略下FPGA 端內存帶寬、時鐘、內核執行時間及資源占用變化情況。,其中,未優化的內核其內存帶寬為1 916.9 MB/s 且FPGA板卡的工作頻率為306.2 MHz,內核運行時間為1 349.181 ms。下文對不同方案下的實驗數據進行分析。

表5 不同優化方案下FPGA 端性能及資源情況Table 5 FPGA performance and resources under different optimization schemes
數據存儲調整結合OpenCL 內存模型及FPGA 板卡不同硬件資源存在訪存延遲及吞吐率差異的特點,將HOST端傳輸的數據存儲類型由常量類型(__constant)更改為全局變量類型(__global),將內存的實際帶寬利用率、板卡的工作頻率提升至325 MHz。這是因為全局類型的變量其存儲位置為FPGA 的片外DDR,且理論帶寬可達到34 GB/s,而常量類型變量在內核運行時會自動由DDR 轉存至FPGA 片上緩存,這在一定程度上增加了額外的數據移動。
數據位寬改進將單工作項處理的數據位寬確定為8 Byte,此時內存帶寬提升了一倍多,這是因為在數據位寬確定的情況下,編譯器能夠結合長度信息做更好的優化,且使用8 Byte 長度的位寬可最大化單工作項處理數據的效率,同時減少不必要資源的使用。結合數據位寬改進后,設備端占用的邏輯資源大幅減少,由最初的8.01%降至1.91%。
指令流優化包含循環展開和循環流水兩部分。使用指令流優化后,系統整體性能的提升較為明顯。由表5 可知,使用指令流優化后內存帶寬提升至5 779.7 MB/s,時鐘頻率達到372.2 MHz,同時內核的運行時間由最初的1 349.181 ms 縮短至46.620 ms。這是因為在結合數據存儲調整、數據位寬改進的前提下,采用循環展開和循環流水策略可以達到較好的并行度。實驗結果表明,在未結合數據位寬改進的情況下,采用循環展開循環流水策略后內核的運行時間為437.053 ms。這是因為如果未結合數據位寬改進,編譯器無法針對循環做有效的展開,且會盡量使用更多的資源和更粗粒度的優化來滿足可能的數據長度,這在一定程度上限制了編譯器的優化能力。由表5 可知,使用循環展開、循環流水策略后,消耗的邏輯資源由原先的1.91%增加至3.3%,這與循環展開增加邏輯資源的消耗相符合。
內核矢量化實現內核中多個工作項以單指令多數據(SIMD)的方式參與運算。結合工作組大小為512,將內核矢量化的參數指定為8,此時全局工作組的大小減少為原來的8 倍。內核矢量化后內存帶寬由5 779.7 MB/s 提升至23 274.5 MB/s。這是因為矢量化內核會指導編譯器合并內存訪問,將對全局內存的8 次Load操作合并為1 次更寬的矢量Load 操作且內核函數計算模塊包含較少的分支語句,有利于形成較合適的SIMD通道。內核矢量化后FPGA端的工作頻率為373.3 MHz,內核的執行時間由原先的46.620 ms縮短至11.132 ms,可見內核矢量化在性能上產生明顯的提升。內核矢量化會增加FPGA 端資源的消耗,由表5 可知,其占用的邏輯資源由3.3%上升至19.41%。
將矢量化的參數由8提升至16,此時可形成更寬的內存訪問操作。由表5 可知,內存帶寬進一步提高至27 534.1 MB/s,內核的執行時間縮短至9.425 ms,系統資源的消耗由19.41%增加至38.57%。
結合內核矢量化與計算單元復制的組合可進一步提高內核的性能。內核矢量化參數為8 時,可復制的最大計算單元數為4;內核矢量化參數為16 時,可復制的最大計算單元數為2。
結合矢量化參數為8、4 個計算單元復制后內存帶寬為27 105.5 MB/s,相比于SIMD16 有一定程度的下降,這是因為計算單元的增加導致對帶寬的競爭,內核的執行時間縮短至9.409 ms,邏輯資源的消耗為77.33%。使用參數為16 的內核矢量化與2 個計算單元復制的組合,其內存帶寬為28 102.3 MB/s,工作頻率為366.7 MHz,內核的計算時間縮短至最低的9.243 ms,邏輯資源的占用達到77.03%。在有限的資源下,內核矢量化參數為16、計算單元復制數為2時獲得了最佳的內核性能。下文將結合不同大小的明文數據量,進一步描述結合內核矢量化參數為16、計算單元復制數為2 的內核性能變化。
為直觀描述內核的性能,以64 KB、1 MB、8 MB、64 MB、128 MB、256 MB、512 MB、1 024 MB的數據為例,描述內核在不同數據量下的吞吐率變化情況。內核吞吐率的計算公式[21]如式(3)所示:

其 中:T為吞吐率;N為3DES 加密的次數;B為單次3DES 加密的明文塊大小;E為內核的執行時間。不同數據量下內核的執行時間及吞吐率的變化情況如表6 所示。可以看出:在數據量較小的情況下,內核的吞吐率不能很好地反映算法的真實性能;隨著數據量的增加,內核的吞吐率在增加后趨于穩定;在計算的數據量大于128 MB 后,內核的吞吐率保持在111.801 Gb/s 左右。

表6 不同數據量下的吞吐率Table 6 Throughput rates under different data volumes
為了驗證本文方案的有效性,與其他文獻方案進行比較,并與CPU、GPU 平臺實現結果進行比較。
4.5.1 與其他文獻方案的比較
文獻[11,22-25]皆采用基于Verilog/VHDL 的設計方案。本文基于OpenCL 實現FPGA 的設計,采用數據存儲調整、數據位寬改進、指令流優化、內核矢量化等策略實現3DES 算法加速器的設計。如表7 所示,與基于Verilog/VHDL 實現的方案相比,本文方案有效解決了開發周期長、維護升級困難等問題,同時頻率達到了366.7 MHz,吞吐率達到111.801 Gb/s,取得了較明顯的性能提升。

表7 不同方案的加速性能Table 7 Acceleration performance of different schemes
4.5.2 與CPU、GPU 實現結果的比較
結合CPU、GPU 平臺驗證本文方案的性能。OpenSSL 是基于密碼學的開發工具包,包含豐富的密碼算法庫。Hashcat 是一種快速密碼恢復工具,支持OpenCL 框架。本文的對比對象為CPU 端的OpenSSL 庫,其版本為1.0.2,CPU 型號為Intel Core i7-9700;GPU 端 的Hashcat,其版本為5.0.0,GPU 型號為NvidiaGeForce GTX 1080Ti。
由圖10 可知,本文實現方案相比于CPU 性能提升372 倍,相比于GPU 性能提升20%。由圖11 可知,本文實現方案相比于CPU 能效比提升644 倍,相比于GPU 能效比提升9 倍。

圖10 不同平臺下的吞吐率Fig.10 Throughput rate under different platforms

圖11 不同平臺下的能效比Fig.11 Energy efficiency ratio under different platforms
本文針對傳統數據加解密計算速度慢、功耗高、占用主機資源的問題,以及Verilog/VHDL 方式實現的FPGA 加解密系統開發周期長、維護升級困難的問題,提出一種基于OpenCL 的3DES 算法FPGA 加速器架構設計方案。結合OpenCL 內存模型與FPGA 端硬件資源的對應關系優化數據存儲模塊,同時對私有內存與全局內存的數據傳輸模塊,采用循環展開、數據位寬改進策略提高內存帶寬的實際利用率,對3DES 算法計算模塊,采用指令流優化提高計算的并行度,形成流水線型架構。在此基礎上,結合內核矢量化、計算單元復制策略進一步提高內核的吞吐率。實驗結果表明,本文設計的加速器能夠有效提升3DES 算法的速度與能效方面,滿足數字貨幣、區塊鏈、云端數據加密等高強度計算領域的計算要求。為進一步提高該加速器的通用性和性能,后續將針對非對稱加密算法和哈希算法進行設計,同時優化主機端與FPGA 端數據的傳輸性能,開發實現支持算法類別更多的加解密算法計算平臺。