版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 鋼材制品貨物運(yùn)輸服務(wù)合同
- 經(jīng)濟(jì)型塊石采購合同
- 正式簽署勞務(wù)分包合同
- 招標(biāo)文件論證
- 會(huì)議服務(wù)合同的簽訂程序
- 校規(guī)我們的紀(jì)律保障與榮譽(yù)
- 解除勞務(wù)分包合同的程序與要求解析
- 分包合同范本
- 工程勞務(wù)水電分包合同模板
- 信息有償共享協(xié)議
- 延長石油集團(tuán)招聘筆試題庫2024
- 宣傳片視頻拍攝項(xiàng)目投標(biāo)方案(技術(shù)方案)
- 2024-2030年鳥類探測(cè)系統(tǒng)行業(yè)市場現(xiàn)狀供需分析及重點(diǎn)企業(yè)投資評(píng)估規(guī)劃分析研究報(bào)告
- 社區(qū)衛(wèi)生服務(wù)中心2024年世界精神衛(wèi)生日工作方案(七篇)
- 2024年下半年四川省攀枝花市引進(jìn)高層次人才和緊缺專業(yè)人才歷年高頻500題難、易錯(cuò)點(diǎn)模擬試題附帶答案詳解
- 2023年山東淄博師范高等專科學(xué)校招聘考試真題
- 數(shù)據(jù)新聞概論 課件 第1章 什么是數(shù)據(jù)新聞
- 2024-2030年全球及中國固態(tài)硬盤市場營銷戰(zhàn)略規(guī)劃及可持續(xù)發(fā)展建議研究報(bào)告
- 商業(yè)銀行資產(chǎn)托管業(yè)務(wù)與風(fēng)險(xiǎn)管理考核試卷
- DB13(J)T 8427-2021 綠色建筑評(píng)價(jià)標(biāo)準(zhǔn)(京津冀)
- 人教版(2024新教材)七年級(jí)上冊(cè)數(shù)學(xué)第一次月考測(cè)試卷(含答案)
評(píng)論
0/150
提交評(píng)論