羅洪艷 周珞一 趙 震 郭 洪 馮曉波
①(重慶大學(xué)生物工程學(xué)院 重慶 400044)
②(生物流變科學(xué)與技術(shù)教育部重點(diǎn)實(shí)驗(yàn)室 重慶 400044)
由于數(shù)字全息重建算法計(jì)算復(fù)雜度高,特別是數(shù)字全息圖所包含的數(shù)據(jù)量隨著光電傳感器分辨率不斷提高而急劇增加,采用傳統(tǒng)的中央處理器(Central Processing Unit, CPU)串行計(jì)算整個(gè)全息重建極為耗時(shí),已成為制約數(shù)字全息技術(shù)廣泛應(yīng)用的重要因素,尤其是在要求高時(shí)效性的應(yīng)用場(chǎng)景[5,6]。
針對(duì)相關(guān)需求,研究者提出了多種加速策略。比如馬靜等人[7]利用共享存儲(chǔ)并行編程對(duì)數(shù)字全息3維重構(gòu)過(guò)程進(jìn)行了提速,但由于多核CPU內(nèi)存資源和功耗的限制,其加速效果相比于經(jīng)典單核計(jì)算模式并不顯著。Chen等人[8]利用現(xiàn)場(chǎng)可編程邏輯門(mén)陣列硬件架構(gòu)實(shí)現(xiàn)了一種低功耗的自動(dòng)對(duì)焦數(shù)字全息重建算法,但由于該硬件技術(shù)開(kāi)發(fā)周期長(zhǎng),設(shè)計(jì)成本高,不利于推廣。與此同時(shí),擁有大量運(yùn)算單元可支撐高效并行計(jì)算,兼具內(nèi)存帶寬大、價(jià)格相對(duì)低廉等優(yōu)勢(shì)的圖形處理單元(Graphics Processing Unit, GPU)飛速發(fā)展,在加速數(shù)字全息重建方面受到廣泛關(guān)注。例如劉海等人[9]針對(duì)粒子3維速度矢量場(chǎng)重建問(wèn)題,提出基于統(tǒng)一計(jì)算設(shè)備架構(gòu)(Compute Unified Device Architecture, CUDA)的并行加速運(yùn)算;Shin等人[10]借助CUDA加速了使用頻域零填充的菲涅爾重建法; Do?ar等人[11]研究了CUDA架構(gòu)下實(shí)現(xiàn)3種重建算法以達(dá)到實(shí)時(shí)性重建的目的。然而CUDA架構(gòu)僅適用于英偉達(dá)(NVIDIA Corporation, NVIDIA)公司GPU,無(wú)法實(shí)現(xiàn)跨平臺(tái)部署。相比于CUDA,由蘋(píng)果(Apple)、NVIDIA、英特爾(Intel)和超威半導(dǎo)體(Advanced Micro Devices,AMD)等多家公司聯(lián)合開(kāi)發(fā)的技術(shù)架構(gòu)-開(kāi)放運(yùn)算語(yǔ)言(Open Computing Language, OpenCL),屬于一種通用性計(jì)算框架,能向不同廠商的GPU計(jì)算設(shè)備提供支持,可運(yùn)行在包括多核CPU,GPU,FPGA和數(shù)字信號(hào)處理器等在內(nèi)的多種異構(gòu)計(jì)算架構(gòu)上,具有良好的跨平臺(tái)特性。
因此,本文提出一種基于OpenCL架構(gòu)的跨平臺(tái)異構(gòu)加速策略,旨在實(shí)現(xiàn)基于GPU底層的卷積重建算法加速,以提高數(shù)字全息重建算法的執(zhí)行效率和通用性。
OpenCL是一個(gè)在異構(gòu)平臺(tái)上編寫(xiě)并行程序的開(kāi)放框架標(biāo)準(zhǔn),通常抽象成平臺(tái)、內(nèi)存、執(zhí)行和編程等4個(gè)模型。其中,平臺(tái)模型主要由1個(gè)主機(jī)和與之相連的1個(gè)或多個(gè)計(jì)算設(shè)備組成。內(nèi)存模型主要包括全局內(nèi)存、常量?jī)?nèi)存、局部?jī)?nèi)存以及私有內(nèi)存等4種類(lèi)型,其對(duì)應(yīng)的大小和訪問(wèn)權(quán)限各不相同,且訪問(wèn)速度依次遞增,其使用方式是否得當(dāng)直接決定程序性能的高低。執(zhí)行模型主要由在主機(jī)上執(zhí)行的主機(jī)端程序和在計(jì)算設(shè)備上執(zhí)行的內(nèi)核程序組成。主機(jī)端程序可對(duì)多個(gè)支持OpenCL的計(jì)算設(shè)備進(jìn)行統(tǒng)一調(diào)度管理,并且配置并行程序的執(zhí)行環(huán)境。內(nèi)核程序主要負(fù)責(zé)算法的并行化設(shè)計(jì)過(guò)程。在創(chuàng)建內(nèi)核程序時(shí),主機(jī)端會(huì)預(yù)先創(chuàng)建一個(gè)N維索引空間,索引空間中的每個(gè)工作項(xiàng)對(duì)應(yīng)執(zhí)行內(nèi)核的實(shí)例,多個(gè)工作項(xiàng)組成工作組。編程模型主要分為數(shù)據(jù)并行和任務(wù)并行兩種類(lèi)型。前者是將同一個(gè)任務(wù)并發(fā)到各個(gè)數(shù)據(jù)元素上,通過(guò)工作組實(shí)現(xiàn)分層化的數(shù)據(jù)并行。后者是由設(shè)計(jì)者直接定義和處理并行任務(wù),并將多個(gè)并行任務(wù)映射到一個(gè)工作項(xiàng)來(lái)執(zhí)行,從而在整體上起到加速的效果。
本文選用在經(jīng)典的全息重建算法中執(zhí)行效率最低、最為復(fù)雜的卷積重建算法[12],以便更好地體現(xiàn)GPU技術(shù)的加速特性。根據(jù)瑞利-索末菲衍射積分公式,全息圖經(jīng)由重建光照射后的衍射光波在再現(xiàn)面上的復(fù)振幅分布可表示為
其中,k=2π/λ。
卷積重建算法的異構(gòu)加速設(shè)計(jì)包括搭建異構(gòu)加速平臺(tái)和算法并行化實(shí)現(xiàn)兩大部分。為了更好地利用硬件資源,本文在設(shè)計(jì)異構(gòu)加速策略時(shí),從CPU和GPU的計(jì)算特性出發(fā)分配各自的任務(wù)。計(jì)算量小且邏輯性復(fù)雜的任務(wù),比如OpenCL平臺(tái)的初始化、數(shù)字全息圖的預(yù)處理、歸一化等過(guò)程,交給CPU端串行處理。而計(jì)算量大且邏輯相對(duì)簡(jiǎn)單的卷積重建任務(wù),交給GPU端并行處理。
在業(yè)務(wù)員提出離職時(shí),銷(xiāo)售經(jīng)理并沒(méi)有反思自己的處事方式,反而對(duì)將要離職的業(yè)務(wù)員更加不友好。例如:克扣工資、提成等,這種敵對(duì)態(tài)度一定程度上激化了業(yè)務(wù)員的逆反心理。
據(jù)此設(shè)計(jì)的重建加速算法的實(shí)現(xiàn)流程如圖1所示。由圖可知,在GPU端并行計(jì)算的重建算法從內(nèi)部分解為g(x,y)初始化、2維傅里葉正變換、2維傅里葉逆變換、點(diǎn)乘、零頻點(diǎn)移到頻譜中心、取模等多個(gè)步驟。這些步驟順序執(zhí)行,適合采用數(shù)據(jù)并行編程模型,通過(guò)合理分配工作組的方式實(shí)現(xiàn)異構(gòu)加速計(jì)算。并且整個(gè)過(guò)程只包含兩次數(shù)據(jù)傳輸,1次傳入全息圖和所需參數(shù),另一次傳出重建結(jié)果,計(jì)算的中間結(jié)果始終存儲(chǔ)于GPU端,可有效避免因多次數(shù)據(jù)交換導(dǎo)致的計(jì)算性能瓶頸。整個(gè)并行處理過(guò)程的GPU內(nèi)部實(shí)現(xiàn)如圖2所示,分為FFT的并行化和算法其他部分的并行化兩部分。
圖1 基于CPU+GPU架構(gòu)的卷積加速重建算法流程圖
圖2 卷積加速重建算法的GPU實(shí)現(xiàn)示意圖
3.2.1 FFT的并行化
2維離散傅里葉正變換、逆變換的公式分別為
通過(guò)以上分析,只需開(kāi)辟尺寸為M×N/2的工作組并行化計(jì)算g(x,y)矩陣的蝶形運(yùn)算,每一個(gè)工作項(xiàng)分配一個(gè)蝶形運(yùn)算。并且采用原址計(jì)算的方式,將每一級(jí)蝶形運(yùn)算的輸出存放于原輸入數(shù)據(jù)的位置。根據(jù)旋轉(zhuǎn)因子計(jì)算公式知,其與數(shù)據(jù)本身互不關(guān)聯(lián),所以分配1個(gè)工作組、N/2個(gè)工作項(xiàng)即可??紤]到局部?jī)?nèi)存是GPU中的高速存儲(chǔ)器,保存在其中的數(shù)據(jù)可被這個(gè)工作組中的所有工作項(xiàng)共享,而且其讀取數(shù)據(jù)速度快于全局內(nèi)存,若多次從全局內(nèi)存讀取旋轉(zhuǎn)因子數(shù)據(jù)會(huì)降低效率,進(jìn)一步將旋轉(zhuǎn)因子存儲(chǔ)在蝶形運(yùn)算工作組的局部?jī)?nèi)存中,以達(dá)到工作項(xiàng)共享旋轉(zhuǎn)因子和提高計(jì)算速度的目的。這樣通過(guò)合理設(shè)置索引空間維度和工作組大小,并且合理使用局部?jī)?nèi)存,不僅可以加快執(zhí)行速度,還可以避免不必要的資源浪費(fèi)。
3.2.2 算法其他部分的并行化
除了傅里葉變換環(huán)節(jié),算法還涉及g(x,y)初始化、點(diǎn)乘、零頻點(diǎn)移到頻譜中心及取模等操作的并行化處理。由式(5)可知,g(x,y)的值只與重建再現(xiàn)距離、像元尺寸、光源波長(zhǎng)及數(shù)據(jù)矩陣尺寸有關(guān),可通過(guò)歐拉公式轉(zhuǎn)換成復(fù)數(shù)矩陣,并將復(fù)數(shù)的實(shí)部和虛部當(dāng)成一個(gè)向量進(jìn)行計(jì)算,提高計(jì)算性能。OpenCL編程語(yǔ)言支持多種從C語(yǔ)言中派生的數(shù)據(jù)類(lèi)型,但并非所有平臺(tái)都支持全部數(shù)據(jù)類(lèi)型。例如部分AMD顯卡并不支持doublen數(shù)據(jù)類(lèi)型,因此本文在涉及向量數(shù)據(jù)的運(yùn)算時(shí)均采用floatn數(shù)據(jù)類(lèi)型,以提高程序兼容性。
如圖2所示,點(diǎn)乘是將兩個(gè)相同大小的矩陣點(diǎn)對(duì)點(diǎn)相乘。零頻點(diǎn)移到頻譜中心是將圖像中心點(diǎn)作為2維坐標(biāo)軸的原點(diǎn),對(duì)2維傅里葉逆變換的結(jié)果進(jìn)行1,3象限和2,4象限的互換。取模是對(duì)任意一個(gè)M行N列的矩陣元素的實(shí)部平方加上其虛部平方再開(kāi)方。以上都是對(duì)矩陣的每一個(gè)數(shù)據(jù)進(jìn)行相同操作的過(guò)程,且各數(shù)據(jù)之間沒(méi)有依賴關(guān)系,滿足數(shù)據(jù)并行和工作項(xiàng)并行的要求,按照矩陣大小分配工作項(xiàng)大小即可。
為了充分驗(yàn)證本文所提出的基于OpenCL架構(gòu)的跨平臺(tái)加速策略(即OpenCL版本)的有效性,采用具有NVIDIA公司GPU的加速平臺(tái)1(CPU1+GPU1)和具有AMD公司GPU的加速平臺(tái)2(CPU2+GPU2)對(duì)不同分辨率的數(shù)字全息圖進(jìn)行了并行重建測(cè)試及各自對(duì)應(yīng)CPU下的串行重建測(cè)試。操作系統(tǒng)為Windows 10 64位,軟件平臺(tái)為Qt5。表1列出了兩種加速平臺(tái)的具體信息。
表1 兩種GPU加速平臺(tái)參數(shù)
此外,在加速平臺(tái)1上還測(cè)試了卷積重建算法并行加速的CUDA版本程序,以對(duì)比分析兩種不同架構(gòu)的加速性能。
實(shí)驗(yàn)測(cè)試圖像為直徑20 μm聚苯乙烯微粒的同軸數(shù)字全息圖,分辨率為3264×2448,如圖3所示。圖4展示了全幅重建結(jié)果及局部區(qū)域?qū)?yīng)的顯微鏡圖像結(jié)果。
圖3 20 μm聚苯乙烯微粒的同軸數(shù)字全息圖
圖4 全幅重建結(jié)果與局部區(qū)域的顯微鏡對(duì)比圖
從圖3中截取6個(gè)分辨率遞增的局部區(qū)域全息圖像,分別在兩個(gè)加速平臺(tái)及其對(duì)應(yīng)CPU下各進(jìn)行3次OpenCL版本的并行、串行重建測(cè)試,以及在加速平臺(tái)1上進(jìn)行3次CUDA版本的并行重建測(cè)試,所得總執(zhí)行時(shí)間的平均值如表2所示。
根據(jù)本文提出的OpenCL版本CPU+GPU異構(gòu)型并行化設(shè)計(jì)策略(見(jiàn)圖1),加速平臺(tái)的全息重建總執(zhí)行時(shí)間實(shí)際由CPU端的串行運(yùn)算用時(shí)、CPU端與GPU端之間的數(shù)據(jù)傳輸用時(shí)和GPU端的并行運(yùn)算用時(shí)等3個(gè)分項(xiàng)構(gòu)成。表3列出了針對(duì)不同分辨率全息圖,在不同加速平臺(tái)進(jìn)行重建的各分項(xiàng)用時(shí)。
根據(jù)表2和表3,可進(jìn)一步計(jì)算得到OpenCL版本下兩個(gè)GPU加速平臺(tái)相對(duì)于CPU平臺(tái)的重建耗時(shí)總加速比(即CPU總執(zhí)行時(shí)間與前者總執(zhí)行時(shí)間之比)、并行運(yùn)算加速比(即CPU執(zhí)行卷積重建的串行運(yùn)算用時(shí)與GPU執(zhí)行卷積重建的并行運(yùn)算用時(shí)之比)隨全息圖像分辨率的變化曲線,如圖5所示。兩個(gè)加速平臺(tái)下各分項(xiàng)用時(shí)占總執(zhí)行時(shí)間的百分比隨全息圖像分辨率的變化曲線如圖6所示。
圖5 不同加速平臺(tái)的加速比(OpenCL版本)
圖6 不同加速平臺(tái)的內(nèi)部耗時(shí)百分比(OpenCL版本)
表3 不同GPU加速平臺(tái)下全息重建的分項(xiàng)執(zhí)行時(shí)間對(duì)比(OpenCL版本)(ms)
(1) 由圖4可見(jiàn),重建還原的聚苯乙烯微粒形態(tài)呈現(xiàn)圓形,與真實(shí)微粒相近,且大小均勻,輪廓清晰,再現(xiàn)像質(zhì)量與顯微鏡圖像相當(dāng),表明本文設(shè)計(jì)實(shí)現(xiàn)的卷積重建加速算法正確有效。
(2) 對(duì)比表2所列OpenCL版本的執(zhí)行時(shí)間,可觀察到兩個(gè)GPU加速平臺(tái)針對(duì)不同分辨率全息圖的重建運(yùn)算總用時(shí)均明顯低于CPU平臺(tái)。以3072×2304最大分辨率全息圖為例,前者約為后者的1.8%和10.1%。由此可見(jiàn),基于OpenCL的異構(gòu)加速策略能顯著提高全息重建的時(shí)效性,且具有良好跨平臺(tái)特性。
表2 不同CPU與GPU加速平臺(tái)的全息重建總執(zhí)行時(shí)間對(duì)比
(3) 觀察圖5可知,在OpenCL版本下,兩個(gè)GPU加速平臺(tái)的總加速比、并行運(yùn)算加速比均先隨著圖像分辨率的提高而增大,且初期增長(zhǎng)迅猛,隨后增速減緩,特別是加速平臺(tái)2在圖像尺寸增至2048×1536時(shí)達(dá)到峰值,此后開(kāi)始降低,整體變化趨勢(shì)與文獻(xiàn)報(bào)道相符[13,14]。這表明,一方面GPU加速具有規(guī)模增長(zhǎng)性,即全息圖像分辨率越高,得到的加速比越大,加速效果會(huì)越顯著;另一方面,這種規(guī)模增長(zhǎng)性又受到GPU所配置的并行運(yùn)算資源的限制。隨著全息圖像分辨率的提高,數(shù)據(jù)規(guī)模越來(lái)越大,重建運(yùn)算對(duì)GPU資源的需求量也增大,而所能利用的GPU資源將逐漸接近飽和狀態(tài),因此加速比從初始階段的陡增變?yōu)橹虚g階段的緩增直至峰值。此后對(duì)于更大分辨率全息圖像的重建,GPU資源將進(jìn)入過(guò)飽和狀態(tài),超負(fù)荷運(yùn)行,意味著并行任務(wù)之間也需要排隊(duì)競(jìng)爭(zhēng)資源,從而導(dǎo)致加速比開(kāi)始下降。值得注意的是,在OpenCL的這種異構(gòu)加速策略中,CPU端負(fù)責(zé)的平臺(tái)初始化、全息圖像預(yù)處理及歸一化過(guò)程并沒(méi)有經(jīng)過(guò)加速處理,因此僅統(tǒng)計(jì)GPU端執(zhí)行卷積重建核心計(jì)算過(guò)程的并行運(yùn)算加速比高于總加速比,且能更真實(shí)地反映GPU的加速效果。對(duì)比兩個(gè)GPU加速平臺(tái)的硬件配置和加速比曲線,不難發(fā)現(xiàn)高配置的加速平臺(tái)1具有更為優(yōu)秀的加速表現(xiàn),其重建不同分辨率全息圖像的運(yùn)行耗時(shí)均比低配置的加速平臺(tái)2低一個(gè)數(shù)量級(jí),在3072×2304最大分辨率下總加速比達(dá)到54.2是后者的5倍以上,并行運(yùn)算加速比更是高達(dá)94.7,是后者的8倍以上,且尚未達(dá)到其規(guī)模增長(zhǎng)上限。由此可見(jiàn),GPU的計(jì)算資源配置對(duì)于并行加速策略所能達(dá)到的加速性能有至關(guān)重要的影響。
(4) 由表3可見(jiàn),兩個(gè)GPU加速平臺(tái)下,Open-CL版本測(cè)試的數(shù)據(jù)傳輸用時(shí)最少,串行運(yùn)算用時(shí)次之,并行運(yùn)算用時(shí)最多,且各分項(xiàng)的運(yùn)算用時(shí)均隨著全息圖像分辨率的增加而增大,尤以串行運(yùn)算用時(shí)的增幅最為顯著,達(dá)到30倍以上。同時(shí),觀察圖6可以發(fā)現(xiàn),在兩種GPU加速平臺(tái)下,數(shù)據(jù)傳輸用時(shí)占比均最低,分別低于8%,4%,且隨圖像分辨率變化微小,因此相比其他兩項(xiàng)用時(shí)幾乎可以忽略不計(jì)。對(duì)于高硬件配置的GPU加速平臺(tái)1,其串行運(yùn)算用時(shí)占比隨全息圖像分辨率上升趨勢(shì)明顯,從10.8%增長(zhǎng)至35.8%,而并行運(yùn)算用時(shí)占比則從83.3%降低至57.2%,減勢(shì)顯著。結(jié)合圖5所示的加速比變化曲線,表明串行運(yùn)算用時(shí)逐漸成為制約其總加速比進(jìn)一步提高的主要因素,這也是總加速比遠(yuǎn)低于并行運(yùn)算加速比且差距逐漸加大的原因。對(duì)于低硬件配置的GPU加速平臺(tái)2,其串行運(yùn)算用時(shí)占比呈現(xiàn)出先略增后持續(xù)降低的變化趨勢(shì),最大占比也僅為12.6%,而并行運(yùn)算用時(shí)占比的變化趨勢(shì)與之相反,即先略降再持續(xù)上升,數(shù)值始終在83.8%以上,表明并行運(yùn)算用時(shí)始終對(duì)其加速效果起著決定性作用,而串行運(yùn)算用時(shí)的影響幾乎可以忽略不計(jì),這也導(dǎo)致了其總加速比與并行運(yùn)算加速比相近。由此可見(jiàn),加速平臺(tái)的硬件配置差異及全息圖像的分辨率差異對(duì)數(shù)據(jù)傳輸用時(shí)的影響極為有限,而后者對(duì)加速性能幾乎沒(méi)有干預(yù)能力。加速平臺(tái)所能達(dá)到的加速效果主要取決于GPU端的配置性能,但在GPU并行計(jì)算資源相對(duì)充足的情況下,CPU的配置性能會(huì)成為GPU加速規(guī)模效應(yīng)的制約因素。因此,在實(shí)際應(yīng)用中需要根據(jù)具體的加速需求合理配置GPU和CPU硬件資源。
(5) 對(duì)比表2中OpenCL版本與CUDA版本并行加速算法在GPU加速平臺(tái)1上針對(duì)不同分辨率全息圖像的重建總執(zhí)行時(shí)間,可見(jiàn)后者比前者用時(shí)更少。且隨著全息圖像分辨率的增加,CUDA版本運(yùn)行效率的提高更為顯著,特別是在3072×2304最大分辨率全息圖時(shí),用時(shí)縮短了26.7%。這與文獻(xiàn)報(bào)道的在大多數(shù)NVIDIA公司GPU上,CUDA的運(yùn)算性能明顯優(yōu)于OpenCL[15-17],運(yùn)行效率增幅高達(dá)30%相吻合[17]。造成這種差異的原因,一方面是OpenCL的內(nèi)核可以在運(yùn)行時(shí)進(jìn)行編譯,從而增加了運(yùn)行時(shí)間[15]。另一方面專(zhuān)用于NVIDIA公司GPU的CUDA顯然得到了廠商的優(yōu)先支持,能更好地匹配其硬件的計(jì)算特性,從而提供更好的性能。而隨著NVIDIA公司更新其OpenCL驅(qū)動(dòng)程序,后者表現(xiàn)不佳的情況將會(huì)有所改善[16]。同時(shí),也有不少文獻(xiàn)報(bào)道[17-20]指出,上述的性能差異源自對(duì)CUDA和OpenCL的不公平比較。在許多情況下,通過(guò)減少兩者存在的編程模型差異、本地內(nèi)核不同優(yōu)化、架構(gòu)相關(guān)差異和編譯器差異,將兩個(gè)版本應(yīng)用程序調(diào)到同等水平,OpenCL的性能可與CUDA媲美。此外,計(jì)算資源配置不同的GPU在性能上的差異其實(shí)更加顯著[18],這一點(diǎn)在本文測(cè)試結(jié)果中也得到了印證。
本文基于OpenCL架構(gòu)提出了一種數(shù)字全息卷積重建算法的并行化加速策略,對(duì)卷積重建算法的異構(gòu)型并行化設(shè)計(jì)進(jìn)行了理論分析和工程實(shí)現(xiàn),并在不同的GPU平臺(tái)上完成了加速重建測(cè)試及與CUDA架構(gòu)加速策略的對(duì)比測(cè)試。實(shí)驗(yàn)結(jié)果表明,與CPU串行方式相比,OpenCL架構(gòu)的GPU并行方式加速成效顯著,具有規(guī)模增長(zhǎng)性,并且在不同的異構(gòu)平臺(tái)下都能實(shí)現(xiàn)很好的加速,全息圖重建效果清晰,滿足跨平臺(tái)加速需求。通過(guò)系統(tǒng)的代碼調(diào)優(yōu),有望達(dá)到與CUDA架構(gòu)相近的運(yùn)算性能。此外,GPU端的硬件配置性能對(duì)異構(gòu)加速策略所能達(dá)到的加速效果起著決定性作用,但對(duì)于高分辨率全息圖像的加速重建,CPU端的硬件配置性能也不容忽視。