莫德林,戴晨光,張振超,胡玲
(信息工程大學地理空間信息學院,鄭州450001)
一種基于OpenACC的遙感影像正射糾正快速實現方法
莫德林,戴晨光,張振超,胡玲
(信息工程大學地理空間信息學院,鄭州450001)

利用CUDA語言移植舊程序時需要重新設計算法,花費較多的時間,效率不高。針對這一問題,本文在分析正射糾正算法并行性的基礎上,提出一種基于OpenACC的遙感影像正射糾正快速實現方法,并與基于CUDA的正射糾正方法進行對比。通過正射糾正實驗表明,OpenACC能通過對源代碼的較小改動將其移植到GPU中,獲得一定的加速比,其可移植性好,代碼開發(fā)效率較高。
OpenACC;CUDA;正射糾正;加速比
多核的CPU和眾核的GPU(Graphic Processing Unit,即圖形處理器)已經成為目前大多數計算機中最重要的兩種處理器,科研人員積極尋找專業(yè)領域與GPU并行處理的結合點,對GPU并行計算進行了有益的探索。數字正射影像是地球空間數據框架的一個基礎數據層[1],被視為快速成圖與更新的重要手段。因此,提高數字正射影像的生產效率具有重要的作用。楊靖宇[2]提出一種基于CUDA(Compute Unified Device Architecture,統(tǒng)一計算設備架構)的遙感影像正射糾正GPU-CPU協(xié)同處理方法,實現了重采樣操作的GPU細粒度并行化。然而,初次接觸GPU的科研人員往往需要較長的時間才能完全掌握CUDA程序的編寫與優(yōu)化[3]。為此,PGI、Cray和NVIDIA3家公司聯合創(chuàng)立OpenACC應用編程接口標準。OpenACC使得科研人員能夠更加自由地將時間投入到自己的研究中,而又能在更短的時間內使程序得到加速。本文實現了一種基于OpenACC的遙感影像正射糾正方法,通過將計算密集區(qū)域加載到GPU上進行并行計算,提高了算法的執(zhí)行效率。
OpenACC借鑒OpenMP的導語(directive)模式,在原始代碼上添加導語,告訴編譯器將哪些代碼塊加載到加速器上執(zhí)行、如何在主機與加速器之間移動數據[4]。如果編譯器不支持OpenACC標準或支持選項沒有打開,編譯器將忽略所有的OpenACC導語,編譯出的程序只在CPU上運行。OpenACC程序不必對原始代碼作過多的修改,可以讓相同的代碼在多核CPU、GPU或任何編譯器支持的其他類型的并行硬件上運行[5]。
在C/C++語言中,用語言本身提供的#pragam機制來引入OpenACC導語。OpenACC導語在C/C++語言中的語法是:
#pragma acc directive-name[clause[[,]clause]…]new-line
OpenACC導語包含四個部分[5]:
①數據管理
數據管理導語包括data構件和update導語。data構件指明的標量、數組和子數組都會在加速器內存上開辟空間。進入本區(qū)域時,數據被從主機復制到加速器內存,離開本區(qū)域時,數據被從設備復制到主機內存。update導語用在顯式或隱式數據區(qū)域中,使加速器內存中數組的值和主機內存中相應數組的值相互傳遞。
②工作管理
工作管理導語包括parallel構件、kernel構件和loop構件。OpenACC提供兩個計算構件(parallel和kernels),并能詳細指定并行方式(gang、worker、vector的值,對應于CUDA的grid、block、thread的值),通過編譯器將循環(huán)轉換為高效的低層級語言代碼(CUDA/OpenCL)。loop構件可以描述執(zhí)行這個循環(huán)的并行類型,還可以聲明循環(huán)的私有變量、數組和歸約操作。
③其他語法
其他語法包括cache構件、host_data構件、wait導語和declare構件。Cache構件指定哪些數組元素或子數組需要為循環(huán)體而預取到最高層級的緩存中,host_data構件使加速器上數據的地址在主機上可用,wait導語使主機等待一個異步活的完成declare構件指定的變量或數組需要在加速器內存上開辟空間。
④運行時例程
OpenACC提供多個運行時例程,可以設置加速器設備的參數,如例程acc_set_device_type告訴運行時環(huán)境使用哪種類型的設備來執(zhí)行加速器parallel區(qū)域和kernels區(qū)域。
數字微分糾正中,一般是利用反解公式求解坐標變換系數,計算對應像元的坐標,然后進行灰度重采樣,最后將重采樣后的灰度值賦值給糾正后的像元。影像灰度重采樣操作是典型的計算密集型模塊,其處理流程相對固定,每個數據點上的計算形式相同,數據點之間相互獨立,具有內在的并行性,因此非常適合GPU并行處理。由于遙感影像的數據量一般都比較大,相對于坐標變換系數的求解,重采樣操作將耗費更多的時間,所以正射糾正并行化的重點應該是重采樣操作的并行化[3]。正射糾正的流程如圖1所示。
圖1中虛線框內是并行計算區(qū)域。要將并行計算區(qū)域加載到加速器上進行計算,必須先設定環(huán)境以及將數據復制到加速器內存上。

圖1 正射糾正流程圖
基于OpenACC的正射糾正步驟如下:
①環(huán)境設定;
//設定執(zhí)行并行計算區(qū)域的設備類型
void acc_set_device_type(acc_device_t);
②使用data構件將原始影像、結果影像和DEM數據復制進顯存;
#pragma acc data copyin(SourceImage[0:width*height])
③使用kernels指令定義核心;
#pragma acc kernels present_or_copyin (SourceImage[0:width*height]){
④使用loop指令定義外層循環(huán);
#pragma acc loop independent
for(….){
⑤使用loop指令定義內層循環(huán);
#pragma acc loop independent
for(…){
//計算坐標變換系數、灰度重采樣以及灰度賦值,同時把結果放入目標內存
}}}
⑥將結果復制到主機端,釋放空間。
//#pragma acc update host();
void acc_shutdown(acc_device_t);//斷開程序與加速器設備的連接
本文使用的實驗平臺CPU為Intel(R)Core(TM) i5,內存大小為4GB,顯卡為NVIDIA Quadro FX 3700。實驗平臺的軟件開發(fā)環(huán)境為:Windows7 32位操作系統(tǒng),PGI編譯器;NVIDIA公司提供的CUDA 5.0版本的開發(fā)包。
本文使用的實驗數據為2009年獲取的河南登封某地區(qū)DMC航攝影像,地面采樣間隔為0.25米。正射糾正所用的DEM數據為影像多視匹配獲得的點云數據經過濾波獲得,將其內插為0.25米規(guī)則格網數據。表1為不同范圍大小的影像基于CUDA與基于OpenACC的正射糾正時間對比結果。
由表1可見,基于CUDA和基于OpenACC的并行算法與基于CPU的串行算法相比,都能獲得一定的加速比,且加速比隨著數據量的增大而增大。在數據量較小時,加速效果并不明顯。這是因為基于CUDA和基于OpenACC的并行計算過程中,要在主機和加速器之間進行數據傳遞,這將耗費一定的時間資源,如果數據量較小,則在加速器上運算時間與數據傳遞時間之比也小,加速效果則不明顯。當數據量增大,在加速器上運算滿載時,運算時間與數據傳遞時間之比合理,則能達到最大的加速比。
CUDA程序經過優(yōu)化后,其加速比較OpenACC大。其原因是CUDA程序經過存儲器優(yōu)化后,可大大減少存儲訪問的時間。在OpenACC中,數據傳遞與訪問是隱式進行的,無法使用類似CUDA的共享內存,所以其訪存時間要比CUDA程序長。然而,從代碼開發(fā)的效率方面看,OpenACC程序只需要在串行代碼中增加OpenACC指令,就能將指定的并行區(qū)域加載到GPU上,取得10倍左右的加速比。這種方式保留了代碼的通用性,不破壞原代碼,開發(fā)速度快,既可并行執(zhí)行又可恢復串行執(zhí)行。而且,在硬件升級時,重新編譯一次代碼即可,不必手工修改代碼。更為重要的是,隨著編譯器的進一步優(yōu)化和硬件技術的發(fā)展,OpenACC與CUDA在底層技術實現上的差距將會越來越小[6],而且支持OpenACC指令的設備將不僅僅限于CUDA設備,還將擴展到其他更多廠商的硬件加速器,從而提高OpenACC程序的可移植性。

表1 GPU粗粒度并行下灰度重采樣時間結果表
本文以正射糾正算法為對象,通過在串行代碼的基礎上加入OpenACC指令,將坐標計算、灰度重采樣計算以及灰度賦值區(qū)域加載到GPU上,得到較高的加速比,提高了算法的執(zhí)行效率。這種方法不僅效率高,且不改變原來的代碼結構,大大增強了代碼的可移植性,對其他的影像處理算法有一定的參考價值。
[1]耿則勛,張保明,范大昭.數字攝影測量學[M].北京:測繪出版社,2010.8.
[2]楊靖宇,張永生,李正國等.遙感影像正射糾正的GPU-CPU協(xié)同處理研究[J].武漢大學學報(信息科學版),2011,36(9):1043-1046.
[3]張舒,褚艷利.GPU高性能運算之CUDA[M].北京:中國水利水電出版社,2009.
[4]Tetsuya Hoshino,Naoya Maruyama,Satoshi Matsuoka. CUDA vs OpenACC:Performance Case Studies with Kernel Benchmarks and a Memory-Bound CFD Application[C]. 13th IEEE/ACM International Symposium on Cluster, Cloud,and Grid Computing,2013(136-143).
[5]"The OpenACCApplication Programming Interface,Version 1.0,"November 2011.
[6]曾文權,胡玉貴,何擁軍等.一種基于OPENACC的GPU加速實現高斯模糊算法[J].計算機技術與發(fā)展,2013,23(7):147-151.
A Fast Implementation M ethod of Remote Sensing Image Ortho-rectification Based on OpenACC
MO De-lin,DAIChen-guang,ZHANG Zhen-chao,HU Ling
(Institude of Geospatial Information,Information Engineering University,Zhengzhou 450001,China)
Algorithms need to be redesigned when using CUDA to transplant old programs.This will cost a long period of time,which leads to a low efficiency.Aiming at solving this problem,a fast implementationmethod of remote sensing image ortho-rectification based on OpenACC is proposed,and compared with ortho-rectification based on CUDA in this paper.Ortho-rectification experiments show that OpenACC can transplant program to the GPU with small changes,and get a speed up ratio.The portability is good,and the efficiency of code development is high.
OpenACC;CUDA;Ortho-rectification;Accelerated ratio
P231
B
10.3969/j.issn.1001-0270.2014.02.21
2014-01-20
莫德林(1988-),男,廣西貴港人,碩士研究生,主要從事遙感圖像處理的研究。