亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于CUDA技術(shù)的DCT并行算法研究與實(shí)現(xiàn)

        2020-12-28 02:10:22張金霜黃旭彬
        電腦知識與技術(shù) 2020年33期

        張金霜 黃旭彬

        摘要:JPEG有損壓縮算法以DCT變換算法為核心,但DCT變換算法較為耗時(shí),為提升圖像壓縮效率,提出利用基于GPU平臺的CUDA技術(shù)對DCT算法做并行優(yōu)化。通過分析DCT變換算法的原理,發(fā)現(xiàn)DCT算法具有很好的并行性,優(yōu)化空間較大,于是利用CUDA技術(shù)實(shí)現(xiàn)高速DCT并行算法。實(shí)驗(yàn)結(jié)果表明,在一張2592x2592分辨率的圖像做DCT變換,加速比能達(dá)到124.5,算法效率得到明顯提升,且壓縮效果無顯著差異。

        關(guān)鍵詞:CUDA;GPU;并行程序設(shè)計(jì);DCT算法;圖像壓縮

        中圖分類號:TP393 文獻(xiàn)標(biāo)識碼:A

        文章編號:1009-3044(2020)33-0198-04

        開放科學(xué)(資源服務(wù))標(biāo)識碼(OSID):

        1 背景

        離散余弦變換( Discrete Cosine Transform,DCT)類似于傅立葉變換,由Ahmed在1974年首次提出。離散余弦變換經(jīng)常被用作信號和圖像處理,如對信號和圖像進(jìn)行有損數(shù)據(jù)壓縮。在JPEG圖像壓縮算法中,有一種是以離散余弦變換為基礎(chǔ)的有損壓縮算法[1]。作為JPEG壓縮算法的核心,DCT是其中最耗時(shí)的部分,且占有較大的工作量比重。

        目前GPU作為一種擅長處理大規(guī)模并行數(shù)據(jù)計(jì)算的設(shè)備,已受到越來越多人的關(guān)注。相較于CPU,GPU有著強(qiáng)大的計(jì)算能力和超高度存儲(chǔ)器帶寬,可以使用數(shù)量較多的執(zhí)行單元,實(shí)現(xiàn)數(shù)據(jù)間的并發(fā)計(jì)算。而CUDA技術(shù)能充分利用GPU的并行計(jì)算能力,且降低了開發(fā)人員的使用門檻,基于GPU的CUDA并行加速技術(shù)也廣泛應(yīng)用于圖像處理領(lǐng)域[2-4]。因此,本文將DCT串行算法改為基于CPU/GPU的異構(gòu)算法,通過GPU內(nèi)部大量獨(dú)立的計(jì)算單元,實(shí)現(xiàn)計(jì)算加速。

        2 CUDA體系結(jié)構(gòu)

        CUDA是由顯卡廠商N(yùn)VIDIA推出的通用并行計(jì)算框架,該架構(gòu)能使有效調(diào)用GPU資源解決復(fù)雜的計(jì)算問題。CUDA允許開發(fā)人員使用C/C++語言和CUDA擴(kuò)展庫的形式編寫程序,避免了傳統(tǒng)方法中將通用計(jì)算轉(zhuǎn)換為圖形處理的過程,大大降低程序設(shè)計(jì)的難度和系統(tǒng)維護(hù)成本。

        CUDA實(shí)現(xiàn)了CPU和GPU的混合架構(gòu)編程。在CUDA架構(gòu)下,程序被分成兩個(gè)部分:host端程序和device端程序。host端程序運(yùn)行在CPU上;device端程序又叫“kernel”,運(yùn)行在GPU上。通常先由host端程序準(zhǔn)備數(shù)據(jù),對設(shè)備進(jìn)行必要的初始化,把數(shù)據(jù)從內(nèi)存?zhèn)魉偷斤@存中;執(zhí)行device端程序,待GPU運(yùn)行完后,host端程序再從顯存中把結(jié)果取回內(nèi)存中,過程如圖1所示[5]。

        CUDA的線程模型分三個(gè)層次:thread、block、grid。其中,kernel以線程網(wǎng)格(grid)的形式組織,每個(gè)線程網(wǎng)格由若干個(gè)線程塊(block)組成,而每個(gè)線程塊又由若干個(gè)線程(thread)組成。

        block內(nèi)的thread之間是并行執(zhí)行的,grid內(nèi)的block之間也是并行執(zhí)行的,而grid與grid之間是串行執(zhí)行的,即GPU同時(shí)只能處理一個(gè)grid。grid包含一組block,grid是kernel在GPU上的一次執(zhí)行,也就是說,一個(gè)kernel對應(yīng)著一個(gè)grid。grid內(nèi)部的block可以按照一維或者二維來組織,block之間共享全局內(nèi)存。

        3 DCT算法理論

        二維頻率與矩陣c(u,v)的左上角代表二維正交展開中的低階項(xiàng),它代表圖像的低頻分量;c(u,v)的右下角代表二維正交展開中的高階項(xiàng),它代表圖像的高頻分量。圖像的低頻分量,反映圖像灰度的緩慢變化;相反,圖像的高頻分量反映圖像灰度的跳變,又稱輪廓或邊緣[6]。

        經(jīng)過DCT變換后的矩陣數(shù)據(jù)自然數(shù)為頻率系數(shù),這些系數(shù)中,位于左上角的F(0,0)的值最大,稱為直流系數(shù)(DC coeffi-cient);其余的63個(gè)頻率系數(shù)多為一些接近于0的正負(fù)浮點(diǎn)數(shù),稱為交流系數(shù)(AC coeffcients)[7]。利用這一特點(diǎn)就可以實(shí)現(xiàn)圖像數(shù)據(jù)壓縮,對其進(jìn)行量化,僅僅保留低頻分量的左上角,其余分量拋棄,這樣就可以達(dá)到圖像數(shù)據(jù)壓縮的目的。在反變換的時(shí)候,拋棄的點(diǎn)用零填充。

        4 基于CUDA實(shí)現(xiàn)DCT算法加速

        4.1可行性分析

        CUDA架構(gòu)的優(yōu)勢在于處理數(shù)據(jù)并行的問題。通過生成盡可能多的線程來處理,每一個(gè)線程的處理是基本相同的,而處理的數(shù)據(jù)是可以并行的。符合這種特點(diǎn)的算法,能在CUDA架構(gòu)下最大化并行執(zhí)行。

        根據(jù)JPEG標(biāo)準(zhǔn),圖像被分成一個(gè)個(gè)8x8的像素塊進(jìn)行DCT變換。針對每一個(gè)8x8的像素塊,它們的處理是相同的,都是進(jìn)行DCT變換。而每一個(gè)8x8的像素塊是相互獨(dú)立的,塊與塊之間沒有關(guān)聯(lián)。而變換矩陣是確定的,與變換對象無關(guān)。因此對各8x8像素塊進(jìn)行DCT變換是數(shù)據(jù)并行的。

        4.2 算法總體流程

        1)算法從host端開始,首先在內(nèi)存中分配兩個(gè)具有與被處理圖像像素?cái)?shù)據(jù)相同大小的空間,分別用于存放被處理圖像的源數(shù)據(jù)和處理結(jié)果,并把圖像像素?cái)?shù)據(jù)讀人到內(nèi)存中。圖像要在GPU中進(jìn)行處理,于是在顯存中申請兩個(gè)具有與被處理圖像像素?cái)?shù)據(jù)相同大小的空間,分別用于存放圖像源數(shù)據(jù)和處理結(jié)果,并一次性把圖像像素?cái)?shù)據(jù)從內(nèi)存復(fù)制到顯存中。

        2)把每一個(gè)8x8塊讀人到共享存儲(chǔ)器中。采用多線程讀人,每個(gè)線程讀人一個(gè)像素。讀人完成后,進(jìn)行DCT變換的計(jì)算。采用多線程進(jìn)行計(jì)算,每個(gè)線程計(jì)算一個(gè)系數(shù)。

        3)DCT變換完成后,把結(jié)果寫入到全局存儲(chǔ)器中,同樣是每個(gè)線程寫入一個(gè)系數(shù)。至此device端的工作完成。

        4)host端再把結(jié)果數(shù)據(jù)從顯存復(fù)制到內(nèi)存中,DCT變換算法完成。

        4.3 算法詳細(xì)設(shè)計(jì)

        1)線程劃分

        把整個(gè)圖像作為一個(gè)grid,由于對圖像采取的是8x8塊的DCT變換,塊與塊之間可以獨(dú)立進(jìn)行處理,不同塊沒有關(guān)聯(lián)。因此,這里采取每個(gè)8x8塊用一個(gè)block來處理,而block中包含8x8個(gè)thread(共64個(gè)thread),每個(gè)thread處理一個(gè)像素的計(jì)算。工作過程如圖2所示。

        2)存儲(chǔ)器分配

        根據(jù)各存儲(chǔ)器的特點(diǎn),先把圖像數(shù)據(jù)載人到全局存儲(chǔ)器中。由于全局存儲(chǔ)器的訪問速度慢,而且沒有緩沖,每一個(gè)block內(nèi),各thread要取的數(shù)據(jù)有重復(fù)之處,如果線程直接從全局存儲(chǔ)器取數(shù)據(jù),將會(huì)遭遇性能瓶頸。因此,由各thread從全局存儲(chǔ)器中讀人到共享存儲(chǔ)器中,各自線程讀取自身坐標(biāo)對應(yīng)的像素值。在各thread讀入像素值后,要進(jìn)行柵障同步,以保證同一個(gè)block內(nèi)所有像素都已經(jīng)讀入,這樣才能進(jìn)行下一步的DCT變換。

        為了進(jìn)一步優(yōu)化,還可以把全局存儲(chǔ)器的中數(shù)據(jù)映射為紋理,紋理有片內(nèi)緩沖,而且能進(jìn)行二維尋址,能簡化DCT算法的尋址,提高訪存的速度。同時(shí),紋理數(shù)據(jù)按16的倍數(shù)對齊,以符合“合并訪問”的要求,進(jìn)一步提高訪存效率。

        此外,DCT變換所需的變換矩陣A要先載人到常數(shù)存儲(chǔ)器,常數(shù)存儲(chǔ)器同樣具有片內(nèi)緩沖。在代碼中,用一constant一聲明限定符直接聲明為常數(shù)存儲(chǔ)器變量即可[8]。

        3)并行DCT算法實(shí)現(xiàn)

        根據(jù)等式(5),DCT變換要計(jì)算兩次矩陣乘法,分別是ATXArX和(ArX)A。矩陣相乘的算法,可以通過線程的索引來確定其計(jì)算的數(shù)據(jù)地址。在CUDA中,線程是能獲得自身在block中的索引的,基于這一特點(diǎn),在矩陣乘法運(yùn)算中,可以很方便地在共享存儲(chǔ)器中尋址。每個(gè)矩陣都需要用到轉(zhuǎn)置矩陣A,而矩陣A被載入到常數(shù)存儲(chǔ)器,GPU能對常數(shù)存儲(chǔ)器進(jìn)行片內(nèi)緩沖,訪問效率很高。

        以下為DCT變換中兩次求矩陣乘積的核心代碼:

        //計(jì)算ATX,結(jié)果保存到CurBlockLoca12

        float curelem=0;//臨時(shí)保存當(dāng)前元素的值

        int DCTv8matrixlndex=ty;//轉(zhuǎn)置矩陣A1索引

        int CurBlockLocalllndex=tx;//x矩陣的索引

        for (int i=0; i

        {

        curelem+= DCTv8matrix[DCTv8matrixlndex] * Cur-BlockLocaII[CurBlockLocalllndexl;

        DCTv8matrixlndex+=BLOCK_SIZE; //A矩陣的列為AT矩陣的行

        CurBlockLocalllndex+=BLO CK_SIZE;

        CurBlockLoca12[ (ty << BLOCK—SIZE—.LOG2) + tx]=curelem;/,保存結(jié)果

        _syncthreads0;//等待矩陣的所有元素計(jì)算完畢

        //計(jì)算(ATX) A(ATX)A,結(jié)果保存到CurBlockLocall

        curelem=0;//臨時(shí)保存當(dāng)前元素的值

        int CurBlockLoca121ndex

        =

        (ty

        *BLOCK_SIZE);//(ATX )(ATX)矩陣索引

        DCTv8matrixlndex=tx;//A矩陣索引

        for (int i=0; i

        curelem += CurBlockLoca12[CurBlockLoca121ndex] *DCTv8matrix[DCTv 8matrixlndexl;

        CurBlockLocal21ndex+=1;//取行,因此步長為1

        DCTv8matrixlndex+=BLOCK_SIZE;,/取列,因此步長為BLOCK__ SIZE

        }

        CurBlockLocall[(ty<

        _syncthreads0;//柵障同步,確保所有系數(shù)計(jì)算完成

        5 實(shí)驗(yàn)結(jié)果分析

        5.1 數(shù)據(jù)分析

        為了測試應(yīng)用CUDA技術(shù)后的運(yùn)行效率,本文編寫了兩個(gè)版本的程序,分別在CPU運(yùn)行(單線程),和在GPU上運(yùn)行(基于CUDA技術(shù))。通過分別調(diào)用兩個(gè)程序,針對同一幅圖片進(jìn)行DCT變換,并計(jì)算其執(zhí)行時(shí)間。

        在計(jì)算執(zhí)行時(shí)間上,本文采用CUDA的cutStartTimer(tim-er)、cutStopTimer(timer)和cutGetTimerValue(timer)函數(shù),分別表示開始計(jì)時(shí)、停止計(jì)時(shí)和讀取時(shí)間,計(jì)時(shí)精度小于Ims。

        硬件上,CPU采用Intel Core i5-7200,主頻為2.5GHz;GPU采用NVIDIA公司的GeForce GTX660,支持CUDA 4.0以上驅(qū)動(dòng)版本,顯存容量2G。

        經(jīng)過測試,DCT算法在CPU和GPU上執(zhí)行的效率對比如表1所示。從表中數(shù)據(jù)可以看出,應(yīng)用CUDA技術(shù)加速DCT變換,加速比最高能達(dá)到124.5。

        5.2 程序演示

        本文通過模塊化的方式,把DCT變換算法這個(gè)功能作為一個(gè)獨(dú)立模塊。DCT變換算法的CUDA實(shí)現(xiàn)版本和CPU實(shí)現(xiàn)版本(C語言洛編譯成一個(gè)DLL文件。主程序模塊則由C#語言編寫,編譯成一個(gè)可執(zhí)行文件。

        以下程序分別演示了應(yīng)用CUDA技術(shù)在GPU上進(jìn)行圖像壓縮,和同樣的算法在CPU上進(jìn)行計(jì)算的效果。左邊的圖是原圖,中間的圖是經(jīng)過DCT變換后的系數(shù),右邊的圖是經(jīng)過DCT——量化——逆量化-IDCT后的結(jié)果。

        6 結(jié)束語

        本文重點(diǎn)分析了DCT變換算法的原理,得出DCT變換算法的矩陣式表示,并成功利用CUDA技術(shù)實(shí)現(xiàn)了高速DCT變換算法。實(shí)驗(yàn)表明,相較于CPU上的串行DCT變換算法,本文算法的執(zhí)行效率得到了很大提升。

        本文也提供了一種程序優(yōu)化思路——對于耗時(shí)的串行程序,只要滿足并行性的條件,都可嘗試采用CUDA技術(shù)進(jìn)行改進(jìn)。而把CUDA部分的程序編譯成DLL文件,可靈活地被第三方項(xiàng)目調(diào)用,使得CUDA技術(shù)適用于更多技術(shù)場景。

        參考文獻(xiàn):

        [1]萬豐,苑豪杰,宮威,基于離散余弦變換的數(shù)字圖像壓縮技術(shù)研究[J].自動(dòng)化應(yīng)用,2020(3):65-67.

        [2]陳慶奎,王海峰,那麗春,等.圖形處理器通用計(jì)算的研究綜述[J],黑龍江大學(xué)自然科學(xué)學(xué)報(bào),2012,29(5):672-679.

        [3]陳茜.基于GPU的數(shù)字圖像處理并行算法的研究[D].西安:中國科學(xué)院研究生院(西安光學(xué)精密機(jī)械研究所),2014.

        [4]曾浩洋.圖像處理的GPU加速技術(shù)的研究及實(shí)現(xiàn)[D].綿陽:西南科技大學(xué),2019.

        [5]張舒,褚艷利.GPU高性能運(yùn)算之CUDA[M].北京:中國水利水電出版社,2009.

        [6] Obukhov A.Kharlamov A.Discrete cosine transform for 8x8blocks with CUDA[R].Nvidia White Paper,2008.

        [7]佘秋菊.基于DCT變換的JPEG圖像壓縮及其MATLAB實(shí)現(xiàn)[J].科技信息(學(xué)術(shù)研究),2008(36):557-558.

        [8]鄒巖,楊志義,張凱龍.CUDA并行程序的內(nèi)存訪問優(yōu)化技術(shù)研究[J].計(jì)算機(jī)測量與控制,2009,17(12):2504-2506.

        【通聯(lián)編輯:謝媛媛】

        作者簡介:張金霜(1987-),男,廣東茂名人,助教,碩士,主要研究方向?yàn)榫W(wǎng)絡(luò)安全、智能優(yōu)化算法;黃旭彬(1981-),廣東高州人,講師,碩士,主要研究方向?yàn)橛?jì)算機(jī)應(yīng)用技術(shù)。

        男女裸体做爰视频高清| 人妻人妻少妇在线系列| 国产三级自拍视频在线| 亚州中文热码在线视频| 在线播放真实国产乱子伦| 精品无码人妻一区二区三区| 欧美日本免费一区二| 色婷婷精久久品蜜臀av蜜桃| 精品福利一区二区三区蜜桃| 人人妻人人澡人人爽欧美精品| 欧美日韩在线观看免费| 中文熟女av一区二区| 午夜精品免费视频一区二区三区| 久久青青草原精品国产app| 欧美性猛交xxxx黑人| 爱v天堂在线观看| 日韩中文字幕不卡在线| 免费看男女做羞羞的事网站| 国产成人精品无码播放 | 18禁真人抽搐一进一出在线| 国产99在线视频| 国产av熟女一区二区三区老牛| 可免费观看的av毛片中日美韩| 激性欧美激情在线| 亚洲AV秘 无码一区二区三区臀| 精品专区一区二区三区| 我和丰满妇女激情视频| 亚洲色www成人永久网址| 国产肉体XXXX裸体784大胆| 亚洲av区一区二区三区| 久久人妻少妇嫩草av| 最近免费中文字幕| 亚洲无码毛片免费视频在线观看 | 日韩精品综合一本久道在线视频| 超薄丝袜足j好爽在线观看| 欧美亚洲韩国国产综合五月天| 亚洲乱码av中文一区二区第八页| 国产精品h片在线播放| 极品美女扒开粉嫩小泬| 免费人成黄页网站在线观看国内| 国产av综合网站不卡|