openMP實(shí)驗(yàn)總結(jié)報(bào)告_第1頁
openMP實(shí)驗(yàn)總結(jié)報(bào)告_第2頁
openMP實(shí)驗(yàn)總結(jié)報(bào)告_第3頁
openMP實(shí)驗(yàn)總結(jié)報(bào)告_第4頁
openMP實(shí)驗(yàn)總結(jié)報(bào)告_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

openMP實(shí)驗(yàn)報(bào)告openMP實(shí)驗(yàn)報(bào)告目錄openMP實(shí)驗(yàn)報(bào)告 1OpenMP簡介 1實(shí)驗(yàn)一 2實(shí)驗(yàn)二 3實(shí)驗(yàn)三 5實(shí)驗(yàn)四 6實(shí)驗(yàn)五 9實(shí)驗(yàn)六 10實(shí)驗(yàn)七 11實(shí)驗(yàn)八 13實(shí)驗(yàn)總結(jié) 15在學(xué)習(xí)了MPI之后,我們又繼續(xù)學(xué)習(xí)了有關(guān)openMP的并行運(yùn)算,通過老師的細(xì)致講解,我們對(duì)openMP有了一個(gè)初步的了解:OpenMP簡介OpenMP是一種用于共享內(nèi)存并行系統(tǒng)的多線程程序設(shè)計(jì)的庫(CompilerDirective),特別適合于多核CPU上的并行程序開發(fā)設(shè)計(jì)。它支持的語言包括:C語言、C++、Fortran;不過,用以上這些語言進(jìn)行程序開發(fā)時(shí),并非需要特別關(guān)注的地方,因?yàn)楝F(xiàn)如今的大多數(shù)編譯器已經(jīng)支持了OpenMP,例如:SunCompiler,GNUCompiler、IntelCompiler、VisualStudio等等。程序員在編程時(shí),只需要在特定的源代碼片段的前面加入OpenMP專用的#pargmaomp預(yù)編譯指令,就可以“通知”編譯器將該段程序自動(dòng)進(jìn)行并行化處理,并且在必要的時(shí)候加入線程同步及通信機(jī)制。當(dāng)編譯器選擇忽略#pargmaomp預(yù)處理指令時(shí),或者編譯器不支持OpenMP時(shí),程序又退化為一般的通用串行程序,此時(shí),代碼依然可以正常運(yùn)作,只是不能利用多線程和多核CPU來加速程序的執(zhí)行而已。

OpenMP使得程序員可以把更多的精力投入到并行算法本身,而非其具體實(shí)現(xiàn)細(xì)節(jié)。對(duì)基于數(shù)據(jù)分集的多線程程序設(shè)計(jì),它是一個(gè)很好的選擇。同時(shí),使用OpenMP也提供了更強(qiáng)的靈活性,可以較容易的適應(yīng)不同的并行系統(tǒng)配置。線程粒度和負(fù)載平衡等是傳統(tǒng)多線程程序設(shè)計(jì)中的難題,然而,在OpenMP中,OpenMP庫從程序員手中接管了部分這兩方面的工作,從而使得程序員可以更加專注于具體的算法本身,而非如何編程使得代碼在CPU負(fù)載平衡和線程粒度方面做出平衡。但是,作為高層抽象,OpenMP并不適合需要復(fù)雜的線程間同步和互斥的場(chǎng)合。OpenMP的另一個(gè)缺點(diǎn)是不能在非共享內(nèi)存系統(tǒng)(如計(jì)算機(jī)集群)上使用。在這樣的系統(tǒng)上,MPI使用較多。實(shí)驗(yàn)步驟:通過編寫了一些程序,驗(yàn)證了關(guān)于openMP的一些簡單的性質(zhì)。實(shí)驗(yàn)一代碼:#include"omp.h"#include<cstdio>#include<cstdlib>intmain(intargc,char*argv[]){ intid,numb;omp_set_num_threads(3);#pragmaompparallelprivate(id,numb){id=omp_get_thread_num();numb=omp_get_num_threads();printf("Iamthread%doutof%d\n",id,numb);}system("pause");return0;}實(shí)驗(yàn)結(jié)果:可以看到,因?yàn)槿齻€(gè)進(jìn)程同步執(zhí)行,所以輸出順序是亂序的,就是表示運(yùn)行優(yōu)先級(jí)相同。當(dāng)把進(jìn)程數(shù)改成10的時(shí)候,得到下面的結(jié)果:與上面的到的結(jié)論(并行并行運(yùn)算)相同。實(shí)驗(yàn)二代碼:#include"omp.h"#include<cstdio>#include<cstdlib>intmain(intargc,char*argv[]){intid;omp_set_num_threads(2);#pragmaompparallel{ printf("whatwillyousee?\n"); #pragmaompfor for(inti=1;i<=5;++i) { printf("i=%dof%d\n",i,omp_get_thread_num()); printf("Howmanyanswers?\n"); }}system("pause");return0;}實(shí)驗(yàn)運(yùn)行結(jié)果:可以看到,在設(shè)置進(jìn)程為2的情況之下,運(yùn)算(計(jì)算規(guī)模)被等可能的分配給各個(gè)進(jìn)程。實(shí)驗(yàn)三代碼:#include<iostream>#include<cstdlib>#include<omp.h>intmain(){#pragmaompparallelsections//聲明該并行區(qū)域分為若干個(gè)section,section之間的運(yùn)行順序?yàn)椴⑿械年P(guān)系 {#pragmaompsection for(inti=0;i<5;++i) { std::cout<<i<<"+"<<std::endl; }#pragmaompsection for(intj=0;j<5;++j) { std::cout<<j<<"-"<<std::endl; } } system("pause"); return0;}運(yùn)行結(jié)果:結(jié)果分析:語句”#pragmaompparallelsections”聲明該并行區(qū)域分為若干個(gè)section,section之間的運(yùn)行順序?yàn)椴⑿械年P(guān)系.實(shí)驗(yàn)四 代碼:#include<cstdlib>#include<iostream>#include<omp.h>intmain(){#pragmaompparallel { for(inti=0;i<100;++i) { std::cout<<i<<"+"<<std::endl; }#pragmaompbarrier for(intj=0;j<10;++j) { std::cout<<j<<"-"<<std::endl; } } system("pause"); return0;}運(yùn)行結(jié)果:結(jié)果分析:在語句#pragmaompbarrier的作用下,只有當(dāng)上面所有的進(jìn)程計(jì)算工作全部完成之后,才會(huì)繼續(xù)barrier之后的工作。實(shí)驗(yàn)五 代碼:#include<cstdlib>#include<iostream>#include<cstdlib>#include<omp.h>usingnamespacestd;intmain(){ intsum=0; cout<<"Before:"<<sum<<endl;#pragmaompparallelfor for(inti=0;i<100;i++) {#pragmaompcritical(a) { sum+=i; sum+=i*2; } } cout<<"After:"<<sum<<endl; system("pause"); return0;}運(yùn)行結(jié)果:結(jié)果分析: CRITICAL指令指定一塊同一時(shí)間只能被一條線程執(zhí)行的代碼區(qū)域各個(gè)線程還是并行執(zhí)行for里面的語句,但當(dāng)你們執(zhí)行到critical里面時(shí),要注意有沒有其他線程正在里面執(zhí)行,如果有的話,要等其他線程執(zhí)行完再進(jìn)去執(zhí)行。實(shí)驗(yàn)六代碼:#include<cstdlib>#include<iostream>#include<cstdlib>#include<omp.h>usingnamespacestd;#defineNUM_THREADS2staticlongnum_steps=100000;intmain(){ inti,id; doublex,pi,sum=0.0; doublestep=1.0/(double)num_steps; omp_set_num_threads(NUM_THREADS);#pragmaompparallelprivate(x,i,id)reduction(+:sum) { id=omp_get_thread_num(); for(i=id+1;i<=num_steps;i=i+NUM_THREADS) { x=(i-0.5)*step; sum+=4.0/(1.0+x*x); } } pi=sum*step; printf("pi=%.12f\n",pi); system("pause"); return0;}運(yùn)行結(jié)果:結(jié)果分析:很簡單,通過并行運(yùn)算,發(fā)揮計(jì)算機(jī)多核的優(yōu)勢(shì),自然能夠較單核計(jì)算更快的得出計(jì)算結(jié)果,但是要注意計(jì)算機(jī)的核數(shù)是有限制的,不能無限擴(kuò)大并行計(jì)算線程。實(shí)驗(yàn)七代碼:#include<cstdlib>#include<iostream>#include<cstdlib>#include<omp.h>usingnamespacestd;inti=0,sum1,sum2,sum3,sum;intmain(){#pragmaompparallelsectionsnum_threads(3) {#pragmaompsection for(i=0;i<100;i++) sum1+=i;#pragmaompsection for(i=100;i<200;i++) sum2+=i;#pragmaompsection for(i=200;i<300;i++) sum3+=i; } sum=sum1+sum2+sum3; printf("sum=%d\n",sum); system("pause"); return0;}運(yùn)行結(jié)果:結(jié)果分析:這里需要將累計(jì)求和值得部分和分配給幾個(gè)變量的原因是:當(dāng)多個(gè)線程并行執(zhí)行時(shí),有可能多個(gè)線程同時(shí)對(duì)某變量進(jìn)行了讀寫操作,從而導(dǎo)致不可預(yù)知的結(jié)果,因?yàn)槎嗑€程計(jì)算如果只設(shè)置一個(gè)sum,每次增加的值可能是不同進(jìn)程的,從而導(dǎo)致運(yùn)算結(jié)果混亂,但是如果把不同進(jìn)程的計(jì)算結(jié)果分別保存,這樣就不會(huì)出現(xiàn)結(jié)算結(jié)果錯(cuò)誤的問題。實(shí)驗(yàn)八將openMP與之前學(xué)習(xí)過的MPI實(shí)驗(yàn)進(jìn)行綜合,通過計(jì)算PI的運(yùn)算時(shí)間的比較得出結(jié)論代碼:#include<stdio.h>#include<omp.h>#include"mpi.h"staticlongnum_steps=100000;#defineNUM_THREADS4voidmain(intargc,char*argv[]){inti_start,i_end,i,myid,numprocs; doublepi,mypi,x,step,sum=0.0; doublestart,end; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); MPI_Comm_rank(MPI_COMM_WORLD,&myid); if(myid==0) { start=MPI_Wtime(); } MPI_Bcast(&num_steps,1,MPI_INT,0,MPI_COMM_WORLD); i_start=myid*(num_steps/numprocs); i_end=i_start+(num_steps/numprocs); step=1.0/(double)num_steps; omp_set_num_threads(NUM_THREADS);#pragmaompparallelprivate(x,i)reduction(+:sum) for(i=i_start;i<i_end;i+=NUM_THREADS) { x=(i+0.5)*step; sum=sum+4.0/(1.0+x*x); } mypi=step*sum; MPI_Reduce(&mypi,&pi,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD); if(myid==0) { printf("Pi=%f\n",pi); end=MPI_Wtime(); printf("Runtimeis:%.10f\n",end-start); fflush(stdout); } MPI_Finalize();}實(shí)驗(yàn)結(jié)果: 實(shí)驗(yàn)結(jié)果分

溫馨提示

  • 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)論