• 
    

    
    

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

      基于多核與眾核結(jié)構(gòu)的并行編程模型研究

      2014-04-01 07:14:24,
      中原工學(xué)院學(xué)報 2014年3期
      關(guān)鍵詞:線程異構(gòu)代碼

      ,

      (中原工學(xué)院,鄭州 450007)

      近半個世紀(jì)以來,處理器的計算速度基本上每18到24個月都要提升一倍。然而,由于單核處理器功耗和散熱等問題的存在,通過提升芯片時鐘頻率來無限制地提升性能已不再可能,于是科學(xué)家們又開始了對多核、眾核處理器技術(shù)的探索。

      多核芯片是通過在單個芯片上集成多個核心而成的,但這種架構(gòu)受到物理規(guī)律的限制,即受到功耗、互連線延時和設(shè)計復(fù)雜性等因素的制約。在這種背景下,眾核[1]應(yīng)運而生。所謂眾核,是指在單個處理器中集成多個簡單的處理器核,即指芯片中擁有大于等于8個核心的處理器。與單核和多核處理器相比,眾核處理器計算資源密度更高,片上通信開銷更低,更多的晶體管和能量可以勝任更為復(fù)雜的并行處理應(yīng)用[2]。

      從存儲方式上劃分,并行編程模型分為共享存儲模型和分布式存儲模型。而在多核處理器的實際系統(tǒng)中,通用計算又造就了異構(gòu)并行編程模型。

      本文就基于多核和眾核體系結(jié)構(gòu)的并行編程模型——共享存儲編程模型、消息傳遞模型、異構(gòu)編程模型和混合編程模型進行分析研究。

      1 共享存儲編程模型

      在共享存儲編程模型中,各個處理器可以對共享存儲器中的數(shù)據(jù)進行存取,數(shù)據(jù)對每個處理器而言都是可訪問的,不需要在處理器之間進行傳送,即數(shù)據(jù)通信是通過讀寫共享存儲單元來完成的。常見的共享內(nèi)存編程模型有:POSIX Threads、OpenMP[3]。

      1.1 POSIX Threads

      POSIX(Portable Operating System Interface of UNIX) Threads,簡稱為Pthreads,是一個可移植的多線程庫,它提供了在多個操作系統(tǒng)平臺上一致的程序設(shè)計接口。在該模型中,有一些能夠被單獨控制的并行執(zhí)行線程。Pthreads現(xiàn)已成為Linux操作系統(tǒng)中多線程接口的標(biāo)準(zhǔn),并已被UNIX平臺使用。Pthreads的主要功能集中在線程的生成、退出、互斥、同步以及一些輔助功能上。例如:

      (1)線程的創(chuàng)建與退出 (create & exit)。任何進程在啟動時就已有了一個主線程,如果需要再生成線程則使用pthread_create函數(shù),在該函數(shù)中可以指定線程屬性、線程例程、傳給線程例程的參數(shù)。線程例程是線程執(zhí)行的代碼,是一個用戶自定義的函數(shù)。當(dāng)線程例程返回時,線程則結(jié)束運行,也可以通過調(diào)用pthread_exit來退出。

      (2)線程間互斥(mutex)。互斥操作,就是在對某段代碼或某個變量修改時只能有一個線程執(zhí)行這段代碼,而其他線程不能同時進入這段代碼或同時修改變量.Pthreads常用pthread_mutex互斥體來實現(xiàn)線程互斥操作。

      pthread_mutex_init函數(shù)用于初始化一個互斥體變量;pthread_mutex_lock函數(shù)用于給互斥體變量上鎖,如果上鎖時互斥體已經(jīng)被其他線程鎖住,那么調(diào)用該函數(shù)的線程將被阻塞,直到互斥體被解鎖為止;pthread_mutex_trylock函數(shù)的作用是試圖鎖住互斥體,但在互斥體已經(jīng)被加鎖時不會造成阻塞,而是迅速返回;pthread_mutex_unlock函數(shù)是對互斥體解鎖;pthread_mutex_destroy函數(shù)是用來釋放互斥體所占資源。

      (3)線程同步(cond)。線程同步就是若干個線程等待某個事件的發(fā)生,當(dāng)該事件發(fā)生時,這些線程同時執(zhí)行各自代碼。在Linux線程中用條件變量來實現(xiàn)同步。函數(shù)pthread_cond_init用來創(chuàng)建一個條件變量。

      pthread_cond_wait和pthread_cond_timewait用來等待條件變量被設(shè)置,值得注意的是這兩個等待調(diào)用的函數(shù)需要一個已經(jīng)上鎖的互斥體mutex,這是為了防止在真正進入等待狀態(tài)之前別的線程有可能設(shè)置該條件變量而產(chǎn)生競爭;pthread_cond_broadcast用于設(shè)置條件變量,即使事件發(fā)生,也使所有等待該事件的線程不再阻塞;pthread_cond_signal用于解除某一個等待線程的阻塞狀態(tài);pthread_cond_destroy用來釋放一個條件變量的資源[4]。

      1.2 OpenMP

      OpenMP(open multi-processing)編程模型是基于線程的并行編程模型,是一個共享存儲應(yīng)用編程接口(API)。OpenMP多線程接口被特別設(shè)計,用來支持高性能并行計算程序,它包含許多編譯制導(dǎo)指令,具有移植性好和可擴展等優(yōu)點。OpenMP是由指導(dǎo)性注釋、編譯指令以及線程池管理和庫例程結(jié)合在一起實現(xiàn)的,它與Pthreads不同,不是作為一個庫來實現(xiàn)的。這些指令指示編譯器創(chuàng)建線程、執(zhí)行同步操作和管理共享內(nèi)存等。

      OpenMP中的常用函數(shù)有:

      ①void omp_set_num_threads(int num_threads):設(shè)置線程數(shù)目。通過該函數(shù)來指定其后用于并行計算的線程數(shù)目,其中參數(shù)num_threads就是指定的線程數(shù)目。

      ②int omp_get_num_threads():獲取線程數(shù)目。通過該函數(shù)可以獲取當(dāng)前運行組中的線程數(shù)目,如果在并行結(jié)構(gòu)中使用該函數(shù),返回的就是現(xiàn)在并行計算中的所有的線程總數(shù);如果在串行中使用該函數(shù),其返回值就為1。

      ③int omp_get_max_threads():獲取最多線程數(shù)目。該函數(shù)將返回最多可以用于并行計算的線程數(shù)目。

      ④ int omp_get_num_procs():獲取程序可用的處理器數(shù)目。該函數(shù)將返回可用于程序的處理器數(shù)目(其實是線程數(shù)目)。

      ⑤ int omp_in_parallel():判斷線程是否處于并行狀態(tài)。該函數(shù)返回值為0時表示線程處于串行程序中,返回值為1時表示線程處于并行程序中。

      2 分布式存儲線程模型

      消息傳遞模型是一種最常用的分布式存儲編程模型,它是通過處理器之間的信息交換來實現(xiàn)通信的,適用于分布式存儲系統(tǒng)。在該模型中,駐留在不同節(jié)點上的進程可以通過網(wǎng)絡(luò)傳遞消息相互通信。它常用于開發(fā)大粒度和粗粒度的并行性。

      MPI(Message Passing Interface)是一個消息傳遞接口的標(biāo)準(zhǔn),用于開發(fā)基于消息傳遞的并行程序,其目的是為用戶提供一個實際可用的、可移植的、高效和靈活的消息傳遞接口庫。因此,使用MPI,必須要和特定的語言如FORTRAN和C語言等結(jié)合起來[5]。

      POSIX Pthreads、OpenMP和MPI等3種并行編程模型屬于共享存儲模型或分布式存儲模型。表1概括了3種編程模型在通常實際應(yīng)用中的實現(xiàn)特性[6]。

      表1 3種并行編程模型實現(xiàn)特性

      3 異構(gòu)并行編程模型

      異構(gòu)并行編程模型主要是針對異構(gòu)計算機系統(tǒng)的并行編程。異構(gòu)計算機系統(tǒng)是由功能或性能相異的處理器通過一定的互聯(lián)結(jié)構(gòu)連接起來的計算系統(tǒng),一般由通用微處理器和專用加速器構(gòu)成。通常實際應(yīng)用較多的異構(gòu)并行編程模型有:CUDA、Opencl。

      3.1 CUDA

      CUDA(Compute Unified Device Architecture,統(tǒng)一計算設(shè)備架構(gòu))是NVIDIA公司開發(fā)的一種并行編程模型,它是一種將GPU作為數(shù)據(jù)并行計算設(shè)備的軟硬件體系。此外,CUDA提供了一個允許開發(fā)者使用C語言或者更高級語言的軟件環(huán)境。對于CUDA來說,一個并行系統(tǒng)包含一個主機(Host)和計算資源或者設(shè)備(device)。CUDA編程模型通常將CPU作為主機,GPU作為設(shè)備或者協(xié)處理器(co-processor)。計算任務(wù)是在GPU中依靠一組并行執(zhí)行的線程來完成的。CUDA將計算任務(wù)映射為大量的可以并行執(zhí)行的線程,通過硬件動態(tài)調(diào)度來執(zhí)行這些線程。

      CUDA的線程結(jié)構(gòu)包含2個層次結(jié)構(gòu):Grid(線程網(wǎng)格)和Block(線程塊)。由圖1所示的CUDA存儲結(jié)構(gòu)可以看出,這2個層次內(nèi)也存在并行,即Grid中的Block間并行和Block中的Thread間并行。

      圖1 CUDA存儲結(jié)構(gòu)

      CUDA的體系結(jié)構(gòu)是以Grid的形式組織的,每個Grid由若干個Block組成,而每個Block又由若干個Thread組成,它們都擁有自己的ID,用以和其他線程相區(qū)分。在圖1的底部,Global Memory(全局存儲器)和Constant Memory(常數(shù)存儲器)能夠被主機代碼寫入和讀取。常數(shù)存儲器允許設(shè)備只讀訪問,在Block里,可以有共享存儲器、寄存器或本地存儲器,共享存儲器能夠在Block里被所有的線程訪問,而寄存器則對每一個線程都是獨立的。同一個Block中的線程通過共享存儲器交換數(shù)據(jù),并通過柵欄同步保證線程間能夠正確地共享數(shù)據(jù),從而實現(xiàn)Block內(nèi)通信。

      通常情況下,一個完整的CUDA程序包括在Host上執(zhí)行的串行代碼以及在GPU上并行執(zhí)行的程序(kernel函數(shù))。在圖1中,每進行一次GPU計算,需要在多種存儲器之間進行數(shù)據(jù)傳輸,這會消耗大量的時間,造成延遲,因此,單獨的CUDA并不適合于一些對實時性要求很高的應(yīng)用,往往還需要與CPU搭配協(xié)同運行[7]。

      3.2 OpenCL

      OpenCL(Open Computing Language,開放計算語言)是一個在由CPU、GPU和其他類型處理器組成的異構(gòu)平臺上進行通用并行編程的免費的標(biāo)準(zhǔn)。它是由用于編寫kernels(在OpenCL設(shè)備上運行的函數(shù))的基于C99的語言和一組用于定義并控制平臺的API組成。

      OpenCL操作規(guī)范模型可描述成4個相關(guān)的模型:平臺模型、執(zhí)行模型、內(nèi)存模型、編程模型。

      平臺模型:描述了協(xié)同執(zhí)行的單個處理器及能執(zhí)行OpenCL代碼的處理器,定義了一個抽象的硬件模型,讓開發(fā)者能夠編寫在這些設(shè)備上執(zhí)行的kernel。

      執(zhí)行模型:定義了如何在主機上配置OpenCL環(huán)境,以及如何在設(shè)備上執(zhí)行kernel。

      內(nèi)存模型:定義了被kernel所用的抽象內(nèi)存層次。

      編程模型:定義了如何將并發(fā)模型映射到物理硬件上。

      上述4個模型,提供了基于任務(wù)和基于數(shù)據(jù)的2種并行計算機制,極大地擴展了GPU的應(yīng)用范圍,而且由于它是跨平臺的基于異構(gòu)的編程模型,在今后很長一段時期,還將會持續(xù)得到發(fā)展[8]。

      4 混合編程模型

      混合編程模型是將共享存儲和分布式存儲編程相結(jié)合的一種方法,它在節(jié)點之間使用消息傳遞來發(fā)送和接受數(shù)據(jù),在節(jié)點內(nèi)通過共享內(nèi)存來進行數(shù)據(jù)運算,充分利用了兩種編程模型的優(yōu)點[6]。這種混合編程模型也非常符合當(dāng)今混合硬件體系結(jié)構(gòu)的發(fā)展趨勢。實際應(yīng)用中出現(xiàn)的主要混合并行編程模型有:MPI+OpenMP,CUDA+OpenMP,CUDA+MPI等。

      4.1 MPI+OpenMP

      MPI可以解決多處理機間的粗粒度通信,而OpenMP提供的輕量級線程可以更好地解決每個多處理器計算機內(nèi)部各處理器間的交互,通常在用MPI實現(xiàn)的原始程序中加入OpenMP編譯制導(dǎo)語句,就能使程序轉(zhuǎn)化為MPI和OpenMP混合編程模式的程序,原理如圖2所示。

      圖2 MPI+OpenMP混合編程模型

      下面給出簡單的細(xì)粒度混合編程模型代碼:

      ......

      MPI_INIT_THREAD();//初始化進程,使其具有多線程功能

      MPI_COMM_RANK();

      MPI_COMM_SIZE();

      .....MPI communiaciton and some computation

      #pragma omp parallel//調(diào)用OpenMP

      #pragma omp for//多個線程并行地執(zhí)行for循環(huán)的代碼

      for(...)

      {.......computation

      }

      ......computation and MPI communication

      MPI_FINALIZE();

      3.1.3 進樣精密度與重復(fù)性 取“2.4.5”項下中間濃度對照品溶液,按“2.1”項下方法進行檢測,連續(xù)進樣6次,硫酸鹽峰面積的RSD為0.5%(n=6),表明儀器精密度良好。精密稱取注射用硫酸核糖霉素樣品,共6份,按“2.4.2”項下方法配制供試品溶液,同法檢測,6份樣品硫酸鹽含量的RSD為0.9%(n=6),表明重復(fù)性良好。

      4.2 CUDA+OpenMP

      該混合模型是在CUDA模型的基礎(chǔ)上,通過在執(zhí)行主程序時加入OpenMP編譯制導(dǎo)語句,在CPU端產(chǎn)生大量的線程,這些線程一方面控制GPU,調(diào)動kernel函數(shù)并行執(zhí)行分配給GPU的計算任務(wù),另一方面也能夠并行化處理在主機上的串行程序,因此在整體上提高了程序的執(zhí)行效率。其不足之處是CPU和GPU之間的數(shù)據(jù)傳輸將會影響到GPU的計算效率。這種模型通常適合多GPU的系統(tǒng)。該模型的簡單代碼框架如下:

      //主機端程序

      #include

      #include

      #include

      _global_[......]//CUDA內(nèi)核程序kernel

      ......

      Main Program

      cudaGetDeviceCount(&num_gpus);//獲得系統(tǒng)中支持CUDA的GPU數(shù)量

      //顯示GPU與CPU的信息

      printf("number of host CPUs: %d ",omp_get_num_procs());

      printf("number of CUDA devices: %d ",num_gpus);

      ......

      #pragma omp parallel

      ...... //并行執(zhí)行kernel

      ......

      parallel_execute_host_code//執(zhí)行host上的串行代碼

      ......

      ...correctsult()//檢查對比CPU和GPU的結(jié)果

      4.3 CUDA+MPI

      這種模型也是一種基于CPU和GPU的異構(gòu)模型,充分利用了MPI在節(jié)點間進行消息傳遞和在節(jié)點內(nèi)進行大量線程計算的特點,非常適合實現(xiàn)集群或者超級計算機中的多節(jié)點多GPU并行計算。在這個模型中,MPI用于控制程序、節(jié)點間通信和數(shù)據(jù)調(diào)度以及CPU之間的交互,而CUDA負(fù)責(zé)在GPU中的計算任務(wù)。

      下面為該混合模型的部分關(guān)鍵代碼:

      /*聲明對MPI以及標(biāo)準(zhǔn)庫的引用*/

      #include"mpi.h"

      #include

      ......

      //啟動CUDA函數(shù)

      #if_DEVICE_EMULATION_

      Bool InitCUDA(int myid){return true;}

      #else

      .......

      //獲得CPU所在節(jié)點中的CUDA設(shè)備數(shù)量,沒有則返回

      cudaGetDeviceCount(&count);

      if(count==0){

      fprintf(stderr,"There is no device. ");

      return false;

      }

      ......

      _global_[......]//設(shè)備端kernel函數(shù)的定義和調(diào)用

      ......

      //啟動MPI環(huán)境

      MPI_Init(&argc,&argv);

      MPI_Comm_size(MPI_COMM_WORLD,&numprocs);

      MPI_Comm_rank(MPI_COMM_WORLD,&myid);

      ......

      execute_kernel();//執(zhí)行內(nèi)核函數(shù)

      ......

      MPI_Finalize();

      }

      從上面幾種模型中不難發(fā)現(xiàn),沒有一種混合編程模型完全適用于當(dāng)今所有的計算機體系結(jié)構(gòu)。因此,只能選擇那些最適合于硬件宿主特性的編程模型,才能最大程度地提高并行程序的性能。

      5 結(jié) 語

      隨著未來計算機微處理器朝著眾核處理器方向的發(fā)展,以及大規(guī)模機群的不斷出現(xiàn),原來單一的編程模型已很難適應(yīng)這種新的體系結(jié)構(gòu),因此,基于異構(gòu)平臺的混合并行編程在今后的大規(guī)模并行應(yīng)用中必將成為主流。

      參考文獻(xiàn):

      [1] Feng Wu-chun , Balaji Pavan.Tools and Environment for Multicore and Many-core Architectures[J].IEEE Computer, 2009, 42(12): 26-27.

      [2] 范平.芯革命新未來 英特爾開啟MIC時代 [EB/OL]. (2013-06-08).http://server.zol.com.cn/246/2468105_all.html.

      [3] 陳明. 反投影算法在雙基地合成孔徑雷達(dá)成像中的應(yīng)用[D].北京:中國科學(xué)院研究生院,2007.

      [4] 劉明剛.基于嵌入式Linux的開放式數(shù)控系統(tǒng)研究與實現(xiàn)[D].成都:電子科技大學(xué),2005.

      [5] 張玉斌. 迭代動態(tài)規(guī)劃算法及并行化研究 [D].青島:中國石油大學(xué),2008.

      [6] Javier Diaz,Camelia Munoz Caro,Alfonso Nino.A Survey of Parallel Programming Models and Tools in the Multi and Many-core Era.[J].IEEE Transactions on Parallel and Distributed Systems, 2012, 23(8): 1368-1386.

      [7] 張舒,褚艷利.GPU高性能運算之CUDA[M].北京:中國水利水電出版社,2009:13-44.

      [8] Benedict R Gaster,Lee Howes,David R Kaeli,et al.OpenCL異構(gòu)計算[M].張云泉,張先軼,等譯.北京:清華大學(xué)出版社, 2012:15-26.

      猜你喜歡
      線程異構(gòu)代碼
      試論同課異構(gòu)之“同”與“異”
      創(chuàng)世代碼
      動漫星空(2018年11期)2018-10-26 02:24:02
      創(chuàng)世代碼
      動漫星空(2018年2期)2018-10-26 02:11:00
      創(chuàng)世代碼
      動漫星空(2018年9期)2018-10-26 01:16:48
      創(chuàng)世代碼
      動漫星空(2018年5期)2018-10-26 01:15:02
      淺談linux多線程協(xié)作
      overlay SDN實現(xiàn)異構(gòu)兼容的關(guān)鍵技術(shù)
      LTE異構(gòu)網(wǎng)技術(shù)與組網(wǎng)研究
      在新興異構(gòu)SoCs上集成多種系統(tǒng)
      Linux線程實現(xiàn)技術(shù)研究
      高唐县| 湘阴县| 建湖县| 连江县| 县级市| 长顺县| 和静县| 山丹县| 皮山县| 高淳县| 嘉祥县| 通海县| 青河县| 宝应县| 明溪县| 临朐县| 霍林郭勒市| 陵川县| 邢台市| 博野县| 手游| 深水埗区| 车致| 山阳县| 岑溪市| 博爱县| 南通市| 内丘县| 台中县| 墨玉县| 天长市| 原平市| 安多县| 响水县| 新宁县| 四子王旗| 栾川县| 冷水江市| 灵璧县| 玛曲县| 凤阳县|