資源描述:
《OpenMP+MPI混合并行編程》由會員上傳分享,免費在線閱讀,更多相關內容在教育資源-天天文庫。
1、HarbinInstituteofTechnology并行處理與體系結構實驗報告實驗題目:OpenMP+MPI混合并行編程院系:計算機科學與技術姓名:學號:實驗日期:2011-12-25哈爾濱工業(yè)大學實驗四:OpenMP+MPI混合并行編程一、實驗目的1、復習前幾次實驗的并行機制,即OpenMP與MPI編程模式。2、掌握OpenMP與MPI混合并行編程模式。二、實驗內容1、使用OpenMP+MPI混合編程并與OpenMP、MPI單獨編程的比較。在OpenMp并行編程中,主要針對細粒度的循環(huán)級并行,主要是在循環(huán)中將每次循環(huán)分配給各個線程執(zhí)行,主要應用在
2、一臺獨立的計算機上;在MPI并行編程中,采用粗粒度級別的并行,主要針對分布式計算機進行的,他將任務分配給集群中的所有電腦,來達到并行計算;OpenMp+MPI混合編程,多臺機器間采用MPI分布式內存并行且每臺機器上只分配一個MPI進程,而各臺機器又利用OpenMP進行多線程共享內存并行。OpenMPMPI并行粒度是線程級并行進程級的并行存儲方式共享存儲分布式存儲數據分配隱式分配顯示分配編程復雜度相對簡單,充分利用了共享存儲體系結構的特點,避免了消息傳遞的開銷。數據的放置策略不當可能會引發(fā)其他問題,并行化的循環(huán)粒度過小會增加系統(tǒng)開銷等。編程模型復雜,需
3、要分析及劃分應用程序問題,并將問題映射到分布式進程集合;細粒度的并行會引發(fā)大量的通信,需要解決通信延遲大和負載不平衡兩個主要問題,調試MPI程序麻煩,MPI程序可靠性差,一個進程出問題,整個程序將錯誤??蓴U展性可擴展性差,OpenMP采用共享存儲,意味著它只適應于SMP、DSM機器,不適合于集群??蓴U展性好,適合于各種機器。并行化支持粗粒度的并行,但主要還是針對細粒度的循環(huán)級并行。將串行程序轉換為并行程序時無須對代碼作大的改動。并行化改進需要大量的修改原有的串行代碼。2、分析影響程序性能的主要因素。在采用OpenMP實現的并行程序中,由于程序受到計算
4、機性能的影響,不能大幅度的提高程序運行速度,采用了集群的MPI并行技術,程序被放到多臺電腦上運行,多臺計算機協(xié)同運行并行程序,但是,在集群中的每臺計算機執(zhí)行程序的過程又是一個執(zhí)行串行程序的過程,因此提出的OpenMP+MPI技術,在集群內采用MPI技術,減少消息傳遞的次數以提高速度,在集群的每個成員上又采用OpenMP技術,節(jié)省內存的開銷,這樣綜合了兩種并行的優(yōu)勢,來提升并行程序的執(zhí)行效率。三、實驗原理OpenMP編程:使用Fork-Join的并行執(zhí)行模式。開始時由一個主線程執(zhí)行程序,該線程一直串行的執(zhí)行,直到遇到第一個并行化制導語句后才開始并行執(zhí)行
5、。含義如下:①Fork:主線程創(chuàng)建一隊線程并行執(zhí)行并行域中的代碼;②Join:當各線程執(zhí)行完畢后被同步或中斷,最后又只有主線程在執(zhí)行。MPI編程:消息傳遞編程模型是使用顯式方式控制并行性的分布存儲模型,MPI是這一模型的事實標準。MPI可移植到分布和共享存儲體系結構上,而且允許靜態(tài)任務調度。顯式并行通常提供了一個更好的性能和可移植性。特別適用于粗粒度的并行,使用MPI實現單程序多數據(SPMD)并行模型時,每個進程只能讀寫本地內存中的數據,對遠程數據的訪問則通過進程間顯式的消息傳遞(庫函數調用)來完成的。MPI包含了多種優(yōu)化的組通信庫函數,可供編程人
6、員選擇使用最佳的通信模式。OpenMP+MPI編程:在OpenMP并行區(qū)域內不要通信,這里通信指的是不同節(jié)點內的線程間的通信,在節(jié)點中多線程公用的代碼間的通信會急劇增加帶寬競爭;在單個線程中也盡量不要通信,因為通信一般都蘊含著同步操作,這會使得性能大大下降。如果必須在線程中通信,也應把通信次數盡可能的減少,或者把需要進行消息傳遞的代碼改寫到線程的外面進行通信;線程中的同步次數也是影響性能的一個重要因素,應該慎重使用同步操作和那些蘊含同步的操作,避免節(jié)點內不必要的數據拷貝;四、實驗結果和分析1、一個簡單的OpenMP+MPI程序“test.c”#inc
7、lude#include#includeintmain(intargc,char**argv){intntask,mytask;MPI_Init(&argc,&argv);MPI_Comm_size(MPI_COMM_WORLD,&ntask);MPI_Comm_rank(MPI_COMM_WORLD,&mytask);#pragmaompparallel{printf("Thread%dontask%d",omp_get_thread_num(),mytask();}MPI_Finalize();r
8、eturn0;}在程序中,首先進行了一些關于MPI的一些初始化和設置:MPI_Init、MPI_Comm_s