洪 亮,周松濤,羅 伊,石婷婷,胡 飛
(1.湖北省航測遙感院,湖北 武漢 430074;2. 武漢大學(xué) 國際軟件學(xué)院,湖北 武漢 430070;3. 湖北省基礎(chǔ)地理信息中心,湖北 武漢 430074;4.安陸市國土資源局,湖北 安陸 432600)
遙感數(shù)據(jù)多為圖像數(shù)據(jù),對它們的處理涉及大量特征數(shù)據(jù)的計算、統(tǒng)計等。對這些數(shù)據(jù)的運算往往是基于分塊的算法,即將柵格數(shù)據(jù)的局部按某種經(jīng)緯格網(wǎng)裁剪出來進(jìn)行計算,然后將結(jié)果寫回數(shù)據(jù)庫。在單一工作站上,這一運算往往是一個串行的過程,因此效率比較低。目前的高性能計算主要是采用并行計算技術(shù)來實現(xiàn)[1]。在硬件體系結(jié)構(gòu)上,并行計算機(jī)主要分為3種形式:多處理機(jī)系統(tǒng)、多計算機(jī)系統(tǒng)和集群計算技術(shù)。但考慮到成本、安全及使用頻度、運算效率等問題,基于網(wǎng)絡(luò)的多計算機(jī)系統(tǒng)和集群運算并不合適,而簡單的多處理機(jī)系統(tǒng)運算能力有限?;贕PU的加速計算技術(shù)為海量遙感數(shù)據(jù)處理效率的提高帶來了新的手段。GPU最初是針對圖形渲染,但在其上的通用計算技術(shù)顯然非常適合類似于圖像這類數(shù)據(jù)的計算與處理。在面向GPU的通用計算技術(shù)中,CUDA技術(shù)是發(fā)展最早、目前相對完善、普及的一種技術(shù)。
與早期的圖形處理器不同,現(xiàn)代的圖形處理器往往具有可編程單元,用于處理龐大而復(fù)雜的三維圖形數(shù)據(jù)。通常,一個GPU內(nèi)部有兩個可編程單元,即頂點著色器和像素著色器,這兩個單元包含有幾十個甚至幾百個流處理器,可并行處理圖形的頂點和像元數(shù)據(jù),有很強(qiáng)的浮點運算能力。目前國際上兩大圖形處理器廠商——NVIDIA和AMD,都在自己的GPU基礎(chǔ)上,構(gòu)建了一套通用數(shù)學(xué)運算的機(jī)制,即NVIDIA的CUDA技術(shù)和AMD的STREAM技術(shù),其中CUDA技術(shù)應(yīng)用比較成熟和廣泛[2]。
CUDA是一個通用的并行計算架構(gòu),將GPU強(qiáng)大的并行計算能力充分調(diào)動起來,使之在解決復(fù)雜計算問題上發(fā)揮其先天優(yōu)勢。開發(fā)人員僅使用C語言,就能在基于CUDA架構(gòu)的GPU上編寫程序,在支持CUDA的處理器上以超高性能運行。不僅如此,CUDA還是免費的開源技術(shù),任何開發(fā)人員都能通過最新的NVIDIA GPU,在個人計算機(jī)上實現(xiàn)高性能計算,解決復(fù)雜的科學(xué)運算問題。
與英特爾的X86架構(gòu)不同,CUDA基于GPU,但不拘于GPU,而是取長補(bǔ)短,將CPU的串行計算和GPU的并行計算融合,開啟“CPU+GPU協(xié)同計算”的全新時代,即“異構(gòu)計算”。“異構(gòu)計算”真正實現(xiàn)了系統(tǒng)整體計算能力的最大化利用:GPU和CPU協(xié)同工作,GPU處理大量的圖形和并行處理,CPU處理操作系統(tǒng)和指令的邏輯控制。兩者的協(xié)同比單純CPU運算高出幾十倍甚至幾百倍、上千倍,使得PC和工作站具有超級計算的能力,使得個人超級計算機(jī)的普及成為可能。
目前,采用GPU進(jìn)行通用運算越來越普及,一些常用軟件,如Photoshop、3DMax以及一些視頻處理軟件已大量使用該技術(shù)。從應(yīng)用的效果來看,均有幾倍或幾十倍的效率提升,前景非常廣闊。有鑒于此,在GPU基礎(chǔ)上,NVIDIA又進(jìn)一步開發(fā)了Tesla處理器。該處理器外觀跟顯卡非常相似,只是沒有顯示輸出接口。這種“顯卡”的主要作用就是“多塊并聯(lián)”,通過CUDA來進(jìn)行科學(xué)運算。和傳統(tǒng)服務(wù)器/工作站相比,塔式Tesla主機(jī)也有CPU等常規(guī)硬件,只是內(nèi)部有多塊“顯卡”組多路SLI,如圖1所示。通過Tesla處理器構(gòu)建的個人高性能計算機(jī),利用多路顯卡的強(qiáng)大并行處理能力,使一些以往主要依靠CPU計算的領(lǐng)域大大提速,甚至使部分依靠CPU無法完成的計算成為可能。
圖1 帶有Tesla處理器的個人超級計算機(jī)
圖2 CUDA中運算任務(wù)的邏輯劃分
GPU作為一種圖形運算單元,具有對紋理圖像的各種優(yōu)化運算功能,支持柵格數(shù)據(jù)的并行運算。
在CUDA運算中,每個GPU的運算單元被映射成一個網(wǎng)格(Grid),每個網(wǎng)格單元在邏輯上被分為多個Block,每個Block被分為若干Thread,Thread作為最新運算邏輯單元存在(如圖2)。在與硬件的對應(yīng)關(guān)系上可以近似地認(rèn)為,每個網(wǎng)格對應(yīng)一個GPU(或一塊Tesla處理器),一個Block對應(yīng)一個SM(streaming multiprocessor),而一個Thread則對應(yīng)硬件上的一個運算單元,即一個SP(streaming processor)。之所以說這種對應(yīng)關(guān)系是近似的,是因為為了防止在I/O等過程中運算單元閑置,GPU會對不同的任務(wù)分組進(jìn)行優(yōu)化處理和調(diào)度。例如在一個Block中,32個Thread會被分為一組并執(zhí)行,稱為一個Wrap。如果發(fā)生任務(wù)閑置的情況,則換另外一組,從而導(dǎo)致Thread和SP之間并沒有嚴(yán)格的一一對應(yīng)關(guān)系。
可參照這一邏輯模型對柵格數(shù)據(jù)分塊進(jìn)行處理。可參照柵格數(shù)據(jù)的邏輯模型(一個2維矩陣),將柵格數(shù)據(jù)作2維的邏輯任務(wù)劃分,與圖2中所示模型一致。實際應(yīng)用中,柵格數(shù)據(jù)的塊狀劃分可根據(jù)應(yīng)用情況進(jìn)行處理。例如,一些空間數(shù)據(jù)庫在對柵格數(shù)據(jù)存儲過程中進(jìn)行了分塊索引,那么檢索到客戶端的柵格數(shù)據(jù)也是自然分塊的。分析處理中,這個數(shù)據(jù)塊可根據(jù)其大小,映射到一個Grid單元或一個Block單元進(jìn)行計算,避免對柵格數(shù)據(jù)的重新規(guī)劃以及重新分塊。
在一個Block內(nèi)部,涉及到如何將一塊柵格數(shù)據(jù)分布到不同的Thread中執(zhí)行運算的問題。實際操作中,這一部分的劃分不是按照矩陣的邏輯模型,而是按照條帶的方式,即將一個數(shù)據(jù)塊中的不同行放到不同的Thread中進(jìn)行處理。同一行數(shù)據(jù)以及相鄰行數(shù)據(jù)在存儲空間連續(xù),便于地址空間的管理,也便于運算結(jié)果的寫回。
在CUDA中,與開發(fā)者密切相關(guān)的存儲器類型主要有兩種,即全局存儲(global memory)和共享存儲(shared memory),見圖3。全局存儲是在一個運算設(shè)備上全局共享存儲區(qū)域,一般來講就是顯存的一部分,用戶與CUDA之間的數(shù)據(jù)傳輸可通過這部分存儲區(qū)間完成。圖3中,Host是用戶在CPU中執(zhí)行的代碼。共享內(nèi)存是在一個Block中共享存儲區(qū)域,其作用可看作是高速緩存,存取速度雖然很快,但大小受限,在目前的硬件水平上一般不超過16 K。在柵格數(shù)據(jù)的任務(wù)調(diào)度中,盡量將數(shù)據(jù)放到共享存儲區(qū)域進(jìn)行處理,這樣效率會較高。在CUDA模型中,將數(shù)據(jù)放到共享存儲區(qū)域的過程是一個需要用戶干預(yù)的過程。用戶在開發(fā)過程中,需要指定全局存儲中的數(shù)據(jù)如何組織到共享存儲中。CUDA的內(nèi)建函數(shù)也提供了一些指令,用于不同線程間共享存儲數(shù)據(jù)的同步。
采用CUDA技術(shù)進(jìn)行海量數(shù)據(jù)的并行運算,其效率除了受并行線程數(shù)量影響以外,還受存儲器的訪問效率影響。GPU訪問顯存的效率要遠(yuǎn)遠(yuǎn)高于CPU訪問內(nèi)存的效率,主要是因為它在帶寬和頻率上都要高于CPU所在系統(tǒng)的總線。而在CUDA層面,對數(shù)據(jù)的訪問則可以考慮全局和共享存儲兩個層面。對于單個線程,在計算比較復(fù)雜、涉及的數(shù)據(jù)量大時,可不使用共享存儲單元;而在運算簡單、數(shù)據(jù)運算局部性比較強(qiáng)時,可先將一個Block中的線程需要訪問的數(shù)據(jù)組織到共享存儲單元中,然后再以共享存儲單元的訪問為基礎(chǔ)進(jìn)行計算。
圖3 CUDA的存儲模型
上述存儲及調(diào)度模型是基于單機(jī)任務(wù)的,如果存在海量遙感數(shù)據(jù),則需要在單機(jī)模式基礎(chǔ)上,建立一個支持分布式或在單一節(jié)點上存在多處理器的分布式運算模型[3,4]。
在一個基于GPU的運算集群環(huán)境下,柵格數(shù)據(jù)處理任務(wù)劃分可參照圖4中的邏輯模型,將柵格數(shù)據(jù)作2維的邏輯任務(wù)劃分。柵格數(shù)據(jù)的塊狀劃分可根據(jù)應(yīng)用情況進(jìn)行處理。例如,一些空間數(shù)據(jù)庫在對柵格數(shù)據(jù)存儲過程中進(jìn)行了分塊索引,那么,檢索到客戶端的柵格數(shù)據(jù)也是自然分塊的。分析處理中,這個數(shù)據(jù)塊可根據(jù)其大小映射到一個GPU設(shè)備(即一個Grid)單元或一個線程塊(Block)單元中進(jìn)行計算,從而避免對柵格數(shù)據(jù)的重新規(guī)劃以及重新分塊處理[5]。
圖 4 海量柵格數(shù)據(jù)在分布式環(huán)境下任務(wù)處理的邏輯模型
圖4中,假設(shè)有4個運算節(jié)點工作站對數(shù)據(jù)庫中的柵格數(shù)據(jù)進(jìn)行處理。為了避免重新對數(shù)據(jù)進(jìn)行任務(wù)劃分,可令每個節(jié)點計算機(jī)處理一塊數(shù)據(jù)。在獲取到數(shù)據(jù)后,節(jié)點計算機(jī)可根據(jù)其自身處理能力對數(shù)據(jù)進(jìn)行再次劃分。例如,運算節(jié)點1中包含有運算能力不同的兩個處理單元,則在任務(wù)劃分中,將待處理數(shù)據(jù)按運算能力的大小分為兩個部分。實際處理中,這種劃分僅僅是一個偏移地址的處理,處理時間可以忽略不計。
為了客觀評價CUDA技術(shù)在柵格數(shù)據(jù)加速運算過程中的效率,本文分別通過相關(guān)曲面、Sobel算子以及標(biāo)準(zhǔn)差計算來比較[6-8]。
由于相關(guān)曲面模板大小為可變的,且其寬和高往往較一般卷積算子大,受共享存儲單元大小的限制,不便于放在其中運算。因此,這部分的測試是基于全局存儲訪問進(jìn)行的。測試過程中,在不同尺寸的數(shù)據(jù)和匹配模板下分別用CPU和GPU進(jìn)行計算,并比較二者的效率,見表1。
表1 GPU和CPU環(huán)境下相關(guān)曲面計算比較
從表中可以看出,在數(shù)據(jù)量比較小的情況下,GPU計算并無多大的優(yōu)勢。隨著數(shù)據(jù)量的加大,GPU相對于CPU計算的加速比逐漸變大??梢?,在海量柵格數(shù)據(jù)的處理中,GPU通用計算的優(yōu)勢非常明顯。
這一測試的目的是檢測基于GPU的全局存儲和共享存儲進(jìn)行計算的差別,因此,Sobel算子的測試并沒有在CPU下進(jìn)行運算測試。由于Sobel算子卷積的運算量較小,運算速度較快,為了使結(jié)果比較客觀,兩種卷積運算各循環(huán)運算100次,然后求平均值。
在GPU采用Geforce GT 420 M的條件下,計算Sobel算子全局存儲訪問運算的平均時間為0.000 023 s,共享存儲訪問的平均時間為0.000 017 s,共享存儲訪問方式下的運算效率要高于全局存儲。因此,對于柵格數(shù)據(jù)的相關(guān)算法,應(yīng)盡量尋求在共享存儲訪問模式下運算,以充分發(fā)揮GPU的優(yōu)勢。
為了反映未進(jìn)行任務(wù)劃分條件下CPU和GPU計算能力的差異,對一個數(shù)組進(jìn)行標(biāo)準(zhǔn)差統(tǒng)計。測試中,分別在CPU單線程、GPU單線程以及GPU多線程條件下進(jìn)行。其中,GPU單線程指的是未對任務(wù)進(jìn)行任何劃分,直接把整塊數(shù)據(jù)放到GPU中運算,同一時刻只有GPU的一個運算單元參與;GPU多線程則是將計算平均值以外的部分進(jìn)行并行計算。數(shù)組大小為5 000個浮點數(shù),計算結(jié)果見表2。
表2 標(biāo)準(zhǔn)差計算在不同計算條件下的時間比較
由此可見,如果不對任務(wù)進(jìn)行劃分,單純靠GPU本身對任務(wù)調(diào)度計算,其計算能力甚至遠(yuǎn)遠(yuǎn)落后于CPU。僅對其中一部分的計算適當(dāng)并行,GPU計算的效率則有明顯改觀。但是,標(biāo)準(zhǔn)差的計算是一個基于全局的運算,整個算法在實現(xiàn)過程中只有部分可實現(xiàn)并行計算,因此,類似算法如果要提高效率,還需要在算法上進(jìn)行重構(gòu),不能僅僅依靠硬件性能。
另外,一次運算的數(shù)據(jù)規(guī)模也是影響運算效率的因素之一。GPU運算不像CPU,首先需要將運算數(shù)據(jù)傳輸?shù)紾PU存儲器(顯存),并進(jìn)行一些數(shù)據(jù)結(jié)構(gòu)的準(zhǔn)備,再啟動內(nèi)核計算。這些必要工作同樣消耗運行時間,而且與運算規(guī)模無關(guān)。因此,在GPU中進(jìn)行數(shù)據(jù)處理,輸入規(guī)模越大,GPU中可并行的線程就越多,并行運算優(yōu)勢就越明顯。圖5是CPU和GPU并行計算效率的比較,橫坐標(biāo)表示運算規(guī)模,縱坐標(biāo)表示時間消耗,單位為s??梢?,當(dāng)輸入數(shù)據(jù)量在131 072(即217)左右時,CPU和GPU耗時相當(dāng);大于217時,GPU表現(xiàn)出時間上的優(yōu)勢。
圖5 不同運算規(guī)模下標(biāo)準(zhǔn)差計算的CPU-GPU效率比較
本文實驗證實,在海量柵格數(shù)據(jù)處理中,GPU通用計算技術(shù)確有優(yōu)勢。因此,適當(dāng)?shù)馗牧棘F(xiàn)有柵格數(shù)據(jù)的算法,使之適應(yīng)于GPU通用運算環(huán)境,是提高柵格數(shù)據(jù)運算效率的有效途徑。但是,由于GPU架構(gòu)以及開發(fā)形式的特殊性,實際應(yīng)用中往往很難使程序具有通用性,尤其是在大規(guī)模并行計算的環(huán)境下,而硬件條件往往比較統(tǒng)一,在允許的情況下可針對特定的GPU硬件進(jìn)行優(yōu)化,以達(dá)到效率最大化。
[1]Kirk D B,Hwu W W.大規(guī)模并行處理器編程實戰(zhàn)[M].北京:清華大學(xué)出版社,2010
[2]張舒,禇艷利.GPU高性能運算之CUDA[M].北京:水利水電出版社,2009
[3]Sanders J, Kandrot E.CUDA范例精解——通用GPU編程[M].北京:清華大學(xué)出版社,2010
[4]多相復(fù)雜系統(tǒng)國家重點實驗室多尺度離散模擬項目組. 基于GPU的多尺度離散模擬并行計算[M].北京:科學(xué)出版社,2009
[5]林一松,楊學(xué)軍,唐滔,等. 一種基于關(guān)鍵路徑分析的CPUGPU異構(gòu)系統(tǒng)綜合能耗優(yōu)化方法[J].計算機(jī)學(xué)報,2012(1):123-133
[6]盧風(fēng)順,宋君強(qiáng),銀???等.CPU/GPU協(xié)同并行計算研究綜述[J].計算機(jī)科學(xué),2011(3):5-9
[7]許洪騰.圖像變換與表示技術(shù)及其在影像資料修復(fù)與增強(qiáng)中的應(yīng)用[D].上海:上海交通大學(xué), 2013
[8]盧麗君,廖明生,張路.分布式并行計算技術(shù)在遙感數(shù)據(jù)處理中的應(yīng)用[J].測繪信息與工程,2005,30(3):1-3