羅洪艷 周珞一 趙 震 郭 洪 馮曉波
①(重慶大學生物工程學院 重慶 400044)
②(生物流變科學與技術教育部重點實驗室 重慶 400044)
由于數字全息重建算法計算復雜度高,特別是數字全息圖所包含的數據量隨著光電傳感器分辨率不斷提高而急劇增加,采用傳統的中央處理器(Central Processing Unit, CPU)串行計算整個全息重建極為耗時,已成為制約數字全息技術廣泛應用的重要因素,尤其是在要求高時效性的應用場景[5,6]。
針對相關需求,研究者提出了多種加速策略。比如馬靜等人[7]利用共享存儲并行編程對數字全息3維重構過程進行了提速,但由于多核CPU內存資源和功耗的限制,其加速效果相比于經典單核計算模式并不顯著。Chen等人[8]利用現場可編程邏輯門陣列硬件架構實現了一種低功耗的自動對焦數字全息重建算法,但由于該硬件技術開發周期長,設計成本高,不利于推廣。與此同時,擁有大量運算單元可支撐高效并行計算,兼具內存帶寬大、價格相對低廉等優勢的圖形處理單元(Graphics Processing Unit, GPU)飛速發展,在加速數字全息重建方面受到廣泛關注。例如劉海等人[9]針對粒子3維速度矢量場重建問題,提出基于統一計算設備架構(Compute Unified Device Architecture, CUDA)的并行加速運算;Shin等人[10]借助CUDA加速了使用頻域零填充的菲涅爾重建法; Do?ar等人[11]研究了CUDA架構下實現3種重建算法以達到實時性重建的目的。然而CUDA架構僅適用于英偉達(NVIDIA Corporation, NVIDIA)公司GPU,無法實現跨平臺部署。相比于CUDA,由蘋果(Apple)、NVIDIA、英特爾(Intel)和超威半導體(Advanced Micro Devices,AMD)等多家公司聯合開發的技術架構-開放運算語言(Open Computing Language, OpenCL),屬于一種通用性計算框架,能向不同廠商的GPU計算設備提供支持,可運行在包括多核CPU,GPU,FPGA和數字信號處理器等在內的多種異構計算架構上,具有良好的跨平臺特性。
因此,本文提出一種基于OpenCL架構的跨平臺異構加速策略,旨在實現基于GPU底層的卷積重建算法加速,以提高數字全息重建算法的執行效率和通用性。
OpenCL是一個在異構平臺上編寫并行程序的開放框架標準,通常抽象成平臺、內存、執行和編程等4個模型。其中,平臺模型主要由1個主機和與之相連的1個或多個計算設備組成。內存模型主要包括全局內存、常量內存、局部內存以及私有內存等4種類型,其對應的大小和訪問權限各不相同,且訪問速度依次遞增,其使用方式是否得當直接決定程序性能的高低。執行模型主要由在主機上執行的主機端程序和在計算設備上執行的內核程序組成。主機端程序可對多個支持OpenCL的計算設備進行統一調度管理,并且配置并行程序的執行環境。內核程序主要負責算法的并行化設計過程。在創建內核程序時,主機端會預先創建一個N維索引空間,索引空間中的每個工作項對應執行內核的實例,多個工作項組成工作組。編程模型主要分為數據并行和任務并行兩種類型。前者是將同一個任務并發到各個數據元素上,通過工作組實現分層化的數據并行。后者是由設計者直接定義和處理并行任務,并將多個并行任務映射到一個工作項來執行,從而在整體上起到加速的效果。
本文選用在經典的全息重建算法中執行效率最低、最為復雜的卷積重建算法[12],以便更好地體現GPU技術的加速特性。根據瑞利-索末菲衍射積分公式,全息圖經由重建光照射后的衍射光波在再現面上的復振幅分布可表示為


其中,k=2π/λ。
卷積重建算法的異構加速設計包括搭建異構加速平臺和算法并行化實現兩大部分。為了更好地利用硬件資源,本文在設計異構加速策略時,從CPU和GPU的計算特性出發分配各自的任務。計算量小且邏輯性復雜的任務,比如OpenCL平臺的初始化、數字全息圖的預處理、歸一化等過程,交給CPU端串行處理。而計算量大且邏輯相對簡單的卷積重建任務,交給GPU端并行處理。
在業務員提出離職時,銷售經理并沒有反思自己的處事方式,反而對將要離職的業務員更加不友好。例如:克扣工資、提成等,這種敵對態度一定程度上激化了業務員的逆反心理。
據此設計的重建加速算法的實現流程如圖1所示。由圖可知,在GPU端并行計算的重建算法從內部分解為g(x,y)初始化、2維傅里葉正變換、2維傅里葉逆變換、點乘、零頻點移到頻譜中心、取模等多個步驟。這些步驟順序執行,適合采用數據并行編程模型,通過合理分配工作組的方式實現異構加速計算。并且整個過程只包含兩次數據傳輸,1次傳入全息圖和所需參數,另一次傳出重建結果,計算的中間結果始終存儲于GPU端,可有效避免因多次數據交換導致的計算性能瓶頸。整個并行處理過程的GPU內部實現如圖2所示,分為FFT的并行化和算法其他部分的并行化兩部分。

圖1 基于CPU+GPU架構的卷積加速重建算法流程圖

圖2 卷積加速重建算法的GPU實現示意圖
3.2.1 FFT的并行化
2維離散傅里葉正變換、逆變換的公式分別為


通過以上分析,只需開辟尺寸為M×N/2的工作組并行化計算g(x,y)矩陣的蝶形運算,每一個工作項分配一個蝶形運算。并且采用原址計算的方式,將每一級蝶形運算的輸出存放于原輸入數據的位置。根據旋轉因子計算公式知,其與數據本身互不關聯,所以分配1個工作組、N/2個工作項即可。考慮到局部內存是GPU中的高速存儲器,保存在其中的數據可被這個工作組中的所有工作項共享,而且其讀取數據速度快于全局內存,若多次從全局內存讀取旋轉因子數據會降低效率,進一步將旋轉因子存儲在蝶形運算工作組的局部內存中,以達到工作項共享旋轉因子和提高計算速度的目的。這樣通過合理設置索引空間維度和工作組大小,并且合理使用局部內存,不僅可以加快執行速度,還可以避免不必要的資源浪費。
3.2.2 算法其他部分的并行化
除了傅里葉變換環節,算法還涉及g(x,y)初始化、點乘、零頻點移到頻譜中心及取模等操作的并行化處理。由式(5)可知,g(x,y)的值只與重建再現距離、像元尺寸、光源波長及數據矩陣尺寸有關,可通過歐拉公式轉換成復數矩陣,并將復數的實部和虛部當成一個向量進行計算,提高計算性能。OpenCL編程語言支持多種從C語言中派生的數據類型,但并非所有平臺都支持全部數據類型。例如部分AMD顯卡并不支持doublen數據類型,因此本文在涉及向量數據的運算時均采用floatn數據類型,以提高程序兼容性。
如圖2所示,點乘是將兩個相同大小的矩陣點對點相乘。零頻點移到頻譜中心是將圖像中心點作為2維坐標軸的原點,對2維傅里葉逆變換的結果進行1,3象限和2,4象限的互換。取模是對任意一個M行N列的矩陣元素的實部平方加上其虛部平方再開方。以上都是對矩陣的每一個數據進行相同操作的過程,且各數據之間沒有依賴關系,滿足數據并行和工作項并行的要求,按照矩陣大小分配工作項大小即可。
為了充分驗證本文所提出的基于OpenCL架構的跨平臺加速策略(即OpenCL版本)的有效性,采用具有NVIDIA公司GPU的加速平臺1(CPU1+GPU1)和具有AMD公司GPU的加速平臺2(CPU2+GPU2)對不同分辨率的數字全息圖進行了并行重建測試及各自對應CPU下的串行重建測試。操作系統為Windows 10 64位,軟件平臺為Qt5。表1列出了兩種加速平臺的具體信息。

表1 兩種GPU加速平臺參數
此外,在加速平臺1上還測試了卷積重建算法并行加速的CUDA版本程序,以對比分析兩種不同架構的加速性能。
實驗測試圖像為直徑20 μm聚苯乙烯微粒的同軸數字全息圖,分辨率為3264×2448,如圖3所示。圖4展示了全幅重建結果及局部區域對應的顯微鏡圖像結果。

圖3 20 μm聚苯乙烯微粒的同軸數字全息圖

圖4 全幅重建結果與局部區域的顯微鏡對比圖
從圖3中截取6個分辨率遞增的局部區域全息圖像,分別在兩個加速平臺及其對應CPU下各進行3次OpenCL版本的并行、串行重建測試,以及在加速平臺1上進行3次CUDA版本的并行重建測試,所得總執行時間的平均值如表2所示。
根據本文提出的OpenCL版本CPU+GPU異構型并行化設計策略(見圖1),加速平臺的全息重建總執行時間實際由CPU端的串行運算用時、CPU端與GPU端之間的數據傳輸用時和GPU端的并行運算用時等3個分項構成。表3列出了針對不同分辨率全息圖,在不同加速平臺進行重建的各分項用時。
根據表2和表3,可進一步計算得到OpenCL版本下兩個GPU加速平臺相對于CPU平臺的重建耗時總加速比(即CPU總執行時間與前者總執行時間之比)、并行運算加速比(即CPU執行卷積重建的串行運算用時與GPU執行卷積重建的并行運算用時之比)隨全息圖像分辨率的變化曲線,如圖5所示。兩個加速平臺下各分項用時占總執行時間的百分比隨全息圖像分辨率的變化曲線如圖6所示。

圖5 不同加速平臺的加速比(OpenCL版本)

圖6 不同加速平臺的內部耗時百分比(OpenCL版本)

表3 不同GPU加速平臺下全息重建的分項執行時間對比(OpenCL版本)(ms)
(1) 由圖4可見,重建還原的聚苯乙烯微粒形態呈現圓形,與真實微粒相近,且大小均勻,輪廓清晰,再現像質量與顯微鏡圖像相當,表明本文設計實現的卷積重建加速算法正確有效。
(2) 對比表2所列OpenCL版本的執行時間,可觀察到兩個GPU加速平臺針對不同分辨率全息圖的重建運算總用時均明顯低于CPU平臺。以3072×2304最大分辨率全息圖為例,前者約為后者的1.8%和10.1%。由此可見,基于OpenCL的異構加速策略能顯著提高全息重建的時效性,且具有良好跨平臺特性。

表2 不同CPU與GPU加速平臺的全息重建總執行時間對比
(3) 觀察圖5可知,在OpenCL版本下,兩個GPU加速平臺的總加速比、并行運算加速比均先隨著圖像分辨率的提高而增大,且初期增長迅猛,隨后增速減緩,特別是加速平臺2在圖像尺寸增至2048×1536時達到峰值,此后開始降低,整體變化趨勢與文獻報道相符[13,14]。這表明,一方面GPU加速具有規模增長性,即全息圖像分辨率越高,得到的加速比越大,加速效果會越顯著;另一方面,這種規模增長性又受到GPU所配置的并行運算資源的限制。隨著全息圖像分辨率的提高,數據規模越來越大,重建運算對GPU資源的需求量也增大,而所能利用的GPU資源將逐漸接近飽和狀態,因此加速比從初始階段的陡增變為中間階段的緩增直至峰值。此后對于更大分辨率全息圖像的重建,GPU資源將進入過飽和狀態,超負荷運行,意味著并行任務之間也需要排隊競爭資源,從而導致加速比開始下降。值得注意的是,在OpenCL的這種異構加速策略中,CPU端負責的平臺初始化、全息圖像預處理及歸一化過程并沒有經過加速處理,因此僅統計GPU端執行卷積重建核心計算過程的并行運算加速比高于總加速比,且能更真實地反映GPU的加速效果。對比兩個GPU加速平臺的硬件配置和加速比曲線,不難發現高配置的加速平臺1具有更為優秀的加速表現,其重建不同分辨率全息圖像的運行耗時均比低配置的加速平臺2低一個數量級,在3072×2304最大分辨率下總加速比達到54.2是后者的5倍以上,并行運算加速比更是高達94.7,是后者的8倍以上,且尚未達到其規模增長上限。由此可見,GPU的計算資源配置對于并行加速策略所能達到的加速性能有至關重要的影響。
(4) 由表3可見,兩個GPU加速平臺下,Open-CL版本測試的數據傳輸用時最少,串行運算用時次之,并行運算用時最多,且各分項的運算用時均隨著全息圖像分辨率的增加而增大,尤以串行運算用時的增幅最為顯著,達到30倍以上。同時,觀察圖6可以發現,在兩種GPU加速平臺下,數據傳輸用時占比均最低,分別低于8%,4%,且隨圖像分辨率變化微小,因此相比其他兩項用時幾乎可以忽略不計。對于高硬件配置的GPU加速平臺1,其串行運算用時占比隨全息圖像分辨率上升趨勢明顯,從10.8%增長至35.8%,而并行運算用時占比則從83.3%降低至57.2%,減勢顯著。結合圖5所示的加速比變化曲線,表明串行運算用時逐漸成為制約其總加速比進一步提高的主要因素,這也是總加速比遠低于并行運算加速比且差距逐漸加大的原因。對于低硬件配置的GPU加速平臺2,其串行運算用時占比呈現出先略增后持續降低的變化趨勢,最大占比也僅為12.6%,而并行運算用時占比的變化趨勢與之相反,即先略降再持續上升,數值始終在83.8%以上,表明并行運算用時始終對其加速效果起著決定性作用,而串行運算用時的影響幾乎可以忽略不計,這也導致了其總加速比與并行運算加速比相近。由此可見,加速平臺的硬件配置差異及全息圖像的分辨率差異對數據傳輸用時的影響極為有限,而后者對加速性能幾乎沒有干預能力。加速平臺所能達到的加速效果主要取決于GPU端的配置性能,但在GPU并行計算資源相對充足的情況下,CPU的配置性能會成為GPU加速規模效應的制約因素。因此,在實際應用中需要根據具體的加速需求合理配置GPU和CPU硬件資源。
(5) 對比表2中OpenCL版本與CUDA版本并行加速算法在GPU加速平臺1上針對不同分辨率全息圖像的重建總執行時間,可見后者比前者用時更少。且隨著全息圖像分辨率的增加,CUDA版本運行效率的提高更為顯著,特別是在3072×2304最大分辨率全息圖時,用時縮短了26.7%。這與文獻報道的在大多數NVIDIA公司GPU上,CUDA的運算性能明顯優于OpenCL[15-17],運行效率增幅高達30%相吻合[17]。造成這種差異的原因,一方面是OpenCL的內核可以在運行時進行編譯,從而增加了運行時間[15]。另一方面專用于NVIDIA公司GPU的CUDA顯然得到了廠商的優先支持,能更好地匹配其硬件的計算特性,從而提供更好的性能。而隨著NVIDIA公司更新其OpenCL驅動程序,后者表現不佳的情況將會有所改善[16]。同時,也有不少文獻報道[17-20]指出,上述的性能差異源自對CUDA和OpenCL的不公平比較。在許多情況下,通過減少兩者存在的編程模型差異、本地內核不同優化、架構相關差異和編譯器差異,將兩個版本應用程序調到同等水平,OpenCL的性能可與CUDA媲美。此外,計算資源配置不同的GPU在性能上的差異其實更加顯著[18],這一點在本文測試結果中也得到了印證。
本文基于OpenCL架構提出了一種數字全息卷積重建算法的并行化加速策略,對卷積重建算法的異構型并行化設計進行了理論分析和工程實現,并在不同的GPU平臺上完成了加速重建測試及與CUDA架構加速策略的對比測試。實驗結果表明,與CPU串行方式相比,OpenCL架構的GPU并行方式加速成效顯著,具有規模增長性,并且在不同的異構平臺下都能實現很好的加速,全息圖重建效果清晰,滿足跨平臺加速需求。通過系統的代碼調優,有望達到與CUDA架構相近的運算性能。此外,GPU端的硬件配置性能對異構加速策略所能達到的加速效果起著決定性作用,但對于高分辨率全息圖像的加速重建,CPU端的硬件配置性能也不容忽視。