專利名稱:基于gpu眾核平臺的矩陣并行轉(zhuǎn)置方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種基于GPU眾核平臺的矩陣并行轉(zhuǎn)置方法以及在工程實踐中的應(yīng)用。
背景技術(shù):
在工程實踐中如SAR成像、通信、微波等,矩陣轉(zhuǎn)置是一種經(jīng)常需求的運算,并且 常常在整個程序的運行時間里占很大一部分,雖然目前已經(jīng)有各種各樣的算法,但是均是 在CPU上進(jìn)行串行處理,考慮到CPU的集成度比較低,目前一塊芯片最多可以集成8塊CPU 處理核心,因此算法并行度不高,運行效率比較低。GPGPU是一種處理密集型數(shù)據(jù)和并行數(shù) 據(jù)的可以內(nèi)含成百上千個處理核心的處理器,因此更適合于大規(guī)模并行計算。但是,目前并 沒有在數(shù)百個處理核心上同時并行處理完成矩陣轉(zhuǎn)置運算。
發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問題是提供一種基于眾核平臺的矩陣并行轉(zhuǎn)置方法,能夠 在包含成百上千個處理核心的GPU上并行、高效的實現(xiàn)矩陣轉(zhuǎn)置運算以及在工程中應(yīng)用。該基于眾核平臺的矩陣轉(zhuǎn)置并行方法包括以下步驟第一步轉(zhuǎn)置的矩陣為M行N列,將每一行和后一行的數(shù)據(jù)首尾相接,將MXN的二 維數(shù)組轉(zhuǎn)化為包含MXN個元素的一維數(shù)組,并標(biāo)識為A ;第二步計算A所占存儲空間的大小,并標(biāo)識為B ;第三步根據(jù)計算出的B,在GPU的全局存儲器上分配同樣大小的存儲空間標(biāo)識為 C,然后將內(nèi)存上的數(shù)據(jù)A拷貝到GPU的全局存儲器的C ;第四步數(shù)據(jù)分割GPU的組織包括線程網(wǎng)格層、線程塊層、線程層,一個網(wǎng)格包含 兩個以上線程塊,為一維組織或二、三維組織,每個塊包含兩個以上運行線程,同時,每個塊 有一個被該塊內(nèi)所有運行線程可見的共享存儲器;線程塊層我們設(shè)置為二維且每維的大小 一致;網(wǎng)格層設(shè)置成二維,大小由原矩陣的大小M、N決定;第五步輸入數(shù)據(jù)索引以線程塊為單位運算,根據(jù)原矩陣模型和GPU的內(nèi)置變量 計算出行方向?qū)υ季仃嚨乃饕土蟹较虻乃饕?,從而計算出對C的索引;第六步根據(jù)第五步得到的對輸入數(shù)據(jù)的索引,以線程塊為單位,將C中對應(yīng)于每 個線程塊的元素導(dǎo)入各自線程塊的共享存儲器中;第七步輸出數(shù)據(jù)索引以線程塊為單位運算,首先根據(jù)轉(zhuǎn)置后的矩陣模型,對掉 行索引和列索引,借助GPU通用編程的內(nèi)置變量計算出行方向?qū)敵鼍仃嚨乃饕约傲蟹?向的索弓丨,從而計算出輸出矩陣的索引;第八步根據(jù)第七步得到的對輸出數(shù)據(jù)的索引,以線程塊為單位,將各個線程塊的 共享存儲器中的緩存導(dǎo)出到一維數(shù)組C ;第九步將C拷貝到內(nèi)存A,然后對A每M個元素切割一次成為一行并按序組合成 一個N行M列的二維數(shù)組,此即為轉(zhuǎn)置后的矩陣。
通過以上步驟就完成了矩陣轉(zhuǎn)置在GPU眾核平臺下的實現(xiàn)。本發(fā)明的有益效果1、通過科學(xué)的統(tǒng)籌安排,成百上千個處理核心并行處理數(shù)據(jù),高效完成了運算并 提高了運算精度;2、進(jìn)行了數(shù)據(jù)分割,采用線程塊處理的模式,用編程的復(fù)雜度換取了程序運行效 率,并減小了矩陣轉(zhuǎn)置尺寸的限制;3、使用了高速緩存,并依據(jù)單次通信海量運算的原則,大大隱藏了通信消耗。
圖1為本發(fā)明基于眾核平臺的矩陣并行轉(zhuǎn)置方法的流程圖;
具體實施例方式以在SAR系統(tǒng)中4096X4096點目標(biāo)成像中二維矩陣轉(zhuǎn)置的應(yīng)用為例,本專利的實 現(xiàn)主要包括以下流程1.對于原始4096X4096 二維矩陣,將每一行和后一行的數(shù)據(jù)首尾相接,轉(zhuǎn)化為包 含4096X4096個元素的一維數(shù)組,并標(biāo)識為idata[16777216];2.計算idata[16777216]所占存儲空間的大小在本系統(tǒng)應(yīng)用中,矩陣 元素的數(shù)據(jù)類型為浮點型,那么idata[16777216]所占存儲空間為mem_Size = sizeof (float)*4096*4096 = 67108864bytes ;3.根據(jù)計算出的mem_SiZe,在顯存上分配同樣大小的存儲空間標(biāo)識為idata_ gpu [16777216],然后將內(nèi)存上的數(shù)據(jù)idata拷貝到顯存的idata_gpU ;4.數(shù)據(jù)分割先考慮線程塊層,為了方便處理,我們設(shè)置為二維的而且每維的大 小一致即每個線程塊包含16X16個線程;考慮網(wǎng)格層,為方便處理,我們也設(shè)置成二維的, 但是大小由原矩陣的大小4096*4096決定沿行的方向gridx = 4096/16 = 256,沿列的方 向 gridy = 4096/16 = 256 ;5.輸入數(shù)據(jù)索引以線程塊為單位運算,首先根據(jù)原矩陣模型和GPU通用編 程的內(nèi)置變量blockldx. χ和threadldx. χ計算出行方向?qū)υ季仃嚨乃饕齲lndex =blockldx. x*16+threadldx. χ,同理計算出列方向的索引ylndex = blockldx. y*16+threadldx. y,根據(jù) xlndex 和 ylndex 計算出對 idata_gpu [16777216]的索引index_ in = ylndex*4096+xlndex ;6.根據(jù)上面得到的對輸入數(shù)據(jù)的索引,以線程塊為單位,將idata_gpU[16777216] 中對應(yīng)于每個線程塊的16X16個元素導(dǎo)入各自線程塊的共享存儲器中的緩存,記為 block_temp[16] [16],導(dǎo)入時的對應(yīng)關(guān)系為:block_temp [threadldx. y] [threadldx. χ]= idata_gpu[index_in];7.輸出數(shù)據(jù)索引以線程塊為單位運算,首先根據(jù)轉(zhuǎn)置后的矩陣模型和GPU 通用編程的內(nèi)置變量blockldx. χ和threadldx. χ計算出行方向?qū)敵鼍仃嚨乃饕?xlndex = blockldx. y*16+threadldx. χ,同理計算出列方向的索引ylndex = blockldx. x*16+threadldx. y,根據(jù) xlndex 和 ylndex 計算出對 odata_gpu [16777216]的索引index_ out = ylndex氺 4096+xIndex ;8.根據(jù)上面得到的對輸出數(shù)據(jù)的索引,以線程塊為單位,將各個線程塊的共享存 儲器中的緩存block_temp[16] [16],導(dǎo)出到輸出一維數(shù)組odata_gpu[16777216],導(dǎo)出時 的對應(yīng)關(guān)系為:odata_gpu [index_out] = block_temp [threadldx. χ] [threadldx. y],注意與輸入數(shù)據(jù)索引相比,bloCk_temp的兩個索引標(biāo)號對調(diào)了 ;9.將odata_gpu[16777216]通過函數(shù)cudamemcopy 拷貝到內(nèi)存odata[16777216], 然后對odata每4096個元素切割一次成為一行并按序組合成一個4096行4096列的二維 數(shù)組,此即為轉(zhuǎn)置后的矩陣。將得到的結(jié)果返回SAR成像算法中,并最終得到點目標(biāo)的成像結(jié)果。通過以上方法就實現(xiàn)了 SAR成像系統(tǒng)中的矩陣并行轉(zhuǎn)置。該過程是以線程塊為單 位進(jìn)行的,因為同一個線程塊內(nèi)部分配在共享存儲器上面的臨時數(shù)據(jù)是對本線程塊內(nèi)所有 的線程共享的,所以硬件上的實現(xiàn)是先把一個線程塊的輸入數(shù)據(jù)全導(dǎo)入共享存儲器,然后 再對這線程塊內(nèi)的所有數(shù)據(jù)每個處理核心負(fù)責(zé)一個線程完成轉(zhuǎn)置,因此實現(xiàn)效率高。這樣 就實現(xiàn)了在含有成百上千個處理核心的GPU上高效、并行完成矩陣轉(zhuǎn)置。
權(quán)利要求
基于眾核平臺的矩陣轉(zhuǎn)置并行方法,其特征在于包括以下步驟第一步轉(zhuǎn)置的矩陣為M行N列,將每一行和后一行的數(shù)據(jù)首尾相接,將M×N的二維數(shù)組轉(zhuǎn)化為包含M×N個元素的一維數(shù)組,并標(biāo)識為A;第二步計算A所占存儲空間的大小,并標(biāo)識為B;第三步根據(jù)計算出的B,在GPU的全局存儲器上分配同樣大小的存儲空間標(biāo)識為C,然后將內(nèi)存上的數(shù)據(jù)A拷貝到GPU的全局存儲器的C;第四步數(shù)據(jù)分割GPU的組織包括線程網(wǎng)格層、線程塊層、線程層,一個網(wǎng)格包含兩個以上線程塊,為一維組織或二、三維組織,每個塊包含兩個以上運行線程,同時,每個塊有一個被該塊內(nèi)所有運行線程可見的共享存儲器;線程塊層我們設(shè)置為二維且每維的大小一致;網(wǎng)格層設(shè)置成二維,大小由原矩陣的大小M、N決定;第五步輸入數(shù)據(jù)索引以線程塊為單位運算,根據(jù)原矩陣模型和GPU的內(nèi)置變量計算出行方向?qū)υ季仃嚨乃饕土蟹较虻乃饕瑥亩嬎愠鰧的索引;第六步根據(jù)第五步得到的對輸入數(shù)據(jù)的索引,以線程塊為單位,將C中對應(yīng)于每個線程塊的元素導(dǎo)入各自線程塊的共享存儲器中;第七步輸出數(shù)據(jù)索引以線程塊為單位運算,首先根據(jù)轉(zhuǎn)置后的矩陣模型,對掉行索引和列索引,借助GPU通用編程的內(nèi)置變量計算出行方向?qū)敵鼍仃嚨乃饕约傲蟹较虻乃饕?,從而計算出輸出矩陣的索引;第八步根?jù)第七步得到的對輸出數(shù)據(jù)的索引,以線程塊為單位,將各個線程塊的共享存儲器中的緩存導(dǎo)出到一維數(shù)組C;第九步將C拷貝到內(nèi)存A,然后對A每M個元素切割一次成為一行并按序組合成一個N行M列的二維數(shù)組,此即為轉(zhuǎn)置后的矩陣;通過以上步驟就完成了矩陣轉(zhuǎn)置在GPU眾核平臺下的實現(xiàn)。
2.根據(jù)權(quán)利要求1所述的一種基于GPU眾核平臺的矩陣轉(zhuǎn)置并行方法,其特征在于 在對數(shù)據(jù)進(jìn)行分割時,對于線程塊層設(shè)置為二維或二維以上且每維的大小一致。
3.根據(jù)權(quán)利要求1所述的一種基于GPU眾核平臺的矩陣轉(zhuǎn)置并行方法,其特征在于 線層網(wǎng)格層大小設(shè)置為二維,且每維的大小由原矩陣的大小M、N決定。
全文摘要
本發(fā)明公開了一種基于GPU眾核平臺的矩陣轉(zhuǎn)置并行方法,該方法是以線程塊為單位進(jìn)行的,因為同一個線程塊內(nèi)分配在共享存儲器上面的臨時數(shù)據(jù)是對本線程塊內(nèi)所有的線程共享的,所以硬件上的實現(xiàn)是先把一個線程塊的輸入數(shù)據(jù)全導(dǎo)入共享存儲器,然后再針對這線程塊內(nèi)的所有數(shù)據(jù)以一個處理核心負(fù)責(zé)一個線程的模式完成轉(zhuǎn)置,因此實現(xiàn)效率高。這樣就實現(xiàn)了在含有成百上千個處理核心的GPU上高效、并行完成矩陣轉(zhuǎn)置。
文檔編號G06F17/16GK101937425SQ20091008837
公開日2011年1月5日 申請日期2009年7月2日 優(yōu)先權(quán)日2009年7月2日
發(fā)明者劉峰, 劉海波, 姚迪, 靳星星, 龍騰 申請人:北京理工大學(xué)