張遠(yuǎn) 張大偉 陳仁 華建文
“風(fēng)云四號”氣象衛(wèi)星于2016年12月發(fā)射,并在軌成功運(yùn)行.“風(fēng)云四號”01星大氣垂直探測儀首次實(shí)現(xiàn)了靜止軌道傅里葉高光譜探測,精細(xì)觀測到大氣的垂直結(jié)構(gòu).干涉式大氣垂直探測儀的核心系統(tǒng)是干涉儀,探測儀實(shí)際上就是空間工作的傅里葉變換光譜儀[1].為了滿足氣象衛(wèi)星更高時空分辨率的大氣探測需求,后續(xù)將會使用更大面陣的焦平面探測器,獲取更大數(shù)據(jù)量的光譜數(shù)據(jù),提高空間分辨率和探測頻率,實(shí)現(xiàn)短周期的實(shí)時天氣預(yù)報等.隨著“風(fēng)云四號”大氣垂直探測儀在光譜分辨率上的重大突破,獲取的遙感高光譜數(shù)據(jù)量會變得更大,海量遙感高光譜數(shù)據(jù)的較低計(jì)算效率成為大氣遙感高光譜應(yīng)用的瓶頸.
為解決海量高光譜數(shù)據(jù)的高性能處理問題,國內(nèi)外眾多研究人員提出通過使用計(jì)算機(jī)集群模式、基于消息傳遞的并行編程環(huán)境MPI(Message Passing Interface)、基于圖形處理的處理器GPU(Graphic Processing Unit)等提高光譜數(shù)據(jù)的處理效率[2].基于GPU的CUDA(Compute Unified Device Architecture)通用并行計(jì)算的架構(gòu)技術(shù),利用GPU多計(jì)算核心、高內(nèi)存帶寬、浮點(diǎn)運(yùn)算的運(yùn)行速度快等特點(diǎn),可以對海量高光譜數(shù)據(jù)進(jìn)行并行優(yōu)化,提升高光譜數(shù)據(jù)的處理性能.如今,基于CPU-GPU的異構(gòu)計(jì)算已經(jīng)成為研究和應(yīng)用的熱點(diǎn),GPU逐漸成為解決海量高光譜數(shù)據(jù)的高性能處理問題的有效途徑.利用GPU加速技術(shù),國內(nèi)外學(xué)者在高光譜數(shù)據(jù)處理中嘗試了目標(biāo)檢測、圖像分類、影像坐標(biāo)轉(zhuǎn)換、圖像處理等算法的并行優(yōu)化,并且實(shí)驗(yàn)取得很大的性能提升.文獻(xiàn)[3]研究并實(shí)現(xiàn)了基于GPU的光譜相關(guān)系數(shù)填圖(SCM)算法的并行化,將加速比提高到25倍左右;文獻(xiàn)[4]在影像坐標(biāo)轉(zhuǎn)換過程中引入了CPU-GPU協(xié)同處理技術(shù),這一技術(shù)使得坐標(biāo)轉(zhuǎn)換效率提高10倍;文獻(xiàn)[5]基于正交空間投影的目標(biāo)檢測算法提出了高光譜圖像的并行優(yōu)化處理方法,將串行計(jì)算速度提高50倍;文獻(xiàn)[6]基于GPU設(shè)計(jì)了針對遙感圖像預(yù)處理過程中的幾何校正的并行算法,結(jié)果表明基于GPU陣列的幾何校正有效提高了矯正效率;文獻(xiàn)[7]分析和總結(jié)了CPU-GPU架構(gòu)在高光譜影像數(shù)據(jù)處理系統(tǒng)中的應(yīng)用,指出這種異構(gòu)架構(gòu)在該領(lǐng)域的應(yīng)用具有可行性且前景廣闊;文獻(xiàn)[8]利用卷積神經(jīng)網(wǎng)絡(luò)(CNN)提取原始圖像特征領(lǐng)域,對現(xiàn)有并行算法GCN(GPU based Cube-CNN)計(jì)算效率不夠高的情況,提出了基于通用矩陣乘法(GEMM)算法的GGCN(GPU based Cube-CNN improved by GEMM)并行算法,提升了算法的效率并有效提高了GPU的利用率.綜上所述,對于海量高光譜遙感數(shù)據(jù)的高性能處理引入基于GPU計(jì)算的技術(shù)手段是可行的.
本文使用基于CPU-GPU異構(gòu)計(jì)算的遙感高光譜數(shù)據(jù)加速處理技術(shù),結(jié)合使用快速傅里葉變換完成高光譜數(shù)據(jù)的傅里葉分析,解決海量高光譜數(shù)據(jù)處理過程中的干涉數(shù)據(jù)到光譜數(shù)據(jù)轉(zhuǎn)換效率較低的問題.這一技術(shù)是“風(fēng)云四號”干涉式大氣垂直探測儀系統(tǒng)研究中的一項(xiàng)重要環(huán)節(jié),對提高光譜分辨率和大氣垂直探測能力,提高我國天氣預(yù)報能力具有重要意義.
圖1 CPU和GPU結(jié)構(gòu)Fig.1 The CPU (a) and GPU (b) structures
為滿足不同的需求,CPU與GPU結(jié)構(gòu)上有較大的區(qū)別(圖1).CPU在邏輯上有三大組成部分,分別是控制單元、運(yùn)算單元和存儲單元.在結(jié)構(gòu)上,CPU有較大容量的高速緩存(cache),有復(fù)雜的邏輯控制與分支預(yù)測,這種結(jié)構(gòu)使得運(yùn)算單元(ALU)只占CPU結(jié)構(gòu)空間較小的一部分.而GPU在結(jié)構(gòu)設(shè)計(jì)上包含了大量的ALU,即圖1b中右上的密集的方格,與CPU相比較,GPU沒有復(fù)雜的邏輯控制,具有較小的高速緩存,且緩存是為了單個線程(thread)提供數(shù)據(jù)等.GPU在內(nèi)存設(shè)計(jì)上分紋理內(nèi)存、共享內(nèi)存、全局內(nèi)存等.使用特定的內(nèi)存可以更好地提高數(shù)據(jù)的訪問速度,且有更高的內(nèi)存帶寬,利用大量ALU進(jìn)行并行處理,計(jì)算能力更強(qiáng).
在實(shí)際問題處理中,某些問題或問題中的某一部分解決方式具有很強(qiáng)的并行性,如果按照串行運(yùn)算處理時,處理時間較長,使用并行計(jì)算明顯具有時間上的優(yōu)勢,特別是待處理的數(shù)據(jù)量較大時.而利用GPU就可以很好地解決這類問題,GPU包含了數(shù)量眾多的更小、更高效的核心,這些核心可以很好地解決多任務(wù)并行處理的問題.以Fermi架構(gòu)為例,GPU設(shè)計(jì)上包含了多個SM(Streaming Multiprocessors,流式多處理器),而每個SM都支持?jǐn)?shù)以百計(jì)的線程并行執(zhí)行,所以當(dāng)GPU進(jìn)行并行運(yùn)算時,成百上千的線程可以并行執(zhí)行.CUDA core為GPU的計(jì)算核心,相當(dāng)于微型CPU,線程的管理和執(zhí)行采用的是SIMT(Single Instruction Multiple Thread)架構(gòu),每個線程都有它自己的狀態(tài)寄存器和指令地址計(jì)數(shù)器,這就使得GPU擅長解決大規(guī)模的數(shù)據(jù)并行任務(wù).
在結(jié)構(gòu)層次上,GPU往下可分為SM、SP(Stream Processor),CUDA中線程分為Grid、Block、Thread三個組織層次,Grid、Block均為dim3結(jié)構(gòu).CUDA Thread 最終的并行執(zhí)行是在實(shí)際的物理硬件上實(shí)現(xiàn)的,邏輯線程與實(shí)際的物理硬件有著一定的映射關(guān)系,即Thread對應(yīng)SP(即CUDA core),Block對應(yīng)SM,Grid對應(yīng)Device設(shè)備.GPU并行執(zhí)行時任務(wù)線程層次如圖2所示.
圖2 CUDA Thread層次Fig.2 CUDA Thread levels
串行運(yùn)算和并行運(yùn)算的區(qū)別在于:串行計(jì)算將一個任務(wù)分解為大量離散的指令,指令是順序執(zhí)行的,而并行計(jì)算將一個任務(wù)的處理分為幾個階段,每個部分同樣分解為一系列的離散指令,在某些階段,任務(wù)適合并行處理時,這些指令可在眾多線程中同時執(zhí)行,提高了解決問題的速度.
對于一個非周期離散時間信號x(n),其離散傅里葉變換為
(1)
式中,k=0,1,…,N-1,為DFT系數(shù).
離散傅里葉變換(DFT)運(yùn)算時間復(fù)雜度為O(n2).為了簡化DFT,利用其周期性、對稱性等特點(diǎn),便出現(xiàn)了快速傅里葉變換(FFT),其時間復(fù)雜度為O(nlog2n),其中Cooley-Tukey FFT 算法[9]最為成熟.
快速傅里葉變換用數(shù)學(xué)公式表示如下:
(2)
(3)
其中:k=0,1,…,N/2-1;DF(k)和GF(k)分別是序列XF(k)的偶數(shù)數(shù)列和奇數(shù)數(shù)列.
圖3 Cooley-Tukey FFT蝴蝶操作結(jié)構(gòu)Fig.3 Structure of Cooley-Tukey FFT butterfly operation
既然Cooley-Tukey FFT 算法采用分治的思想,那么分治過程就會有分解和合并兩個階段,合并階段進(jìn)行的是蝴蝶操作.合并過程大致如下:經(jīng)過前面分解過后,各個序列長度均為1,第一組合并(即蝴蝶操作)是將這些序列兩兩合并,由于原序列被分為了n個短序列,故一共需要進(jìn)行n/2次合并.以此類推,共進(jìn)行l(wèi)og2n組的合并,時間復(fù)雜度為O(nlog2n).
每一組合并中有n/2次蝴蝶操作,由于它們之間沒有先后順序關(guān)系,因此可以分配足夠的線程,使得一組中n/2次蝴蝶操作同時進(jìn)行,該組計(jì)算的并行時間復(fù)雜度為O(1),整個計(jì)算過程一共需要進(jìn)行l(wèi)og2n組合并,故采用蝴蝶操作并行化時,整個計(jì)算過程的并行時間復(fù)雜度為O(log2n).本文利用該方法在GPU上實(shí)現(xiàn)FFT的并行化操作,加快高光譜數(shù)據(jù)的處理速度.
通過對CPU和GPU結(jié)構(gòu)比較,使用CPU 完成數(shù)據(jù)處理過程中邏輯控制的計(jì)算,而GPU完成具有數(shù)據(jù)密集型的并行處理的計(jì)算.明白CPU-GPU的協(xié)同處理技術(shù)后,使用NVIDIA 的CUDA并行編程框架制訂數(shù)據(jù)并行處理流程,包括高光譜數(shù)據(jù)的讀取、CPU和GPU端內(nèi)存分配、數(shù)據(jù)的分塊處理、CPU-GPU內(nèi)存交互、GPU端核函數(shù)定義等,建立穩(wěn)定高效的處理流程,具體流程如圖4所示,圖4a為傳統(tǒng)CPU計(jì)算流程,圖4b為異構(gòu)計(jì)算流程.異構(gòu)計(jì)算流程如下:
1)CPU和GPU端內(nèi)存分配.CPU和GPU兩者內(nèi)存地址不同,需要在兩端進(jìn)行內(nèi)存單獨(dú)分配,便于CPU和GPU對內(nèi)存數(shù)據(jù)操作,為后續(xù)的CPU-GPU內(nèi)存交互做準(zhǔn)備.
2)大氣遙感高光譜數(shù)據(jù)的讀?。吖庾V數(shù)據(jù)以二進(jìn)制格式存儲在PC機(jī)中,需要數(shù)據(jù)讀至CPU內(nèi)存中,用于后續(xù)高光譜數(shù)據(jù)的處理.
3)CPU-GPU內(nèi)存交互.由于CPU 與 GPU端內(nèi)存相互獨(dú)立,即兩端分配的內(nèi)存只能在各自端使用,因此在GPU端運(yùn)行核函數(shù)時,需要將用于計(jì)算的數(shù)據(jù)從CPU端內(nèi)存拷貝到 GPU端內(nèi)存,核函數(shù)計(jì)算完成之后,也需要把計(jì)算結(jié)果拷貝到CPU端,然后在主機(jī)端完成后面的處理.
4)GPU端核函數(shù)定義.在GPU端定義核函數(shù),將CPU端拷貝來的數(shù)據(jù)在GPU端進(jìn)行數(shù)據(jù)的并行計(jì)算,同時設(shè)置線程網(wǎng)格(Grid)和 線程塊(Block)的大小,確定使用線程的數(shù)量.
5)核函數(shù)的執(zhí)行.定義的核函數(shù)將在分配的大量線程上運(yùn)行,線程之間的運(yùn)行同時進(jìn)行,互補(bǔ)干擾,這得益于GPU本身的物理結(jié)構(gòu)擁有很多的硬件線程,它們使用單指令多數(shù)據(jù)運(yùn)算.
圖4 CPU計(jì)算和異構(gòu)計(jì)算流程Fig.4 Processes of the CPU-based computing (a) and CPU-GPU heterogeneous computing (b)
本實(shí)驗(yàn)使用同一臺PC機(jī),分別測試基于CPU計(jì)算和基于CPU-GPU異構(gòu)計(jì)算處理高光譜數(shù)據(jù),處理的數(shù)據(jù)量均為400份文件,一份文件有36 MB光譜數(shù)據(jù),總共14.4 GB的數(shù)據(jù),比較兩者處理相同任務(wù)所用的時間,判斷基于CPU-GPU異構(gòu)計(jì)算的并行處理是否具有性能優(yōu)勢.
1)軟硬件環(huán)境
采用一臺PC機(jī),使用NVIDIA 公司的GenForce GTX 1660 GPU顯卡,顯卡容量6 GB,有1 408個CUDA核心;CPU處理器為Intel(R) Core(TM) i9-9900K,物理內(nèi)存32 GB.實(shí)驗(yàn)在64 bit Windows10系統(tǒng)下進(jìn)行,采用Visual Studio 2017 集成開發(fā)環(huán)境,使用C++編程語言,進(jìn)行基于CPU計(jì)算和基于CPU-GPU異構(gòu)計(jì)算的高光譜數(shù)據(jù)處理.
2)實(shí)驗(yàn)結(jié)果分析
分別使用基于CPU計(jì)算和基于CPU-GPU異構(gòu)計(jì)算的技術(shù)處理相同海量高光譜數(shù)據(jù),兩者所用計(jì)算數(shù)據(jù)均用雙精度表示,計(jì)算完成干涉圖到光譜圖的轉(zhuǎn)換時間,使用計(jì)時工具計(jì)時,并判斷計(jì)算結(jié)果準(zhǔn)確性.兩者所用時間:前者130 min左右,后者約1.5 min,說明采用異構(gòu)計(jì)算可以明顯提升處理性能,速度提升80多倍.為驗(yàn)證結(jié)果準(zhǔn)確性,這里選取兩幅對應(yīng)的光譜圖顯示,一幅為基于CPU-GPU異構(gòu)模式的計(jì)算數(shù)據(jù)圖像,一幅為基于CPU的使用matlab函數(shù)庫計(jì)算的數(shù)據(jù)圖像,如圖5所示.?dāng)?shù)據(jù)結(jié)果比較采用(a-b)/((a+b)/2)誤差的形式,a表示圖5a即基于CPU-GPU異構(gòu)模式的計(jì)算數(shù)據(jù),b表示圖5b即使用CPU計(jì)算的數(shù)據(jù),結(jié)果如圖6所示,兩者相對誤差量級基本在10-14,可以說明兩種方式處理后的數(shù)據(jù)是一致的.故使用基于CPU-GPU異構(gòu)計(jì)算的并行加速處理的方法處理大氣遙感高光譜數(shù)據(jù)時,速度明顯提升,準(zhǔn)確性也可以保證.
圖5 基于CPU-GPU異構(gòu)計(jì)算和基于CPU計(jì)算得到的光譜圖Fig.5 Spectrograms obtained from CPU-GPU heterogeneous computing (a) and CPU-based computing (b)
圖6 兩種情況計(jì)算結(jié)果相對誤差Fig.6 Relative error between CPU-GPU heterogeneous computing and CPU-based computing
本文針對海量高光譜數(shù)據(jù)處理效率較低的情況,將基于CPU-GPU異構(gòu)計(jì)算的技術(shù)引入到高光譜數(shù)據(jù)處理中來,并將其用于高光譜數(shù)據(jù)處理的一套系統(tǒng)中,對整體的性能進(jìn)行優(yōu)化,極大地提高了數(shù)據(jù)處理的效率.實(shí)驗(yàn)結(jié)果表明,本方法較傳統(tǒng)的CPU計(jì)算有著較大的性能提升,速度提升80多倍,研究成果將會在“風(fēng)云四號”干涉式大氣垂直探測儀獲得的數(shù)據(jù)處理中得到應(yīng)用.基于CPU-GPU異構(gòu)計(jì)算的大氣高光譜數(shù)據(jù)并行加速處理技術(shù),是提高高光譜分辨率探測和大氣垂直探測能力的要求,對于提高我國天氣預(yù)報能力具有重要的應(yīng)用價值.