opendocdocument-平行计算程式设计

上传人:微*** 文档编号:168608089 上传时间:2022-11-11 格式:DOCX 页数:243 大小:887KB
收藏 版权申诉 举报 下载
opendocdocument-平行计算程式设计_第1页
第1页 / 共243页
opendocdocument-平行计算程式设计_第2页
第2页 / 共243页
opendocdocument-平行计算程式设计_第3页
第3页 / 共243页
资源描述:

《opendocdocument-平行计算程式设计》由会员分享,可在线阅读,更多相关《opendocdocument-平行计算程式设计(243页珍藏版)》请在装配图网上搜索。

1、C語言MPI平行計算程式設計編著:鄭守成期間:民國91年1月1日電 話:(03) 5776085 x 305E-mail: c00tch00nchc.gov.twC語言MPI平行計算程式設計1第一章前言61.1 MP1平行計算軟體71.2 國家高速電腦中心的平行計算環境81.3 在1BMSP2上如何使用MPI101.3.1 1BMSP2的MPI C程式編譯指令101.3.2 IBM SP2 的 Job command file111.3.3 IBM SP2的 平行程式的執行指令131.4 在PC Cluster上如何使用MPI161.4.1 PC Cluster上C語言的MPI程式編譯指令16

2、1.4.2 PC Guster 上的 Job command file171.4.3 PC Guster上的平行程式執行指令18第二章無邊界資料交換的平行程式202.1 MP!基本指令212.1.1 mpi.h include file212.1.2 MPIJnit, MPI_Finalize222.1.3 MPI_Comm_size, MPI_Comm_rank222.1.4 MPI_Send, MPI_Recv242.2 無邊界資料交換的循序程式T2SEQ272.3 資料不切割的平行程式T2cp292.4 MPI_Scatter , MPI_Gather , MPI_Reduce352.4

3、.1 MPI_Scatter , MPI_Gather352.4.2 MPI_Reduce, MPI_Allreduce382.5 資料切割的平行程式T2DCP41第三章需要邊界資料交換的平行程式453.1 MPI_Sendrecv, IvPI_Bcast463.1.1 MPI_ Shndrecv463.1.2 MPI_Bcast473.2 邊界資料交換的循序程式T3SEQ493.3 資料不切割的邊界資料交換平行程式T3CP513.4 資料切割的邊界資料交換平行程式(一)T3DCP603.5 資料切割的邊界資料交換平行程式(二)T3DCP_266第四章格點數不能整除的平行程式724.1 格點數

4、不能整除的循序程式T4SEQ734.2 . MPI_Scatterv、MPI_Gatherv754.3 MPI_Pack、MPI_Unpack、MPI_Barrier、MPI_ Wtime784.3.1 MPI_Pack、MPI_Unpack784.3.2 MPLBarrier、MPI_Wtime814.4 資料切割的平行程式T4DCP84第五章多維陣列的平行程式915.1 多維陣列的循序程式T5SEQ925.2 多維陣列資料不切割的平行程式T5CP965.3 多維陣列第一維資料切割的平行程式T5DCP1045.4 定義二維切割的MPI函式1115.4.1 垂直座標圖示法則(Cartesian

5、Topology)1115.4.2 界定二維切割的 MP! 函式 MPI_Cart_create112MPI_Cart_coords、MPI_Cart_shift1125.4.3 定義固定間隔資料的MP!函式117MPI_Type_vector、MPI_Type_commit1175.5 多維陣列首二維切割的平行程式T5_2D119第六章MPI程式的效率提昇1336.1 Nonblocking 資料傳送1346.2 資料傳送的合併1446.3 以邊界資料計算取代邊界資料交換1496.4 輸出入資料的安排1516.4.1 事先切割輸入資料1516.4.2 事後收集切割過的輸出資料157第七章導出

6、的資料類別1607.1 導出的資料類別1617.2 陣列的轉換1687.3 兩方迴歸與管線法179第八章 多方依賴及SOR解法1888.1 四方依賴及SOR解法1898.2 黑白點間隔SOR解法1948.3 斑馬線SOR解法2048.4 八方依賴與四色點間隔SOR解法213第九章有限元素法程式2239.1 有限元素法的循序程式2249.2 有限元素法的平行程式228參考書目240Parallel Processing of 1-D Arrays without Partition241Parallel Processing of 1-D Arrays with Partition242Para

7、llel on the 1st Dimension of 2-D Arrays without Partition243Parallel on the 1st Dimension of 2-D Arrays with Partition244Partition on the 1st dimension of 3-D Arrays245第一章前言本章將介紹MP!平行計算軟體、國家高速電腦中心現有的平行計算環境、以及在各型機器上如何使用MPIo第一節簡單介紹MP!平行計算軟體。第二節介紹國家高速電腦中心現有的平行計算環境。第三節介紹如何在!BM SP2上使用MPI,包括路徑的設定、平行程式的編譯、

8、及平行程式 的執行等。第四節介紹如何在PC cluster上使用MPI ,包括路徑的設定、平行程式的編譯、及平行程式 的執行等。1.1 MPI平行計算軟體MPI (Message Passing Interface)是第一個標準化的Message Passing平行語言。可以使用 在Fortran, C、C+等語言撰寫的程式上。MPI平行程式可以在分散式記憶體平行系統上執 行,也可以在共用記憶體cluster平行系統上執行。目前系統廠商所提供的MPI軟體是屬於 MPI1.2版。它提供了一百多個函式,讓程式人員來選用。MP!協會在1998年公布了 MPI 2.0版的規格,數年之後就會有MPI 2

9、.0版的軟體可用了。日前美國的Argonne National Lab 已經公布了 MPICH 1.2版的整套軟體,該版含有MPI 2.0版的部份功能。有興趣的讀者可 以免費自網路下載該軟體,其網址是http:/www-unix.mcs.anl.gov/mpi/mpich也可以用anonymous ftp下載該軟體,其網址是ftp.mcs.anl.gov其下目錄(directory) pub/mpi 裏檔名 mpich-1.2.1.tar.Z 或 mpich-1.2.l.tar.gz ,在該目錄之下還有許多與MPI相關的資訊可供參考。1.2 國家高速電腦中心的平行計算環境目前國家高速電腦中心的

10、 !BM SP厶 !BM SP2 SMP、HP SPP2000, SGI 0rigin2000 和 Fujitsu VPP300等系統上均有該公司自備的MP!平行軟體,PC cluster上是裝用MPICH公用平行 軟體,也都有能力執行平行程式但是到目前為止,只有PC cluster; IBM SP2和!BM SP2 SMP 設有一個CPU只執行一個程式的平行環境,其他機器上則無此種設定。例如,若有一個用戶 要用四個CPU來執行其平行程式,他在IBM SP2上取得四個CPU之後,這四個CPU就僅 只執行這個平行程式直到它執行完畢為止,不會有其他程式進來跟他搶CPU時間。但是在其 他機器(如HP

11、SPP2000)上取得四個CPU之後,如果所有使用者對CPU的需求數量超過該 系統的CPU總數時,他所取得四個CPU之中的每一個CPU ,都有可能要跟其他程式以分時 方式(time sharing)共用一個 CPU。HP SPP2OOO和SGI ORIGIN2000為共用記憶體平行系統,這種電腦系統是16顆CPU共用 一組記憶體。SP2和VPP3OO是屬於分散式記憶體平行系統,每一個CPU備有它獨用的記 憶體。SP2 SMP是共用記憶體及分散式記憶體混合的平行系統,每一個node備有4顆CPU 共用一組記憶體,目前備有42個node的SMP luster。SP2和SP2 SMP是採用該系統專屬

12、的 工作排程軟體(job scheduler) LoadLeveler來安排用戶的批次工作(batch job)。使用者必須備 妥LoadLeveler的job command file ,使用llsubmit指令把該批次工作交給SP2來執行。SPP2000, ORIGIN2000 和 VPP300 是採用 NQS (Network Queue System)工作排程軟體來安排用戶的批次工作。使用者必須備妥NQS的job command file,使用qsub指令把該批次工作 交給各該系統來執行。PC cluster是採用DQS (Distributed Queue System)工作排程軟體

13、來安排用戶的批次工作,其使用方式類似NQS。1.3 在IBM SP2上如何使用MPI首先,C shell用戶要在自己home directory的.cshrc檔裏加入下列路徑,這樣才能夠抓得到 include file (mpif.lx mpif90.K mpi.h、編譯指令(mpxlR mpxlf9(X mpeg mpCCX MPI library、 和 LoadLeveler 指令(llsubmit、llq、!lstatus llcancel)set lpath=(. /usr/1 pp/ppe.poe/include /usr/lpp/ppe.poe/lib)set lpath=($lp

14、ath /usr/lpp/ppe.poe/bin /home/loadl/bin ) set path=($path $lpath)加好上述路徑之後,將.cshrc存檔,再執行source .cshrc指令,即可進行平行程式的編譯與執 行。簽退(logout)後再簽到(login)之後就不必再執行source .cshrc指令。1.3.1 IBMSP2的MPI C程式編譯指令使用MPI的C平行程式,其編譯器(compiler) 一般叫做mpicc ,但是在IBM SP2和SP2 SMP上卻叫做mpcco mpcc常用的編譯選項如下:mpcc -03 -qarch=auto -qstrict -

15、o file.x file.f其中選項03是作最高級的最佳化(level 3 0Ptimization),可使程式的計算速度加快數倍-qarch=auto是通知編譯器該程式要在同型機器上執行-qstrict是通知編譯器不要改變計算的順序-o file.x是指定執行檔名為file.x ,不指定時其內定(default)檔名為a.out1.3.2 IBM SP2 的 Job command file要在IBM SP2(ivy)上執行平行程式,使用者必須備妥oadLeveler的job command fileo例如,下面這個job command file叫做jobp4 ,它要在四個CPU上執行平

16、行程式file.xo#!/bin/csh# executable = /usr/bin/poe# arguments = /your_working_directory/file.x -euilib us# ouput=oup4# tfror=oup4# job_type=parallel# dass=medium# min_processors = 4# max_processors = 4# requirements = (Adapter = hps_user”)# wall_clock_limit = 20# queue其中 executable = /usr/bin/poe 是固定不變

17、,poe 是指 Parallel Operating Environmentarguments =執行檔所在之全路徑及檔名output=標準輸出檔名(stdout)error=錯誤訊息(errormessage)輸出檔名class=SP2 CPU的分組別,使用llclass指令可以看到分組別:short(CPU時間上限為12小時,共有10顆120MHz CPU)medium (CPU時間上限為24小時,共有64顆160MHz CPU)long (CPU時間上限為96小時,共有24顆120MHz CPU)min_processors =最少的 CPU 數目max_processors =最多的

18、CPU 數目requirements = (Adapter”hps_user)是固定不變wall_clockimit二該job最多需要的時間,單位為分鐘queue是固定不變平行計算可以使用的CPU數目,short class最多4個CPU, medium class最多32個CPU, long class最多8個CPU。由於MPI 1.2版不具備取得CPU、控制CPU、和歸還CPU的功 能,所以min_processors和max_processors要填相同的數字。如果所需要的時間較短時,加 上wall_clock_limit可以較早排入執行的行列。要在IBM SP2 SMP(ivory)上

19、執行平行程式,使用者必須備妥LoadLeveler的job command file例如,下面這個job command file叫做jobp4 ,它要在四個CPU上執行平行程式file.x#!/bin/csh# network.mpi二 cssO,shared,us# executable 二 /usr/bin/poe# arguments = /your_working_directory/file.x euilib us# ouput= oup4# tfror= oup4# job_type= parallel# dass= medium# tasks_per_node = 4# nod

20、e = 1# wall_clock_limit = 20# queue由於!BM SP2 SMP每個Node含有四棵375MHz CPU共用4GB或8GB的記憶體。class=SP2 SMP CPU的分組別,使用llclass指令可以看到分組別:short (CPU時間上限為12小時,3個Node共有6顆CPU)medium (CPU時間上限為24小時,32個Node共有!28顆CPU)bigmem (CPU時間上限為48小時,4個Node共有16顆CPU)這個class 一個Node備有8GB的共用記憶體tasks_per_node=4是說明一個Node選用四棵CPUnode= 1是說明要用

21、一個Node ,共四棵CPU平行計算可以使用的CPU數目medium class是16個Node 一共64顆CPU ,其他class不設 限。1.3.3 IBM SP2的平行程式的執行指令要在IBM SP2及SP2 SMP上執行平行程式,使用者在備妥LoadLeveler的job command file 之後,就可以使用!lsubmit指令將該job command file交給該系統排隊等候執行。例如上一節的job command file例子jobp4即可用下述指令交付執行:llsubmit jobp4工作交付之後,該工作執行的情形可用!lq指令查詢。要縮小查詢的範圍可在llq指令之後加

22、 上grep指令敘明要查詢的class或user id(例如上一個例子jobp4所選用的分組別為medium, 就可用下述指令進行查詢:llq I grep mediumllq顯示之內容有下列事項:job_iduser_idsubmittedstatus piorityclassrunning onivyl.1781.0u43ycc008/13 U:24R50mediumivy39ivyl.1814.0u50pao008/13 2012R50shortivy35其中job_id是LoadLeveler給交付的工作編定的工作代號user_id是使用者的login namesubmitted是交付

23、工作的時刻,月日時:分status是工作執行的情形R 表 RunningI 表 !dle (=waiting in queue)ST 表 Start executionNQ表Not Queued ,還在隊伍之外Priority是交付工作的優先次序,不用更動它Class是CPU分組別Running on是執行交付工作的第一個CPU代號工作交付執行之後,如果要中止該工作的執行可用llcancel指令殺掉該工作。llcancel job_id此處的job_id就是使用Uq指令所顯示之使用者交付工作的工作代號。執行過llcancel指令 之後,再使用!lq指令就可以看出該工作已經消失不見了。1.4 在

24、PC Cluster上如何使用MPI首先,使用MPICH的C shell用戶要在自己home directory的.cshrc檔裏加入下列路徑,這樣 才能夠抓得到 include file (mpif.h、mpi.h)、編譯指令(mpif77、mpicc、mpiCC)、MPI libraryx 和DQS指令。不同的PC Cluster這些存放的路徑可能不同,要向該系統的管理人詢問。其路 徑設定如下:setenv PGI /usr/local/pgiset path = (./usr/local/pgi/linux86/bin Spath)set path = ( /home/package/D

25、QS/bin Spath)set path = ( /home/package/mpich/bin Spath)其中第一行是PGI公司(Portland Group Inc.)軟體存放的路徑,第二行是PGI公司C、C+ 編譯器pgcc、pgCC存放的路徑,第三行是DQS批次工作排程軟体存放的路徑,第四行是 MPICH編譯系統存放的路徑。沒有購用PGI公司的軟體時前面兩行可以省略。1.4.1 PC Cluster上C語言的MPI程式編譯指令MPICH的C語言平行程式編譯器叫做mpicc ,其底層是使用GNU的gcc來編譯,因此可 以使用gcc的調適選項。舉例如下:mpicc -03 -o fil

26、e.x file.f其中選項-03 是選用gcc最高層次的調適選項-o file.x是指定編譯產生的執行檔為flle.x沒有指定時,內定的執行檔為a.outfile.c 是C語言平行程式如果選用PG!公司的MP!平行程式編譯器mpicc ,其底層是使用該公司的pgcc來編譯,因 此可以使用 pgcc的調適選項。其makefile舉例如下:OBJ= fle.oEXE= fle.xMPI= home/package/mpich_PGILIB= $MPI)/lib/libmpich.aMPICC = $(MPI)/bin/mpiccOPT = -02 -I$(MPI)/include$(EXE):

27、$(OBJ)$(MPICC) $(LFLAG) -o $(EXE) $(OBJ) $(LIB).f.o :$(MPICC) $(OPT) -c $ MPI_HOSTmpirun -np 4 -machinefile MPI_HOST hubksp & outp4其中#!/bin/csh是說明這是個C shell script# $ -I qty.eq.4,HPCS 是向 DQS 要求四個 CPU , qty 是數量(quantity)HPCS 是單 CPU cluster 的 queue class 代號# $ -N HUP4是說明這個工作的名字(Name)叫做HUP4# $ -A usr_i

28、d是說明付費帳號(Account)就是使用者帳號# $ -cwd是說明要在現在這個路徑(working directory)上執行程式內定的路徑是home directory# $ -j y是說明錯誤訊息要輸出到標準輸出檔$HOST_FILE 是DQS安排給這項工作的node list# np 4 hubksp 是告訴mpirun要在四個CPU上執行平行程式hubksp# & outp4是要把標準輸出檔寫入outp41.4.3 PC Cluster上的平行程式執行指令要在PC cluster上執行平行程式,使用者在備妥DQS的job command file之後,就可以使 用qsub指令將該j

29、ob command file交給PC cluster排隊等候執行。例如上一節的job command file例子jobp4即可用下述指令交付執行:qsub jobp4工作交付之後,可以使用qstat指令(不加參數)查詢整個cluster交付工作執行的情形,使用qstat -f指令查詢整個cluster各個node的狀況上述指令qsub jobp4之後使用qstat指令 顯示的內容如下:cOOtchOOHJP4hpcsOl620:1rRUNNING02/26/991051:23cOOtchOOHJP4hpcs02620:1rRUNNING02/26/991051:23cOOtchOOHJP4

30、hpcsO3620:1rRUNNING02/26/991051:23cOOtchOOHJP4hpcs04620:1rRUNNING02/26/991051:23Pending Jobs -cOOtchOO明D5700:2QUEUED02/26/991924:32第一欄是usejid ,第二欄是交付工作的名稱,第三欄是CPU代號,第四欄是DQS替交付的 工作編定的工作編號job_id ( 62 ),第五欄0:1的。是交付工作的優先序號,0:1的1是該用 戶交付的第一個工作,第六欄的r和第七欄的RUNNING表示該工作正在執行中,最後是該 工作交付時的時刻,月/日/年時:分:秒。排隊等待執行的工作

31、則出現在Pending Jobs之列, 對應RUNNING的欄位則為QUEUEDo工作交付執行之後,如果要中止該工作的執行可用qdel指令殺掉該工作。qdel job_id此處的job_id就是使用qstat指令所顯示之第四欄。執行過qde!指令之後,再使用qstat指令 就可以看出該工作已經消失不見了。第二章無邊界資料交換的平行程式最簡單的平行程式就是無邊界資料交換的平行程式。本章將利用一個很簡單的循序程式(sequential program)使用MPI指令加以平行化,並比較其計算結果以資驗證。2.1 節介紹六個 MPI 基本指令 MPUnit、MPI_Finalize、MPI_Comm_

32、size、MPI_Comm_rank MPI_Send、MPI_Recvo2.2 節介紹無邊界資料交換的循序程式T2SEQ。2.3 節說明使用這六個MPI基本指令平行化循序程式T2SEQ而成為平行程式T2CP。2.4 節介紹另外四個常用的 MPI 指令 MPI_Scatter、MPI_Gather、MPI_Reduce、MPI_Allreduceo2.5 節是使用這些指令平行化循序程式T2SEQ而成為平行程式T2DCPO2.1 MPI基本指令MP1的基本指令有下列六個,將於本節分段加以介紹。MPIJnit, MPI_Finalize,MPI_Comm_size, MPI_Comm_rank,M

33、PI_Send, MPI_Recv2.1.1 mpi.h include file使用MP!撰寫C語言平行程式時,必須在主程式之前加上include 陳述(statement)o mpi.h檔案裏含有編譯MPI平行程式所必須的MP!字彙與MPI常數(constant)o例如:#include #include #include main (argc, argv)int argc;char *argv;MPI_Finalize();return 0;)startend(int myid, int nproc, int isl, int is2, int* istart, int* iend) r

34、eturn 0;讀者可以在MP!軟體所在之路徑裏查看mpi.h的內容。不同廠商設定的MPI常數也許不盡相 同,但是所使用的MP!字彙則是完全一致。2.1.2 MPI_Init, MPI.Finalize在叫用其他MPI函式之前必須先叫用MPInit函式,來啟動該程式在多個CPU上的平行 計算工作。在程式結束之前必須叫用MPI.Finalize函式,以結束平行計算工作。所以MPInit 和MPI_Finalize在主程式裏只要叫用一次就夠了,例如:#include #include #include main (argc, argv)int argc;char *argv;MPI_Init(&a

35、rgc, &argv);MPI_Finalize();return 0;)2.1.3 MPI_Comm_size, MPI_Comm_rank通常在叫用過MPIJnit之後,就必須叫用MPI_Comm_size以得知參與平行計算的CPU個數 (nproc),及叫用MPI_Comm_rank以得知我是第幾個CPU (myid),第幾個CPU是從開始起 算。所以第一個CPU的myid值為零,第二個CPU的myid值為1 ,第三個CPU的myid值 為2 ,餘類推。通常要在幾個CPU上作平行計算是在下執行命令時決定的,而不是在程式裏 事先設定。當然,使用者也可以在程式裏事先設定要在幾個CPU上作平行

36、計算,其意義只供 程式人員做參考,實際上使用幾個CPU作平行計算是根據job command file裏min_processors 和max_processors的設定值,或np的設定值。MPI_Comm_size 和 MPI_Comm_rank 的叫用格式如下:MPI_Comm_size (MPI_COMM_WORLD, &nproc);MPI_Comm_rank(MPI_COMM_WORLD, &myid);引數MPI_COMM_WORLD是MP!內定的(default) communicator,參與該程式平行計算的全 部CPU都是屬於同一個communicator屬於同一個commu

37、nicator的各個CPU之間可以傳 送資料。MPI 1.2版不具備CPU的取得與控制功能,參與平行計算的CPU顆數從程式開始執 行到程式結束都是固定不變的。因此,這兩個MPI副程式在一個程式裏只要叫用一次就可以 To例如:#include #include #include int nproc, nyid; main (argc, argv) int argc;char *argv;MPI_Init(&argc, &argv);MPI_Comm_size (MPI_COMM_WORLD, &nproc);MPI_Comm_rank MPI_COMM_WORLD, &myid);MPI_Fin

38、alize();return 0;2.1.4 MPI_Send, MPI_Recv參與平行計算的各個CPU之間的資料傳送方式有兩種,一種叫做點對點通訊(point b point communication),另外一種叫做集體通訊,(collective communication)o 此處先介紹 點對點通訊類的MPLSend和MPLRecv,其他常用的點對點通訊及集體通訊指令容 後再介紹。一個CPU與另外一個CPU之間的資料傳送屬於1點對點通訊,送出資料的CPU要叫用 MPI_Send來送資料,而收受資料的CPU要叫用MPI.Recv來收資料。一個MPI_Send必須 要有一個對應的MPI_

39、Recv與之配合,才能完成一份資料的傳送工作。MPI_Send的叫用格式 如下:MPI_Send (void *)&data, icount, DATA_TYPE, idest, itag, MPI_COMM_WORLD);引數data要送出去的資料起點,可以是純量(scalar)或陣列(array)資料icount要送出去的資料數量,當icount的值大於一時,data必須是陣列DATATYPE是要送出去的資料類別,MP!內定的資料類別如表1.1idest是收受資料的CPU iditag要送出去的資料標籤MPI data typeC data typedescriptionMPI_CHARs

40、igned char1 -byte characterMPI_SHORTsigned short iny2-byte integerMPI.INTsigned int4-byte integerMPI_LONGsigned long int4-byte integerMPI_UNSIGNED_CHARunsigned char1 -byte unsigned characterMPI_UNSIGNED_SHORTunsigned short int2-byte unsigned integerMPI_UNSIGNEDunsigned int4-byte unsigned integerMPI_

41、UNSIGNED_LONGunsigned long int4-byte unsigned integerMPI_FLOATfloat4-byte floating pointMPLDOUBLEdouble8-byte floating pointMPI_LONG_DOUBLElong double8-byte floating pointMPI_PACKED表1.1 C語言常用的MPI基本資料類別MPI_Recv的叫用格式如下:MPI_Recv (void *)&data, icount, DATA_TYPE, isrc, itag, MPI_COMM_WORLD, istat);引數dat

42、a是要收受的資料起點icount是要收受的資料數量DATATYPE 是要收受的資料類別isrc是送出資料的CPU iditag是要收受的資料標籤istat是執行MPI_Recv副程式之後的狀況istat為一整數陣列,該陣列的長度為在mpi.h裏已經設定的常數MPI_STATUS_SIZE ,寫法如下MPI_Status istatMPI_STATUS_SIZEl;若該電腦系統的mpi.h裏沒有設定MPI_STATUS_SIZE常數時,可用任意整數取代如下MPI_Status istat8;一個CPU同時要收受多個CPU送來的資料時,若不依照特定的順序,而是先到先收,則其指令為MPI_Recv(

43、 (void *)&buff, icount, DATA_TYPE, MPI_ANY_SOURCE, itag, MPI_COMM_WORLD, istat);若要判斷送出該資料的CPU id時就要用到STATUS變數如下isrc= istat( MPI_SOURCE);MPI在傳送資料(MPI_Send、MPI_Recv)時,是以下列四項構成其信封(envelope),用以識別一件訊息(message)o1 .送出資料的CPU id2 .收受資料的CPU id3 .資料標籤4 . communicator所以一個CPU送給另外一個CPU多種資料時,不同的資料要用不同的資料標籤,以資識別。2.

44、2 無邊界資料交換的循序程式T2SEQT2SEQ是個無邊界資料交換的循序程式,在test data generation段落裏設定陣列b、c, d的 值,然後把這些陣列寫到磁檔上。其目的是便利往後的範例程式可以讀入同一組資料作平行 計算,用來驗證其計算的結果是否正確。這個程式的計算部份只有一個for loop ,而且該loop裏只有兩個計算陳述,其目的是方便 往後說明如何將這一類for loop平行化。實際的計算程式也許有數百個或數千個for loop ,但 是其平行化的方法是樣的。/* PROGRAM T2SEQ sequential version of 1 -dimensional a:

45、ray operation */#include #include #define n 200main () double suma, anl,bnl, cn, dn;int i, j FILE *fp;/* test dla gaieration aid wite out t) fie input.dat */for (i = 0; i n; i+) j=i+l;bi = 3./(double) j + 1.0;ci =2./(double) j+ 1.0;di = 1./(double) j + 1.0; ) fp = fopen( input.dat, w); fwrite( (void

46、 *)&b, sizeof(b), 1, fp );fwrite( (void *)&c, sizeof(c), 1, fp );fwrite( (void *)&d, sizeof(d), 1, fp ); fclose( fp);/* read input.dat, compute aid wite outthe esult */fp = fopen( ,input.datM, Mrn);fread( (void *)&b, sizeof(b), 1, fp );fread( (void *)&c, sizeof(c), 1, fp );fread( (void *)&d, sizeof(

47、d), 1, fp );fclose( fp);suma = 0.;for (i = 0; i n; i+) ai = bi+ci*di;suma += ai;)for (i = 0; i n; i+=40) printf(%,3ft%,3ft%.3ft%.3ft%.3ft%,3ft%.3ft%.3fn,ai,ai+51,ai+101,ai+151,ai+201,ai+251,ai+301,ai+351);)printf( sum of A=%fn,suma);return 0;循序程式T2SEQ的測試結果如下:10.0003.0562.5622.3832.2902.2342.1962.168

48、2.1482.1312.1182.1082.0992.0912.0852.0792.0742.0702.0662.0632.0602.0572.0542.0522.0502.0482.0462.0442.0432.0412.0402.0392.0372.0362.0352.0342.0332.0322.0312.031sum of A=438.5480792.3 資料不切割的平行程式T2cp平行程式的切割(decomposition/partition)方式有兩種。一種是計算切割而資料不切割,另 外一種是計算和資料都切割。前一種切割方式不能夠節省記憶體的使用量是其缺點,但是陣 列的描述與循序版

49、(sequential version)完全相同,程式容易閱讀也容易維護是其優點。後一 種切割方式能夠節省記憶體的使用量是其最大優點,但是陣列的描述與循序版差異較大,程 式的閱讀與維護比較困難是其缺點。如何將循序程式T2SEQ平行化呢?這一節先介紹計算切割而資料不切割的方法,2.5節 再介紹計算及資料同時切割的方法。假如T2SEQ程式要在四個CPU上平行計算而資料不切割時,就把維陣列a、b、c、d均 分為四段,各個CPU負責計算其中的一段,分工合作完成整個計算工作。此處是利用一個 startend函式來計算各個CPU負責計算段落的起迄index。它是把第一段分給CPU0 ,第二段 分給CPU1

50、 ,第三段分給CPU2 ,餘類推。如圖2.1所示:computing partition without data pailition i start iendntotalIIIcpuO 。i start iendntotalIIICpul 000000 00000000000istart iendntotalIIIcpu2 。0。istart iendcpu3 array element hside erritory array element outside territory圖2.1計算切割而資料不切割的示意圖圖2.1裏符號代表轄區內的陣列元素,符號。代表轄區外的陣列元素,各個CPU負責

51、計算的 範圍是從該CPU的istart到iend。由於MPI 1.2版不具備平行輸出入(Parallel I/O )的功能,所以輸入資料由CPU0 ( myid值為 零)讀入後,利用一個for loop分段傳送(MPI.Send )給其他三個CPU ,而其他三個CPU (myid值大於零)則接收由CPU0送來給該CPU的陣列片段。請留意,傳送不同的陣列片 段要使用不同的資料標籤(itag ),每一個MPI_Send 一定有一個對應的MPI_Recvo每一個 CPU算完自己負責的段落後,把計算的結果(陣列a的一部份)傳送給CPU0 , CPU0利用 一個for loop把其他三個CPU送來的陣列

52、片段逐一接收下來。然後由CPU0單獨計算整個a 陣列各個元素的和suma ,再把a陣列和suma列印出來。/* PROGRAM T2CPcomputation partition without data partition of 1-dimensional arrays */#include #include #include #define n 200main (argc, argv) int argc;char *argv;double suma, anl, bn, cn, dfn;int i, j k;FILE *fp;intnproc, nyid, start, end, count

53、;int itag, isrc, idest, istart 1, icountl;intgstart16,nd16, g:ount16;MPI_Status istat8;MPI_Comm comm;MPI_Init (&argc, &argv);MPI_Comm_size (MPI_COMM_WORLD, &nproc);MPI_Comm_rank (MPI_COMM_WORLD, &myid);startend( nproc, 0, n - 1, gstart, gend, gcount);istart=gstartmyid;iend=gendfmyidl;comm=MPI_COMM_W

54、ORLD;printf( nNPROC,MYID,ISTART,IEND=%dt%dt%dt%dnn,nproc,myid,istart,iend);/* READ input.dat, COMPUTE AND WRITE CUT THE FESULT */if ( myid=0) fp = fopen( ninput.dat, Hrn);fread( (void *)&b, sizeof(b), 1, fp );fread( (void *)&c, sizeof(c), 1, fp );fread( (void *)&d, sizeof(d), 1, fp );fclose( fp);for

55、 (idest = 1; idest nproc; idest+) istart 1 =gstart idest;icountl =gcount idest;itag=10;MPI_Send (void *)&bistartl, icountl, MPI_DOUBLE, idest, itag, comm); itag=20;MPI_Send (void *)&cistartl, icountl, MPI_DOUBLE, idest, itag, comm); itag=30;MPI_Send (void *)&distartl, icountl, MPI_DOUBLE, idest, ita

56、g, comm);else icount=gcountmyid;isrc=O;itag=10;MPI_Recv (void *)&bistart, icount, MPI_DOUBLE, isrc, itag, comm, istat);itag=20;MPI_Recv (void *)&cistart, icount, MPI_DOUBLE, isrc, itag, comm, istat);itag=3O;MPI_Recv (void *)&distart, icount, MPI_DOUBLE, isrc, itag, comm, istat);/*compute, collect co

57、mputed result and write out the resultifor (i = istart; i Q icount=gcountmyid; idest=O;MPI_Send(void *)&aistart, icount, MPI_DOUBLE, idest, itag, comm);)else for (isrc=l; isrc nproc; isrc+ ) icountl =gcountisrc;istartl=gstartisrc;MPI_Recv(void *)&aistartl, icountl, MPI_DOUBLE, isrc, itag, comm, ista

58、t); )if (myid = 0) for (i = 0; i n; i+=40) printf( ”.3nt%.3nt%.3ft%.3ft%.3ft%.3ft%.3nt%3An”,ai,ai+5,ai+10,ai+15,ai+20,ai+25,ai+30,ai+35);)suma=0.0;for (i = 0; i n; i+) suma+=ai;printf( sum of A=%fn,suma);MPI_Finalize();return 0;startend(,int nproc,int isl,int is2,int gstart16,int gend16, int gcount16) (int ilength, block, r;ilength=is2-isl + l;iblock=ilength/nproc;ir=ilength-iblock*nproc;for (i=0; i nproc; i+ ) if(i ir) gstarti=is l+i*(iblock+1);gendi=gstarti+iblock;)else gstarti=is 1 +i*iblock+ir;gendi=gstartf il+iblock-1;)if(ilength 1) gstarti=l; gendil=0;gcounti=gendi-gstarti

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!