并行編程課程實驗報告_第1頁
并行編程課程實驗報告_第2頁
并行編程課程實驗報告_第3頁
并行編程課程實驗報告_第4頁
并行編程課程實驗報告_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

Word資料課程實驗報告課程名稱:并行編程專業(yè)班級:學(xué)號:姓名:指導(dǎo)教師:報告日期:目錄TOC\o"1-2"\h\u實驗一 21.實驗?zāi)康呐c要求 22.實驗內(nèi)容 23.實驗結(jié)果 2實驗二 21.實驗?zāi)康呐c要求 22.算法描述 23.實驗方案 24.實驗結(jié)果與分析 2實驗三 21.實驗?zāi)康呐c要求 22.算法描述 23.實驗方案 24.實驗結(jié)果與分析 2實驗四 21.實驗?zāi)康呐c要求 22.算法描述 23.實驗方案 24.實驗結(jié)果與分析 2實驗五 21.實驗?zāi)康呐c要求 22.算法描述 23.實驗方案 24.實驗結(jié)果與分析 2PROJECT2 2AIM: 2HYPOTHESIS: 2METHODS: 2RESULT: 2DICUSSION&CONCLUSION 2REFERENCE 2Word資料實驗一實驗?zāi)康呐c要求becomefamiliarwiththeparalleldevelopmentenvironments,andthebasicprinciplesandmethodsofparallelprogrammingandperformanceoptimizationbyusingtoolsandframeworkslikepthread,OpenMP,MPIunderLinuxsystem.實驗內(nèi)容熟悉并行開發(fā)環(huán)境,掌握并行編程用到的工具如線程、OpenMP,、MPI等。實驗結(jié)果通過上機(jī)操作熟悉了各種命令,編寫了簡單的程序熟悉開發(fā)環(huán)境。

實驗二實驗?zāi)康呐c要求masterthebasicprinciplesandmethodsofparallelprogrammingdesignandperformanceoptimizationusingpthreadunderstandthebasicmethodfordatapartitionandtaskdecompositioninparallelprogrammingimplementtheparallelalgorithmofcalculatingthevalueofpiusingpthreadthencarriesonthesimpleanalysisandsummaryoftheprogramexecutionresults算法描述采用蒙特卡洛方法計算圓周率,利用單位圓與邊長為1的正方形面積之比計算圓周率的近似值。比值的計算采用蒙特卡羅方法的隨即投點(diǎn)思想,在正方形中隨機(jī)投入很多點(diǎn),使所投點(diǎn)在正方形中每一個位置的機(jī)會均等,然后考察有多少個點(diǎn)落在扇形內(nèi),落在扇形內(nèi)的點(diǎn)的個數(shù)與投點(diǎn)總數(shù)之比就是該比例的近似值。每一個線程完成一次投點(diǎn),n個線程同時計算。實驗方案開發(fā)與運(yùn)行環(huán)境:使用筆記本電腦登錄實驗室服務(wù)器。實驗代碼如下:#include<pthread.h>#include<stdlib.h>#include<stdio.h>#defineMaxThreadNum100#definekSamplePoints10000000#definekSpace1void*compute_pi(void*);inttotal_hits,hits[MaxThreadNum][kSpace];intsample_points_per_thread,num_threads;intmain(void){inti;pthread_tp_threads[MaxThreadNum];pthread_attr_tattr;pthread_attr_init(&attr);pthread_attr_setscope(&attr,PTHREAD_SCOPE_SYSTEM);printf("Enternum_threads\n");scanf("%d",&num_threads);total_hits=0;sample_points_per_thread=kSamplePoints/num_threads;for(i=0;i<num_threads;i++){hits[i][0]=i;pthread_create(&p_threads[i],&attr,compute_pi,(void*)&hits[i]);}for(i=0;i<num_threads;i++){pthread_join(p_threads[i],NULL);total_hits+=hits[i][0];}doublepi=4.0*(double)total_hits/kSamplePoints;printf("Pi:%lf\n",pi);return0;}void*compute_pi(void*s){unsignedintseed;inti;int*hit_pointer;doublerand_no_x,rand_no_y;hit_pointer=(int*)s;seed=*hit_pointer;//intlocal_hits=0;for(i=0;i<sample_points_per_thread;i++){rand_no_x=(double)(rand_r(&seed))/(double)(RAND_MAX);rand_no_y=(double)(rand_r(&seed))/(double)(RAND_MAX);if((rand_no_x-0.5)*(rand_no_x-0.5)+(rand_no_y-0.5)*(rand_no_y-0.5)<0.25){(*hit_pointer)++;}seed*=i;}pthread_exit(0);}實驗結(jié)果與分析實驗結(jié)果符合預(yù)期:

實驗三實驗?zāi)康呐c要求masterthebasicprinciplesandmethodsofparallelprogrammingdesignandperformanceoptimizationusingOpenMPimplementtheparallelalgorithmofcalculatingthevalueofpiusingOpenMPcarriesonthesimpleanalysisandsummaryoftheprogramexecutionresultscompareitwiththeresultsofLab2算法描述與實驗二相似,同樣采用蒙特卡羅方法計算pi值,算法不再詳細(xì)描述。實驗方案實驗環(huán)境:使用筆記本電腦登錄實驗室服務(wù)器。實驗代碼如下:#include<omp.h>#include<stdio.h>#include<stdlib.h>#include<math.h>#defineSEED35791246main(intargc,char*argv){intnumiter=0;//looptimesdoublex,y,z,pi;inti,count;/*#ofpointsinthe1stquadrantofunitcircle*/printf("Enterthenumberofiterationsusedtoestimatepi:");scanf("%d",&niter);/*initializerandomnumbers*/srand(SEED);count=0;intchunk;//sizechunk=1;#pragmaompparallelshared(chunk)private(i,x,y,z)reduction(+:count){#pragmaompforschedule(dynamic,chunk)for(i=0;i<niter;i++){x=(double)rand()/RAND_MAX;y=(double)rand()/RAND_MAX;z=x*x+y*y;if(z<=1)count++;}}pi=(double)count/niter*4;printf("#looptimes=%d,estimateofpiis%g\n",niter,pi);}Openmp自動將for循環(huán)分解成多個線程并行執(zhí)行。實驗結(jié)果與分析實驗結(jié)果如下:與實驗二相比本實驗是使用openmp自動分解多線程并行,精度并無明顯區(qū)別,與所選算法有關(guān)。循環(huán)次數(shù)越多,得到的結(jié)果就越精確。

實驗四實驗?zāi)康呐c要求masterthebasicprinciplesandmethodsofparallelprogrammingdesignandperformanceoptimizationusingMPIimplementtheparallelalgorithmofcalculatingthevalueofpiusingMPIcarriesonthesimpleanalysisandsummaryoftheprogramexecutionresultscompareitwiththeresultsofLab2andLab3算法描述本實驗采用與實驗一實驗二相同的蒙特卡羅算法實現(xiàn)pi值得計算,即利用單位圓與邊長為1的正方形面積之比計算圓周率的近似值。比值的計算采用蒙特卡羅方法的隨即投點(diǎn)思想,在正方形中隨機(jī)投入很多點(diǎn),使所投點(diǎn)在正方形中每一個位置的機(jī)會均等,然后考察有多少個點(diǎn)落在扇形內(nèi),落在扇形內(nèi)的點(diǎn)的個數(shù)與投點(diǎn)總數(shù)之比就是該比例的近似值。實驗方案Mpi是一種基于消息傳遞的并行編程技術(shù),各個進(jìn)程有獨(dú)立的堆棧和代碼段,進(jìn)程之間的信息交互通過調(diào)用通信函數(shù)完成?;镜腁PI如下:intMPI_Init(int*argc,char**argv) MPI_Init是MPI程序的第一個調(diào)用,它完成MPI程序的所有初始化工作, 啟動MPI環(huán)境,標(biāo)志并行代碼的開始。intMPI_Finalize(void)MPI_Finalize是MPI程序的最后一個調(diào)用,它結(jié)束MPI程序的運(yùn)行,標(biāo) 志并行代碼的結(jié)束,結(jié)束除主進(jìn)程外其它進(jìn)程。其之后串行代碼仍可在 主進(jìn)程(rank=0)上繼續(xù)運(yùn)行。intMPI_Comm_size(MPI_Commcomm,int*size); 獲取進(jìn)程個數(shù)p。intMPI_Comm_rank(MPI_Commcomm,int*rank);MPI獲取當(dāng)前進(jìn)程的RANK,rank值取址范圍是0~p-1,RANK值唯一 的表示了進(jìn)程的ID,其中Rank=0的為主進(jìn)程intMPI_Send(void*buf,intcount,MPI_Datatypedatatype,intdest,inttag, MPI_Commcomm);發(fā)送函數(shù):當(dāng)前進(jìn)程將以buf為初始地址,長度為count且元素類型為datatype的信息發(fā)動給rank值為dest的進(jìn)程,這條消息的標(biāo)識符為tag。其中datatype有MPI_INT,MPI_FLOAT等常用類型,Tag的作用是用于區(qū)分一對進(jìn)程之間發(fā)送的不同信息intMPI_Recv(void*buf,intcount,MPI_Datatypedatatype,intsource,inttag,MPI_Commcomm,MPI_Status*status);接受函數(shù):從rank值為source的進(jìn)程接受標(biāo)識符為tag的信息,存入以buf為初始地址,長度為count的存儲區(qū)域中,類型為datatype.實驗環(huán)境:使用筆記本電腦登錄實驗室服務(wù)器。具體代碼如下:#include<stdio.h>#include<stdlib.h>#include<math.h>#include<time.h>#include<mpi.h>voidread_num(longlongint*num_point,intmy_rank,MPI_Commcomm);voidcompute_pi(longlongintnum_point,longlongint*num_in_cycle,longlongint*local_num_point,intcomm_sz,longlongint*total_num_in_cycle,MPI_Commcomm,intmy_rank);intmain(intargc,char**argv){longlongintnum_in_cycle,num_point,total_num_in_cycle,local_num_point;intmy_rank,comm_sz;MPI_Commcomm;MPI_Init(NULL,NULL);//初始化comm=MPI_COMM_WORLD;MPI_Comm_size(comm,&comm_sz);//得到進(jìn)程總數(shù)MPI_Comm_rank(comm,&my_rank);//得到進(jìn)程編號read_num(&num_point,my_rank,comm);//讀取輸入數(shù)據(jù)compute_pi(num_point,&num_in_cycle,&local_num_point,comm_sz,&total_num_in_cycle,comm,my_rank);MPI_Finalize();return0;}voidread_num(longlongint*num_point,intmy_rank,MPI_Commcomm){if(my_rank==0){printf("pleaseinputnuminsqaure\n");scanf("%lld",num_point);}/*廣播函數(shù)intMPI_Bcast(void*data_p//in/outintcount//inMPI_Datatypedatatype//inintsource_proc//inMPI_Commcomm//in)*/MPI_Bcast(num_point,1,MPI_LONG_LONG,0,comm);}voidcompute_pi(longlongintnum_point,longlongint*num_in_cycle,longlongint*local_num_point,intcomm_sz,longlongint*total_num_in_cycle,MPI_Commcomm,intmy_rank){*num_in_cycle=0;*local_num_point=num_point/comm_sz;doublex,y,distance_squared;srand(time(NULL));for(longlonginti=0;i<*local_num_point;i++){x=(double)rand()/(double)RAND_MAX;x=x*2-1;y=(double)rand()/(double)RAND_MAX;y=y*2-1;distance_squared=x*x+y*y;if(distance_squared<=1)*num_in_cycle=*num_in_cycle+1;}/*全局函數(shù)MPI_Reduce(void*input_data_p//invoid*output_data_p//outintcount//inMPI_Datatypedatatype//inMPI_Opoprtator//inintdest_process//inMPI_Commcomm//in)*/MPI_Reduce(num_in_cycle,total_num_in_cycle,1,MPI_LONG_LONG,MPI_SUM,0,comm);if(my_rank==0){doublepi=(double)*total_num_in_cycle/(double)num_point*4;printf("theestimatevalueofpiis%lf\n",pi);}}實驗結(jié)果與分析實驗結(jié)果如下:由結(jié)果可知循環(huán)次數(shù)越多得到的pi值就越精確。與實驗二和實驗三相比,相同循環(huán)次數(shù)下采用mpi運(yùn)算速度更快。

實驗五1.實驗?zāi)康呐c要求1.understanddeeplythearchitectureofGPGPUandmastertheCUDAprogrammingmodel2.implementtheparallelalgorithmofcalculatingthevalueofpiusingCUDA3.carriesonthesimpleanalysisandsummaryoftheprogramexecutionposeoptimizationsolutionbasedontheexecutionresultsandhardwarepareitwiththeresultsofLab2,Lab3andLab42.算法描述采用積分法計算pi值:積分法計算pi值的基本思想是利用1/(1+x^2)的原函數(shù)為arctanx,再利用積分的基本步驟:分割,求和,取極限。將函數(shù)圖形與Y軸和直線X=1圍成的面積盡可能細(xì)分,然后求和,最后乘以相應(yīng)常數(shù),可以得到一個非常近似的pi值。3.實驗方案CUDA在執(zhí)行的時候是讓host里面的一個一個的kernel按照線程網(wǎng)格的概念在顯卡硬件(GPU)上執(zhí)行。每一個線程網(wǎng)格又可以包含多個線程塊(block),每一個線程塊中又可以包含多個線程(thread)?;続PI如下:cudaError_t

cudaMalloc

(void

**devPtr,

size_t

size

);在設(shè)備端分配size大小的空間,起始地址為devPtrcudaError_tcudaMemcpy(void*dst,constvoid*src,size_tcount,enumcudaMemcpyKindkind);將以src為地址長度為count的數(shù)據(jù)賦值到dst為起始地址的內(nèi) 存區(qū)域中,常用的kind有cudaMemcpyHostToDevice,cudaMemcpyDeviceToHostcudaError_t

cudaFree

(void

*devPtr);在設(shè)備端清理以devPtr為起始地址的內(nèi)存空間將任務(wù)合理的分配到grid和thread中,有助于提升程序的性能:gridofthread:具體實驗代碼如下:#include<stdio.h>__global__voidkernel(double*gpu_p){intgpu_count=0;for(intgpu_i=1;gpu_i<=1000;gpu_i++){if(gpu_count%2==0){gpu_p[gpu_i]=gpu_p[gpu_i-1]-4/(double)(2*gpu_i-1);}else{gpu_p[gpu_i]=gpu_p[gpu_i-1]+4/(double)(2*gpu_i-1);}gpu_count=gpu_count+1;}__syncthreads();}intmain(intargc,char*argv[]){inti;intcount=0;doublep[100];double*g_p;intblock_size=32;constintN=1000;intn_blocks=N/block_size+(N%block_size==0?0:1);p[0]=0;g_p=(double*)malloc(1000*sizeof(double));cudaMalloc((void**)&g_p,1000*sizeof(double));cudaMemcpy(g_p,p,1000*sizeof(double),cudaMemcpyHostToDevice);kernel<<<n_blocks,block_size>>>(g_p);cudaMemcpy(p,g_p,1000*sizeof(double),cudaMemcpyDeviceToHost);cudaFree(g_p);for(i=1;i<=1000;i++){

溫馨提示

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

評論

0/150

提交評論