国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于智能手機平臺的積分圖像并行算法優(yōu)化與實現(xiàn)

2018-02-26 04:46:44蔣睿張素文汪創(chuàng)
電子技術(shù)與軟件工程 2018年14期

蔣睿 張素文 汪創(chuàng)

摘要 積分圖像算法是虛擬現(xiàn)實等技術(shù)中的一個重要組成部分,廣泛應(yīng)用于現(xiàn)實生活中。智能手機平臺對虛擬現(xiàn)實應(yīng)用具有實時性的要求,而目前的研究主要集中在桌面平臺上的并行加速。本文針對智能手機對運行速度要求高的特點,在對兩種前綴加法進行詳細分析的基礎(chǔ)上,提出一種基于移動智能手機的積分圖像并行算法。該算法利用OpenCL框架在Android平臺上實現(xiàn)了積分圖像算法的并行設(shè)計。實驗結(jié)果表明,積分圖像并行算法實現(xiàn)了算法運行效率的提升。

【關(guān)鍵詞】積分圖像 OpenCL 并行

對于一幅灰度的圖像,積分圖像中的任意一點(x,y)的值是指從圖像的左上角這個點的所構(gòu)成的矩形區(qū)域內(nèi)所有的點的灰度值之和。積分圖像主要用于算法加速,廣泛應(yīng)用于快速特征檢測中。雖然在過去的十年間,移動處理器有了很大發(fā)展,但是相比于桌面處理器的性能還有很大差距。而隨著目前各種異構(gòu)并行編程模型的成熟,其可以很好的彌補移動平處理器的性能,顯著的提高積分圖像算法的實時性。

GPU(Graphics Process Unit)的概念是NVDIA公司于1999年率先提出的。GPU中設(shè)計了大量用于算術(shù)邏輯運算的晶體管,這些晶體管的網(wǎng)狀布局賦予了GPU強大的并行數(shù)據(jù)運算能力。隨著科技的進步,對于智能手機的實時性要求也越來越重要,充分利用智能手機的GPU參與運算是極其必要的。大量的研究者開始進行各平臺上的GPU并行加速研究。Sinha等提出了基于OpenGL的SIFT算法,但是并不適用于移動平臺;Keyombya在智能手機上實現(xiàn)了基于OpenGL的SIFT算法加速,并取得了一定的效果;Guohui Wang等提出了基于OpenCL標準的GPU加速理論,其主要應(yīng)用在智能手機平臺上,并對OpenCL標準的GPU并行算法的優(yōu)化進行了闡述。中國科學院的吳再龍、張櫻等對圖像重映射算法、圖像模糊算法等進行了并行優(yōu)化,并取得了不錯的效果。

對于積分圖像的GPU并行算法,清華大學的王志國采用了分段前綴加法算法,降低了線程間的通訊依賴,提高了GPU線程的工作效率;中國科學院的賈海鵬在采用分而治之策略的前提下,采用雙buffer的方式,消除了bank沖突,取得了不錯的效果。然而遺憾的是,他們的成果主要應(yīng)用于桌面平臺。本文通過對上述文獻的研究,以O(shè)penCL異構(gòu)并行編程為基礎(chǔ),在智能手機平臺上對積分圖像并行算法進行研究。

1 積分圖像原理

積分圖像算法原理基于前綴加法,實際上,積分圖像可以理解為二維的前綴加法。對于一個一維數(shù)組a(x),其前綴加法結(jié)果b(x)為:

而對于一副圖像I(x,y),其積分圖像可表示為:

我們首先對圖像進行行前綴加法,可以得到:

然后對得到的圖像進行列前綴加法,即可得到積分圖像:

2 并行前綴加法

2.1 Hillis和Steele并行前綴加法

并行前綴加法最早由Hillis和Steele于1986年提出的。該算法的工作方式是假設(shè)存在與元素一樣多的處理器,構(gòu)造一棵高度為log2n的樹結(jié)構(gòu),對每一層都進行順序掃描,即可得到結(jié)果。

如果采用Hillis和Steele的前綴和算法進行并行計算,在每一層的計算中,并不能同時啟動所有線程,因為一旦位于前面的線程計算完畢,則內(nèi)存就已經(jīng)發(fā)生了改變,后面線程的計算都為錯誤。那么就只能采用層掃描的方式,依次對每個點進行計算,可以很容易的發(fā)現(xiàn)其時間復雜度為O(nlOg2n),甚至比串行算法還要高。

解決的方法是定義一個與元素組同樣大的數(shù)組,在對原數(shù)組進行第一層數(shù)組的計算時,將結(jié)果數(shù)組保存至臨時數(shù)組,然后在對臨時數(shù)組進行第二層數(shù)組的計算,將結(jié)果保存至原數(shù)組。但這種方式仍然存在很大的弊病,其一是相鄰的線程會去訪問同一個內(nèi)存,造成bank沖突,其二是在生成臨時數(shù)組時,對臨時數(shù)組進行初始化需要浪費些許時間,同時會造成空間復雜度從O(l)提高至O(n),造成空間的浪費,特別是對于移動平臺的GPU來說,當圖像過大時,浪費共享內(nèi)存是及其奢侈的事情,甚至會造成溢出,使程序無法正常運行。由于上述原因,在本文中不采用Hillis和Steele前綴和算法。

2.2 Blelloch并行前綴加法

Blelloch采用了平衡二叉樹的方式,將數(shù)組作為平衡二叉樹的葉子節(jié)點,采用歸約的方式計算該二叉樹,其計算過程包括上歸約過程和下歸約過程。

在上歸約過程中,將左子樹和右子樹的和保存至父節(jié)點,但在實際操作中,我們采用父節(jié)點數(shù)據(jù)覆蓋右子樹數(shù)據(jù),留下左子樹數(shù)據(jù)的方式,不會丟失信息,也可以節(jié)省空間。

在下歸約過程中,首先將根節(jié)點清零,并將其保存至臨時內(nèi)存中,然后在每一層,都將父節(jié)點與左子樹的和賦予右子樹,將父節(jié)點的值賦予左子樹。經(jīng)過上歸約過程和下歸約過程,對最后一個數(shù)據(jù)進行特殊處理后,即可得到前綴數(shù)組。

相對于Hillis和Steele的并行前綴加法,Blelloch的并行前綴加法有2次歸約的過程,在每層都并行執(zhí)行的情況下,計算的層數(shù)是前者的兩倍,但使用這種算法的好處是,每個線程所訪問的兩個數(shù)據(jù)別的線程一定不會訪問,不會造成bank沖突,也不需要生成額外的數(shù)組,僅需要申請一個數(shù)據(jù)空間保存根節(jié)點數(shù)據(jù),符合本文基于移動平臺GPU的設(shè)計方式。3積分圖像并行算法設(shè)計與優(yōu)化

3.1 積分圖像并行算法設(shè)計

積分圖像算法主要包括一次行前綴加法和一次列前綴加法,在實際的工作中,進行列前綴算法時,線程訪問按列訪問,則會導致訪問的不連續(xù),影響程序性能,因此,在進行列前綴加法前,我們對行前綴算法的結(jié)果進行一次轉(zhuǎn)置,然后進行第二次行前綴加法,再對輸出結(jié)果進行一次轉(zhuǎn)置,即可得到積分圖像。在并行算法下,一次矩陣轉(zhuǎn)置只需要每個線程進行一次操作,時間損耗極小。

圖1為圖像中每行進行的并行行前綴加法流程,圖像中每行數(shù)據(jù)都并行計算。

并行行前綴加法流程包括:

(1)將原數(shù)組劃分至共享內(nèi)存;

(2)進行上歸約操作,并將塊和保存至全局塊和數(shù)組,對塊和清零;

(3)進行下歸約操作;

(4)將下歸約塊與塊和數(shù)組合并,保存至全局目標數(shù)組。值得一提的是,在塊合并時,采用行并行列串行的方式,合并不可避免的會影響程序的執(zhí)行效率。

3.2 積分圖像并行算法優(yōu)化

對于行前綴加法的并行化,本文針對智能手機的硬件條件做出了以下優(yōu)化方式:

(1)算法優(yōu)化。行前綴加法原理是基于平衡二叉樹的,它要求計算數(shù)據(jù)量一定為2k個,如果對原數(shù)據(jù)進行補齊,補齊的數(shù)據(jù)量會極大,所以在本文中,我們采用先分而治之再合并的方式,將數(shù)據(jù)分為數(shù)個2n個數(shù)據(jù)的子塊,則補齊的數(shù)據(jù)不會太大,同時,分治法也讓比全局內(nèi)存更快的共享內(nèi)存有了用武之地。

(2)內(nèi)存優(yōu)化。對于每個子塊,線程在歸約過程中會進行頻繁的數(shù)據(jù)訪問,所以在實際工作中,本文將這些子塊傳至共享內(nèi)存,以加快訪問速度。對于智能手機的硬件條件,每個group的共享內(nèi)存的可分配大小不能超過256,因此,本文以256*1的方式來劃分數(shù)據(jù)。

(3)指令優(yōu)化。盡量減少分支語句,使用三目運算符代替條件判斷語句。④內(nèi)核優(yōu)化。在實際的工作中,為了減少CPU與GPU之間過多的數(shù)據(jù)傳輸而大大增加并行算法運行的時間,本文在進行積分圖像并行算法的設(shè)計時,采用了在一個內(nèi)核中執(zhí)行行前綴加法和矩陣轉(zhuǎn)置的方案。只需要調(diào)用兩次該內(nèi)核,即可得到目標矩陣。

4 實驗結(jié)果及分析

本次實驗的軟件平臺為Android5.1,硬件平臺為Adren0 510,該平臺最高支持OpenCL2.0標準。APP編譯平臺為Windows10,主要使用Android Srudi0 2.2對軟件進行編譯,采用NDK技術(shù)將C++源碼編譯生成本地庫,然后由JNI在Java層中實現(xiàn)本地庫中積分圖像并行算法的調(diào)用。

本次實驗對三種算法進行了測試,第一種是OpenCV中的標準串行算法;第二種優(yōu)化前的積分圖像并行算法,即不使用分而治之策略,不使用共享內(nèi)存等方法進行優(yōu)化的算法;第三種是使用本文中優(yōu)化策略的優(yōu)化后算法。

本次實驗中對多組圖片進行了測試,這些樣本圖片的尺寸不一,能夠體現(xiàn)本算法在不同大小數(shù)據(jù)處理時的運行速度。為了提高加速比的可信度,在進行積分圖像并行算法測試的時候,將使用變量控制法,進行內(nèi)核運行粒度設(shè)置統(tǒng)一、保持并行算法外其他算法不變等措施。然后每組圖片都進行多次實驗,取其平均值,以降低隨機概率事件的影響。

如表1所示,由實驗數(shù)據(jù)可知,相對于標準串行算法,當圖像不大時,優(yōu)化后的并行算法并不能取得優(yōu)勢,這是由CPU與GPU的數(shù)據(jù)傳輸導致的。隨著圖像的增大,加速比逐漸上升,數(shù)據(jù)傳輸時間被掩蓋。但圖像大到一定程度時,塊合并的代價升高,使得加速比有所下降。

而對于優(yōu)化前的積分圖像并行算法,因為在未使用優(yōu)化策略的情況下,需要非常多次的全局內(nèi)存同步,以及全局內(nèi)存的訪問速度很慢的問題,導致了該算法運行效率極低,從側(cè)面上反映了本文優(yōu)化策略的有效性。

5 結(jié)束語

本文重點對兩種前綴加法進行了分析,設(shè)計了積分圖像并行算法,并進行了優(yōu)化。并取得了不錯的效果。但是受到宿主機數(shù)據(jù)傳輸、GPU中內(nèi)存數(shù)據(jù)讀取速度和算法中塊合并的影響,本算法的加速效果還有待提高。今后對宿主機數(shù)據(jù)傳輸?shù)膬?yōu)化以及對塊合并部分的優(yōu)化應(yīng)該是本算法隨后應(yīng)該改進的方向。

參考文獻

[1]吳再龍,張云泉,龍國平等.基于OpenCL的圖像重映射算法優(yōu)化研究[J].科研信息化技術(shù)與應(yīng)用,2013,4(01):57-66.

[2]張櫻,張云泉,龍國平,基于OpenCL的圖像模糊化算法優(yōu)化研究[J],計算機科學,2012, 39 (03): 260-264.

[3]王志國,王貴錦,施陳博等,積分圖像的快速GPU計算[J].計算機應(yīng)用研究,2011, 28 (10): 3913-3916.

[4]賈海鵬,張云泉,徐建良,基于OpenCL的圖像積分圖算法優(yōu)化研究[J].計算機 科學,2013 (02):1-7.

天长市| 沂源县| 封丘县| 平舆县| 类乌齐县| 沙坪坝区| 班戈县| 双峰县| 江陵县| 新和县| 天镇县| 白银市| 平南县| 浑源县| 浙江省| 枞阳县| 全南县| 庄浪县| 碌曲县| 晋中市| 沧州市| 保德县| 乌恰县| 南充市| 虎林市| 洪洞县| 万州区| 怀柔区| 六枝特区| 天等县| 宝山区| 宁明县| 南通市| 道孚县| 平度市| 旬阳县| 苏尼特左旗| 民勤县| 古交市| 昭平县| 丹江口市|