孟大地 胡玉新 石濤 孫蕊 李曉波
(中國(guó)科學(xué)院電子學(xué)研究所 北京 100190)
(中國(guó)科學(xué)院空間信息處理與應(yīng)用系統(tǒng)技術(shù)重點(diǎn)實(shí)驗(yàn)室 北京 100190)
合成孔徑雷達(dá)(Synthetic Aperture Radar,SAR)是一種具有全天時(shí)、全天候、獲取微波散射信息豐富等特點(diǎn)的重要的遙感技術(shù)手段,在軍事、農(nóng)業(yè)、林業(yè)、海洋等領(lǐng)域均具有巨大的應(yīng)用潛力[1]。但由于高分辨率SAR系統(tǒng)接收的原始數(shù)據(jù)量大,并且需要經(jīng)過(guò)復(fù)雜的2維匹配濾波處理才能獲得SAR圖像,甚至有些應(yīng)用領(lǐng)域?qū)?SAR圖像獲取具有較高的實(shí)時(shí)性要求,從而使得高速的成像處理技術(shù)成為SAR領(lǐng)域的一項(xiàng)關(guān)鍵技術(shù)。目前一般利用基于中央處理器(Central Processing Unit,CPU)的個(gè)人計(jì)算機(jī)、工作站以及大型計(jì)算服務(wù)器進(jìn)行后期的 SAR成像處理,這時(shí)需要投入大量資金購(gòu)置多臺(tái)具有足夠處理能力的計(jì)算設(shè)備,并利用 OpenMP[2]或 MPI[3]等并行編程技術(shù)進(jìn)行軟件實(shí)現(xiàn)。而SAR實(shí)時(shí)成像處理器一般用FPGA或DSP實(shí)現(xiàn),這時(shí)均需要較為復(fù)雜的編程手段以及采購(gòu)昂貴的硬件設(shè)備。
由于圖形處理市場(chǎng)的拉動(dòng)作用,圖形處理器(Graphic Processing Unit,GPU)已經(jīng)發(fā)展成為具有高度并行、多線程、多核心、超大帶寬、具有數(shù)百個(gè)計(jì)算單元的高性能處理平臺(tái)。與通用的 CPU相比,由于GPU產(chǎn)品不具有CPU產(chǎn)品中的流程控制、緩存等功能部件而專(zhuān)注于進(jìn)行數(shù)據(jù)運(yùn)算,因此GPU產(chǎn)品更適用于作為以浮點(diǎn)運(yùn)算為主、適于并行化的計(jì)算任務(wù)的運(yùn)行平臺(tái)[4]。近年英偉達(dá)(NVIDIA)公司GPU產(chǎn)品與英特爾(Intel)公司CPU產(chǎn)品的計(jì)算性能對(duì)比如圖1所示[4],可見(jiàn)各時(shí)期GPU產(chǎn)品的運(yùn)算速度以及傳輸帶寬遠(yuǎn)高于同時(shí)代的 CPU產(chǎn)品。NVIDIA于2006年11月推出了一種將GPU用于進(jìn)行高性能計(jì)算的通用并行計(jì)算架構(gòu)(Compute Unified Device Architecture,CUDA)以及相關(guān)的并行編程模型和函數(shù)庫(kù)。該技術(shù)的出現(xiàn)大大推動(dòng)了GPU在高性能計(jì)算領(lǐng)域的廣泛應(yīng)用[4]。借助于CUDA技術(shù),在傳統(tǒng)CPU上運(yùn)行的需要大量浮點(diǎn)運(yùn)算的代碼可以方便地移植到 GPU上,而代碼的條件判斷等邏輯控制部分仍然在CPU平臺(tái)上運(yùn)行[4]。
機(jī)載 SAR成像處理過(guò)程一般由向量相乘、轉(zhuǎn)置、快速傅里葉變換(FFT)以及插值等運(yùn)算模塊組成[1],各運(yùn)算模塊都能以較高的效率進(jìn)行并行化處理,因此有望利用CUDA技術(shù)在GPU上實(shí)現(xiàn)成像處理算法,并取得與CPU上的成像處理算法相比較大幅度的速度提升。本文擬利用CUDA技術(shù)將傳統(tǒng)的機(jī)載SAR成像處理算法部署于NVIDIA的GPU產(chǎn)品上,并用于進(jìn)行SAR實(shí)時(shí)成像處理。
當(dāng)前支持CUDA技術(shù)的主流GPU產(chǎn)品的顯存較小,一般不超過(guò)6 GB,不足以容納一景SAR數(shù)據(jù)量,且具有較大顯存的高端產(chǎn)品價(jià)格較為昂貴。由于成像處理過(guò)程中需要多次進(jìn)行轉(zhuǎn)置操作,因此需要在主機(jī)內(nèi)存中開(kāi)辟足夠空間用于存儲(chǔ)全部處理數(shù)據(jù),并在成像處理的各個(gè)階段將數(shù)據(jù)進(jìn)行分塊,各塊依次傳入 GPU設(shè)備顯存,處理完成之后將處理結(jié)果傳入主機(jī)內(nèi)存。設(shè)備顯存與主機(jī)內(nèi)存通過(guò)PCI-e接口進(jìn)行數(shù)據(jù)交互,該接口的單向傳輸速度約為 6 GB/s(2代 PCI-e×16,CUDA SDK 提供bandwidthtest軟件測(cè)試結(jié)果),因此數(shù)據(jù)在主機(jī)內(nèi)存與GPU顯存之間的多次交互導(dǎo)致GPU的處理性能不能得到充分發(fā)揮,處理效率大大降低。
本文利用 CUDA編程接口中的異步執(zhí)行(asynchronous concurrent execution)[4],流(stream)等技術(shù)[4],以及對(duì)SAR數(shù)據(jù)的分塊處理策略,提出了一種運(yùn)行于NVIDIA GPU產(chǎn)品上的成像處理算法的設(shè)計(jì)方案。該方案在不降低算法處理精度的基礎(chǔ)上,掩蓋了數(shù)據(jù)在主機(jī)內(nèi)存與設(shè)備顯存之間的交互傳輸,從而能夠充分利用GPU設(shè)備的計(jì)算資源;當(dāng)主機(jī)上配置多個(gè) GPU設(shè)備時(shí),該方案還支持多GPU設(shè)備的同時(shí)執(zhí)行,提高了方案的硬件配置靈活性;該方案中的所有大規(guī)模計(jì)算任務(wù)都由 GPU完成,CPU只進(jìn)行足以忽略不計(jì)的簡(jiǎn)單計(jì)算、參數(shù)讀取以及邏輯判斷,因此主機(jī)只需配置足夠的內(nèi)存,而無(wú)須配置昂貴的高性能CPU,甚至單核CPU產(chǎn)品也足以勝任,降低了設(shè)備預(yù)算及設(shè)備功耗;該方案突破了GPU顯存容量對(duì)SAR成像處理數(shù)據(jù)大小的限制,只需足夠的主機(jī)內(nèi)存,而不要求單個(gè)設(shè)備具有大容量顯存,甚至不足1 G的顯存容量也能滿(mǎn)足處理需求,從而提高了實(shí)時(shí)成像處理算法對(duì)大數(shù)據(jù)量SAR數(shù)據(jù)的處理能力,拓寬了購(gòu)置GPU設(shè)備時(shí)的選擇范圍,大大降低了對(duì) GPU設(shè)備內(nèi)存容量的要求,從而降低了設(shè)備購(gòu)置的資金預(yù)算;另外,該方案不但能用于SAR實(shí)時(shí)成像處理,也能用于事后SAR數(shù)據(jù)處理,這時(shí)甚至可以將該方案部署在筆記本電腦上,大大增加了成像處理設(shè)備的便攜性。
將機(jī)載ωκ成像處理算法在一部 NVIDIA K20C(計(jì)算能力 3.5,2496個(gè) CUDA計(jì)算核心(core),功耗225 W,市場(chǎng)價(jià)格約為25000元人民幣,用CUDA 5.0編譯)[5]以及一顆INTEL Xeon E5645(Westmere系列,主頻2.4 GHz,6核心,功耗80 W,市場(chǎng)價(jià)格約為2900元人民幣,用INTEL編譯器編譯,調(diào)用INTEL MKL數(shù)學(xué)運(yùn)算庫(kù))[6]上的對(duì)比測(cè)試表明,該方案可以達(dá)到約每秒處理36 M個(gè)原始數(shù)據(jù)采樣點(diǎn)的處理速度。與基于 CPU的處理算法相比,該方案可以達(dá)到約15倍的加速比,基本與圖1的性能對(duì)比相符。對(duì)方位/距離向各為32768的SAR數(shù)據(jù),一部K20C處理所需時(shí)間約為7 s(不包括原始數(shù)據(jù)讀取、數(shù)據(jù)寫(xiě)入、內(nèi)存/顯存的分配和釋放),足以保證成像處理的實(shí)時(shí)率。
本文第2節(jié)根據(jù)CUDA并行化特點(diǎn)對(duì)SAR成像處理算法的結(jié)構(gòu)特征進(jìn)行分析;第3節(jié)簡(jiǎn)要介紹了SAR實(shí)時(shí)成像處理算法實(shí)現(xiàn)所需CUDA編程技巧;基于以上兩節(jié)的討論,第4節(jié)詳細(xì)討論了基于CUDA的 SAR實(shí)時(shí)成像處理算法設(shè)計(jì)思路以及最終實(shí)現(xiàn)方案;第5節(jié)利用仿真SAR數(shù)據(jù)驗(yàn)證了算法的處理速度,并與基于CPU的處理結(jié)果進(jìn)行對(duì)比;第6節(jié)對(duì)本文內(nèi)容進(jìn)行了總結(jié)。
目前一般采用頻域2維匹配濾波的成像處理算法[1]進(jìn)行SAR成像處理,而不采用運(yùn)算量多出數(shù)百倍甚至千倍的時(shí)域后向反投影算法[7],對(duì)于實(shí)時(shí)成像處理算法更是如此。頻域匹配濾波算法主要包括距離多普勒(RD)算法、Chirp Scaling(CS)算法以及ωκ算法。3種算法的詳細(xì)介紹及優(yōu)缺點(diǎn)對(duì)比參見(jiàn)文獻(xiàn)[1]。3種算法的處理步驟見(jiàn)圖2所示流程圖[1]。圖2中圓角矩形表示距離向處理,所處理數(shù)據(jù)按先排距離向存儲(chǔ);直角矩形表示方位向處理,所處理數(shù)據(jù)按先排方位向存儲(chǔ)。
由圖2可見(jiàn),3種頻域機(jī)載SAR成像處理算法具有大致相同的算法結(jié)構(gòu),在研究其在 GPU上的部署時(shí),可以統(tǒng)一進(jìn)行分析與設(shè)計(jì)。因此下文內(nèi)容適用于3種算法中的任何一種。
機(jī)載SAR在實(shí)際數(shù)據(jù)獲取過(guò)程中,載機(jī)受氣流影響會(huì)偏離理想水平勻速直線運(yùn)動(dòng)狀態(tài),導(dǎo)致原始回波數(shù)據(jù)與成像處理算法失配,因此在對(duì)實(shí)際機(jī)載SAR 數(shù)據(jù)進(jìn)行處理時(shí),還需進(jìn)行運(yùn)動(dòng)補(bǔ)償[8]。本文中采用文獻(xiàn)[9]中介紹的具有更高精度的運(yùn)動(dòng)補(bǔ)償算法(考慮了距離空變的距離走動(dòng)補(bǔ)償),在圖 2中的步驟A距離壓縮之后進(jìn)行運(yùn)動(dòng)補(bǔ)償處理即可。
在圖2中,由于SAR原始數(shù)據(jù)以及處理中間結(jié)果數(shù)據(jù)在計(jì)算機(jī)內(nèi)存中的線性存儲(chǔ)特點(diǎn),3種算法都需要在處理過(guò)程中進(jìn)行3次轉(zhuǎn)置操作(改變2維數(shù)據(jù)的優(yōu)先存儲(chǔ)方向,以利于處理器對(duì)內(nèi)存中數(shù)據(jù)的讀取/寫(xiě)入效率)。SAR原始數(shù)據(jù)最初是處于先排距離向的存儲(chǔ)狀態(tài)。3種算法在不同的數(shù)據(jù)存儲(chǔ)方式下(先排距離向或先排方位向)對(duì)數(shù)據(jù)執(zhí)行所需操作(圖2中表示為A,B,C,D 4個(gè)運(yùn)算模塊),最終獲得先排距離向的SAR圖像。
由于上述3種算法在執(zhí)行過(guò)程中都需要進(jìn)行多次轉(zhuǎn)置,要將其利用CUDA技術(shù)在GPU上部署,首選方案是將所有數(shù)據(jù)一次性讀入 GPU顯存,并在 GPU上用 kernel(GPU處理任務(wù)的調(diào)度單元[4])的方式實(shí)現(xiàn)算法的所有運(yùn)算模塊。目前已有基于CUDA技術(shù)的SAR成像處理算法均采用了這種方法[10-13],因此可處理一景數(shù)據(jù)所包含脈沖數(shù)受到GPU顯存容量的限制。而當(dāng)GPU顯存容量(不超過(guò)6 GB,未來(lái)預(yù)計(jì)會(huì)有更高顯存容量的GPU產(chǎn)品問(wèn)世,但價(jià)格總是與內(nèi)存容量成正比)不能容納一景SAR數(shù)據(jù)時(shí),這時(shí)只能先將所有數(shù)據(jù)存入主機(jī)內(nèi)存,在主機(jī)端利用CPU完成4次轉(zhuǎn)置操作。在不同的數(shù)據(jù)存儲(chǔ)方式下,每個(gè)運(yùn)算模塊由以下方式實(shí)現(xiàn):根據(jù)顯存容量對(duì)所需處理數(shù)據(jù)進(jìn)行分塊(每個(gè)分塊的數(shù)據(jù)連續(xù)存儲(chǔ),并確保GPU顯存能容納每塊數(shù)據(jù),分塊處理并不影響算法的處理精度);對(duì)于每個(gè)數(shù)據(jù)塊,先將其拷貝至GPU顯存,在GPU中用kernel的方式實(shí)現(xiàn)模塊相關(guān)處理步驟,再將結(jié)果寫(xiě)入主機(jī)內(nèi)存的原位置;最后從主機(jī)內(nèi)存中將處理結(jié)果SAR圖像存盤(pán)。
在上述實(shí)現(xiàn)方式中,GPU需要等待主機(jī)端的轉(zhuǎn)置操作完成才能執(zhí)行之后的運(yùn)算模塊,由此帶來(lái)兩點(diǎn)不便:CPU轉(zhuǎn)置操作與GPU運(yùn)算不能同時(shí)執(zhí)行,降低了算法的整體處理效率;為了提高轉(zhuǎn)置效率,需要配置運(yùn)算速度較快的CPU,增加設(shè)備預(yù)算及設(shè)備功耗。
由此可見(jiàn),為了充分利用 GPU設(shè)備的運(yùn)算性能,降低對(duì)CPU的性能要求,在將數(shù)據(jù)存儲(chǔ)于主機(jī)內(nèi)存(始終以先排距離向的存儲(chǔ)方式)以及采用分塊處理策略的前提下,需要將轉(zhuǎn)置操作以及A,B,C,D 4個(gè)運(yùn)算模塊在GPU上執(zhí)行,而CPU只承擔(dān)流程控制、數(shù)據(jù)讀取/寫(xiě)入以及少量簡(jiǎn)單運(yùn)算。另外,還需要利用CUDA編程接口中的異步并行技術(shù),使得主機(jī)內(nèi)存與GPU顯存之間的數(shù)據(jù)交互與kernel并行執(zhí)行,從而減少甚至消除kernel執(zhí)行對(duì)數(shù)據(jù)交互的等待時(shí)間。
CUDA編程技術(shù)的基本任務(wù)劃分原則是:由主機(jī)負(fù)責(zé)算法的整體架構(gòu),而將算法中的大運(yùn)算量模塊交由 GPU處理。這些大運(yùn)算量模塊一般由連續(xù)執(zhí)行的若干步驟組成,其中某些步驟可直接調(diào)用現(xiàn)有的CUDA函數(shù)庫(kù)(如FFT可由CUFFT中的庫(kù)函數(shù)實(shí)現(xiàn)),其余無(wú)庫(kù)函數(shù)可供調(diào)用的步驟需編寫(xiě)對(duì)應(yīng)的kernel。
根據(jù)上節(jié)對(duì) SAR成像處理算法的結(jié)構(gòu)特征分析,對(duì)于圖2中A,B,C,D 4個(gè)運(yùn)算模塊,均需要執(zhí)行CPU→GPU數(shù)據(jù)復(fù)制、數(shù)據(jù)處理、GPU→CPU數(shù)據(jù)復(fù)制3個(gè)步驟;對(duì)于模塊B與模塊D,還需要在數(shù)據(jù)處理之前進(jìn)行先排距離向到先排方位向的轉(zhuǎn)置操作,以及在數(shù)據(jù)處理之后進(jìn)行先排方位向到先排距離向的轉(zhuǎn)置操作。兩次轉(zhuǎn)置操作均由 GPU完成。要利用CUDA技術(shù)將這種實(shí)現(xiàn)方案在GPU上部署,并充分利用 GPU設(shè)備的運(yùn)算資源以及傳輸帶寬,需要利用CUDA編程技術(shù)所提供的各種接口解決以下幾點(diǎn)技術(shù)難題。
根據(jù)第2節(jié)對(duì)SAR成像處理算法的結(jié)構(gòu)分析,需要對(duì)主機(jī)內(nèi)存中的 SAR數(shù)據(jù)分塊,對(duì)每塊執(zhí)行“讀入 GPU顯存→數(shù)據(jù)處理→寫(xiě)入主機(jī)內(nèi)存”3步操作。由于數(shù)據(jù)始終以先排距離向的方式存儲(chǔ)于主機(jī)內(nèi)存,因此在進(jìn)行距離向操作(圖 2中以圓角表示的模塊,模塊A,C)時(shí),所需處理的數(shù)據(jù)塊連續(xù)存儲(chǔ)于主機(jī)內(nèi)存的一段空間(如圖3(a)所示),這時(shí)可直接利用 CUDA 庫(kù)函數(shù) cudaMemcpy[4]或cudaMemcpyAsync[4]將其由主機(jī)內(nèi)存復(fù)制到 GPU顯存,處理結(jié)束后再由該函數(shù)將處理結(jié)果從 GPU顯存復(fù)制到主機(jī)內(nèi)存的原位置。
而在進(jìn)行方位向操作(圖 2中以直角表示的模塊,模塊 B,D)時(shí),所需處理的一塊數(shù)據(jù)在主機(jī)內(nèi)存中分散于 Na個(gè)連續(xù)存儲(chǔ)數(shù)據(jù)段(如圖 3(b)所示,其中 Nr為距離向采樣點(diǎn)數(shù),Na為脈沖個(gè)數(shù)),這時(shí)就需要調(diào)用 CUDA編程接口所提供的支持分段復(fù)制的內(nèi)存復(fù)制函數(shù) cudaMemcpy2D[4]或cudaMemcpy2DAsync[4]進(jìn)行模塊前后的兩次數(shù)據(jù)塊復(fù)制。在將數(shù)據(jù)由主機(jī)內(nèi)存?zhèn)魅?GPU顯存后,數(shù)據(jù)按照先排距離向方式存儲(chǔ)于 GPU顯存上一塊連續(xù)的存儲(chǔ)空間,這時(shí)還需要將該數(shù)據(jù)做轉(zhuǎn)置處理(數(shù)據(jù)將按先排方位向方式存儲(chǔ)),才能進(jìn)行后續(xù)的數(shù)據(jù)處理操作。在數(shù)據(jù)處理完成之后,還需再進(jìn)行一次轉(zhuǎn)置處理(數(shù)據(jù)將按先排距離向存儲(chǔ)),才能再次調(diào)用cudaMemcpy2D或cudaMemcpy2DAsync將處理結(jié)果寫(xiě)入主機(jī)內(nèi)存原位置。
CUDA Samples中提供了利用共享內(nèi)存技術(shù)在GPU 上實(shí)現(xiàn)轉(zhuǎn)置操作的示例[14],本文轉(zhuǎn)置 kernel的設(shè)計(jì)直接采用了該方法。另外,為了讓轉(zhuǎn)置執(zhí)行與內(nèi)存顯存之間的數(shù)據(jù)復(fù)制實(shí)現(xiàn)下節(jié)所述的異步并行化,在實(shí)現(xiàn)轉(zhuǎn)置kernel時(shí),借助于cudaMemcpy2D或 cudaMemcpy2DAsync,轉(zhuǎn)置前后數(shù)據(jù)均位于GPU顯存上,而未采用內(nèi)存映射(mapped memory)技術(shù)[4]或統(tǒng)一虛擬地址空間(unified virtual address space)技術(shù)[4]所實(shí)現(xiàn)的從主機(jī)內(nèi)存讀取數(shù)據(jù)直接進(jìn)行轉(zhuǎn)置。
3.2.1 異步并行技術(shù) 在計(jì)算能力不低于1.1的部分GPU設(shè)備上,CUDA編程架構(gòu)提供了主機(jī)內(nèi)存與GPU顯存之間數(shù)據(jù)傳輸與kernel執(zhí)行的并行機(jī)制,稱(chēng)為異步并行技術(shù)。合理地利用該技術(shù),使得數(shù)據(jù)復(fù)制與kernel執(zhí)行同步進(jìn)行,可以盡可能地保證GPU設(shè)備的運(yùn)算核心處于忙碌狀態(tài),減少甚至消除第 2節(jié)所述kernel對(duì)所需數(shù)據(jù)的等待時(shí)間。在計(jì)算能力不低于2.0的部分GPU設(shè)備上,CUDA編程架構(gòu)甚至支持“主機(jī)內(nèi)存→GPU顯存數(shù)據(jù)傳輸、kernel執(zhí)行、GPU顯存→主機(jī)內(nèi)存數(shù)據(jù)傳輸”3者的并行機(jī)制[4]。
但是,這種并行機(jī)制也受到所復(fù)制數(shù)據(jù)與kernel執(zhí)行所需數(shù)據(jù)的依賴(lài)性的限制,即在 kernel執(zhí)行所需數(shù)據(jù)復(fù)制到顯存完成之前kernel一直處于等待狀態(tài),在kernel執(zhí)行完成之前無(wú)法將執(zhí)行結(jié)果復(fù)制到主機(jī)內(nèi)存,因此該技術(shù)不能直接應(yīng)用于SAR成像處理算法。
3.2.2 流技術(shù) 異步并行技術(shù)的實(shí)施需要借助于流(stream)技術(shù)。創(chuàng)建若干個(gè)流,將所需處理任務(wù)分配到各個(gè)流上。在各流的當(dāng)前任務(wù)滿(mǎn)足上節(jié)所述的并行執(zhí)行條件時(shí),由于流的可并行執(zhí)行特性[4],從而實(shí)現(xiàn)了當(dāng)前各任務(wù)的并行執(zhí)行。圖4示意了這種異步并行方案的實(shí)現(xiàn)方式。其中 CPU代表主機(jī)內(nèi)存,GPU代表 GPU顯存,各圓角矩形中的數(shù)字代表分塊序號(hào)。將圖2中的每個(gè)運(yùn)算模塊部署在GPU上時(shí),可按照如圖4所示策略進(jìn)行任務(wù)調(diào)度(對(duì)于運(yùn)算模塊B,D,在數(shù)據(jù)處理前后還包含兩次轉(zhuǎn)置操作)。
如圖4所示,創(chuàng)建3個(gè)流,先將前3個(gè)SAR數(shù)據(jù)塊分別交由流0,流1,流2處理,每塊數(shù)據(jù)的處理都包括“CPU→GPU數(shù)據(jù)傳輸、數(shù)據(jù)處理、GPU→CPU數(shù)據(jù)傳輸”3項(xiàng)任務(wù)(該示例中假設(shè)各處理模塊的執(zhí)行時(shí)間相等)。由于3個(gè)流的同類(lèi)處理任務(wù)不能并行執(zhí)行,因此相鄰流之間有一個(gè)任務(wù)執(zhí)行時(shí)間的延時(shí),而3個(gè)流的不同類(lèi)處理任務(wù)可以并行執(zhí)行。再繼續(xù)將后續(xù)待處理數(shù)據(jù)塊依次發(fā)射(issue)在 3個(gè)流上,即可保證所有時(shí)刻3個(gè)流中的處理步驟都處于并行執(zhí)行狀態(tài)。這時(shí)除了整個(gè)任務(wù)的首尾少量時(shí)間3個(gè)流未完全并行外,處理過(guò)程中絕大部分處理時(shí)間3個(gè)流都處于并行執(zhí)行狀態(tài),從而保證了GPU運(yùn)算核心(core)絕大部分時(shí)間處于忙碌狀態(tài),有效掩蓋了數(shù)據(jù)在主機(jī)內(nèi)存與GPU顯存中的傳輸時(shí)間。
為了降低3個(gè)流首尾未并行任務(wù)塊占總?cè)蝿?wù)的比例,需要保證SAR數(shù)據(jù)的分塊數(shù)不能太少,而各分塊尺寸太小時(shí)不能充分利用所有 CUDA運(yùn)算核心。實(shí)際中可通過(guò)多次試驗(yàn)選取效率較高的分塊大小和分塊總數(shù)組合。
3.2.3 事件同步技術(shù) 如前所述,圖4中的數(shù)據(jù)處理環(huán)節(jié)由若干個(gè)kernel組成,而且kernel執(zhí)行時(shí)間與單向數(shù)據(jù)傳輸時(shí)間一般情況下不完全相同,根據(jù)GPU對(duì)各流所發(fā)射kernel的調(diào)度機(jī)制,在運(yùn)行過(guò)程中各流的 kernel可能會(huì)交替執(zhí)行[4],從而導(dǎo)致圖 4中的某些數(shù)據(jù)處理環(huán)節(jié)(由多個(gè) kernel組成)開(kāi)始到結(jié)束所需時(shí)間增加。為了避免此現(xiàn)象,確保每個(gè)數(shù)據(jù)處理環(huán)節(jié)中的所有kernel集中連續(xù)執(zhí)行,可以利用CUDA中的事件(event)技術(shù)[4]。在每個(gè)數(shù)據(jù)處理環(huán)節(jié)的末尾(GPU→CPU 數(shù)據(jù)傳輸環(huán)節(jié)開(kāi)始前)利用cudaEventRecord函數(shù)標(biāo)記事件同步節(jié)點(diǎn),并在下一個(gè)數(shù)據(jù)處理環(huán)節(jié)的起始(CPU→GPU數(shù)據(jù)傳輸環(huán)節(jié)結(jié)束后)時(shí)利用 cudaEventSynchronize函數(shù)對(duì)該事件標(biāo)記進(jìn)行同步。根據(jù)事件的同步特點(diǎn),在cudaEventRecord函數(shù)調(diào)用之前的所有CUDA操作完成之前,cudaEventSynchronize之后的CUDA操作不能進(jìn)行,從而確保了每個(gè)數(shù)據(jù)處理環(huán)節(jié)中各kernel的集中連續(xù)執(zhí)行。詳見(jiàn)下述實(shí)驗(yàn)結(jié)果。
3.2.4 多GPU并行處理技術(shù) 當(dāng)一臺(tái)主機(jī)內(nèi)有多部GPU設(shè)備時(shí),利用流技術(shù)還可以實(shí)現(xiàn)所有設(shè)備之間的并行處理。在每個(gè)GPU設(shè)備上各部署3個(gè)流,并將所有SAR數(shù)據(jù)處理任務(wù)依次發(fā)射到各個(gè)流上,從而在每個(gè) GPU設(shè)備內(nèi)部異步并行的同時(shí),也實(shí)現(xiàn)了多GPU設(shè)備的并行處理。
對(duì)于第i個(gè)數(shù)據(jù)塊,所對(duì)應(yīng)的GPU設(shè)備號(hào)iGPU以及流號(hào)istream的計(jì)算方法分別為(三者均以0為起始編號(hào)):
其中NGPU為GPU設(shè)備個(gè)數(shù),%表示求余操作。
由上節(jié)可知,為了充分利用 GPU設(shè)備的異步并行技術(shù)掩蓋數(shù)據(jù)傳輸時(shí)間,在每個(gè) GPU設(shè)備中需各分配3個(gè)流。由于各流之間除并行關(guān)系外相互獨(dú)立運(yùn)行,因此需要為每個(gè)流分配一個(gè)獨(dú)立的存儲(chǔ)空間用于存儲(chǔ)從主機(jī)內(nèi)存加載的數(shù)據(jù)塊。另外,各個(gè)運(yùn)算模塊中的某些運(yùn)算步驟需要用另外一塊同樣大小的存儲(chǔ)空間存儲(chǔ)運(yùn)算處理結(jié)果,這些運(yùn)算步驟包括轉(zhuǎn)置處理,ω κ算法中的 stolt插值處理[1],運(yùn)動(dòng)補(bǔ)償處理[4]等。因此,需要對(duì)每個(gè)流分配兩個(gè)同樣大小的存儲(chǔ)空間。實(shí)踐表明,對(duì)于機(jī)載SAR實(shí)時(shí)處理算法來(lái)說(shuō),兩塊存儲(chǔ)空間已能夠滿(mǎn)足算法的運(yùn)算需要。
由此可見(jiàn),每個(gè)GPU設(shè)備上共需分配6塊同樣大小的存儲(chǔ)空間。另外利用CUFFT庫(kù)函數(shù)進(jìn)行FFT運(yùn)算時(shí),需要為每個(gè)流根據(jù)數(shù)據(jù)尺寸調(diào)用cufftPlan1d()創(chuàng)建一個(gè)plan配置數(shù)據(jù)。以上9項(xiàng)存儲(chǔ)空間之和不能超過(guò)一個(gè)GPU設(shè)備的顯存總?cè)萘俊?/p>
在成像處理開(kāi)始之前,需要先進(jìn)行內(nèi)存及顯存分配,在所有步驟執(zhí)行完畢之后,再將所分配內(nèi)存及顯存釋放。
首先在主機(jī)內(nèi)存中分配兩段存儲(chǔ)空間H0與H1,H0用于存儲(chǔ)讀入的原始數(shù)據(jù)以及處理結(jié)果 SAR圖像(一般1個(gè)采樣點(diǎn)占用1個(gè)或2個(gè)字節(jié)),H1用于存儲(chǔ)算法各階段的中間處理結(jié)果(一般按單精度浮點(diǎn)存儲(chǔ),1個(gè)采樣點(diǎn)占用8個(gè)字節(jié))。假設(shè)所需處理的一景 SAR數(shù)據(jù)每個(gè)回波脈沖采樣點(diǎn)數(shù)為 Nr,共Na個(gè)脈沖,則H0與H1占用字節(jié)數(shù)分別為:
為了提高主機(jī)內(nèi)存與 GPU顯存之間的數(shù)據(jù)傳輸速度,H0與H1按照頁(yè)鎖定(page-locked)的方式進(jìn)行空間分配[4]。
根據(jù)第3節(jié)所述,在每部GPU設(shè)備上各分配3個(gè)流Sij(其中i,j分別表示以0為起始的GPU編號(hào)以及流編號(hào)),并為每個(gè)流在所在GPU設(shè)備顯存上分配兩塊字節(jié)數(shù)分別為Md(按照上節(jié)所述進(jìn)行設(shè)置)的存儲(chǔ)空間DA,ij與DB,ij,用于完成圖2中每個(gè)模塊的各個(gè)計(jì)算步驟。根據(jù)顯存塊大小Md,可以得到用于每個(gè)運(yùn)算模塊的數(shù)據(jù)分塊大小。對(duì)于先排距離向的運(yùn)算模塊A,C,每個(gè)數(shù)據(jù)塊的方位脈沖數(shù)為:
為了方便起見(jiàn),如有必要,Ba與Br可在以上計(jì)算結(jié)果基礎(chǔ)上適當(dāng)減小,使其分別能整除Na與Nr。對(duì)于運(yùn)算模塊A,C,處理數(shù)據(jù)的分塊數(shù)為Ca=Na/Ba;對(duì)于運(yùn)算模塊 B,D,處理數(shù)據(jù)的分塊數(shù)為Cr=Nr/Br。
另外,由于各運(yùn)算模塊的執(zhí)行步驟中都需要用到FFT操作,對(duì)于每個(gè)運(yùn)算模塊,還需要為每個(gè)流Sij根據(jù)數(shù)據(jù)塊2維尺寸利用CUDA函數(shù)cufftPlan1d建立 FFT執(zhí)行所需 plan,并將所創(chuàng)建 plan用cufftSetStream 函數(shù)與所屬流關(guān)聯(lián)[4]。由于 plan的創(chuàng)建及銷(xiāo)毀占用時(shí)間非常小,對(duì)于每個(gè)運(yùn)算模塊,可以在模塊執(zhí)行前建立并關(guān)聯(lián)所需plan,模塊執(zhí)行完畢后立即調(diào)用 cufftDestroy函數(shù)銷(xiāo)毀,或者在算法開(kāi)始運(yùn)行時(shí)創(chuàng)建所需plan,算法結(jié)束時(shí)銷(xiāo)毀所需plan。
根據(jù)以上對(duì)CUDA編程技術(shù)以及SAR成像處理算法特點(diǎn)的分析,在上述存儲(chǔ)空間分配方案基礎(chǔ)上,可按照以下方案進(jìn)行機(jī)載SAR實(shí)時(shí)成像處理算法設(shè)計(jì):
(1) 將所需處理SAR原始數(shù)據(jù)由文件讀入主機(jī)內(nèi)存H0。
(2) 將 H0中的 SAR原始數(shù)據(jù)沿方位向均分為Ca塊,各塊字節(jié)數(shù)均為2NrBa。各塊按照?qǐng)D4所示方案依次分配給各個(gè)流 Sij,各個(gè)流 Sij調(diào)用cudaMemcpyAsync函數(shù)將所分配數(shù)據(jù)塊讀入顯存空間DA,ij,再進(jìn)行運(yùn)算模塊A的各處理步驟,最后將結(jié)果由cudaMemcpyAsync函數(shù)寫(xiě)回主機(jī)內(nèi)存H1的對(duì)應(yīng)位置,每塊寫(xiě)回?cái)?shù)據(jù)字節(jié)數(shù)為 8NrBa。此時(shí)數(shù)據(jù)在H1中按照先排距離向的方式存儲(chǔ)。
(3) 將H1中的數(shù)據(jù)沿距離向均分為Cr塊,各塊按照?qǐng)D4所示方案依次分配給各個(gè)流Sij,每個(gè)流將所分配數(shù)據(jù)塊(非連續(xù)存儲(chǔ),如圖 3(b)所示)先由cudaMemcpy2DAsync函數(shù)讀入顯存空間 DB,ij,再由轉(zhuǎn)置kernel將DB,ij中的數(shù)據(jù)轉(zhuǎn)為先排方位向方式存儲(chǔ)于DA,ij,然后進(jìn)行運(yùn)算模塊B的各處理步驟;處理完成之后再次調(diào)用轉(zhuǎn)置 kernel將處理結(jié)果(可能在 DA,ij或 DB,ij中,視具體實(shí)現(xiàn)方式而定)轉(zhuǎn)為先排距離向方式存儲(chǔ)于該流的另一塊顯存空間,將結(jié)果由cudaMemcpyAsync函數(shù)寫(xiě)回主機(jī)內(nèi)存H1的原位置。此時(shí)數(shù)據(jù)在H1中仍然按照先排距離向的方式存儲(chǔ)。
(4) 按照與步驟(2)類(lèi)似的方式執(zhí)行運(yùn)算模塊C,但不是從H0中讀取數(shù)據(jù),而是從H1中讀取數(shù)據(jù)。
(5) 按照與步驟(3)類(lèi)似的方式執(zhí)行運(yùn)算模塊D,但有以下幾點(diǎn)區(qū)別:(a) 在對(duì)處理結(jié)果進(jìn)行轉(zhuǎn)置時(shí),由于多視后每個(gè)圖像的像素點(diǎn)按照1個(gè)字節(jié)或2個(gè)字節(jié)無(wú)符號(hào)存儲(chǔ),因此需要實(shí)現(xiàn)一個(gè)新的轉(zhuǎn)置kernel,但也可將轉(zhuǎn)置 kernel利用 C++的模板(template)技術(shù)實(shí)現(xiàn),從而對(duì)中間結(jié)果的轉(zhuǎn)置處理以及對(duì)多視結(jié)果的轉(zhuǎn)置處理可復(fù)用一個(gè)函數(shù)代碼;(b)由于每塊數(shù)據(jù)處理前后數(shù)據(jù)量變化,而且數(shù)據(jù)在主機(jī)內(nèi)存中非連續(xù)存儲(chǔ),因此不能再將處理結(jié)果寫(xiě)回H1的原位置,但可以將處理結(jié)果寫(xiě)入H0。各塊圖像數(shù)據(jù)在 H0中的組織及寫(xiě)回方式與 3.1節(jié)所述及圖3(b)所示方式相同。
(6) 將H0中的處理結(jié)果圖像寫(xiě)入圖像文件。
在以上各步驟中,除了第(1)步數(shù)據(jù)讀取以及第(6)步數(shù)據(jù)落盤(pán)(這兩步受磁盤(pán)條件限制無(wú)法通過(guò)并行手段提高執(zhí)行速度)以外,在步驟(2)-步驟(5)中,每步對(duì)所有數(shù)據(jù)塊的處理都按照 3.2節(jié)所述方式實(shí)現(xiàn)了并行執(zhí)行,從而充分利用了 GPU設(shè)備的傳輸帶寬以及計(jì)算資源,保證在最短時(shí)間內(nèi)完成所有的處理步驟。
將上述方案用于實(shí)時(shí)成像處理時(shí),需要對(duì)各景SAR數(shù)據(jù)依次進(jìn)行處理。為滿(mǎn)足實(shí)時(shí)性要求,對(duì)各景的處理之間不能有長(zhǎng)時(shí)間等待。在上述方案中,當(dāng)一景數(shù)據(jù)量較大時(shí),對(duì)H0,H1,DA,ij以及DB,ij的分配及釋放都需要占用較多的時(shí)間,若對(duì)每景數(shù)據(jù)都進(jìn)行一次存儲(chǔ)空間的分配及釋放,將大大降低處理的實(shí)時(shí)性。
為了避免存儲(chǔ)空間的分配和釋放對(duì)處理實(shí)時(shí)性的影響,在各景數(shù)據(jù)2維尺寸不變的情況下(一般至少在一個(gè)條帶內(nèi)能夠保證各景的數(shù)據(jù) 2維尺寸不變),可以通過(guò)圖5所示的策略避免主機(jī)內(nèi)存/GPU顯存的重復(fù)分配與釋放。對(duì)于單景數(shù)據(jù)距離/方位點(diǎn)數(shù)未發(fā)生變化的一組處理任務(wù),在主機(jī)內(nèi)存/GPU顯存分配后對(duì)所有任務(wù)進(jìn)行連續(xù)處理,處理結(jié)束后再將主機(jī)內(nèi)存/GPU顯存釋放。
圖5 批量任務(wù)處理策略圖Fig.5 Processing strategy of a batch of tasks
由上述設(shè)計(jì)思路可知,本文提出的基于GPU的實(shí)驗(yàn)結(jié)果如圖6所示,其中藍(lán)色表示CPU單線程處理,綠色表示CPU全速(6線程)處理,深紅色表示 GPU處理。由于從磁盤(pán)讀取原始數(shù)據(jù)和將結(jié)果圖像寫(xiě)入磁盤(pán)兩個(gè)環(huán)節(jié)對(duì)各種處理手段來(lái)說(shuō)耗費(fèi)時(shí)間相同,因此圖6的時(shí)間測(cè)量結(jié)果中未計(jì)入這兩個(gè)環(huán)節(jié)所花時(shí)間。的機(jī)載 SAR實(shí)時(shí)成像處理算法并未對(duì)成像處理算法本身做任何更改,也未用單精度代替雙精度進(jìn)行浮點(diǎn)運(yùn)算,因此所需運(yùn)算量與基于CPU的實(shí)現(xiàn)方式相同,而且能夠完全達(dá)到算法本身應(yīng)有的處理精度。本文將測(cè)試同樣處理算法用本文所提出方案在GPU上實(shí)現(xiàn)時(shí)相對(duì)于常規(guī)在CPU上實(shí)現(xiàn)時(shí)處理速度的提升比例,而未針對(duì)分辨率等成像處理指標(biāo)進(jìn)行測(cè)試。本節(jié)測(cè)試在HP Z600立式工作站上進(jìn)行,實(shí)驗(yàn)所用GPU選用NVIDIA K20C,CPU選用工作站自帶INTEL E5645 @2.4 GHz。根據(jù)GPU處理速度提升比例的測(cè)試結(jié)果,還對(duì)價(jià)格、功耗、并行度、實(shí)時(shí)性等方面進(jìn)行了分析。
對(duì)于某種成像處理算法,對(duì)一塊機(jī)載SAR數(shù)據(jù)的處理時(shí)間僅取決于距離及方位向的采樣點(diǎn)數(shù),而與載頻波段及分辨率無(wú)關(guān)。因此本節(jié)選用ωκ成像處理算法,利用一段X波段機(jī)載SAR仿真數(shù)據(jù)分別用本文方案和常規(guī)基于CPU的處理算法進(jìn)行處理,并對(duì)處理所需時(shí)間進(jìn)行對(duì)比及討論。本節(jié)分別針對(duì)距離/方位采樣點(diǎn)數(shù)均為16384與32768兩種情況進(jìn)行了仿真實(shí)驗(yàn)。由于實(shí)際機(jī)載SAR數(shù)據(jù)處理中都需要進(jìn)行運(yùn)動(dòng)補(bǔ)償處理,因此按照第2節(jié)所述在圖 2的運(yùn)算模塊A中加入了運(yùn)動(dòng)補(bǔ)償?shù)奶幚憝h(huán)節(jié)。其它相關(guān)運(yùn)行參數(shù)如表1所示,各種處理手段消耗時(shí)間
?
由于顯存中的分塊大小為256 MB(占用顯存共計(jì) 1.5 GB),對(duì)于距離/方位點(diǎn)數(shù)為 16384的 SAR數(shù)據(jù)(中間結(jié)果數(shù)據(jù)量為2 GB),對(duì)所有數(shù)據(jù)的分塊數(shù)目為8;對(duì)于距離/方位點(diǎn)數(shù)為32768的SAR數(shù)據(jù)(中間結(jié)果數(shù)據(jù)量為8 GB),分塊數(shù)為32。
由圖6可見(jiàn),對(duì)于距離/方位點(diǎn)數(shù)為16384的SAR數(shù)據(jù),與單線程及6線程CPU處理相比,GPU處理的加速比分別約為71與14;對(duì)于距離/方位點(diǎn)數(shù)為32768的SAR數(shù)據(jù),加速比分別約為80與16。通過(guò)NVIDIA提供的并行處理可視化分析工具-Visual profiler[15]觀察兩者各運(yùn)算模塊的運(yùn)行情況可知,兩種情況下各流的處理及數(shù)據(jù)傳輸速度基本相同,但由于數(shù)據(jù)分塊數(shù)較大時(shí)各運(yùn)算模塊首尾未并行部分占模塊所有運(yùn)行時(shí)間比例較大,因此距離/方位點(diǎn)數(shù)為32768時(shí)的加速比較大。
從價(jià)格的角度考慮,K20C目前市場(chǎng)價(jià)格約為E5645的將近10倍,可見(jiàn)與E5645相比K20C具有約1.5倍的價(jià)格優(yōu)勢(shì)。從功耗的角度考慮,本文方案中CPU無(wú)需承擔(dān)任何大型運(yùn)算任務(wù),因此無(wú)需耗資配置高性能CPU,但須配置具有高速總線以及高速PCI-E插槽的主板。從功耗的角度考慮,K20C在處理時(shí)功耗約為140 W[5],而E5645的標(biāo)稱(chēng)功耗為80 W,可見(jiàn)K20C具有約8倍的功耗優(yōu)勢(shì)。從便攜性的角度考慮,由于需要約15顆E5645才能達(dá)到一部K20C的處理能力,而一塊主板上的CPU插槽有限(目前市場(chǎng)上主流主板支持CPU個(gè)數(shù)一般不超過(guò)4個(gè)),因此至少需要配置4臺(tái)主機(jī)??梢?jiàn),選用GPU作為處理設(shè)備使得 SAR數(shù)據(jù)處理設(shè)備的便攜性大大提高。
利用Visual Profiler對(duì)本文方案的并行度進(jìn)行分析,觀察數(shù)據(jù)在主機(jī)內(nèi)存與GPU顯存間的傳輸與GPU運(yùn)算的并行程度,距離/方位點(diǎn)數(shù)為16384時(shí)的處理過(guò)程在Visual Profiler中如圖7所示,其中黃色模塊表示CPU/GPU間數(shù)據(jù)傳輸,其它顏色模塊表示各種數(shù)據(jù)處理kernel。由圖7可見(jiàn),對(duì)于圖2中的運(yùn)算模塊A,B,C,kernel的運(yùn)行幾乎沒(méi)有任何中斷,即由于數(shù)據(jù)傳輸與kernel執(zhí)行的并行化,各數(shù)據(jù)塊的kernel開(kāi)始執(zhí)行之前,所需數(shù)據(jù)都已就緒(各流的首尾數(shù)據(jù)塊除外)。對(duì)于運(yùn)算模塊D,由于數(shù)據(jù)傳入GPU時(shí)間大于數(shù)據(jù)傳入 GPU的拷貝過(guò)程以及kernel執(zhí)行所需時(shí)間,因此前者的執(zhí)行幾乎沒(méi)有任何中斷,而后兩者在前者的執(zhí)行過(guò)程中已并行完成,省去了前者的等待時(shí)間(各流的首尾數(shù)據(jù)塊除外)。另外,由于各流的首尾數(shù)據(jù)塊未完全并行,各運(yùn)算模塊總體執(zhí)行時(shí)間與 kernel實(shí)際執(zhí)行時(shí)間(或數(shù)據(jù)單向傳輸時(shí)間,取大者)相比有略微增加。
另外,如3.2.3節(jié)所述,由于采用了事件同步機(jī)制,各數(shù)據(jù)分塊的所有kernel都實(shí)現(xiàn)了連續(xù)集中執(zhí)行,各數(shù)據(jù)分塊的所有kernel完全實(shí)現(xiàn)了順序執(zhí)行,從而避免了各GPU→CPU數(shù)據(jù)傳輸環(huán)節(jié)延緩執(zhí)行。
但由于事件同步機(jī)制的影響,從第2個(gè)數(shù)據(jù)分塊開(kāi)始,每次cudaEventSynchronize調(diào)用都需要等待上一數(shù)據(jù)分塊的cudaEventSynchronize調(diào)用成功返回,即每個(gè)數(shù)據(jù)塊的數(shù)據(jù)處理任務(wù)及其之后發(fā)射的任務(wù)都需要在上一數(shù)據(jù)塊的數(shù)據(jù)處理完成之后開(kāi)始執(zhí)行(launch)[4],因此導(dǎo)致了運(yùn)算模塊A,B,C從第3個(gè)數(shù)據(jù)分塊開(kāi)始每次的CPU→GPU數(shù)據(jù)傳輸環(huán)節(jié)的執(zhí)行略有延遲。而運(yùn)算模塊D的kernel執(zhí)行時(shí)間小于 CPU→GPU數(shù)據(jù)傳輸時(shí)間,因此未出現(xiàn)此現(xiàn)象。
機(jī)載SAR成像處理算法能否滿(mǎn)足實(shí)時(shí)性要求,取決于處理速度是否大于數(shù)據(jù)采集速度。假設(shè)距離采樣點(diǎn)數(shù)為Nr,每秒采集脈沖數(shù)為Prf,則數(shù)據(jù)采集速度為NrPrf。可見(jiàn)處理算法的實(shí)時(shí)性與處理速度、距離采樣點(diǎn)數(shù)以及每秒采集脈沖數(shù)有關(guān),而與SAR系統(tǒng)波段、天線尺寸、載機(jī)速度等因素?zé)o關(guān)?;诖?,本節(jié)的分析無(wú)需設(shè)計(jì)距離采樣點(diǎn)數(shù)與每秒采集脈沖數(shù)之外的其它無(wú)關(guān)因素。
在不考慮每景 SAR數(shù)據(jù)處理的不完全孔徑截取的情況下,由圖6可見(jiàn),一部K20C對(duì)機(jī)載SAR數(shù)據(jù)的處理速度約為每秒處理36 M個(gè)原始數(shù)據(jù)采樣點(diǎn)。對(duì)于距離采樣點(diǎn)數(shù)為64k的SAR系統(tǒng),則每秒處理數(shù)據(jù)量約為576個(gè)脈沖,因此一部K20C可以滿(mǎn)足脈沖采樣點(diǎn)數(shù)64k、脈沖重復(fù)頻率(PRF)不超過(guò)576的機(jī)載SAR系統(tǒng)的2維全分辨率實(shí)時(shí)處理速度需求。
由于機(jī)載 SAR方位向分辨率為載機(jī)速度與多普勒帶寬之比(與系統(tǒng)波段無(wú)關(guān)),假設(shè)載機(jī)速度為v,則一部K20C能夠達(dá)到實(shí)時(shí)處理速度的機(jī)載SAR系統(tǒng)方位向分辨率約為:
在此基礎(chǔ)上,還可以通過(guò)增加 GPU設(shè)備個(gè)數(shù)(目前 1部服務(wù)器或工作站主板最多可支持 4部GPU設(shè)備)擴(kuò)充設(shè)備的處理能力,以達(dá)到增加距離采樣點(diǎn)數(shù)以及提高方位向分辨率等要求。
本文對(duì)機(jī)載SAR成像處理算法在CUDA架構(gòu)下的高效實(shí)現(xiàn)方法進(jìn)行了深入研究,首先對(duì)常用機(jī)載 SAR頻域成像處理算法的結(jié)構(gòu)特征以及 CUDA架構(gòu)下的實(shí)現(xiàn)思路進(jìn)行了詳細(xì)分析,并對(duì)算法的CUDA實(shí)現(xiàn)所需解決的若干技術(shù)問(wèn)題及其解決方法進(jìn)行了詳細(xì)論述?;谝陨涎芯抗ぷ?,提出并詳細(xì)闡述了一種基于CUDA架構(gòu)的機(jī)載SAR實(shí)時(shí)成像處理算法實(shí)現(xiàn)方案。該方案針對(duì)成像處理算法的結(jié)構(gòu)特征以及CUDA架構(gòu)的并行化特點(diǎn),通過(guò)對(duì)顯存/內(nèi)存分配策略以及數(shù)據(jù)傳輸/kernel執(zhí)行并行化的巧妙設(shè)計(jì),借助于CUDA編程體系所提供的數(shù)據(jù)處理及傳輸接口,實(shí)現(xiàn)了處理算法在 NVIDIA GPU設(shè)備上的高效部署。該方案實(shí)現(xiàn)了絕大部分的數(shù)據(jù)傳輸環(huán)節(jié)與 kernel執(zhí)行的并行進(jìn)行,大大減少了kernel執(zhí)行的數(shù)據(jù)等待時(shí)間。在NVIDIA迄今最新的通用計(jì)算高性能產(chǎn)品K20C上實(shí)驗(yàn)結(jié)果表明,借助于本文方案,與傳統(tǒng)基于CPU的成像處理算法相比,基于K20C的機(jī)載SAR成像處理算法具有低廉的價(jià)格、極低的功耗以及高度的便攜性,只需一臺(tái)配備一部或多部K20C的主機(jī)即可具有相當(dāng)于數(shù)十臺(tái)普通主機(jī)的處理能力。
[1]Cumming I G and Wong F H.Digital Processing of Synthetic Aperture Radar Data: Algorithms and Implementation[M].Norwood: Artech House,2002.
[2]OpenMP Architecture Review Board.OpenMP application program interface[OL].http://www.openmp.org/mp-documents/spec30.pdf,May 2008.
[3]Snir M,Otto S,Lederman S H,et al..MPI: The Complete Reference[M].US: The MIT Press,1996.
[4]NVIDIA.CUDA Cprogramming guide[OL].http://docs.nvidia.com/cuda/pdf/CUDA_C_Programming_Guide.pdf,July 2013.
[5]NVIDIA.Tesla k20 GPU active accelerator: board specification [OL].http://www.nvidia.cn/content/PDF/kepler/tesla-k20-active-bd-06499-001-v03.pdf,May 2013.
[6]Intel.Intel Xeon Processor E5645 [OL].http://ark.intel.com/zh-cn/products/48768.2010.
[7]Yegulalp A F.Fast backprojection algorithm for synthetic aperture radar[C].Proceedings 1999 IEEE Radar Conference,Waltham,US,1999: 60-65.
[8]John Jr.C K.Motion compensation for synthetic aperture radar[J].IEEE Transaction on Aerospace and Electronic Systems,1975,11(3): 338-348.
[9]Meng Da-di,Hu Dong-hui,and Ding Chi-biao.A new approachto airborne high resolution SAR motion compensation for large trajectory deviations[J].Chinese Journal of Electronics,2012,21(4): 764-769.
[10]Liu Bin,Wang Kai-zhi,Liu Xing-zhao,et al..An efficient signal processor of synthetic aperture radar based on GPU[C].European Conference on Synthetic Aperture Radar,Eurogress,Aachen,Germany,June 2010: 1054-1057.
[11]Ning Xia,Yeh Chun-mao,Zhou Bin,et al..Multiple- GPU accelerated range-Doppler algorithm for synthetic aperture radar imaging[C].IEEE International Radar Conference,Kansas City,MO,USA,May 2011: 698-701.
[12]Clemente C,Bisceglie M D,Santo M D,et al..Processing of synthetic aperture radar data with GPGPU[C].IEEE Workshop on Signal Processing Systems,Tampere,Finland,Oct.2009: 309-314.
[13]俞驚雷,柳彬,王開(kāi)志,等.一種基于 GPU 的高效合成孔徑雷達(dá)信號(hào)處理器[J].信息與電子工程,2010,8(4): 415-418.Yu J L,Liu B,Wang K Z,et al..A highly efficient GPU-based signal processor of Synthetic Aperture Radar[J].Information and Electronic Engineering,2010,8(4): 415-418.
[14]NVIDIA.Optimizing matrix transpose in CUDA[OL].http://www.cs.colostate.edu/~cs675/matrixtranspose.pdf,May 2013.
[15]NVIDIA.Profiler user’s guide[OL].http://docs.nvidia.com/cuda/pdf/CUDA_Profiler_Users_Guide.pdf,July 2013.作者簡(jiǎn)介