• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      Open MP在Android多核編程中的研究與運(yùn)用

      2014-07-03 03:33:08王沖楊斌
      關(guān)鍵詞:編譯器源代碼線程

      王沖,楊斌

      (西南交通大學(xué)信息 科學(xué)與技術(shù)學(xué)院,成都610031)

      引 言

      雖然多核平臺(tái)具有很大的潛能,但由于多核軟件開發(fā)工具和標(biāo)準(zhǔn)的缺乏減緩了它們的全面普及。編程人員要想從這些系統(tǒng)中獲得更大的好處,可能還需要編寫底層代碼、調(diào)度工作單元,并管理內(nèi)核之間的同步。作為在桌面系統(tǒng)上興起的技術(shù),Open MP在PC平臺(tái)上已經(jīng)非常成熟,但是在嵌入式領(lǐng)域,尤其是Android平臺(tái)的開發(fā),大多還停留在傳統(tǒng)的單核模式。雖然Google增加了對Open MP的支持,但是在使用上還存在一些問題,如無法在用戶線程中使用Open MP,本文對這個(gè)問題進(jìn)行了研究并提出解決方案,最后通過測試程序進(jìn)行驗(yàn)證。

      1 OpenMP的簡介及特點(diǎn)

      Open MP是由Open MP Architecture Review Board牽頭提出的,已被廣泛接受,是用于共享內(nèi)存并行系統(tǒng)的多線程程序設(shè)計(jì)的一套指導(dǎo)性注釋語句(Compiler Directive)。Open MP支持的編程語言包括C/C++和Fortran;而支持Open MP的編譯器包括Intel Compiler和Sun Studio,以及開放源碼的Open64和GCC編譯器。Open MP提供了對并行算法的高層抽象描述,程序員可以通過在源代碼中加入專用的pragma來指明自己的意圖,然后編譯器自動(dòng)將程序進(jìn)行并行化,并在必要的地方加入同步互斥以及通信。當(dāng)選擇忽略這些pragma,或者編譯器不支持Open MP時(shí),程序又可退化為通常的程序(一般為串行),代碼仍然可以正常運(yùn)作,只是不能利用多線程來加速程序執(zhí)行。

      Open MP提供的這種對于并行描述的高層抽象降低了并行編程的難度和復(fù)雜度,這樣程序員可以把更多的精力投入到并行算法本身,而非其具體實(shí)現(xiàn)細(xì)節(jié)。對基于數(shù)據(jù)分集的多線程程序設(shè)計(jì),Open MP是一個(gè)很好的選擇。同時(shí),使用Open MP也提供了更強(qiáng)的靈活性,可以較容易地適應(yīng)不同的并行系統(tǒng)配置。線程粒度和負(fù)載平衡等是傳統(tǒng)多線程程序設(shè)計(jì)中的難題,但在Open MP中,Open MP庫從程序員手中接管了這兩方面的部分工作。

      Open MP使用分叉-聯(lián)接(Fork-Join)模型實(shí)現(xiàn)并行執(zhí)行。程序從單線程或主線程開始,當(dāng)進(jìn)入并行區(qū)域時(shí),主線程將創(chuàng)建一組并行的工作線程,位于并行模塊內(nèi)的語句由工作線程并行執(zhí)行。在并行區(qū)域末端,所有線程等待得到同步(聯(lián)接),如圖1所示。在這個(gè)階段完成之后開始串行執(zhí)行過程。Open MP的主要特性包括并行循環(huán)和分區(qū),以及可能通過動(dòng)態(tài)調(diào)度加以執(zhí)行的任務(wù)身份。并行區(qū)域中的數(shù)據(jù)可以被所有線程共享,或?qū)γ總€(gè)線程保持私有屬性。因此它能幫助應(yīng)用程序開發(fā)人員減小代碼所占的內(nèi)存空間。

      圖1 分叉-聯(lián)接(Fork-Join)模型

      Open MP中最主要的是編譯指導(dǎo)語句,一條編譯指導(dǎo)語句由directive(命令,也叫指令)和clause list(子句列表)組成。在C/C++中,Open MP編譯指導(dǎo)語句的使用格式為:

      #pragma omp<directive> [clause[[,]clause]...]

      并行計(jì)算可分為任務(wù)并行和數(shù)據(jù)并行。任務(wù)并行是把多個(gè)獨(dú)立的工作分開同時(shí)執(zhí)行,數(shù)據(jù)并行則把大的任務(wù)化解成若干個(gè)相同的子任務(wù),處理起來比任務(wù)并行簡單。Open MP的特性使我們很容易實(shí)現(xiàn)數(shù)據(jù)的并行分解,使其獨(dú)立運(yùn)行,C語言中的for循環(huán)最適合使用數(shù)據(jù)并行。

      2 OpenMP在Android上的使用

      JNI(Java Native Interface)是Java本地調(diào)用接口,它使得運(yùn)行于Android平臺(tái)的Java程序可以使用C、C++甚至匯編語言編寫的動(dòng)態(tài)鏈接庫。在需要頻繁訪問內(nèi)存或復(fù)雜計(jì)算的情況下,使用C動(dòng)態(tài)鏈接庫比在Android平臺(tái)上使用Java語言實(shí)現(xiàn)相同功能更具有效率。NDK(N-ative Development Kit)提供了一系列的工具,可以生成ARM二進(jìn)制碼的動(dòng)態(tài)庫,并且能自動(dòng)地將生成的動(dòng)態(tài)庫和Java應(yīng)用程序一起打包成Android系統(tǒng)可以直接安裝的apk安裝包,即NDK可以將包含JNI接口函數(shù)的C源程序文件編譯生成動(dòng)態(tài)庫,供Android應(yīng)用程序調(diào)用,提高了對現(xiàn)有代碼的重用性,而加快了開發(fā)進(jìn)度。由于Open MP不支持Java語言,所以使用Open MP就需要用到Android NDK。NDK允許開發(fā)者通過JNI將開發(fā)C(或C++)的動(dòng)態(tài)庫嵌入到Java程序中,并能自動(dòng)將so和Java應(yīng)用一起打包成apk,JNI構(gòu)成了Java和C/C++互相溝通的橋梁。Open MP使用示意圖如圖2所示。

      圖2 OpenMP使用示意圖

      2.1 引用OpenMP函數(shù)庫

      由于最新的NDK已經(jīng)添加了對Open MP函數(shù)庫的支持,所以只需要在Android.mk文件中添加Open MP的標(biāo)志,然后使用編譯指導(dǎo)語句來并行化代碼。

      編譯器將根據(jù)可用的CPU核數(shù)目設(shè)置線程數(shù),自動(dòng)對C/C++代碼并行化。

      2.2 存在的問題

      經(jīng)過跟蹤測試,當(dāng)前的NDK版本僅支持在主線程中使用Open MP(在用戶線程中使用Open Mp將會(huì)導(dǎo)致程序崩潰),但是如果僅在主線程中處理數(shù)據(jù),無法達(dá)到UI與數(shù)據(jù)分離的目的,在處理一些耗時(shí)操作時(shí)將大大影響用戶體驗(yàn),也失去了并行的意義。GOMP線程創(chuàng)建流程圖如圖3所示。

      圖3 GOMP線程創(chuàng)建流程圖

      通過對源代碼分析,發(fā)現(xiàn)是由于libgomp/libgomp.h中的gomp_thread函數(shù)返回NULL。

      進(jìn)一步分析,在GOMP(GCC標(biāo)準(zhǔn)下的Open MP)中,若使用了TLS(線程局部存儲(chǔ)),則設(shè)置HAVE_TLS標(biāo)志,并會(huì)產(chǎn)生一個(gè)全局變量gomp_tls_data跟蹤每個(gè)線程的狀態(tài),否則將通過pthread_setspecific函數(shù)來管理線程特有的數(shù)據(jù)。由于Android中用戶線程不支持TLS,所以只能通過pthread_setspecific函數(shù)來管理線程特有的數(shù)據(jù),當(dāng) GOMP創(chuàng)建線程時(shí),libgomp/team.c中的gomp_thread_start函數(shù)將設(shè)置線程特有的數(shù)據(jù),創(chuàng)建獨(dú)立線程(用戶線程)時(shí),線程特有的數(shù)據(jù)沒有設(shè)置,從而gomp_thread函數(shù)返回NULL,導(dǎo)致程序崩潰。因此,必須在調(diào)用gomp_thread時(shí)初始化線程特有數(shù)據(jù)。

      2.3 解決方案

      由于修改了源代碼,所以需要對NDK的交叉編譯工具鏈進(jìn)行重新編譯,方法如下:

      ①下載Android NDK源碼。

      ②修改libgomp.h源代碼。

      ③編譯。

      # ./build/tools/build-gcc.sh--verbose$(pwd)/src$(pwd)arm-linux-androideabi-4.8

      ④將生成的libgomp.a文件拷貝到NDK的安裝目錄替換。

      3 應(yīng)用與結(jié)果分析

      完成了對NDK的修改,將對Open MP在Android平臺(tái)上的性能進(jìn)行測試。本次測試分別使用單核、雙核、4核的Android設(shè)備對800×600的灰度圖像進(jìn)行3×3的均值濾波。

      3.1 均值濾波任務(wù)并行化

      均值濾波是典型的線性濾波算法,它是指在圖像上對目標(biāo)像素f(x,y)給定一個(gè)模板,該模板包括了其周圍的臨近像素(以目標(biāo)像素為中心的周圍m個(gè)像素,構(gòu)成一個(gè)濾波模板,即去掉目標(biāo)像素本身)。再用模板中的全體像素的平均值g(x,y)來代替原來像素值。

      g(x,y)=1/m ∑f(x,y)

      傳統(tǒng)的處理方法將會(huì)遍歷每個(gè)像素點(diǎn),依次處理,而Open MP的for語句可以將這部分工作并行化。并行for語句語法:

      #pragma omp[parallel]for[clauses]

      主要實(shí)現(xiàn)代碼如下:

      3.2 結(jié)果分析

      將每個(gè)像素點(diǎn)的處理劃分成獨(dú)立的任務(wù)并行處理,得到使用Open MP和不使用Open MP的情況下所需要的時(shí)間,測試結(jié)果如表1所列。

      表1 運(yùn)行結(jié)果對比

      從表1中可以看出,隨著CPU內(nèi)核數(shù)目的增加,Open MP對性能的提升也更為顯著,在4核設(shè)備上使用Open MP的運(yùn)行時(shí)間接近不使用所需時(shí)間的四分之一。

      結(jié) 語

      雖然Open MP在Android上的運(yùn)用還不成熟,但是在Android軟硬件快速發(fā)展的今天,其憑借易入門、良好的可移植性會(huì)在將來得到廣泛應(yīng)用。本文對Open MP在Android上進(jìn)行多核編程進(jìn)行研究,解決了用戶無法再創(chuàng)建的線程使用Open MP的問題,并通過測試證明Open MP能夠顯著提高多核設(shè)備的性能。

      [1]Open MP architecture Review Board.Open MP Application Program Interface Version 4.0,2012.

      [2]Keith Obenschain.Open MP support in NDK[EB/OL].[2014-03].https://groups.google.com/d/topic/androidndk/p Ufqx URg Nb Q.

      [3]Sylvain Ratabouil.Android NDK beginner's Guide[M].Birmingham:PACKT Publishing,2012.

      [4]王如親.并行算術(shù)編碼在Android上的實(shí)現(xiàn)[J].計(jì)算機(jī)與數(shù)字工程,2013(9).

      [5]許曉寧.Java Native Interface應(yīng)用研究[J].計(jì)算機(jī)科學(xué),2006,33(10):291-292.

      [6]王科俊,熊新炎,任楨.高效均值濾波算法[J].計(jì)算機(jī)應(yīng)用研究,2010(2).

      [7]Open MP Application Program Interface,2012.

      猜你喜歡
      編譯器源代碼線程
      人工智能下復(fù)雜軟件源代碼缺陷精準(zhǔn)校正
      基于TXL的源代碼插樁技術(shù)研究
      基于相異編譯器的安全計(jì)算機(jī)平臺(tái)交叉編譯環(huán)境設(shè)計(jì)
      軟件源代碼非公知性司法鑒定方法探析
      淺談linux多線程協(xié)作
      揭秘龍湖產(chǎn)品“源代碼”
      通用NC代碼編譯器的設(shè)計(jì)與實(shí)現(xiàn)
      Linux線程實(shí)現(xiàn)技術(shù)研究
      編譯器無關(guān)性編碼在微控制器中的優(yōu)勢
      么移動(dòng)中間件線程池并發(fā)機(jī)制優(yōu)化改進(jìn)
      延庆县| 工布江达县| 习水县| 电白县| 卢湾区| 新郑市| 中山市| 武义县| 新沂市| 泸水县| 永福县| 芜湖县| 游戏| 红原县| 西城区| 社旗县| 双城市| 罗山县| 南澳县| 杭锦后旗| 新兴县| 莲花县| 光山县| 苏尼特左旗| 合作市| 常德市| 涞源县| 阜新| 五家渠市| 咸阳市| 方正县| 滨海县| 丰城市| 汽车| 延庆县| 望奎县| 重庆市| 青海省| 金溪县| 弥勒县| 绵竹市|