在完成所有數(shù)據(jù)的累加后,特定的線程會將自己的結(jié)果累加到相應(yīng)的線程上,每經(jīng)過一次循環(huán),累加所需的次數(shù)就減少一半,直至獲得整個線程塊的局部和。最后通過原子加法累加到全局內(nèi)存中。
[0038](7)完成節(jié)點(diǎn)的分類并得到新的中心點(diǎn)后,程序會將新的子節(jié)點(diǎn)發(fā)送至主機(jī)中的其他線程。主線程會繼續(xù)從任務(wù)隊中獲取之后待處理的節(jié)點(diǎn),從而縮短程序中的關(guān)鍵路徑。而處理新節(jié)點(diǎn)的線程會將不同的節(jié)點(diǎn)插入不同的隊列中,需要多GPU合作的大型的節(jié)點(diǎn)會放在一個隊列中,可以放在單個GHJ中的節(jié)點(diǎn)放在一個隊列中,而小于設(shè)置的閾值大小的節(jié)點(diǎn)會放到另一個隊列,只有當(dāng)前一個隊列為空時程序才會從后一個隊列中取節(jié)點(diǎn)。在程序開始時,所有節(jié)點(diǎn)都是大型節(jié)點(diǎn),由所有GHJ共同處理。當(dāng)開始處理后一個隊列時,程序會激活其他線程,多個GPU會同時開始工作,協(xié)同方式如圖3所示,分別從隊列中取得自己的任務(wù),處理新的節(jié)點(diǎn)。
[0039](8)新的節(jié)點(diǎn)插入隊列后,程序會對隊列進(jìn)行遍歷,尋找還未進(jìn)行預(yù)處理的節(jié)點(diǎn),并將任務(wù)分發(fā)到各個負(fù)責(zé)預(yù)處理工作的線程中。對于初始節(jié)點(diǎn)是超大型節(jié)點(diǎn)的建樹工作,由于內(nèi)存限制,程序會記錄內(nèi)存占用情況并限制節(jié)點(diǎn)的預(yù)處理工作。在遍歷過程中,程序會判斷內(nèi)存是否夠存放下預(yù)處理的數(shù)據(jù),如果不夠則該過程會結(jié)束,等待下次遍歷。如果空間足夠那么程序會進(jìn)行預(yù)處理,并將預(yù)處理的數(shù)據(jù)計入內(nèi)存消耗中。
[0040](9)當(dāng)層數(shù)超出預(yù)設(shè)值或者節(jié)點(diǎn)中高維特征點(diǎn)數(shù)小于中心點(diǎn)數(shù)時,程序都不會將新節(jié)點(diǎn)插入隊列中。所以,當(dāng)隊列為空時,程序就會結(jié)束,完成高維詞匯樹的構(gòu)建工作。
【主權(quán)項】
1.一種基于異構(gòu)平臺的高維詞匯樹構(gòu)建方法,其特征在于包括:利用異構(gòu)平臺中圖形處理器(GPU)強(qiáng)大的并行計算能力與可編程性,提升高維詞匯樹構(gòu)建過程的速度;利用高維詞匯樹算法特性和圖形處理器的內(nèi)存訪問模式優(yōu)化算法;采用主機(jī)和圖形處理器在高維詞匯樹算法運(yùn)行過程中的協(xié)調(diào)策略; 在高維詞匯樹的構(gòu)建中,將高維詞匯樹中隊列管理以及預(yù)處理工作放在主機(jī)端,生成新節(jié)點(diǎn)算法中的分類以及求和兩個部分交由GPU進(jìn)行處理; 在運(yùn)行建樹程序前,將所有圖片的高維特征點(diǎn)作為一整個節(jié)點(diǎn)放入隊列中; 開始運(yùn)行建樹程序,建樹過程根據(jù)主機(jī)端的主線程維護(hù)的隊列進(jìn)行,具體步驟如下: 第一步,程序從任務(wù)隊列中取出待處理的節(jié)點(diǎn),并將需要處理的數(shù)據(jù)傳輸?shù)紾PU的主存中; 根據(jù)節(jié)點(diǎn)大小的不同,將采用不同的GPU協(xié)同策略:將節(jié)點(diǎn)分為下述三種,并放到不同的隊列中進(jìn)行處理;在前一個隊列處理完之前程序不處理下一個隊列中的節(jié)點(diǎn); 第一種是大型節(jié)點(diǎn),這類節(jié)點(diǎn)的大小超過GPU主存的容量,將其劃分為可以放入GPU中的數(shù)據(jù)塊;如果是多GPU結(jié)構(gòu),每個GPU依次拿取自己的數(shù)據(jù)塊;如果是單GPU結(jié)構(gòu),該GPU順序處理所有的數(shù)據(jù)塊;每次處理完所有數(shù)據(jù)塊的分類或者求和之后,進(jìn)行同步,并將結(jié)果匯總至主機(jī)端內(nèi)存上的數(shù)組中,之后再進(jìn)行下一部分的處理; 第二種是普通的節(jié)點(diǎn),這類節(jié)點(diǎn)的大小可以整塊放入GHJ內(nèi)存中,不需要劃分為數(shù)據(jù)塊;GPU按順序從隊列中獲取任務(wù),處理完一個任務(wù)后即可取下一塊任務(wù); 第三種是碎片化節(jié)點(diǎn),這類節(jié)點(diǎn)是到了隊列的尾部,高維詞匯樹的底層,產(chǎn)生的許多只有數(shù)百、數(shù)十個高維特征點(diǎn)的節(jié)點(diǎn);為了充分利用GPU的計算能力,要放入盡量多的碎片化節(jié)點(diǎn)以填滿GPU的內(nèi)存,此時GPU每次可以處理上百個節(jié)點(diǎn); 第二步,對節(jié)點(diǎn)進(jìn)行處理,生成K個子節(jié)點(diǎn) 首先,在節(jié)點(diǎn)中隨機(jī)尋找K個高維特征點(diǎn)作為初始的中心點(diǎn),然后對高維特征點(diǎn)進(jìn)行分類處理,之后對每個分類求和,最后得到新的K個中心點(diǎn);經(jīng)過循環(huán)上述過程,至中心點(diǎn)結(jié)果不變后,得到K個新的中心點(diǎn); 其中,GPU上節(jié)點(diǎn)的處理工作有兩部分:一是對每個高維特征點(diǎn)進(jìn)行分類,二是對每個類別的高維特征點(diǎn)進(jìn)行求和;對這兩部分采用不同的并行模式以提高并行性能: 對于分類計算,每個線程以高維特征點(diǎn)為任務(wù)目標(biāo),去完成分類任務(wù);線程的任務(wù)是首先求出高維特征點(diǎn)與所有中心點(diǎn)的多維距離,然后確定與之距離最短的中心點(diǎn),將結(jié)果存儲到全局內(nèi)存中;由于計算最短距離不適合由多個線程共同完成,所以GPU采用根據(jù)高維特征點(diǎn)進(jìn)行處理的方式,線程各自讀取高維特征點(diǎn)進(jìn)行處理;中心點(diǎn)的數(shù)據(jù)被存儲在線程塊的共享內(nèi)存中,這是所有高維特征點(diǎn)公用的數(shù)據(jù),放在共享內(nèi)存中能夠減少不必要的主存訪問;當(dāng)一個線程在處理完一個節(jié)點(diǎn)后,讀取下一個要處理的高維特征點(diǎn)并循環(huán)直至處理完所有的節(jié)點(diǎn); 對于求和計算,GPU按維度進(jìn)行并行處理,一個線程塊處理一組節(jié)點(diǎn),每個線程負(fù)責(zé)特定的維度,每個線程只存儲自己負(fù)責(zé)的維度的局部和,這樣就能將局部和放在共享內(nèi)存上,減少不必要的GPU主存訪問;每次處理完一個點(diǎn)中的特定維度,線程根據(jù)線程塊中的總線程數(shù)累加一定的地址得到下一部分有相同維度的數(shù)據(jù);最終,在這組節(jié)點(diǎn)中所有線程都完成累加后,有特定的線程將各自負(fù)責(zé)的值累加到全局變量上; 第三步,將子節(jié)點(diǎn)放入隊列中 當(dāng)前節(jié)點(diǎn)生成的K個子節(jié)點(diǎn)中,超過預(yù)定的層數(shù)L或者特征點(diǎn)過少的節(jié)點(diǎn)不會被放入隊列,其余節(jié)點(diǎn)會被放到相應(yīng)節(jié)點(diǎn)中; 第四步,重復(fù)第一至第三步的過程,當(dāng)隊列為空時,高維詞匯樹的構(gòu)建工作完成。2.根據(jù)權(quán)利要求1所述的基于異構(gòu)平臺的高維詞匯樹構(gòu)建方法,其特征在于在第二步中,驟還對于GPU中的內(nèi)存訪問進(jìn)行了優(yōu)化,優(yōu)化目標(biāo)是減少對全局內(nèi)存的訪問或者將經(jīng)常訪問的數(shù)據(jù)放置到共享內(nèi)存上,包括: (1)采用數(shù)據(jù)壓縮的內(nèi)存訪問方式 在每次讀取數(shù)據(jù)時將多個維度的數(shù)據(jù)拼接成與帶寬匹配的數(shù)據(jù)一次讀取;對于分類的過程,一個點(diǎn)中相鄰的多個維度放在一起,作為一個數(shù)據(jù)讀取;對于求和的過程,將相鄰的多個點(diǎn)的同一個維度抽取出來進(jìn)行拼接,作為一個數(shù)據(jù)讀?。? (2)進(jìn)行數(shù)據(jù)重構(gòu) 在分類的過程中,數(shù)據(jù)重構(gòu),就是使warp中線程訪問數(shù)據(jù)時,數(shù)據(jù)在GHJ主存中的分布是連續(xù)的,即warp訪問的特征點(diǎn)的同一維在GPU主存中是連續(xù)的;同時,將同一個點(diǎn)的多個維度先作為一塊存放,再和相鄰點(diǎn)的相同維度一起存放;在求和的過程中,數(shù)據(jù)重構(gòu)是將一組特征點(diǎn)的同一維度一起存放,以適應(yīng)壓縮訪問的要求; (3)、逆向的數(shù)據(jù)塊遍歷和數(shù)據(jù)塊加載順序的優(yōu)化 對于大型節(jié)點(diǎn),由于節(jié)點(diǎn)大小大于GPU主存的容量,所以需要將其劃分為多個數(shù)據(jù)塊依次放入GPU中進(jìn)行處理;將數(shù)據(jù)塊設(shè)計成小于GPU內(nèi)存的一半,在使用GPU生成新節(jié)點(diǎn)的時候就能使用GHJ的第二個工作流進(jìn)行數(shù)據(jù)裝載的工作,將下一塊數(shù)據(jù)塊裝載在GPU的另一半內(nèi)存上; 節(jié)點(diǎn)的處理會循環(huán)多次,對數(shù)據(jù)塊也會進(jìn)行多次遍歷,為在遍歷的過程中減少數(shù)據(jù)塊的讀取次數(shù),前一循環(huán)的結(jié)尾數(shù)據(jù)塊在后一循環(huán)開始時仍然儲存在GHJ主存中,所以讓相鄰的兩個循環(huán)以逆向的方向進(jìn)行數(shù)據(jù)塊的遍歷處理,這樣每一個GHJ在頭部和尾部都可以節(jié)省一次數(shù)據(jù)塊載入的工作。
【專利摘要】本發(fā)明屬于并行處理器技術(shù)領(lǐng)域,具體為一種基于異構(gòu)平臺的面向高維詞匯樹構(gòu)建方法。本發(fā)明利用異構(gòu)處理平臺(通用處理器和圖形處理器(GPGPU)混合架構(gòu))上圖形處理器強(qiáng)大的并行計算能力與可編程性,提升高維詞匯樹構(gòu)建過程的速度。本發(fā)明利用圖形處理器高并發(fā)性的特點(diǎn)加速高維詞匯樹算法的核心過程,利用高維詞匯樹算法特性和圖形處理器的內(nèi)存訪問模式優(yōu)化算法的訪存過程,并設(shè)計了主機(jī)和圖形處理器在高維詞匯樹算法運(yùn)行過程中的協(xié)調(diào)策略。本發(fā)明方法可以有效提升面向高維數(shù)據(jù)的詞匯樹的構(gòu)建速度。
【IPC分類】G06F9/48
【公開號】CN105573834
【申請?zhí)枴緾N201510938217
【發(fā)明人】張為華, 季曉楓, 余時強(qiáng)
【申請人】復(fù)旦大學(xué)
【公開日】2016年5月11日
【申請日】2015年12月16日