预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共54页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

MPI使用C語言 學校:台北科技大學 編寫者:呂宗螢 指導教授:梁文耀老師 MPI簡介 MPI全名MessagePassingInterface,MPIisalanguage-independentcommunicationsprotocolused toprogramparallelcomputers 定義了process和process之間傳送訊息的一個標準,適用於各種不同的傳遞媒介。不止是單一 電腦內的process和process傳送訊息,還可以在網路上不同電腦間的process與process的溝通。目 的是希望能提供一套可移值性和高效率的傳送訊息的標準。有相同功能的是PVM(ParallelVirtual Machine),但現在一般較多人使用的是MPI。 因為他只是一個標準(interface/standard),所以MPI本身不是library,只是提供給各個單位自 行製作MPI時所必須遵循標準。所以市面上有許多的ex:MPICH、MSMPI、Lan/MPI…等,均是 遵循MPI的標準所實作出來的MPI,而各廠商亦可以針對自己的硬體做最佳化。 MPICH便是其中之一實作MPI標準的library,提供了MPI的function,以便程式設計師撰寫 平行運算程式,也是最基本MPI實作,其優點是可以跨平台(只能要能裝mpich的環境均可,但程 式的撰寫不能相依於OS,ex:使用pthread.h),提供語言有C、Fortan77、C++、Fortan90(c++和 fortan90在mpich2才支援)。 撰寫程式和執行的步驟 1.啟動MPI環境(亦可以在Compiler完再啟動,mpd.hosts定義了一些mpi環境的主機名稱) mpdboot-n4-fmpd.hosts(-n是指啟動主機的數目,-f是指定義主機的檔案) 2.撰寫MPI程式 vihello.c 3.Compile mpicchello.c–ohello.o 4.執行程式 mpiexec–n4./hello.o(-n是指process(行程)的數目) 5.結束MPI mpdallexit 撰寫平行程式的基本觀念 1.需由程式設計師來規畫平行化程式: 所謂平行程式並不是指說你寫好一個程式,只要丟到平行運算環境,該環境便會自動幫你把程 式分開,然後做平行處理。而是程式設計師在撰寫時就必須規畫好程式那些可以分開做平行化,然 後丟到平行運算環境後,該環境會依據你的程式規畫,而將程式分開做平行處理,所以怎麼把程式 平行化是很重要的。 (MPI會把程式A整個複製到各個電腦,然後各節點只執行自己那一段,這與SIMD的模式類似) 2.並不是只要將程式平行化之後就能提高程式的效率 確實程式分成了數個部份同時給不同的電腦做處理,減少了電腦的資源消耗,但因為平行程式 在將資料傳送到每個process是很花時間的,如果process分散到不同的電腦時,在網路上,MPI 在以網路為交換資料的介面底層也是使用TCP/IP網路協定在傳送資料,在傳送時所浪費的時間是 不可避免,當然還有許多其他的資源交換時的浪費,所以通常如果在所要處理的程式資料量很小, 是看不出平行程式所帶來的效率的。 但當所要處理的程式資料量很大時,在長時間上來看,平行程式確實是比較簡省時間而且來得 有效率的。 MPI程式基本架構 #include"mpi.h" MPI_Init(); DosomeworkorMPIfunction example: MPI_Send()/MPI_Recv() MPI_Finalize(); MPI一些基本function intMPI_Init(int*argc,char*argv[]) intMPI_Comm_rank(MPI_Commcomm,int*rank) doubleMPI_Wtime() intMPI_Finzlize() intMPI_Abort(MPI_Commcomm,interrorcode) MPI_Init MPI_Init初始了一些東西,包含了所有process及提供互相傳遞訊息所需的資料,可以讓這 些mpi的process互相溝通的communicator(溝通者),初始的communicator包含了有 MPI_COMM_WORLD和MPI_COMM_SELF,並將指令參數(argc,argv)複製到所有process。 MPI_COMM_WORLD 是一個communicator,主要作用是指出辨別所有有加入平行運算環境的Processes,而process 和process溝通時所使用的functioncall都要用他做為參數