專(zhuān)利名稱(chēng):一種面向gpu的雙調(diào)歸并排序方法
—種面向GPU的雙調(diào)歸并排序方法本發(fā)明涉及一種數(shù)據(jù)排序方法,特別是一種面向GPU的基于OpenCL規(guī)范的雙調(diào)歸并排序方法。
背景技術(shù):
排序是計(jì)算機(jī)應(yīng)用中最常見(jiàn)的操作之一,隨著并行處理技術(shù)的進(jìn)一步發(fā)展,并行排序已經(jīng)成為一個(gè)非常重要的研究領(lǐng)域。通常將并行排序分為兩類(lèi)一類(lèi)是直接排序,能夠直接實(shí)現(xiàn)序列的排序;另一類(lèi)是歸并排序,即可以將多個(gè)有序列快速合并為一個(gè)有序列。在現(xiàn)有技術(shù)中,大部分的排序方法都需要開(kāi)辟新的內(nèi)存空間來(lái)存儲(chǔ)排序中間步驟的結(jié)果,例如常見(jiàn)的快速排序、基數(shù)排序和并行排序算法中的桶排序等。雙調(diào)歸并排序方法 能夠直接在待排序列的存儲(chǔ)空間進(jìn)行數(shù)據(jù)交換,有效節(jié)省了內(nèi)存開(kāi)銷(xiāo)。目前AMD的OpenCL軟件開(kāi)發(fā)套件(SDK)中包含了 OpenCL版本的雙調(diào)排序方法在GTO上的實(shí)現(xiàn)。其雙調(diào)排序程序能夠充分利用GPU的流處理器,但是排序中的同步工作完全由CPU部分完成,工作組間的線程同步需要進(jìn)行上下文的切換,從而影響計(jì)算效率。因此,在節(jié)省存儲(chǔ)空間的基礎(chǔ)上,如何有效減少CPU和GPU之間的同步次數(shù)、減少執(zhí)行指令的總量和延時(shí)、增加GPU計(jì)算單元的利用率等是本發(fā)明要解決的技術(shù)問(wèn)題。
發(fā)明內(nèi)容
本發(fā)明的目的是為了有效減少CPU和GPU之間的同步次數(shù)、減少執(zhí)行指令的總量和延時(shí)、增加GPU計(jì)算單元的利用率。為了實(shí)現(xiàn)上述目的,本發(fā)明提供了一種面向GPU的雙調(diào)歸并排序方法,包括如下步驟(I)將共享內(nèi)存中的待排序列數(shù)據(jù)拷貝到GPU設(shè)備局部?jī)?nèi)存中;(2)判斷是否需要進(jìn)行向量?jī)?nèi)排序,若需要?jiǎng)t由一個(gè)線程操作向量模擬L個(gè)比較器,多個(gè)線程并行執(zhí)行歸并排序;(3)將排序結(jié)果由GPU設(shè)備局部?jī)?nèi)存拷貝到共享內(nèi)存中。本發(fā)明還提供了一種面向GPU的雙調(diào)歸并排序系統(tǒng),包括如下模塊用于將共享內(nèi)存中的待排序列數(shù)據(jù)拷貝到GPU設(shè)備局部?jī)?nèi)存中的模塊;用于判斷是否需要進(jìn)行向量?jī)?nèi)排序,若需要?jiǎng)t由一個(gè)線程操作向量模擬L個(gè)比較器,多個(gè)線程并行執(zhí)行歸并排序的模塊;用于將排序結(jié)果由GPU設(shè)備局部?jī)?nèi)存拷貝到共享內(nèi)存中的模塊。本發(fā)明的一種優(yōu)選方案為多個(gè)線程并行執(zhí)行歸并排序時(shí),對(duì)于同一個(gè)工作組內(nèi)的線程同步使用同步函數(shù)來(lái)完成,對(duì)于不同工作組內(nèi)的線程間同步通過(guò)CPU完成。本發(fā)明的另一優(yōu)選方案為當(dāng)一個(gè)工作組內(nèi)的比較器本次和下次操作數(shù)都存在于該工作組的局部?jī)?nèi)存時(shí),使用同步函數(shù)同步工作組內(nèi)線程;當(dāng)一個(gè)工作組內(nèi)的比較器本次和下次操作數(shù)存放在不同的工作組局部?jī)?nèi)存時(shí),由CPU參與線程的同步。本發(fā)明的另一優(yōu)選方案為由一個(gè)線程來(lái)模擬LXM個(gè)比較器,操作2XM個(gè)向量進(jìn)行比較交換操作,每個(gè)線程內(nèi)向量運(yùn)算指令順序執(zhí)行。本發(fā)明的另一優(yōu)選方案為在排序過(guò)程中,改變比較器操作數(shù)的寫(xiě)回地址,以使局部?jī)?nèi)存讀操作的地址連續(xù),同時(shí)為防止線程間數(shù)據(jù)讀寫(xiě)沖突,設(shè)置每個(gè)線程將需要操作的數(shù)據(jù)讀入寄存器再進(jìn)行比較交換操作。本發(fā)明的另一優(yōu)選方案為在排序一組向量時(shí),若該組向量的前半部分向量不連續(xù),則將該前半部分向量中的后半部與該后半部分向量中的后半部交換位置后,再執(zhí)行寫(xiě)回共享內(nèi)存的操作。本發(fā)明的另一優(yōu)選方案為在排序一組向量時(shí),若該組向量的前半部分向量不連續(xù),后半部分向量連續(xù),則將該前半部分向量中的前半部與該后半部分向量中的前半部交換位置后,再執(zhí)行寫(xiě)回共享內(nèi)存的操作。
圖I為雙調(diào)歸并排序網(wǎng)絡(luò)的原理圖;圖2為本發(fā)明的由CPU端執(zhí)行的主機(jī)程序流程;圖3為本發(fā)明的GPU雙調(diào)歸并排序方法執(zhí)行過(guò)程。
具體實(shí)施例方式下面通過(guò)附圖和實(shí)施例,對(duì)本發(fā)明的技術(shù)方案做進(jìn)一步的詳細(xì)描述。本發(fā)明主要通過(guò)以下幾種方式,對(duì)現(xiàn)有技術(shù)中GPU雙調(diào)歸并排序方法做出改進(jìn)一、使用向量模擬多個(gè)比較器在傳統(tǒng)的GPU雙調(diào)歸并排序方法中,一條線程作為一個(gè)比較器(compare andconditionally interchange),待排序列長(zhǎng)度為比較器數(shù)的2倍??梢詫⒈容^器第一次分組,通過(guò)組號(hào)即可確定所排列的數(shù)據(jù)段是按升序還是降序排列,同時(shí)可以將比較器二次分組,通過(guò)組號(hào)能夠得到該比較器操作的序列元素的位置,圖I是擁有4個(gè)比較器的雙調(diào)歸并排序網(wǎng)絡(luò)的簡(jiǎn)單原理示意。而在實(shí)際應(yīng)用的測(cè)試中發(fā)現(xiàn),僅使用單數(shù)據(jù)項(xiàng)進(jìn)行比較的傳統(tǒng)雙調(diào)排序方法在運(yùn)行中算術(shù)邏輯單元(ALU)的使用率偏低,為解決該技術(shù)問(wèn)題,本發(fā)明提出一種引入向量計(jì)算的雙調(diào)歸并排序方法,以提高算術(shù)邏輯單元的利用率。對(duì)2N個(gè)數(shù)字進(jìn)行基于標(biāo)量的雙調(diào)歸并排序,需要N個(gè)比較器,同步次數(shù)為(IgN/lg2+2)*(lgN/lg2+l)/2-l。而使用長(zhǎng)度為L(zhǎng)的向量,使得一個(gè)線程由模擬一個(gè)比較器變?yōu)槟ML個(gè)比較器,在進(jìn)行雙調(diào)歸并排序時(shí),同步次數(shù)減少為(2+lgN/lg2-2*lgL/lg2)*(lgN/lg2-2*lgL/lg2+l)/2-l。同時(shí)使用向量可以減少線程數(shù),即減少需要執(zhí)行的指令數(shù)。排序同等規(guī)模數(shù)據(jù)時(shí),使用長(zhǎng)度為L(zhǎng)的向量的指令數(shù)為基于標(biāo)量的指令數(shù)的1/L,從而將大大減少計(jì)算的時(shí)間,提高排序計(jì)算的效率。二、向量同步操作優(yōu)化在GPU運(yùn)算中線程同步是高開(kāi)銷(xiāo)的操作,不同的同步方法產(chǎn)生的開(kāi)銷(xiāo)差別很大。在OpenCL規(guī)范中,一個(gè)工作組(work-group)內(nèi)的線程(work_item)同步可以使用同步函數(shù)完成,同步過(guò)程不需要CPU參與,不涉及上下文(context)切換,因而該同步方法開(kāi)銷(xiāo)低。而工作組間的線程同步必須通過(guò)切換上下文到CPU設(shè)備來(lái)完成,該同步方法開(kāi)銷(xiāo)高。若GPU—個(gè)工作組內(nèi)可包含的線程數(shù)為ITEMS,使用長(zhǎng)度為L(zhǎng)的向量進(jìn)行排序操作,當(dāng)(N/L>lgITEMS/lg2)時(shí),需要CPU同步的次數(shù)為(l+lgN/lg2-2*lgL/lg2-lgITEMS/lg2)*(lgN/lg2-2*lgL/lg2_lgITEMS/lg2)/2 ;而當(dāng)(N/L〈=lgITEMS/lg2)時(shí),需要CPU同步的次數(shù)為0,即完全使用同步函數(shù)來(lái)進(jìn)行線程內(nèi)同步?;谏鲜龇治?,為了將同步開(kāi)銷(xiāo)降到最低,本實(shí)施例的方案中混合使用兩種同步方法,當(dāng)一個(gè)工作組內(nèi)的比較器本次和下次操作數(shù)都存在于該工作組的局部?jī)?nèi)存時(shí),使用同步函數(shù)同步工作組內(nèi)線程;當(dāng)一個(gè)工作組內(nèi)的比較器本次和下次操作數(shù)存放在不同的工作組局部?jī)?nèi)存時(shí),CPU參與所有線程的同步。三、使用多個(gè)向量模擬更大長(zhǎng)度向量 由于在GPU運(yùn)算中,向量指令允許的向量長(zhǎng)度有限制,為使單個(gè)線程模擬超過(guò)最大向量長(zhǎng)度數(shù)的比較器,可以使用單線程操作2組多個(gè)向量實(shí)現(xiàn)。使用標(biāo)量的情況下,一個(gè)線程模擬一個(gè)比較器操作2個(gè)標(biāo)量進(jìn)行比較交換;使用L長(zhǎng)度的向量情況下,一個(gè)線程模擬L個(gè)比較器操作2個(gè)向量進(jìn)行比較交換。為使單個(gè)線程模擬超過(guò)向量指令允許的最大向量長(zhǎng)度數(shù)的比較器,本實(shí)施例的方案中,使用單線程操作2組向量,每組向量中包含多個(gè)向量。即L長(zhǎng)度向量情況下一個(gè)線程模擬L*M個(gè)比較器操作2*M個(gè)向量進(jìn)行比較交換。單線程操作2組M個(gè)L長(zhǎng)度向量,即相當(dāng)于使用M個(gè)L長(zhǎng)度向量模擬M*L長(zhǎng)度向量,從而增加單個(gè)工作組內(nèi)處理的數(shù)據(jù)量。對(duì)于排序2N個(gè)元素,使用M個(gè)L長(zhǎng)度向量模擬M*L長(zhǎng)度向量,與實(shí)施例一、二中使用L長(zhǎng)度向量相比,在執(zhí)行相同數(shù)量向量運(yùn)算指令下將(l+2*lgN/lg2-2*lgITEMS/lg2-2*lgM*lg2)*lgM/lg2條需CPU參與的同步轉(zhuǎn)換為單線程內(nèi)向量運(yùn)算指令順序執(zhí)行所蘊(yùn)含的隱式同步或同步函數(shù)同步,隱式同步的開(kāi)銷(xiāo)要小于CPU參與的同步和OpenCL同步函數(shù)的同步。四、基于向量的局部?jī)?nèi)存讀操作優(yōu)化傳統(tǒng)的雙調(diào)歸并排序方法中,一組線程進(jìn)行內(nèi)存讀操作的地址在大多數(shù)情況下是不連續(xù)的,當(dāng)局部?jī)?nèi)存讀操作的內(nèi)存地址不連續(xù)時(shí)將降低緩存命中率、產(chǎn)生額外的bank沖關(guān)。由于下次操作的數(shù)據(jù)位置在本次操作中是能夠計(jì)算的,可以通過(guò)改變數(shù)據(jù)寫(xiě)回地址實(shí)現(xiàn)下次局部?jī)?nèi)存讀操作的地址連續(xù)。改變后由于比較器讀操作的內(nèi)存地址和寫(xiě)操作的內(nèi)存地址不一致,為了防止線程間數(shù)據(jù)讀寫(xiě)沖突,設(shè)置每個(gè)線程將需要操作的數(shù)據(jù)讀入寄存器再進(jìn)行比較交換操作,在寫(xiě)回操作前設(shè)置同步操作確保所有數(shù)據(jù)已經(jīng)被處理。通過(guò)對(duì)雙調(diào)歸并排序的推導(dǎo),得到如下數(shù)據(jù)寫(xiě)回地址換算規(guī)則,對(duì)CPU和GPU構(gòu)架均適用。a)設(shè)本次數(shù)據(jù)操作是將兩組m個(gè)元素的單調(diào)序列歸并為一個(gè)2*m個(gè)元素的單調(diào)序列的一系列操作中的一步,下次數(shù)據(jù)操作仍然屬于這一系列操作,轉(zhuǎn)換公式為(僅適用于包含8個(gè)元素的向量)idl=((Id>>jg_3)<<jg_3)+Id-g21_setoff;id2=idl+(l jg_3);
idl= (idl》(jg_3-l)) %2==0 idl-( (idl》(jg_3_l)) >>1) * (1 (jg_3_l)) : idl+ (((1 (10_jg_3)) - (idl》(jg_3-l))) >>1) * (1 (jg_3-l));id2= (id2 (jg_3-l)) %2==0 id2-((id2 (jg_3_l)) >>1) * (1 (jg_3_l)) : id2+ (((1 (10_jg_3)) - (id2 (jg_3-l))) >>1) * (1 (jg_3-l));其中idl、id2為比較器操作的兩個(gè)數(shù)的寫(xiě)回下標(biāo),Id為線程的全局編號(hào),jg_3為將兩個(gè)m個(gè)元素的單調(diào)序列歸并為一個(gè)2*m個(gè)元素的單調(diào)序列的一系列操作中“總步數(shù)和現(xiàn)步驟編號(hào)的差”,g21_setoff為“兩倍的工作組內(nèi)線程數(shù)乘以工作組編號(hào)”。b)設(shè)本次數(shù)據(jù)操作是將兩個(gè)m個(gè)元素的單調(diào)序列歸并為一個(gè)2*m個(gè)元素的單調(diào)序列的一系列操作中的一步,但下次數(shù)據(jù)操作是將兩個(gè)2*m個(gè)元素的單調(diào)序列歸 并為一個(gè)2*2*m個(gè)元素的單調(diào)序列的一系列操作中的一步,同時(shí)下一次數(shù)據(jù)操作所隸屬的一系列操作完成后不需要CPU參與同步,轉(zhuǎn)換公式為(僅適用于包含8個(gè)元素的向量)idl=((Id>>jg_3)<<jg_3)+Id-g21_setoff;id2=idl+(l jg_3);idl=(idl (ig_3+l))%2==0 idl-((idl (ig_3+l)) l)*(l (ig_3+l)) :idl+(((1 (8_ig_3)) - (idl》(ig_3+l))) >>1) * (1 (ig_3+l));id2= (id2 (ig_3+l)) %2==0 id2-((id2 (ig_3+l)) >>1) * (1 (ig_3+l)) : id2+ (((1 (8_ig_3)) - (id2 (ig_3+l))) >>1) * (1 (ig_3+l));b條的規(guī)則設(shè)置是為了將不需要CPU同步的幾組系列操作通過(guò)同步函數(shù)聯(lián)系起來(lái)。c)類(lèi)似于上述b條情況,但下一次數(shù)據(jù)操作所隸屬的一系列操作完成后需CPU參與同步,轉(zhuǎn)換公式為(僅適用于包含8個(gè)元素的向量)idl=((Id>>jg_3)<<jg_3)+Id-g21_setoff;id2=idl+(1<<jg_3);d)本次數(shù)據(jù)操作需要CPU參與同步,轉(zhuǎn)換公式為(僅適用于包含8個(gè)元素的向量)idl= ((Id (jg_3-3)) (jg_3_3)) +Id;id2=idl+(1〈〈(jg_3_3));五、降低向量寫(xiě)操作bank沖突的普適方法ATI GPU以64個(gè)線程一組(warp)執(zhí)行,但局部?jī)?nèi)存操作要分成兩次的32個(gè)線程一組對(duì)局部?jī)?nèi)存進(jìn)行操作;Nvidia GPU以32個(gè)線程一組執(zhí)行,局部?jī)?nèi)存操作同樣以32個(gè)線程一組對(duì)局部?jī)?nèi)存進(jìn)行操作。ATI GPU的64個(gè)局部?jī)?nèi)存操作要分成兩次的32個(gè)線程作為一組對(duì)局部?jī)?nèi)存進(jìn)行操作時(shí),32個(gè)線程將寫(xiě)操作32*2個(gè)向量,那么32*2個(gè)向量需要2次局部?jī)?nèi)存寫(xiě)操作完成,可以分兩種情況一是32*2個(gè)向量地址不連續(xù),由于算法特點(diǎn)前32個(gè)地址連續(xù),后32個(gè)地址連續(xù),對(duì)于32個(gè)連續(xù)地址的局部?jī)?nèi)存數(shù)據(jù)操作的bank沖突已經(jīng)最低;二是32*2個(gè)向量地址連續(xù),但前32個(gè)地址不連續(xù),此時(shí)需要交換一部分?jǐn)?shù)據(jù)在寄存器中的位置將bank沖突降至最低;但在Nvidia GPU平臺(tái)上由于32個(gè)線程一組,局部?jī)?nèi)存操作同樣以32線程為一組,所以寫(xiě)局部?jī)?nèi)存數(shù)據(jù)一定bank沖突最低。只針對(duì)ATI GPU特點(diǎn)制定針對(duì)ATI GPU的局部?jī)?nèi)存寫(xiě)操作優(yōu)化策略“當(dāng)32個(gè)線程操作的64個(gè)向量的前32個(gè)地址不連續(xù)時(shí),在比較器操作完成后將此32個(gè)線程中奇數(shù)編號(hào)線程對(duì)應(yīng)的idl和id2關(guān)聯(lián)的兩個(gè)向量元素進(jìn)行再次交換,達(dá)到每組32個(gè)寫(xiě)操作中奇數(shù)線程先寫(xiě)回大數(shù)(或小數(shù))但偶數(shù)線程先寫(xiě)回相反的小數(shù)(或大數(shù)),但這32個(gè)元素在地址上是一定連續(xù)的”。此方法是以增加計(jì)算量的方式減少bank沖突。設(shè)備全局內(nèi)存的bank數(shù)為同時(shí)執(zhí)行寫(xiě)操作線程數(shù)的l/M(M=2i,i為正整數(shù)),一個(gè)向量占據(jù)K個(gè)bank通道(K=2j,j為正整數(shù),K小于bank數(shù))的廣義情況下,此時(shí)“同時(shí)執(zhí)行寫(xiě)操作線程數(shù)*K/bank數(shù)=2i+\即每次寫(xiě)操作需要2 _倍的bank通道,但2 _>1所以必然存在bank沖突”。普適的向量寫(xiě)操作bank沖突優(yōu)化方法為“排序一組連續(xù)向量,前半部向量不連續(xù)時(shí),將前半部的后半部(或前半部)向量和后半部的后半部(或前半部)向量交換位置后再執(zhí)行寫(xiě)回設(shè)備全局內(nèi)存的操作將使bank沖突降至最低”。鑒于一次寫(xiě)操作的向量地址必然等間隔,一組比較器執(zhí)行一次比較操作的兩次寫(xiě)操作的向量地址必然連續(xù)的特點(diǎn),可保證上述方法的正確性。如附圖2所示,本發(fā)明的面向GPU的雙調(diào)歸并排序方法中,由CPU端執(zhí)行的主機(jī)程序流程為步驟I :查找OpenCL支持的計(jì)算平臺(tái),選擇相應(yīng)的計(jì)算平臺(tái)后創(chuàng)建支持特定特備的上下文(Context);步驟2 :查找上下文支持的計(jì)算設(shè)備,并關(guān)聯(lián)上下文和計(jì)算設(shè)備;步驟3 :查詢(xún)計(jì)算設(shè)備的屬性,創(chuàng)建待排序隊(duì)列并關(guān)聯(lián)到上下文和具體設(shè)備;步驟4 :創(chuàng)建Kernel程序并關(guān)聯(lián)到上下文后,編譯具體設(shè)備上運(yùn)行的Kernel程序; 步驟5 :選擇Kernel程序中一個(gè)能夠在設(shè)備上運(yùn)行的函數(shù)作為Kernel函數(shù);步驟6 :創(chuàng)建設(shè)備內(nèi)存和主機(jī)內(nèi)存間的緩沖區(qū);步驟7 :對(duì)Kernel函數(shù)的參數(shù)賦值,初次啟動(dòng)Kernel函數(shù);步驟8 :判斷待排序隊(duì)列的排序是否已完成,若完成則導(dǎo)出設(shè)備內(nèi)存數(shù)據(jù)至主機(jī)內(nèi)存;步驟9 :若未完成,繼續(xù)判斷是否更新Kernel函數(shù)參數(shù),若不需更新則啟動(dòng)Kernel函數(shù)后跳轉(zhuǎn)到步驟8繼續(xù)執(zhí)行,若需要更新則重新對(duì)Kernel函數(shù)參數(shù)賦值并啟動(dòng)Kernel函數(shù)后跳轉(zhuǎn)到步驟8繼續(xù)執(zhí)行。如附圖3所示,為由Kernel函數(shù)執(zhí)行的本發(fā)明的GPU雙調(diào)歸并排序方法執(zhí)行過(guò)程步驟I :讀取Kernel函數(shù)參數(shù),若為GPU線程需要多次局部同步(工作組內(nèi)同步)截止到需要全局同步(情況3),則執(zhí)行步驟3 ;若為GPU線程進(jìn)行一次比較操作后需要全局同步(情況2),則執(zhí)行步驟4后強(qiáng)制返回至步驟I ;若為排序起始到首次GPU線程需要全局同步截止(情況I ),則執(zhí)行步驟2 ;步驟2 :將設(shè)備共享內(nèi)存數(shù)據(jù)拷貝到設(shè)備局部?jī)?nèi)存,進(jìn)行向量?jī)?nèi)排序;步驟3 :執(zhí)行數(shù)據(jù)讀合并操作;步驟4:向量比較交換數(shù)據(jù),判斷是否需要進(jìn)行向量?jī)?nèi)排序,若是則進(jìn)行向量?jī)?nèi)排序,若否則繼續(xù)執(zhí)行步驟5;步驟5 :判斷是否需要降低bank沖突操作,若是則執(zhí)行半數(shù)線程交換操作,若否則繼續(xù)執(zhí)行步驟6 ;
步驟6 :判斷是否終止排序,若是則將設(shè)備局部?jī)?nèi)存數(shù)據(jù)拷貝到設(shè)備共享內(nèi)存,若否則返回至步驟I。通過(guò)本發(fā)明的技術(shù)方案,可以實(shí)現(xiàn)在節(jié)省存儲(chǔ)空間的基礎(chǔ)上,有效減少CPU和GPU之間的同步次數(shù)、減少執(zhí)行指令的總量和延時(shí)、增加GPU計(jì)算單元的利用率。以上所述的具體實(shí)施方式
,對(duì)本發(fā)明的目的、技術(shù)方案和有益效果進(jìn)行了進(jìn)一步詳細(xì)說(shuō)明,所應(yīng)理解的是,以上所述僅為本發(fā)明的具體實(shí)施方式
而已,并不用于限定本發(fā)明 的保護(hù)范圍,凡在本發(fā)明的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
1.一種面向GPU的雙調(diào)歸并排序方法,其特征在于包括如下步驟 (1)將共享內(nèi)存中的待排序列數(shù)據(jù)拷貝到GPU設(shè)備局部?jī)?nèi)存中; (2)判斷是否需要進(jìn)行向量?jī)?nèi)排序,若需要?jiǎng)t由一個(gè)線程操作向量模擬L個(gè)比較器,多個(gè)線程并行執(zhí)行歸并排序; (3)將排序結(jié)果由GPU設(shè)備局部?jī)?nèi)存拷貝到共享內(nèi)存中。
2.如權(quán)利要求I所述的方法,其特征在于 步驟(2)中多個(gè)線程并行執(zhí)行歸并排序時(shí),對(duì)于同一個(gè)工作組內(nèi)的線程同步使用同步函數(shù)來(lái)完成,對(duì)于不同工作組內(nèi)的線程間同步通過(guò)CPU完成。
3.如權(quán)利要求2所述的方法,其特征在于 當(dāng)一個(gè)工作組內(nèi)的比較器本次和下次操作數(shù)都存在于該工作組的局部?jī)?nèi)存時(shí),使用同步函數(shù)同步工作組內(nèi)線程;當(dāng)一個(gè)工作組內(nèi)的比較器本次和下次操作數(shù)存放在不同的工作組局部?jī)?nèi)存時(shí),由CPU參與線程的同步。
4.如權(quán)利要求1-3之一所述的方法,其特征在于 由一個(gè)線程來(lái)模擬L X M個(gè)比較器,操作2 X M個(gè)向量進(jìn)行比較交換操作,每個(gè)線程內(nèi)向量運(yùn)算指令順序執(zhí)行。
5.如權(quán)利要求4所述的方法,其特征在于 在排序過(guò)程中,改變比較器操作數(shù)的寫(xiě)回地址,以使局部?jī)?nèi)存讀操作的地址連續(xù),同時(shí)為防止線程間數(shù)據(jù)讀寫(xiě)沖突,設(shè)置每個(gè)線程將需要操作的數(shù)據(jù)讀入寄存器再進(jìn)行比較交換操作。
6.如權(quán)利要求5所述的方法,其特征在于 在排序一組向量時(shí),若該組向量的前半部分向量地址不連續(xù),則將該前半部分向量中的后半部與該后半部分向量中的后半部交換位置后,再執(zhí)行寫(xiě)回共享內(nèi)存的操作。
7.如權(quán)利要求5所述的方法,其特征在于 在排序一組向量時(shí),若該組向量的前半部分向量地址不連續(xù),則將該前半部分向量中的前半部與該后半部分向量中的前半部交換位置后,再執(zhí)行寫(xiě)回共享內(nèi)存的操作。
8.一種面向GPU的雙調(diào)歸并排序系統(tǒng),其特征在于包括如下模塊 用于將共享內(nèi)存中的待排序列數(shù)據(jù)拷貝到GPU設(shè)備局部?jī)?nèi)存中的模塊; 用于判斷是否需要進(jìn)行向量?jī)?nèi)排序,若需要?jiǎng)t由一個(gè)線程操作向量模擬L個(gè)比較器,多個(gè)線程并行執(zhí)行歸并排序的模塊; 用于將排序結(jié)果由GPU設(shè)備局部?jī)?nèi)存拷貝到共享內(nèi)存中的模塊。
9.如權(quán)利要求8所述的系統(tǒng),其特征在于 多個(gè)線程并行執(zhí)行歸并排序時(shí),對(duì)于同一個(gè)工作組內(nèi)的線程同步使用同步函數(shù)來(lái)完成,對(duì)于不同工作組內(nèi)的線程間同步通過(guò)CPU完成。
10.如權(quán)利要求9所述的系統(tǒng),其特征在于 當(dāng)一個(gè)工作組內(nèi)的比較器本次和下次操作數(shù)都存在于該工作組的局部?jī)?nèi)存時(shí),使用同步函數(shù)同步工作組內(nèi)線程;當(dāng)一個(gè)工作組內(nèi)的比較器本次和下次操作數(shù)存放在不同的工作組局部?jī)?nèi)存時(shí),由CPU參與線程的同步。
11.如權(quán)利要求8-10之一所述的系統(tǒng),其特征在于 由一個(gè)線程來(lái)模擬L X M個(gè)比較器,操作2 X M個(gè)向量進(jìn)行比較交換操作,每個(gè)線程內(nèi)向量運(yùn)算指令順序執(zhí)行。
12.如權(quán)利要求11所述的系統(tǒng),其特征在于 在排序過(guò)程中,改變比較器操作數(shù)的寫(xiě)回地址,以使局部?jī)?nèi)存讀操作的地址連續(xù),同時(shí)為防止線程間數(shù)據(jù)讀寫(xiě)沖突,設(shè)置每個(gè)線程將需要操作的數(shù)據(jù)讀入寄存器再進(jìn)行比較交換操作。
13.如權(quán)利要求12所述的系統(tǒng),其特征在于 在排序一組向量時(shí),若該組向量的前半部分向量地址不連續(xù),則將該前半部分向量中的后半部與該后半部分向量中的后半部交換位置后,再執(zhí)行寫(xiě)回共享內(nèi)存的操作。
14.如權(quán)利要求12所述的系統(tǒng),其特征在于 在排序一組向量時(shí),若該組向量的前半部分向量地址不連續(xù),則將該前半部分向量中 的前半部與該后半部分向量中的前半部交換位置后,再執(zhí)行寫(xiě)回共享內(nèi)存的操作。
全文摘要
本發(fā)明公開(kāi)了一種面向GPU的雙調(diào)排序方法和系統(tǒng),通過(guò)一個(gè)線程操作向量來(lái)模擬多個(gè)比較器,多個(gè)線程并行執(zhí)行歸并排序,其中對(duì)同一個(gè)工作組內(nèi)的線程同步使用同步函數(shù)來(lái)完成,對(duì)不同工作組內(nèi)的線程同步通過(guò)CPU完成,進(jìn)一步的可以使用多個(gè)向量來(lái)模擬更大長(zhǎng)度向量,在排序過(guò)程中改變比較器操作數(shù)的寫(xiě)回地址,對(duì)內(nèi)存讀寫(xiě)進(jìn)行優(yōu)化。本發(fā)明在節(jié)省存儲(chǔ)空間的基礎(chǔ)上,有效地減少CPU和GPU之間的同步次數(shù)、減少執(zhí)行指令的總量和延時(shí)、增加GPU計(jì)算單元的利用率。
文檔編號(hào)G06F9/38GK102750131SQ20121018738
公開(kāi)日2012年10月24日 申請(qǐng)日期2012年6月7日 優(yōu)先權(quán)日2012年6月7日
發(fā)明者王玨, 聶寧明, 遲學(xué)斌, 郎顯宇, 闞圣哲 申請(qǐng)人:中國(guó)科學(xué)院計(jì)算機(jī)網(wǎng)絡(luò)信息中心