多核程序設(shè)計(jì)6_第1頁
多核程序設(shè)計(jì)6_第2頁
多核程序設(shè)計(jì)6_第3頁
多核程序設(shè)計(jì)6_第4頁
多核程序設(shè)計(jì)6_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

多核程序設(shè)計(jì)

第六章OpenMP多線程編程及性能優(yōu)化2007年6月12日1OpenMP編程簡介一種面向共享內(nèi)存以及分布式共享內(nèi)存的多處理器多線程并行編程語言。一種能夠被用于顯示指導(dǎo)多線程、共享內(nèi)存并行的應(yīng)用程序編程接口(API)。OpenMP具有良好的可移植性,支持多種編程語言O(shè)penMP能夠支持多種平臺(tái),包括大多數(shù)的類UNIX系統(tǒng)以及WindowsNT系統(tǒng)(Windows2000,WindowsXP,WindowsVista等)。2OpenMP多線程編程基礎(chǔ)OpenMP的編程模型以線程為基礎(chǔ),通過編譯指導(dǎo)語句來顯示地指導(dǎo)并行化,為編程人員提供了對(duì)并行化的完整的控制。采用Fork-Join的形式MasterThreadParalllRegionNestedParallelRegion3OpenMP多線程編程基礎(chǔ)(續(xù))編譯指導(dǎo)語句在編譯器編譯程序的時(shí)候,會(huì)識(shí)別特定的注釋,而這些特定的注釋就包含著OpenMP程序的一些語義。#pragmaomp<directive>[clause[[,]clause]…]其中directive部分就包含了具體的編譯指導(dǎo)語句,包括parallel,for,parallelfor,section,sections,single,master,critical,flush,ordered和atomic。將串行的程序逐步地改造成一個(gè)并行程序,達(dá)到增量更新程序的目的,減少程序編寫人員一定的負(fù)擔(dān)。運(yùn)行時(shí)庫函數(shù)OpenMP運(yùn)行時(shí)函數(shù)庫原本用以設(shè)置和獲取執(zhí)行環(huán)境相關(guān)的信息,它們當(dāng)中也包含一系列用以同步的API。支持運(yùn)行時(shí)對(duì)并行環(huán)境的改變和優(yōu)化,給編程人員足夠的靈活性來控制運(yùn)行時(shí)的程序運(yùn)行狀況。4使用VisualStudio2005編寫OpenMP程序當(dāng)前的VisualStudio.Net2005完全支持OpenMP2.0標(biāo)準(zhǔn),通過新的編譯器選項(xiàng)/openmp來支持OpenMP程序的編譯和鏈接。5使用VisualStudio2005編寫OpenMP程序(續(xù))#include“stdafx.h”#include“omp.h”

int_tmain(intargc,_TCHAR*argv[]){printf(“Hellofromserial.\n”);printf(“Threadnumber=%d\n”,omp_get_thread_num());//串行執(zhí)行#pragmaompparallel//開始并行執(zhí)行{printf(“Hellofromparallel.Threadnumber=%d\n”,omp_get_thread_num());

}printf(“Hellofromserialagain.\n”);return0;}6使用VisualStudio2005編寫OpenMP程序(續(xù)2)OpenMP程序使用到的環(huán)境變量OMP_NUM_THREADS設(shè)置為4三次執(zhí)行的結(jié)果7OpenMP編程技術(shù)——循環(huán)并行化循環(huán)并行化編譯指導(dǎo)語句的格式

#pragmaompparallelfor[clause[clause…]] for(

index=first;test_expression;increment_expr){ bodyoftheloop; }循環(huán)并行化語句的限制循環(huán)并行化的語句必須具有如下的形式for(index=start;index<end;increment_expr)循環(huán)語句塊應(yīng)該是單出口與單入口的循環(huán)嵌套循環(huán)并行化編譯指導(dǎo)語句可以加在任意一個(gè)循環(huán)之前,則對(duì)應(yīng)的最近的循環(huán)語句被并行化,其它部分保持不變。8OpenMP編程技術(shù)——并行區(qū)域編程通過循環(huán)并行化編譯指導(dǎo)語句使得一段代碼能夠在多個(gè)線程內(nèi)部同時(shí)執(zhí)行。并行區(qū)域編譯指導(dǎo)語句的格式與使用限制#pragmaompparallel[clause[clause]…] blockparallel編譯指導(dǎo)語句的執(zhí)行過程#pragmaompparallelfor(inti=0;i<5;i++)

printf("helloworldi=%d\n",i);程序的執(zhí)行結(jié)果:helloworldi=0helloworldi=1helloworldi=2helloworldi=3helloworldi=4#pragmaompparallelforfor(inti=0;i<5;i++)

printf("helloworldi=%d\n",i);程序的執(zhí)行結(jié)果:helloworldi=0helloworldi=3helloworldi=1helloworldi=4helloworldi=2 9OpenMP編程技術(shù)——并行區(qū)域編程(續(xù))線程私有數(shù)據(jù)與threadprivate,copyin子句使用threadprivate子句用來標(biāo)明某一個(gè)變量是線程私有數(shù)據(jù),在程序運(yùn)行的過程中,不能夠被其他線程訪問到。使用copyin子句對(duì)線程私有的全局變量進(jìn)行初始化。intcounter=0;//usingthreadprivate#pragmaompthreadprivate(counter)

voidinc_counter(){ counter++;}

int_tmain(intargc,TCHAR*argv[]){ #pragmaompparallel for(inti=0;i<10000;i++)

inc_counter(); printf("counter=%d\n",counter);}intglobal=0;#pragmaompthreadprivate(global)int_tmain(intargc,TCHAR*argv[]){ global=1000; #pragmaompparallelcopyin(global) { printf("global=%d\n",global); global=omp_get_thread_num(); } printf("global=%d\n",global); printf("parallelagain\n"); #pragmaompparallel printf("global=%d\n",global);}10OpenMP編程技術(shù)——并行區(qū)域編程(續(xù)2)并行區(qū)域之間的工作共享工作隊(duì)列工作隊(duì)列的基本工作過程即為維持一個(gè)工作的隊(duì)列,線程在并行執(zhí)行的時(shí)候,不斷從這個(gè)隊(duì)列中取出相應(yīng)的工作完成,直到隊(duì)列為空為止。根據(jù)線程號(hào)分配任務(wù)由于每一個(gè)線程在執(zhí)行的過程中的線程標(biāo)識(shí)號(hào)是不同的,可以根據(jù)這個(gè)線程標(biāo)識(shí)號(hào)來分配不同的任務(wù)。使用循環(huán)語句分配任務(wù)#pragmaompparallel { printf("outsideloopthread=%d\n",omp_get_thread_num());#pragmaompfor for(inti=0;i<4;i++) printf("insideloopi=%dthread=%d\n",i,omp_get_thread_num(); }11OpenMP編程技術(shù)——并行區(qū)域編程(續(xù)3)工作分區(qū)編碼(sections)#pragmaompparallelsections {#pragmaompsection printf("section1thread=%d\n",omp_get_thread_num());#pragmaompsection printf("section2thread=%d\n",omp_get_thread_num());#pragmaompsection printf("sectino3thread=%d\n",omp_get_thread_num()); }程序運(yùn)行結(jié)果為:section1thread=0section2thread=1sectino3thread=012OpenMP線程同步OpenMP支持兩種不同類型的線程同步機(jī)制互斥鎖事件通知機(jī)制數(shù)據(jù)競爭inti;intmax_num=-1;#pragmaompparallelforfor(i=0;i<n;i++)

if(ar[i]>max_num) max_num=ar[i];互斥鎖機(jī)制在OpenMP中,提供了三種不同的互斥鎖機(jī)制用來對(duì)一塊內(nèi)存進(jìn)行保護(hù),它們分別是臨界區(qū)(critical),原子操作(atomic)以及由庫函數(shù)來提供同步操作。13OpenMP線程同步——臨界區(qū)在程序需要訪問可能產(chǎn)生競爭的內(nèi)存數(shù)據(jù)的時(shí)候,都需要插入相應(yīng)的臨界區(qū)代碼。臨界區(qū)編譯指導(dǎo)語句的格式如下所示:#pragmaompcritical[(name)] blockinti;intmax_num_x=max_num_y=-1;#pragmaompparallelforfor(i=0;i<n;i++){#pragmaompcritical(max_arx) if(arx[i]>max_num_x)

max_num_x=arx[i];

#pragmaompcritical(max_ary) if(ary[i]>max_num_y) max_num_y=ary[i];}14OpenMP線程同步——原子操作原子操作是OpenMP編程方式給同步編程帶來的特殊的編程功能,通過編譯指導(dǎo)語句的方式直接獲取了現(xiàn)在多處理器計(jì)算機(jī)體系結(jié)構(gòu)的功能。通過#pragmaompatomic編譯指導(dǎo)語句提供。只能作用在語言內(nèi)建的基本數(shù)據(jù)結(jié)構(gòu)。#pragmaompatomic x<binop>=expr或者#pragmaompatomic x++//orx--,--x,++xintcounter=0;#pragmaompparallel{for(inti=0;i<10000;i++)#pragmaompatomic//atomicoperation counter++;}printf("counter=%d\n",counter);15OpenMP運(yùn)行時(shí)庫函數(shù)的互斥鎖支持OpenMP通過一系列的庫函數(shù)支持更加細(xì)致的互斥鎖操作編譯指導(dǎo)語句進(jìn)行的互斥鎖支持只能放置在一段代碼之前,作用在這段代碼之上。程序員必須自己保證在調(diào)用相應(yīng)鎖操作之后釋放相應(yīng)的鎖,否則就會(huì)造成多線程程序的死鎖。函數(shù)名稱描述voidomp_init_lock(omp_lock_t*)

初始化一個(gè)互斥鎖voidomp_destroy_lock(omp_lock_t*)結(jié)束一個(gè)互斥鎖的使用并釋放內(nèi)存voidomp_set_lock(omp_lock_t*)

獲得一個(gè)互斥鎖voidomp_unset_lock(omp_lock_t*)釋放一個(gè)互斥鎖intomp_test_lock(omp_l

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論