一種基于gpu和cpu混合平臺的高速無損數(shù)據(jù)壓縮方法
【專利摘要】本發(fā)明公開了一種基于GPU和CPU混合平臺的高速無損數(shù)據(jù)壓縮方法,包括:CPU讀取待壓縮數(shù)據(jù)文件,將該待壓縮數(shù)據(jù)文件從內(nèi)存拷貝到GPU的全局存儲器中,設(shè)置GPU上的線程塊組bk[a],每個線程塊中的線程個數(shù)b,設(shè)置壓縮字典窗口的長度為c,并設(shè)置指向第一個壓縮字典窗口的頭部指針為p_dic_h,設(shè)置預(yù)讀窗口大小為d,指向第一個預(yù)讀窗口的指針p_pre_r,該指針的初始值設(shè)置為p_dic_h-c,初始化工作線程組threads[a*b],以及(a*b/2)/c個gMatrix矩陣,其大小為c*d,調(diào)用工作線程組threads[a*b]中的(a*b/2)個線程處理待壓縮數(shù)據(jù)文件中q=(a*b/2)/c個長度為c+d的數(shù)據(jù),在q個結(jié)果矩陣gMatrix的每一個中尋找具有最多連續(xù)1的斜線段,確定每個結(jié)果矩陣的三元結(jié)果數(shù)組locations[p]。本發(fā)明能夠大大提高海量數(shù)據(jù)的壓縮速率。
【專利說明】—種基于GPU和CPU混合平臺的高速無損數(shù)據(jù)壓縮方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明屬于計算機數(shù)據(jù)壓縮【技術(shù)領(lǐng)域】,更具體地,涉及一種基于GPU和CPU混合平臺的高速無損數(shù)據(jù)壓縮方法。
【背景技術(shù)】
[0002]據(jù)國際數(shù)據(jù)公司(InternationalData Corporation,簡稱 IDC)研究表明:近 10年來,全球信息總量每過兩年,就會增長一倍。2011年,全球被創(chuàng)建和被復(fù)制的數(shù)據(jù)總量為
1.8ZB (1800EB),到了 2015年將達到8ZB (8000EB),而下一個十年即2020年左右,全球的數(shù)據(jù)將比現(xiàn)在高出50倍。與此同時,雖然網(wǎng)絡(luò)帶寬和新的存儲技術(shù)也得到了快速的發(fā)展,但仍然遠(yuǎn)不能滿足當(dāng)前海量數(shù)據(jù)傳輸和存儲的性能需求。而解決海量數(shù)據(jù)傳輸和存儲面臨的挑戰(zhàn)的關(guān)鍵技術(shù)之一就是數(shù)據(jù)壓縮。通過數(shù)據(jù)壓縮技術(shù),可以有效的減少需要傳輸和存儲的數(shù)據(jù)容量,從而有效的控制數(shù)據(jù)傳輸和存放的成本,實現(xiàn)數(shù)據(jù)的低成本高效管理。
[0003]傳統(tǒng)的基于CPU平臺的壓縮理論和壓縮算法關(guān)注的重點在于如何提高數(shù)據(jù)的壓縮比率,海量數(shù)據(jù)時代對數(shù)據(jù)壓縮的速度提出了更高的要求。為了提高壓縮速率,數(shù)據(jù)的并行壓縮成為一個新的發(fā)展方向。進行并行數(shù)據(jù)壓縮的前提是需要找到數(shù)據(jù)級別的并行性,將數(shù)據(jù)進行分塊,并同時對各個分塊進行壓縮是一種自然的并行思想?,F(xiàn)有的J.Gilchrist、GZIP、S.Pradhan等算法分別利用多線程,多核和集群的方式,在CPU平臺上實現(xiàn)了并行數(shù)據(jù)壓縮。但在實際的應(yīng)用中,隨著需要處理的數(shù)據(jù)量的增加,由于交互中產(chǎn)生的大量通信量,中間結(jié)果需要占用大量的內(nèi)存空間,以及CPU本身固有的硬件體系結(jié)構(gòu)并不適合大規(guī)模的并行計算特性,所有這些因素使得在CPU平臺下采用并行的壓縮算法并不能使得壓縮的速率達到預(yù)期的目標(biāo)。
[0004]也有學(xué)者將一些CPU平臺下的一些經(jīng)典的無損數(shù)據(jù)壓縮算法,如行程編碼算法,BZIP2算法等通過改進,移植到了 GPU平臺下。這些算法為了解決上述CPU壓縮的不足,專注于如何利用GPU的共享存儲器和全局存儲器,從而最大限度的減少不同模塊之間的通信,減少內(nèi)存的占用,進而提高壓縮的速率。但由于這些算法本身是基于CPU平臺發(fā)明的,在本質(zhì)上并不適合GPU這種不同的硬件結(jié)構(gòu),因此在實際的應(yīng)用中,壓縮速率的提高仍然有待提聞。
【發(fā)明內(nèi)容】
[0005]針對現(xiàn)有技術(shù)的以上缺陷或改進需求,本發(fā)明提供了一種基于GPU和CPU混合平臺的高速無損數(shù)據(jù)壓縮方法,其目的在于通過將數(shù)據(jù)壓縮的過程分解為并行計算和串行計算兩個部分,并行計算部分包括劃分多個壓縮數(shù)據(jù)字典和預(yù)讀窗口,組織為多個矩陣,并將待壓縮數(shù)據(jù)文件交由GPU中的多個線程塊并行完成,而將串行計算部分中壓縮編碼的生成與輸出交由CPU完成,這種工作模式綜合了 GPU和CPU本身各自的優(yōu)點和長處,從而在保證壓縮率不降低的情況下,大大提高海量數(shù)據(jù)的壓縮速率。
[0006]為實現(xiàn)上述目的,按照本發(fā)明的一個方面,提供了一種基于GPU和CPU混合平臺的高速無損數(shù)據(jù)壓縮方法,包括以下步驟:
[0007](I)CPU讀取待壓縮數(shù)據(jù)文件,將該待壓縮數(shù)據(jù)文件從內(nèi)存拷貝到GPU的全局存儲器中;
[0008](2)設(shè)置GPU上的線程塊組bk[a],每個線程塊中的線程個數(shù)b,其中a為線程塊的總數(shù);
[0009](3)設(shè)置壓縮字典窗口的長度為C,并設(shè)置指向第一個壓縮字典窗口的頭部指針為
P—die—h ;
[0010](4)設(shè)置預(yù)讀窗口大小為d,指向第一個預(yù)讀窗口的指針p_pre_r,該指針的初始值設(shè)置為p_dic_h_c ;
[0011](5)初始化工作線程組threads[a*b],以及(a*b/2)/c個gMatrix矩陣,其大小為c*d ;
[0012](6)調(diào)用工作線程組threads [a*b]中的(a*b/2)個線程處理待壓縮數(shù)據(jù)文件中q=(a*b/2) /c個長度為c+d的數(shù)據(jù);
[0013](7)在q個結(jié)果矩陣gMatrix的每一個中尋找具有最多連續(xù)I的斜線段,確定每個結(jié)果矩陣的三元結(jié)果數(shù)組locations[p],數(shù)組中的每個元素存儲有三元結(jié)果(X,y, length),其中P為該結(jié)果矩陣中斜線段的數(shù)量,且等于c+d - 1,X表示斜線段相對于其所在結(jié)果矩陣對應(yīng)的壓縮字典的偏移量,y表示該斜線段相對于其所在結(jié)果矩陣對應(yīng)的預(yù)讀窗口的偏移量,length表不該斜線段的長度;
[0014](8)尋找每個gMatrix對應(yīng)的locations [p]數(shù)組中具有最大length值的元素:設(shè)置線程T3,其線程編號為th3,T3是線程組threads [a*b]中第O個線程至第(q_l)個線程中的一個,T3線程負(fù)責(zé)尋找每個gMatrix矩陣對應(yīng)的三元結(jié)果數(shù)組locations [p]中具有最大length值的元素,并將其對應(yīng)的參數(shù)x、y與length存入全局的匹配結(jié)果數(shù)組match [q],該數(shù)組中的每個元素也存儲有三元結(jié)果(x,1,length);
[0015](9)根據(jù)匹配結(jié)果數(shù)組match[q]對待壓縮數(shù)據(jù)文件進行壓縮;
[0016](10)判斷指是否已經(jīng)到待壓縮數(shù)據(jù)文件的尾部,如果是,則過程結(jié)束;否則,向前滑動字典窗口和預(yù)讀窗口,即設(shè)置p_pre_r=p_pre_r+q*d, p_dic_h=p_dic_h+q*d,然后返回步驟(6)。
[0017]優(yōu)選地,d的值等于16*η,η的取值范圍為1-8。
[0018]優(yōu)選地,步驟(6)中,p_dic_h指向待壓縮數(shù)據(jù)文件的第一個壓縮字典窗口首部,p_pre_r指向待壓縮數(shù)據(jù)文件的第一個預(yù)讀窗口首部,而(p_dic_h_d)指向壓縮數(shù)據(jù)文件第二個壓縮字典窗口首部,(p_pre_r-d)指向待壓縮數(shù)據(jù)文件的第二預(yù)讀窗口首部,如此劃分,一次循環(huán),可以處理q對壓縮字典窗口和預(yù)讀數(shù)據(jù)窗口。
[0019]優(yōu)選地,步驟(6)具體為,對于每一個待處理的壓縮字典窗口和與其對應(yīng)的預(yù)讀數(shù)據(jù)窗口的數(shù)據(jù),分別執(zhí)行以下步驟:
[0020](6-1)設(shè)置計數(shù)器i=0;
[0021](6-2)設(shè)置線程Tl,其線程編號為thl, Tl是線程組threads [a*b/2]中第(c*k)個線程至第(c*(k+l)-l)個線程中的一個,其判斷第k個壓縮字典窗口中第(thl mod c)位字節(jié)與第k個預(yù)讀數(shù)據(jù)窗口中第i*16至(i+l)*16-l位字節(jié)是否匹配,其中0〈=k〈q,當(dāng)兩個字節(jié)匹配時,返回值1,否則返回值0,并把該匹配結(jié)果寫回全局存儲器的第k個gMatrix矩陣中的位置((thl mod c)*d+i*16)到位置((thl mod c) *d+i*16+16)中;
[0022](6-3)設(shè)置i=i+l,并判斷是否有i〈n,如果是則轉(zhuǎn)入步驟(6-2),否則轉(zhuǎn)入步驟
(7)。
[0023]優(yōu)選地,當(dāng)length為小于3時,表明沒有找到匹配,此時,x與y直接賦值為_1。
[0024]優(yōu)選地,步驟(7)具體包括以下子步驟:
[0025](7-1)設(shè)置線程T2,其線程編號為th2, T2是線程組threads[a*b]中第(c*k)個線程至第(c*(k+l)+d-l)個線程中的一個,T2負(fù)責(zé)尋找一個斜線段中具有連續(xù)I最多的子段,并記錄下該子段對應(yīng)的參數(shù)X、y與length ;
[0026](7-2)線程T2將其獲取的對應(yīng)數(shù)據(jù)x、y與length存儲在三元結(jié)果數(shù)組locations的第(th2 mod p)個元素中。
[0027]優(yōu)選地,步驟(9)具體包括以下子步驟:
[0028](9-1)將匹配結(jié)果數(shù)組match [q]從GPU傳輸?shù)紺PU中的主存儲器;
[0029](9_2)CPU將存儲在匹配結(jié)果數(shù)組match[q]中的數(shù)據(jù)換算成預(yù)讀窗口的子串在壓縮字典窗口中最長匹配的偏移量和長度,并輸出壓縮編碼三兀組compress [q],壓縮編碼三元數(shù)組中的每個元素存儲有三元結(jié)果(flag,offset,length)其中,flag為標(biāo)志字節(jié),表明輸出的是否是壓縮數(shù)據(jù),offset和length分別表示預(yù)讀窗口的子串在對應(yīng)的壓縮字典窗口中最長匹配的偏移量和長度;
[0030](9-3)根據(jù)標(biāo)志字節(jié)對待壓縮數(shù)據(jù)文件進行數(shù)據(jù)壓縮。
[0031]優(yōu)選地,步驟(9-3)中,得到的標(biāo)志字節(jié)類型包括原始標(biāo)志字節(jié)和混合標(biāo)志字節(jié),原始標(biāo)志字節(jié)第一位為0,后7位表示輸出的原始數(shù)據(jù)長度,后面最多可以輸出連續(xù)128個原始數(shù)據(jù)字節(jié),混合標(biāo)志字節(jié)第一位為1,后7位表示7個原始和壓縮的混合數(shù)據(jù),對應(yīng)位為O時表示輸出的是原始數(shù)據(jù),為I時表示輸出的是壓縮編碼,由此實現(xiàn)數(shù)據(jù)的壓縮,如果沒有發(fā)現(xiàn)匹配,則原樣輸出數(shù)據(jù)。
[0032]按照本發(fā)明的另一方面,提供了一種基于GPU和CPU混合平臺的高速無損數(shù)據(jù)壓縮系統(tǒng),包括:
[0033]第一模塊,用于讀取待壓縮數(shù)據(jù)文件,將該待壓縮數(shù)據(jù)文件從內(nèi)存拷貝到GPU的全局存儲器中;
[0034]第二模塊,用于設(shè)置GPU上的線程塊組bk [a],每個線程塊中的線程個數(shù)b,其中a為線程塊的總數(shù);
[0035]第三模塊,用于設(shè)置壓縮字典窗口的長度為C,并設(shè)置指向第一個壓縮字典窗口的頭部指針為p_dic_h ;
[0036]第四模塊,用于設(shè)置預(yù)讀窗口大小為d,指向第一個預(yù)讀窗口的指針p_pre_r,該指針的初始值設(shè)置為p_dic_h-c ;
[0037]第五模塊,用于初始化工作線程組threads [a*b],以及(a*b/2) /c個gMatrix矩陣,其大小為c*d ;
[0038]第六模塊,用于調(diào)用工作線程組threads [a*b]中的(a*b/2)個線程處理待壓縮數(shù)據(jù)文件中q=(a*b/2) /c個長度為c+d的數(shù)據(jù);
[0039]第七模塊,用于在q個結(jié)果矩陣gMatrix的每一個中尋找具有最多連續(xù)I的斜線段,確定每個結(jié)果矩陣的三元結(jié)果數(shù)組locations [p],數(shù)組中的每個元素存儲有三元結(jié)果(X,y, length),其中p為該結(jié)果矩陣中斜線段的數(shù)量,且等于c+d - 1,x表示斜線段相對于其所在結(jié)果矩陣對應(yīng)的壓縮字典的偏移量,y表示該斜線段相對于其所在結(jié)果矩陣對應(yīng)的預(yù)讀窗口的偏移量,length表不該斜線段的長度;
[0040]第八模塊,用于尋找每個gMatrix對應(yīng)的locations [p]數(shù)組中具有最大length值的元素:設(shè)置線程T3,其線程編號為th3,T3是線程組threadS[a*b]中第O個線程至第(q-Ι)個線程中的一個,T3線程負(fù)責(zé)尋找每個gMatrix矩陣對應(yīng)的三元結(jié)果數(shù)組locations [p]中具有最大length值的元素,并將其對應(yīng)的參數(shù)x、y與length存入全局的匹配結(jié)果數(shù)組match [q],該數(shù)組中的每個元素也存儲有三元結(jié)果(X, y, length);
[0041]第九模塊,用于根據(jù)匹配結(jié)果數(shù)組match[q]對待壓縮數(shù)據(jù)文件進行壓縮;
[0042]第十模塊,用于判斷指針p_pre_r是否已經(jīng)到待壓縮數(shù)據(jù)文件的尾部,如果是,則過程結(jié)束;否則,向前滑動字典窗口和預(yù)讀窗口,即設(shè)置p_pre_r=p_pre_r+q*d, p_dic_h=p_dic_h+q*d,然后返回第六模塊。
[0043]總體而言,通過本發(fā)明所構(gòu)思的以上技術(shù)方案與現(xiàn)有技術(shù)相比,能夠取得下列有益效果:
[0044](I)本發(fā)明通過矩陣并行匹配,加快了數(shù)據(jù)的匹配速度:本發(fā)明提出的矩陣并行匹配的工作模式,在一次循環(huán)中并行處理q個c*q的矩陣匹配,使得循環(huán)匹配的步長由d字節(jié)增加到了 q*d字節(jié),由此加快了匹配速度;
[0045](2)本發(fā)明實現(xiàn)了異步處理,重疊了冗余數(shù)據(jù)發(fā)現(xiàn)與壓縮編碼輸出的時間,使得CPU和GPU中的操作能夠以類似流水線的形式執(zhí)行,從而也在一定程度上減少了整個數(shù)據(jù)壓縮的時間,提高了壓縮的速率。
【專利附圖】
【附圖說明】
[0046]圖1是本發(fā)明基于GPU和CPU混合平臺的高速無損數(shù)據(jù)壓縮方法的流程圖。
[0047]圖2是待壓縮數(shù)據(jù)文件的壓縮字典窗口和與其對應(yīng)的預(yù)讀窗口劃分示意圖。
[0048]圖3至圖6是本發(fā)明應(yīng)用實例的示意圖。
【具體實施方式】
[0049]為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點更加清楚明白,以下結(jié)合附圖及實施例,對本發(fā)明進行進一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述的具體實施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。此外,下面所描述的本發(fā)明各個實施方式中所涉及到的技術(shù)特征只要彼此之間未構(gòu)成沖突就可以相互組合。
[0050]如圖1所示,本發(fā)明基于GPU和CPU混合平臺的高速無損數(shù)據(jù)壓縮方法包括以下步驟:
[0051](I)CPU讀取待壓縮數(shù)據(jù)文件,將該待壓縮數(shù)據(jù)文件從內(nèi)存拷貝到GPU的全局存儲器中;
[0052](2)設(shè)置GPU上的線程塊組bk[a],每個線程塊中的線程個數(shù)b,其中a為線程塊的總數(shù),其為正整數(shù),b的取值范圍是256到1024 ;
[0053](3)設(shè)置壓縮字典窗口的長度為C,并設(shè)置指向第一個壓縮字典窗口的頭部指針為P_dic_h ;具體而言,c的取值范圍為2KB-8KB,優(yōu)選值取為4KB,p_dic_h初始值為指向該壓縮數(shù)據(jù)文件的開始處;
[0054](4)設(shè)置預(yù)讀窗口大小為d,指向第一個預(yù)讀窗口的指針p_pre_r,該指針的初始值設(shè)置Sp_dic_h-c,d值等于16*n,n的取值范圍為1_8,優(yōu)選取值為4,即每個預(yù)讀窗口的優(yōu)選取值為64B ;
[0055](5)初始化工作線程組threads[a*b],以及(a*b/2)/c個gMatrix矩陣,其大小為c^d ;
[0056](6)調(diào)用工作線程組threadsta補]中的(a補/2)個線程處理待壓縮數(shù)據(jù)文件中q=(a*b/2) /c個長度為c+d的數(shù)據(jù);待壓縮數(shù)據(jù)文件的壓縮字典窗口和與其對應(yīng)的預(yù)讀窗口的劃分如圖2所示,p_dic_h指向待壓縮數(shù)據(jù)文件的第一個壓縮字典窗口首部,p_pre_r指向待壓縮數(shù)據(jù)文件的第一個預(yù)讀窗口首部;而(P_dic_h-d)指向壓縮數(shù)據(jù)文件第二個壓縮字典窗口首部,(p_pre_r-d)指向待壓縮數(shù)據(jù)文件的第二預(yù)讀窗口首部,如此劃分,一次循環(huán),可以處理q對壓縮字典窗口和預(yù)讀數(shù)據(jù)窗口。具體而言,對于每一個待處理的壓縮字典窗口和與其對應(yīng)的預(yù)讀數(shù)據(jù)窗口的數(shù)據(jù),分別執(zhí)行以下步驟:
[0057](6-1)設(shè)置計數(shù)器i=0;
[0058](6-2)設(shè)置線程Tl,其線程編號為thl, Tl是線程組threads [a*b/2]中第(c*k)個線程至第(c*(k+l)-l)個線程中的一個,其判斷第k個壓縮字典窗口中第(thl mod c)位字節(jié)與第k個預(yù)讀數(shù)據(jù)窗口中第i*16至(i+l)*16-l位字節(jié)是否匹配(即二者是否相等),其中0〈=k〈q,當(dāng) 兩個字節(jié)匹配(即相等)時,返回值1,否則返回值0,并把該匹配結(jié)果寫回全局存儲器的第k個gMatrix矩陣中的位置((thl mod c)*d+i*16)到位置((thl modc)*d+i*16+16)中;
[0059](6-3)設(shè)置i=i+l,并判斷是否有i〈n,如果是則轉(zhuǎn)入步驟(6-2),否則轉(zhuǎn)入步驟
(7);
[0060](7)在q個結(jié)果矩陣gMatrix的每一個中尋找具有最多連續(xù)I的斜線段,確定每個結(jié)果矩陣的三元結(jié)果數(shù)組locations[p],數(shù)組中的每個元素存儲有三元結(jié)果(X,y, length),其中P為該結(jié)果矩陣中斜線段的數(shù)量,且等于c+d - 1,X表示斜線段相對于其所在結(jié)果矩陣對應(yīng)的壓縮字典的偏移量,y表示該斜線段相對于其所在結(jié)果矩陣對應(yīng)的預(yù)讀窗口的偏移量,length表示該斜線段的長度(即包括“I”的個數(shù)),當(dāng)length為小于3時,表明沒有找到匹配(這是由于如果匹配子串的長度小于兩個字節(jié)時,壓縮后的代碼比不壓縮的還長,無意義),此時,X與y沒有意義,可以直接賦值為-1 ;
[0061]本步驟具體包括以下子步驟:
[0062](7-1)設(shè)置線程T2,其線程編號為th2,T2是線程組threads[a*b]中第(c*k)個線程至第(c*(k+l)+d-l)個線程中的一個,T2負(fù)責(zé)尋找一個斜線段中具有連續(xù)I最多的子段,并記錄下該子段對應(yīng)的參數(shù)X、y與length ;
[0063](7-2)線程T2將其獲取的對應(yīng)數(shù)據(jù)x、y與length存儲在三元結(jié)果數(shù)組locations的第(th2 mod p)個元素中;
[0064](8)尋找每個gMatrix對應(yīng)的locations [p]數(shù)組中具有最大length值的元素:設(shè)置線程T3,其線程編號為th3,T3是線程組threads [a*b]中第O個線程至第(q_l)個線程中的一個,T3線程負(fù)責(zé)尋找每個gMatrix矩陣對應(yīng)的三元結(jié)果數(shù)組locations [p]中具有最大length值的元素,并將其對應(yīng)的參數(shù)x、y與length存入全局的匹配結(jié)果數(shù)組match [q],該數(shù)組中的每個元素也存儲有三元結(jié)果(X,I, length);
[0065](9)根據(jù)匹配結(jié)果數(shù)組match [q]對待壓縮數(shù)據(jù)文件進行壓縮,具體包括以下子步驟;
[0066](9-1)將匹配結(jié)果數(shù)組match [q]從GPU傳輸?shù)紺PU中的主存儲器;
[0067](9_2)CPU將存儲在匹配結(jié)果數(shù)組match[q]中的數(shù)據(jù)換算成預(yù)讀窗口的子串在壓縮字典窗口中最長匹配的偏移量和長度,并輸出壓縮編碼三兀組compress [q],壓縮編碼三元數(shù)組中的每個元素存儲有三元結(jié)果(flag,offset,length)其中,flag為標(biāo)志字節(jié),表明輸出的是否是壓縮數(shù)據(jù),offset和length分別表示預(yù)讀窗口的子串在對應(yīng)的壓縮字典窗口中最長匹配的偏移量和長度;
[0068](9-3)根據(jù)標(biāo)志字節(jié)對待壓縮數(shù)據(jù)文件進行數(shù)據(jù)壓縮;具體而言,得到的標(biāo)志字節(jié)類型有兩種,一種為原始標(biāo)志字節(jié),一種為混合標(biāo)志字節(jié),原始標(biāo)志字節(jié)第一位為0,后7位表示輸出的原始數(shù)據(jù)長度,后面最多可以輸出連續(xù)128個原始數(shù)據(jù)字節(jié);而混合標(biāo)志字節(jié)第一位為1,后7位表示7個原始和壓縮的混合數(shù)據(jù),對應(yīng)位為O時表示輸出的是原始數(shù)據(jù),為I時表示輸出的是壓縮編碼,由此實現(xiàn)數(shù)據(jù)的壓縮;如果沒有發(fā)現(xiàn)匹配,則原樣輸出數(shù)據(jù);
[0069](10)判斷指是否已經(jīng)到待壓縮數(shù)據(jù)文件的尾部,如果是,則過程結(jié)束;否則,向前滑動字典窗口和預(yù)讀窗口,即設(shè)置p_pre_r=p_pre_r+q*d, p_dic_h=p_dic_h+q*d,然后返回步驟(6)。
[0070]本發(fā)明基于GPU和CPU混合平臺的高速無損數(shù)據(jù)壓縮系統(tǒng),其特征在于,包括:
[0071]第一模塊,用于讀取待壓縮數(shù)據(jù)文件,將該待壓縮數(shù)據(jù)文件從內(nèi)存拷貝到GPU的全局存儲器中;
[0072]第二模塊,用于設(shè)置GPU上的線程塊組bk [a],每個線程塊中的線程個數(shù)b,其中a為線程塊的總數(shù);
[0073]第三模塊,用于設(shè)置壓縮字典窗口的長度為C,并設(shè)置指向第一個壓縮字典窗口的頭部指針為p_dic_h ;
[0074]第四模塊,用于設(shè)置預(yù)讀窗口大小為d,指向第一個預(yù)讀窗口的指針p_pre_r,該指針的初始值設(shè)置為p_dic_h-c ;
[0075]第五模塊,用于初始化工作線程組threads [a*b],以及(a*b/2) /c個gMatrix矩陣,其大小為c*d ;
[0076]第六模塊,用于調(diào)用工作線程組threads [a*b]中的(a*b/2)個線程處理待壓縮數(shù)據(jù)文件中q=(a*b/2) /c個長度為c+d的數(shù)據(jù);
[0077]第七模塊,用于在q個結(jié)果矩陣gMatrix的每一個中尋找具有最多連續(xù)I的斜線段,確定每個結(jié)果矩陣的三元結(jié)果數(shù)組locations [p],數(shù)組中的每個元素存儲有三元結(jié)果(X,y, length),其中P為該結(jié)果矩陣中斜線段的數(shù)量,且等于c+d - 1,X表示斜線段相對于其所在結(jié)果矩陣對應(yīng)的壓縮字典的偏移量,y表示該斜線段相對于其所在結(jié)果矩陣對應(yīng)的預(yù)讀窗口的偏移量,length表不該斜線段的長度;
[0078]第八模塊,用于尋找每個gMatrix對應(yīng)的locations [p]數(shù)組中具有最大length值的元素:設(shè)置線程T3,其線程編號為th3,T3是線程組threadS[a*b]中第O個線程至第(q-Ι)個線程中的一個,T3線程負(fù)責(zé)尋找每個gMatrix矩陣對應(yīng)的三元結(jié)果數(shù)組locations [p]中具有最大length值的元素,并將其對應(yīng)的參數(shù)x、y與length存入全局的匹配結(jié)果數(shù)組match [q],該數(shù)組中的每個元素也存儲有三元結(jié)果(X, y, length);
[0079]第九模塊,用于根據(jù)匹配結(jié)果數(shù)組match[q]對待壓縮數(shù)據(jù)文件進行壓縮;
[0080]第十模塊,用于判斷指針p_pre_r是否已經(jīng)到待壓縮數(shù)據(jù)文件的尾部,如果是,則過程結(jié)束;否則,向前滑動字典窗口和預(yù)讀窗口,即設(shè)置p_pre_r=p_pre_r+q*d, p_dic_h=p_dic_h+q*d,然后返回第六模塊。
[0081]示例
[0082]為了清楚的闡述本發(fā)明的原理,以下舉例說明本發(fā)明的實現(xiàn)過程。
[0083](I)CPU讀取待壓縮數(shù)據(jù)文件,將該壓縮數(shù)據(jù)文件從內(nèi)存拷貝到GPU的全局存儲器中;
[0084](2)設(shè)置GPU上的線程塊組bk[1024],每個線程塊中的線程個數(shù)512 ;
[0085](3)設(shè)置壓縮字典窗口的長度為4096字節(jié),指向第一個壓縮字典窗口的頭部指針為 p_dic_h=0 ;
[0086](4)設(shè)置預(yù)讀窗口長度為64字節(jié),指向第一個預(yù)讀窗口的指針為p_pre_r=4096 ;
[0087](5)初始化工作線程組threads[1024*512],以及64個gMatrix矩陣,其大小為4096*64 ;
[0088](6)調(diào)用工作線程組threads [1024*512]中的1024*256個線程處理待壓縮數(shù)據(jù)文件中64個長度為(4096+64) B的數(shù)據(jù);待壓縮數(shù)據(jù)文件的壓縮字典窗口和與其對應(yīng)的預(yù)讀窗口的劃分如圖3所示:
[0089]p_dic_h指向待壓縮數(shù)據(jù)文件的第一個壓縮字典窗口首部,p_pre_r指向待壓縮數(shù)據(jù)文件的第一個預(yù)讀窗口首部;而(?_(1化_11-64)指向壓縮數(shù)據(jù)文件第二個壓縮字典窗口首部,(p_pre_r_64) 指向待壓縮數(shù)據(jù)文件的第二預(yù)讀窗口首部,如此劃分,一次循環(huán)可以處理64對壓縮字典窗口和預(yù)讀數(shù)據(jù)窗口。具體而言,對于每一個待處理的壓縮字典窗口和與其對應(yīng)的預(yù)讀數(shù)據(jù)窗口的數(shù)據(jù),分別執(zhí)行以下步驟(在此,我們選擇對第一對壓縮字典窗口和預(yù)讀數(shù)據(jù)窗口的處理工作進行說明):
[0090]為了簡單明了的描述壓縮過程,我們選擇待壓縮數(shù)據(jù)文件中第一個壓縮字典中的數(shù)據(jù)為“hellothisaeybfisa”,長度為4096字節(jié);而第一個預(yù)讀窗口的數(shù)據(jù)的前16B數(shù)據(jù)為“thisisaexampletosh”。線程組中TO至T4095共4096個線程,其線程編號分別為O至4095,Tml (ml e [0,4095])為其中任意一個線程,ml為其線程編號,此線程負(fù)責(zé)判斷壓縮字典窗口中第ml位字節(jié)與預(yù)讀數(shù)據(jù)窗口中第O至15位字節(jié)是否匹配(即二者是否相等),當(dāng)兩個字節(jié)匹配(即相等)時,返回值1,否則返回值0,并把該匹配結(jié)果寫回全局存儲器的對應(yīng)的gMatrix矩陣中的位置ml*64到位置ml*64+16中。由于僅僅選擇了 16B的數(shù)據(jù)進行壓縮,則我們僅僅執(zhí)行i=0時的一次循環(huán);獲得大小為4096*64的結(jié)果矩陣gMatrix中的1/4的結(jié)果,即此次獲取的結(jié)果大小為4096*16,如圖4所示:
[0091](7)下面僅描述在64個結(jié)果矩陣gMatrix的中的第一個gMatrix中如何尋找具有最多連續(xù)I的斜線段。
[0092](7-1)線程組中TO至T4110共(4096+15)個線程,其線程編號分別為O至4110,Tm2 (m2 e [0,4110])為其中任意一個線程,m2為其線程編號,Tm2負(fù)責(zé)尋找一個斜線段中具有連續(xù)I最多的子段,如圖5所示:[0093](7-2)線程Tm2將其獲取參數(shù)x、y與length,并將它們存儲在三元結(jié)果數(shù)組locations的第m2個元素中;
[0094]此例中,線程T5與線程TlO發(fā)現(xiàn)了多個連續(xù)I的子線段,其為對應(yīng)的locations數(shù)組中的元素賦值 locations (5) = {5,0,6},locations (10) = {10, 2, 3},locations 數(shù)組其他元素的值為{-1,-1,0},如圖6所示:
[0095](8)尋找每個gMatrix對應(yīng)的locations[p]數(shù)組中具有最大length值的元素:線程組中TO至T63共64個線程,其線程編號分別為O至63,Tm3 (m3 e [0,63])為其中任意一個線程,m3為其線程編號,Tm3負(fù)責(zé)尋找每個gMatrix矩陣對應(yīng)的locations數(shù)組中具有最大length值的元素,并將其對應(yīng)的參數(shù)X、y與length存入全局的匹配結(jié)果數(shù)組match [64],該數(shù)組中的每個元素也存儲有三元結(jié)果(X, y, length)。此例中,我們利用線程TO尋找對應(yīng)的第O個結(jié)果矩陣gMatrix中的具有最大length值的locations元素為第5個元素,將其相關(guān)參數(shù)寫入數(shù)組match中的第O個元素,即match (0) = (5,0,6};
[0096](9)根據(jù)匹配結(jié)果數(shù)組match[64]對待壓縮數(shù)據(jù)文件進行壓縮,具體包括以下子步驟;
[0097](9-1)將匹配結(jié)果數(shù)組match [64]從GPU傳輸?shù)紺PU中的主存儲器;
[0098](9-2)CPU將存儲在匹配結(jié)果數(shù)組match[64]中的數(shù)據(jù)換算成預(yù)讀窗口的子串在壓縮字典窗口中最長匹配的偏移量和長度,并輸出壓縮編碼三兀組compress [64],此例中,將match (0)的數(shù)據(jù)換算為第O個預(yù)讀窗口在第O個壓縮字典窗口中的最長匹配的位移量offset和長度length分別為5和6,并將輸出一個混合標(biāo)志字節(jié),即flag值為224(11100000), compress (0) = {224,5,6};此時待壓縮數(shù)據(jù)文件的前(4096+16 )個字節(jié)被壓縮后輸出為:hellothisaeybc...1sa22456amplet3osh。此時,第一個壓縮字典窗口中的4096B數(shù)據(jù)是不能被壓縮的,原樣輸出,緊跟后面的22456表示預(yù)讀數(shù)據(jù)窗口中有6個字節(jié)長的子串被壓縮,其原文是壓縮字典窗口從位移量5處開始,長度為6個字節(jié),再后面輸出一串未被壓縮原始數(shù)據(jù)amplet,長6個字節(jié);接著輸出一個原始標(biāo)志字節(jié),其值為3 (00000011),最后,在其后輸出3字節(jié)的未被壓縮的原始數(shù)據(jù)osh。
[0099](10)判斷指針p_pre_r是否已經(jīng)到待壓縮數(shù)據(jù)文件的尾部,如果已經(jīng)指向文件尾部,貝1J過程結(jié)束;否則,向前滑動字典窗口和預(yù)讀窗口,即設(shè)置p_pre_r=p_pre_r+64*64, p_dic_h=p_dic_h+64*64,然后返回步驟(6)。
[0100]本領(lǐng)域的技術(shù)人員容易理解,以上所述僅為本發(fā)明的較佳實施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi)所作的任何修改、等同替換和改進等,均應(yīng)包含在本發(fā)明的保護范圍之內(nèi)。
【權(quán)利要求】
1.一種基于GPU和CPU混合平臺的高速無損數(shù)據(jù)壓縮方法,其特征在于,包括以下步驟: (1)CPU讀取待壓縮數(shù)據(jù)文件,將該待壓縮數(shù)據(jù)文件從內(nèi)存拷貝到GPU的全局存儲器中; (2)設(shè)置GPU上的線程塊組bk[a],每個線程塊中的線程個數(shù)b,其中a為線程塊的總數(shù); (3)設(shè)置壓縮字典窗口的長度為C,并設(shè)置指向第一個壓縮字典窗口的頭部指針為P_die—h ; (4)設(shè)置預(yù)讀窗口大小為d,指向第一個預(yù)讀窗口的指針p_pre_r,該指針的初始值設(shè)置為 p_dic_h-c ; (5)初始化工作線程組threads[a*b],以及(a*b/2)/c個gMatrix矩陣,其大小為c*d ; (6)調(diào)用工作線程組threads[a*b]中的(a*b/2)個線程處理待壓縮數(shù)據(jù)文件中q=(a*b/2) /c個長度為c+d的數(shù)據(jù); (7)在q個結(jié)果矩陣gMatrix的每一個中尋找具有最多連續(xù)I的斜線段,確定每個結(jié)果矩陣的三元結(jié)果數(shù)組locations [p],數(shù)組中的每個元素存儲有三元結(jié)果(X,y, length),其中P為該結(jié)果矩陣中 斜線段的數(shù)量,且等于c+d - 1,X表示斜線段相對于其所在結(jié)果矩陣對應(yīng)的壓縮字典的偏移量,Y表示該斜線段相對于其所在結(jié)果矩陣對應(yīng)的預(yù)讀窗口的偏移量,length表示該斜線段的長度; (8)尋找每個gMatrix對應(yīng)的locations[p]數(shù)組中具有最大length值的元素:設(shè)置線程T3,其線程編號為th3,T3是線程組threads [a*b]中第O個線程至第(q_l)個線程中的一個,T3線程負(fù)責(zé)尋找每個gMatrix矩陣對應(yīng)的三元結(jié)果數(shù)組locations [p]中具有最大length值的元素,并將其對應(yīng)的參數(shù)x、y與length存入全局的匹配結(jié)果數(shù)組match [q],該數(shù)組中的每個元素也存儲有三元結(jié)果(X,1,length); (9)根據(jù)匹配結(jié)果數(shù)組match[q]對待壓縮數(shù)據(jù)文件進行壓縮; (10)判斷指針p_pre_r是否已經(jīng)到待壓縮數(shù)據(jù)文件的尾部,如果是,則過程結(jié)束;否貝1J,向前滑動字典窗口和預(yù)讀窗口,即設(shè)置 p_pre_r=p_pre_r+q*d, p_dic_h=p_dic_h+q*d,然后返回步驟(6)。
2.根據(jù)權(quán)利要求1所述的高速無損數(shù)據(jù)壓縮方法,其特征在于,d的值等于16*η,η的取值范圍為1-8。
3.根據(jù)權(quán)利要求1所述的高速無損數(shù)據(jù)壓縮方法,其特征在于,步驟(6)中,p_dic_h指向待壓縮數(shù)據(jù)文件的第一個壓縮字典窗口首部,p_pre_i^^向待壓縮數(shù)據(jù)文件的第一個預(yù)讀窗口首部,而(P_dic_h_d)指向壓縮數(shù)據(jù)文件第二個壓縮字典窗口首部,(p_pre_r-d)指向待壓縮數(shù)據(jù)文件的第二預(yù)讀窗口首部,如此劃分,一次循環(huán),可以處理q對壓縮字典窗口和預(yù)讀數(shù)據(jù)窗口。
4.根據(jù)權(quán)利要求1所述的高速無損數(shù)據(jù)壓縮方法,其特征在于,步驟(6)具體為,對于每一個待處理的壓縮字典窗口和與其對應(yīng)的預(yù)讀數(shù)據(jù)窗口的數(shù)據(jù),分別執(zhí)行以下步驟: (6-1)設(shè)置計數(shù)器i=0 ; (6-2)設(shè)置線程Tl,其線程編號為thl,Tl是線程組threads[a*b/2]中第(c*k)個線程至第(c*(k+l)-l)個線程中的一個,其判斷第k個壓縮字典窗口中第(thl mod c)位字節(jié)與第k個預(yù)讀數(shù)據(jù)窗口中第i*16至(i+l)*16-l位字節(jié)是否匹配,其中0〈=k〈q,當(dāng)兩個字節(jié)匹配時,返回值1,否則返回值O,并把該匹配結(jié)果寫回全局存儲器的第k個gMatrix矩陣中的位置((thl mod c)*d+i*16)到位置((thl mod c) *d+i*16+16)中; (6-3)設(shè)置i=i+l,并判斷是否有i〈n,如果是則轉(zhuǎn)入步驟(6-2),否則轉(zhuǎn)入步驟(7)。
5.根據(jù)權(quán)利要求1所述的高速無損數(shù)據(jù)壓縮方法,其特征在于,當(dāng)length為小于3時,表明沒有找到匹配,此時,X與y直接賦值為-1。
6.根據(jù)權(quán)利要求1所述的高速無損數(shù)據(jù)壓縮方法,其特征在于,步驟(7)具體包括以下子步驟: (7-1)設(shè)置線程T2,其線程編號為th2,T2是線程組threads[a*b]中第(c*k)個線程至第(c*(k+l)+d-l)個線程中的一個,T2負(fù)責(zé)尋找一個斜線段中具有連續(xù)I最多的子段,并記錄下該子段對應(yīng)的參數(shù)X、y與length ; (7-2)線程T2將其獲取的對應(yīng)數(shù)據(jù)x、y與length存儲在三元結(jié)果數(shù)組locations的第(th2 mod p)個元素中。
7.根據(jù)權(quán)利要求1所述的高速無損數(shù)據(jù)壓縮方法,其特征在于,步驟(9)具體包括以下子步驟: (9-1)將匹配結(jié)果數(shù)組match [q]從GPU傳輸?shù)紺PU中的主存儲器; (9_2)CPU將存儲在匹配結(jié)果數(shù)組match[q]中的數(shù)據(jù)換算成預(yù)讀窗口的子串在壓縮字典窗口中最長匹配的偏移量和長度,并輸出壓縮編碼三元組compress [q],壓縮編碼三元數(shù)組中的每個元素存儲有三元結(jié)果(flag, offset, length)其中,flag為標(biāo)志字節(jié),表明輸出的是否是壓縮數(shù)據(jù),offset和.length分別表示預(yù)讀窗口的子串在對應(yīng)的壓縮字典窗口中最長匹配的偏移量和長度; (9-3)根據(jù)標(biāo)志字節(jié)對待壓縮數(shù)據(jù)文件進行數(shù)據(jù)壓縮。
8.根據(jù)權(quán)利要求7所述的高速無損數(shù)據(jù)壓縮方法,其特征在于,步驟(9-3)中,得到的標(biāo)志字節(jié)類型包括原始標(biāo)志字節(jié)和混合標(biāo)志字節(jié),原始標(biāo)志字節(jié)第一位為0,后7位表示輸出的原始數(shù)據(jù)長度,后面最多可以輸出連續(xù)128個原始數(shù)據(jù)字節(jié),混合標(biāo)志字節(jié)第一位為1,后7位表示7個原始和壓縮的混合數(shù)據(jù),對應(yīng)位為O時表示輸出的是原始數(shù)據(jù),為I時表示輸出的是壓縮編碼,由此實現(xiàn)數(shù)據(jù)的壓縮,如果沒有發(fā)現(xiàn)匹配,則原樣輸出數(shù)據(jù)。
9.一種基于GPU和CPU混合平臺的高速無損數(shù)據(jù)壓縮系統(tǒng),其特征在于,包括: 第一模塊,用于讀取待壓縮數(shù)據(jù)文件,將該待壓縮數(shù)據(jù)文件從內(nèi)存拷貝到GPU的全局存儲器中; 第二模塊,用于設(shè)置GPU上的線程塊組bk[a],每個線程塊中的線程個數(shù)b,其中a為線程塊的總數(shù); 第三模塊,用于設(shè)置壓縮字典窗口的長度為C,并設(shè)置指向第一個壓縮字典窗口的頭部指針為P_dic_h ; 第四模塊,用于設(shè)置預(yù)讀窗口大小為d,指向第一個預(yù)讀窗口的指針p_pre_r,該指針的初始值設(shè)置為p_dic_h-c ; 第五模塊,用于初始化工作線程組threads[a*b],以及(a*b/2)/c個gMatrix矩陣,其大小為c*d ; 第六模塊,用于調(diào)用工作線程組threadS[a*b]中的(a*b/2)個線程處理待壓縮數(shù)據(jù)文件中q=(a*b/2) /c個長度為c+d的數(shù)據(jù); 第七模塊,用于在q個結(jié)果矩陣gMatrix的每一個中尋找具有最多連續(xù)I的斜線段,確定每個結(jié)果矩陣的三元結(jié)果數(shù)組locations[p],數(shù)組中的每個元素存儲有三元結(jié)果(X,y, length),其中P為該結(jié)果矩陣中斜線段的數(shù)量,且等于c+d - 1,X表示斜線段相對于其所在結(jié)果矩陣對應(yīng)的壓縮字典的偏移量,y表示該斜線段相對于其所在結(jié)果矩陣對應(yīng)的預(yù)讀窗口的偏移量,length表不該斜線段的長度; 第八模塊,用于尋找每個gMatrix對應(yīng)的locations [p]數(shù)組中具有最大length值的元素:設(shè)置線程T3,其線程編號為th3,T3是線程組threadS[a*b]中第O個線程至第(q_l)個線程中的一個,T3線程負(fù)責(zé)尋找每個gMatrix矩陣對應(yīng)的三元結(jié)果數(shù)組locations [p]中具有最大length值的元素,并將其對應(yīng)的參數(shù)X、y與length存入全局的匹配結(jié)果數(shù)組match [q],該數(shù)組中的每個元素也存儲有三元結(jié)果(X, y, length); 第九模塊,用于根據(jù)匹配結(jié)果數(shù)組match[q]對待壓縮數(shù)據(jù)文件進行壓縮; 第十模塊,用于判斷指針p_pre_r是否 已經(jīng)到待壓縮數(shù)據(jù)文件的尾部,如果是,則過程結(jié)束;否則,向前滑動字典窗口和預(yù)讀窗口,即設(shè)置p_pre_r=p_pre_r+q*d, p_dic_h=p_dic_h+q*d,然后返回第六模塊。
【文檔編號】H03M7/30GK103427844SQ201310321071
【公開日】2013年12月4日 申請日期:2013年7月26日 優(yōu)先權(quán)日:2013年7月26日
【發(fā)明者】金海 , 鄭然 , 周斌 申請人:華中科技大學(xué)