《平行计算程式设计.docx》由会员分享,可在线阅读,更多相关《平行计算程式设计.docx(234页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Fortran BeMPI平行tl算程式编著:奠B守成期山民国192年2月12日15: (03) 5776085 x 305E-mail : cOOtchOOnchc.gov.twFortran II 言1MPI平行tt算程式1第一章前言61.1 MPI平行算戟醴71.2 g|家高速路舆tt算中心的平行it算璟境81.3 在IBM系统上如何使用MPI101.3.1 IBM系统的MPI Fortran程式编群指令101.3.2 IBM 系统的 Job command file111.3.3 IBM系统的平行程式的轨行指令141.4 在PCCluster上如何使用MPI171.4.1 PC Clu
2、ster 上的 MPI Fortran 程式编葬指令171.4.2 PC Cluster 上的 Job command file181.4.3 PC Cluster上的平行程式轨行指令19第二章舞遑界资料交换的平行程式212.1 MPI基本指令222.1.1 mpif.h include file222.1.2 MPI_INIT, MPI_HNALIZE232.1.3 MPI_COMM_SIZE, MPI_COMM_RANK232.1.4 MPI_SEND, MPI_RECV242.2 瓢遵界资料交换的循序程式T2SEQ282.4 MPI_SCATTER , MPI_GATHER , MPI_
3、REDUCE362.4.1 MPI_SCATTER , MPI_GATHER362.4.2 MPI_REDUCE, MPI_ALLREDUCE392.5 资料切割的平行程式T2DCP42第三章需要遵界资料交换的平行程式463.1 MPI_SENDRECY MPI_BCAST473.1.1 MPI_SENDRECV473.1.2 MPI.BCAST483.2 遏界资料交换的循序程式T3SEQ503.3 资料不切割的暹界资料交换平行程式T3cp523.4 资料切割的遏界资料交换平行程式(一)T3DCP_1613.5 资料切割的遏界资料交换平行程式(二)T3DCP_266第四章格黠数不能整除的平行程
4、式724.1 格黠数不能整除的循序程式T4SEQ734.2 .MPLSCATTERV、MPI_GATHERV754.3 MPI_PACK、UNPACK. BARRIER. WTIME794.3.1 MPI_PACK、MPI_UNPACK794.3.2 MPI_BARRIER、MPI_WTIME834.4 资料切割的平行程式T4DCP85第五章多雉障列的平行程式915.2 多雉阵列资料不切割的平行程式T5cp965.3 多雒障列末雉资料切割的平行程式T5DCP1055.4 舆二雉切割有的MPI副程式1135.4.1 垂直座襟圃示法见J (CartesianTopology)1135.4.2 界定
5、二雉切割的 MPI 副程式 MPI_CART_CREATE114MPI_CART_COORDS. MPI_CART_SHIFT1145.4.3 定羲固定隔资料的MPI副程式118MPI_TYPE_VECTOR. MPI_TYPE_COMMIT1185.5 多雉障列末二雒切割的平行程式T5_2D121第六章MPI程式的效率提昇1366.1 Nonblocking 资料僖送1376.2 资料停送的合饼1486.3 以遴界资料算取代遏界资料交换1536.4 W?出入资料的安排1556.4.1 事先切割输入资料1556.4.2 事接收集切割遇的输出资料158第七章溥出的资料别1617.1醇出的资料别1
6、627.3雨方逗牖舆管法180第八章 多方依$1及SOR解法1868.1 四方依11及SOR解法1878.2 黑白黠隔SOR解法1918.3 斑 SOR 解法2008.4 八方依$1舆四色黠隔SOR解法207第九章有限元素法程式2169.1 有限元素法的循序程式2179.2 有限元素法的平行程式220附一 撰嘉言的MPI程式231参考害目235Parallel Processing without Partition of1-D Arrays236Parallel Processing with Partition of 1-D Arrays237Parallel on the 2nd Dim
7、ension of 2-D Arrays without Partition238Parallel on the 2nd Dimension of 2-D Arrays with Partition239Partition on the 3rd dimension of 3-D Arrays240第一章前言本章耨介貂MPI平行算戟阈家高速路舆tl算中心现有的平行tl算璟境、以及在 各型械器上如何使用MPIo第一第曾军介貂MPI平行言十算戟:18。第二第介貂阈家高速路舆算中心垣有的平行算璟境。第三第介貂如何在IBM系统上使用MPI ,包括路的1殳定、平行程式的编葬、及平行 程式的孰行等。第四第介
8、貂如何在PC cluster上使用MPI ,包括路的定、平行程式的编群、及平行程式 的轨行等。1.1 mpi平行fi算戟:醴MPI (Message Passing Interface)是第一彳固襟型化的Message Passing平行言。可以使用 在Fortran, C、C+等II言撰嘉的程式上。MPI平行程式可以在分散式暂己惊醴平行系统上轨 行,也可以在共用得己惊醴平行系统上轨行。目前系统摩商所提供的MPI勒:醴是SB於MPI1.2 版。它提供了一百多他副程式程式人员来il用。MPI愤曾在1998年公布了 MPI 2.0版 的规格,数年之接就曾有MPI 2.0版的朝:!可用了。日前美阈的
9、Argonne National Lab已 公布了 MPICH 1.2.0版的整套戟醴,版含有MPI 2.0版的部份功能。有典趣的者可以 免费自路下戟醴,其址是http:/www-unix.mcs.anl.gov/mpi/mpich也可以用anonymous ftp下载敦:1 ,其址是ftp.mcs.anl.gov其下目 (directory) pub/mpi 裹槽名 mpich-1.2.0.tar.Z 或 mpich120.tar.gz ,在目 之下 逮有三午多舆MPI相的可供参考。1.2 阈家高速路舆tt算中心的平行ft算璟境目前域I家高速路舆 11算中心的 IBMSP2、IBMSP2SM
10、P、IBMp690、HPSPP2200. SGI 0rigin2000和Fujitsu VPP300等系统上均有公司自的MPI平行戟醴,PC cluster上是装 用MPICH公用平行戟醴,也都有能力孰行平行程式o但是到目前悬止,只有PC cluster. IBM SP2. IBM SP2 SMP和IBM p690 有一彳固CPU只孰行一彳固程式的平行璟境,其他檄器上刖 辗此槿定。例如,若有一彳固用户要用四彳固CPU来孰行其平行程式,他在IBMSP2上取得 四他CPU之彳及,道四他CPU就仅只孰行道彳固平行程式直到它轨行完止,不曾有其他程 式迤来跟他揖CPU畴但他在其他檄器(如HP SPP20
11、00)上取得四彳固CPU之彳及,如果所 有使用者封CPU的需求数量超系统的CPU ,他所取得四彳固CPU之中的每一他 CPU ,都有可能要跟其他程式以分畴方式(time sharing)共用T固CPU。HP SPP2000和SGI ORIGIN2000悬共用言己惊IS平行系统,)1系统是16果复CPU共用 SP2和VPP300是匾於分散式言已惊醴平行系统,每一他CPU倩有它褐用的 惊醴。IBM SP2 SMP及IBM p690是共用得己惊醴及分散式官己1115混合的平行系统,SP2 SMP 每一IS node借有4 SI CPU共用一司己惊醴,目前借有42 node的SMP clustero
12、p690每一 f固node倩有32 SI CPU共用一己惊醴,目前借有8彳固node的SMP clustero SP2、SP2 SMP 和p690是探用系统U匾的工作排程戟IS (job scheduler) LoadLeveler来安排用户的批次 工作(batch job)。使用者必须借妥LoadLeveler的job command file ,使用llsubmit指令把批 次工作交给系统来轨行。SPP2000. ORIGIN2000和VPP300是探用NQS (Network Queue System)工作排程戟it来安排用户的批次工作。使用者必须借妥NQS的job command fi
13、le , 使用qsub指令把批次工作交给各系统来轨行。PC cluster是探用DQS (Distributed Queue System)工作排程戟醴来安排用户的批次工作,其使用方式似NQS。1.3 在IBM重月窗系统上如何使用MPI首先,C shell用户要在自己home directory的.cshrc槽裹加入下列路 , if檬才能多包抓得到 include file (mpif.h mpif90.h、mpi.h)、编群指令(mpxlf、mpxlf90、mpcc)、MPI library 和 LoadLeveler 指令(llsubmit Hq、llstatusx llcancel)os
14、et lpath=(./usr/1 pp/ppe.poe/include /usr/lpp/ppe.poe/lib)set lpath=($lpath /usr/1 pp/ppe.poe/bin /home/loadl/bin ) set path=($path $lpath)加好上述路之彳度,符.cshrc存槽,再孰行source .cshrc指令,即可谨行平行程式的编群典孰 行。筵退(logout)彳爰再筵到(login)之彳爰就不必再寻I行source .cshrc指令。1.3.1 IBM 躺系统的MPI Fortran程式群指令使用MPI的Fortran 77平行程式,其编群器(com
15、piler) 一般叫做mpif77,但是在IBM重系统上郤叫做mpxlfo mpxlf常用的编Ifil项如下:mpxlf -03 -qarch=auto -qstrict -o file.x file.f其中IB工直-03是作最高级的最佳化(level 3 0Ptimization),可使程式的tt算速度加快数倍-qarch=auto是通知编葬器程式要在同型檄器上轨行-qstrict是通知编群器不要改建It算的)嗔序-o file.x是指定期l行檎名file.x ,不指定畴其内定(default)槽名卷a.out1.3.2 IBM 胎系统的 Job command Hie要在IBM SP2(i
16、vy)上轨行平行程式,使用者必须借妥LoadLeveler的job command fileo例如,下面道彳固job command file叫做jobp4 ,它要在四彳固CPU上期I行平行程式file.xo#!/bin/csh# executable = /usr/bin/poe# arguments = /your_working_directory/file.x -euilib us# output = outp4# error = outp4# job_type = parallel# class = medium# min_processors = 4# max_processors
17、 = 4# requirements = (Adapter = nhps_userH)# wall_clock_limit = 20# queue其中 executable = /usr/bin/poe 是固定不建,poe 是指 Parallel Operating Environmentarguments =轨行槽所在之全路及槽名output =襟津翰出槽名(stdout)error =哥I息(error message)输出槽名class= SP2CPU的分别,使用Hclass指令可以看到分别:short(CPU畤上限悬12小畴,共有101 120MHzCPU)medium (CPU上限悬
18、24小畴,共有64颗160MHz CPU)long (CPU上限悬96小畴,共有24颗120MHz CPU)min_processors =最少的 CPU 数目max_processors =最多的 CPU 数目requirements = (Adapter = nhps_usern)是固定不燮wall_clock_limit =job最多需要的畤,军位悬分queue是固定不燮平行tt算可以使用的CPU数目,short class最多4彳固CPU, medium class最多32 IS CPU , 10ngelass最多8彳固CPU。由於MPI 1.2版不具借取得CPU、控制CPU、和皇帝i
19、f CPU的功能, 所以min_processors和max_processors要填相同的数字。要在IBM SP2 SMP (ivory)上轨行平行程式,使用者必须借妥LoadLeveler的job command fileo例如,下面11彳固job command file叫做jobp4 ,它要在四彳固CPU上轨行平行程式file.Xo#!/bin/csh# network.mpi= cssO,shared,us# executable = /usr/bin/poe# arguments = /your_working_directory/file.x -euilib us# output
20、= outp4# error= outp4# job_type= parallel# class= medium# tasks_per_node = 4# node = 1# queue由於IBM SP2 SMP每彳固Node含有四棵375MHz CPU共用4GB或8GB的言己惊醴。class= SP2 SMPCPU的分别,使用llclass指令可以看到分别:short (CPU上限卷12小畴,3 Node共有6颗CPU)medium (CPU畤上限悬24小畴,32他Node共有128颗CPU)bigmem (CPU畤上限卷48小畴,4他Node共有16颗CPU)il彳固class 彳固Nod
21、e借有8GB的共用言已惊IStasks_per_node=4 是 明一Node IS用四棵 CPUnode= 1是明要用一彳固Node ,一共四棵CPU平行tt算可以使用的CPU数目medium class是8彳固Node 一共32颗CPU。要在IBM p690上轨行平行程式,使用者必须倩妥LoadLeveler的job command fileo例如,下面道1固job command file叫做jobp8 ,它要在8他CPU上轨行平行程式file.Xo#!/bin/csh# executable = /usr/bin/poe# network.mpi= csss,shared,us# ar
22、guments=/your-working-directory/file.x# output = outp8# error = outp8# job_type = parallel# class = 8cpu# tasks_per_node = 8# node = 1# queue由於IBMp690每彳固Node含有32棵1.3 GHz CPU共用128GB的每己醴。class= p690 CPU的分组别,使用llclass指令可以看到分组别:32cpu(CPU上限悬36小畴,2彳固Node共有64 CPU)16cpu(CPU上限悬72小畴,1彳固Node共有32 CPU)8cpu(CPU上限
23、悬72小畴,6彳固Node共有188颗CPU)4cpu(CPU上限悬96小畤,6彳固Node共有188颗CPU)serial(CPU上限悬168小畴,1彳固Node共有32 CPU)tasks_per_node=8 是明一彳固 Node 用 8 棵 CPUnode=l是明要用一彳固Node , 一共8棵CPU1.3.3 IBM 躺系统的平行程式的轨行指令要在IBM雷系统上轨行平行程式,使用者在借妥LoadLeveler的job command file之彳及, 就可以使用llsubmit指令耨job command file交给系统排除等候轨行。例如上一第的job command file例子
24、jobp4即可用下述指令交付孰行: llsubmit jobp4工作交付之彳爰,工作轨行的情形可用llq指令查前。要缩小查前的甄圉可在llq指令之彳爰加 上grep指令叙明要查前)的class或user id,例如上一(固例子jobp4所IS用的分&别卷medium, 就可用下述指令it行查前:llq I grep mediumRunning onllq示之内容有下列事项:job_iduserjdsubmittedstatus priorityclassrunning onivy 1.1781.0u43ycc008/13 11:24R50mediumivy39ivyl.1814.0u50pao
25、008/13 20:12R50shortivy35其中job_id是LoadLeveler给交付的工作编定的工作代虢user_id是使用者的login namesubmitted是交付工作的畤刻,月/日畴:分status是工作轨行的情形R 表 RunningI 表 Idle (=waiting in queue)ST 表 Start executionNQ表Not Queued ,逮在除伍之外Priority是交付工作的僵先次序,不用更勤它Class是CPU分别是孰行交付工作的第一彳固CPU代虢工作交付孰行之彳度,如果要中止工作的轨行可用llcancel指令毅:掉工作。llcancel job
26、_id此虑的job_id就是使用llq指令所Ig示之使用者交付工作的工作代虢。轨行遇llcancel指令 之彳度,再使用Hq指令就可以看出工作已消失不见了。1.4 在PC Cluster上如何使用MPI首先,使用MPICH的C shell用户要在自己home directory的.cshrc槽凄加入下列路 , 1IW 才能别I抓得到 include file (mpif.h. mpi.h)、编If 指令(mpif77、mpicc)、MPI library,和 DQS 指令。不同的PC Cluster道些存放的路可能不同,要向系统的管理人前冏。其路言殳定 如下:setenv PGI /usr/l
27、ocal/pgiset path = (/usr/local/pgi/linux86/bin $path)set path = (/package/DQS _hpcserv2/bin $path)set path = ( /package/mpich _hpcserv2/bin $path)其中第一行是PGI公司(Portland Group Inc.)敦:醴存放的路 ,第二行是PGI公司Fortran77 编If器pgf77存放的路,第三行是DQS批次工作排程里:体存放的路,第四行是MPICH编 If系统存放的路没有瞒用PGI公司的戟醴畴前面雨行可以省略。1.4.1 PC Cluster 上
28、的 MPI Fortran 程式H群指令MPICH的Fortran77平行程式编葬器叫做mpif77 ,其底盾是使用GNU的g77来编群,因此可以使用g77的遹逗项。聚例如下:mpif77 -03 -o file.x file.f-03是逗用g77最高眉次的项-o file.x是指定编11崖生的轨行槽悬file.x没有指定畴,内定的轨行槽悬a.outfile.f 是Fortran77平行程式如果逗用PGI公司的MPI平行程式编群器mpif77 ,其底是使用公司的pgf77来编群,因此可以使用pgf77及pgf90的项。其makefile聚例如下:OBJ= file.oEXE= file.xMP
29、I = /home/package/mpich_PGILIB = $(MPI)/lib/LINUX/ch_p4LFLAG = L$(LIB) -IfmpichMPIF77 = $(MPI)/bin/mpif77OPT = -02 -I$(MPI)/include$(EXE): $(OBJ)$(MPIF77) $(LFLAG) -o $(EXE) $(OBJ) $(LIB),f.o :$(MPIF77) $(OPT) -c $ MPI_HOSTmpirun -np 4 -machinefile MPI_HOST hubksp & outp4其中 #!/bin/csh是明道是他C shell sc
30、ript#$ -1 qty.eq.4是向DQS要求四IS CPU , qty是数量(quantity)#$ -N HUP4是明道彳固工作的名字(Name)叫做HUP4#$ -A user_id是明付费111s虢(Account)就是使用者幔虢#$ -cwd是就:明要在现在if彳固路1(working directory)上轨行程式内定的路是home directory#$-jy是明哥1息要输出到襟津输出槽$HOST_FILE是DQS安排给道项工作的node list-np 4 hubksp是告 mpirun要在四彳固CPU上轨行平行程式hubksp& outp4是要把襟津输出槽瘾入outp41
31、.4.3 PC Cluster上的平行程式轨行指令要在PC cluster上轨行平行程式,使用者在借妥DQS的job command file之接,就可以使用qsub32指令耨job command行le交给PC cluster排除等候轨任 例如上一第的job command file例子jobp4即可用下述指令交付孰行: qsub32 jobp4工作交付之接,可以使用qstat32指令(不加参数)查前整彳固cluster交付工作孰行的情形, 使用qstat32-f指令查莉)整1(固cluster各node的状况 上述指令qsub32 jobp4之彳爰使用qstat32 指令骸示的内容如下:c
32、OOtchOO HUP4hpcsOOl620:1rRUNNING02/26/99 10:51:23cOOtchOO HUP4hpcs002620:1rRUNNING02/26/99 10:51:23cOOtchOO HUP4hpcsOO3620:1rRUNNING02/26/99 10:51:23cOOtchOO HUP4hpcs004620:1rRUNNING02/26/99 10:51:23Pending Jobs cOOtchOO RAD5700:2QUEUED02/26/99 19:24:32第一棚是usejid ,第二ffil是交付工作的名耦,第三棚是CPU代虢,第四棚是DQS替交付
33、的 工作编定的工作编虢job_id ( 62 ),新棚0:1的0是交付工作的侵先序虢,0:1的1是用 户交付的第一他工作,第六棚的r和第七棚的RUNNING表示工作正在孰行中,最接是 工作交付畤的畴刻,月/日/年畤:分:秒。排除等待轨行的工作即出现在Pending Jobs之列, 封J RUNNING的橄位同慎 QUEUEDo工作交付孰行之接,如果要中止工作的轨行可用qdel32指令被掉工作。Qdel32 job_id此的job_id就是使用qstat32指令所示之第四概孰行遇qde132指令之彳爰,再使用qstat32 指令就可以看出工作已消失不见了。第二章瓢谩界资料交换的平行程式最曾罩的平
34、行程式就是瓢遵界资料交换的平行程式。本章符利用一彳固很曾罩的循序程式(sequential program)使用MPI指令加以平行化,或比敕其算结果以资瞬瞪。2.1 第介貂六彳固 MP1 基本指令 MPINIT、MPI_FINALIZE、MPI_COMM_SIZE.MPI_COMM_RANK、MPI_SEND、MPI_RECVO2.2 第介貂辗遏界资料交换的循序程式T2SEQ。2.3 明使用道六彳固MPI基本指令平行化循序程式T2SEQ而成卷平行程式T2CP。2.4 第介貂另外四他常用的 MP1 指令 MPLSCATTER、MPI_GATHER、MPI_REDUCE、MPI_ALLREDUCE
35、o2.5 第是使用道些指令平行化循序程式T2SEQ而成卷平行程式T2DCPO2.1 MPI基本指令MPI的基本指令有下列六他,耨於本第分段加以介貂。MPIJNIT, MPI_HNALIZE,MPI_COMM_SIZE, MPI_COMM_RANK,MPI_SEND, MPI_RECV2.1.1 mpif.h include file使用MPI撰瘾Fortran平行程式畤,必须在每一他程式(包括主程式和副程式)的宣告段落囊加上INCLUDE ,mpif.h像述(statement)o mpif.h槽案凄含有编群MPI平行程式所必须的MPI字麋典MPI常数(constant)o例如:PROGRAM
36、 DRIVERIMPLICIT REAL*8 .INCLUDE mpif.hCALL CHEF(.)STOP ENDSUBROUTINE CHEF(.)IMPLICIT REAL*8 .INCLUDE mpif.hRETURNENDSI者可以在MPI戟IS所在之路查看mpif.h的内容。不同摩商定的MPI常数也rp不翥相同,但是所使用的MPI字麋即是完全一致。2.1.2 MPIJNIT, MPI_FINALIZE在叫用(CALL)其他MP1函数或副程式之前必须先叫用MPLINIT副程式,来改勤程式 在多他CPU上的平行tt算工他在程式结束(STOP)之前必须叫用MPI_FINALIZE副程式,
37、 以结束平行tt算工作。所以MPLINIT和MPLFINALIZE在主程式凄只要叫用一次就多包了, 例如:PROGRAM T2CPPARAMETER (.)INCLUDE mpif.hREAL*8 .INTEGER .CALL MPIJNIT(IERR)CALL MPI_FINALIZE(IERR)STOPEND所有MP1副程式引数(argument)的资料别除了资料名耦之外,其绘的都是整数(integer), 僖回的引数IERR其值卷零畴是正常结束,否即就有生。2.1.3 MPI_COMM_SIZE, MPI_COMM_RANK通常在叫用遇MPI_INIT之接,就必须叫用MPI_COMM_S
38、IZE以得知参舆平行每十算的CPU 彳固数(NPROC),及叫用MPI_COMM_RANK以得知我是第知固CPU(MYID),第弱固CPU 是优0 始起算。所以第一彳固CPU的MYID值卷零,第二他CPU的MYID值悬1 ,第三他 CPU的MYID值悬2,瓶 通常要在黑彳固CPU上作平行it算是在下孰行命令畤决定的, 而不是在程式裹事先定。富然,使用者也可以在程式裹事先定要在黑彳固CPU上作平行 算,其意羲只供程式人景做参考,除上使用黑他CPU作平行tt算是根撼job command file 裹 min_processors 和 max_processors 的定值,或-np 的 定值。MP
39、I_COMM_SIZE 和 MPI_COMM_RANK 的叫用格式如下:CALL MPI_COMM_SIZE (MPI_COMM_WORLD, NPROC, IERR) CALL MPI_COMM_RANK (MPI_COMM_WORLD, MYID, IERR)引数MPI_COMM_WORLD是MPI内定的(default) communicator,参舆程式平行算的全部CPU都是S8於同一彳固communicator。於同一彳固communicator的各CPU之才可以停送资料。MPI 1.2版不具倩CPU的取得舆控制功能,参舆平行11算的CPU颗数优程式始 孰行到程式结束都是固定不爱的。
40、因此,道雨他MPI副程式在一他程式裹只要叫用一次就可以了。例如:PROGRAM T2CPPARAMETER (.) INCLUDE mpif.h REAL *8.INTEGER NPROC, MYIDCALL MPIJNIT (IERR)CALL MPI_COMM_SIZE (MPI_COMM_WORLD, NPROC, IERR) CALL MPI_COMM_RANK (MPI_COMM_WORLD, MYID, IERR)CALL MPI_FINALIZE (IERR)STOP END2.1.4 MPI_SEND, MPI_RECV参舆平行tl算的各他CPU之的资料僖送方式有雨槿,一槿叫做
41、黠封黠通1 (point to point communication),另外一槿叫做,集醴通(collective communication)o 此J8先介貂 祟封黠通 的MPLSEND和MPLRECV,其他常用的黑封黠通御及集醴通那指令 容彳度再介貂。一他CPU典另外一他CPU之的资料僖送喝於黠封黠通,送出资料的CPU要叫用 MPI_SEND来送资料,而收受资料的CPU要叫用MPI_RECV来收资料。一彳固MPI_SEND必 须要有一彳固封的MPLRECV典之配合,才能完成一份资料的僖送工作。MPLSEND的叫 用格式如下:CALL MPI_SEND (DATA, ICOUNT, DAT
42、A.TYPE, IDEST, ITAQ&MPI_COMM_WORLD, IERR)引数DATA要送出去的资料起黠,可以是触量(scalar)或障列(array)资料ICOUNT要送出去的资料数量,富ICOUNT的值大於一畴,DATA必须是障列DATA_TYPE是要送出去的资料别,MPI内定的资料别如表1.1IDEST是收受资料的CPU idITAG要送出去的资料襟ISMPI data typesFortran data typesMPI_CHARACTERCHARACTERMPI_LOGICALLOGICALMPIJNTEGERINTEGERMPI_REAL, MPI_REAL4REAL, R
43、EALMMPI_REAL8, MPI_DOUBLE_PRECISIONREAL*8, DOUBLE PRECISIONMPI_COMPLEX, MPI_COMPLEX8COMPLEX, COMPLEX*8MPI_COMPLEX 16, MPI_DOUBLE_COMPLEXCOMPLEX* 16表 1.1 MPI data typesMPI_RECV的叫用格式如下:CALL MPI_RECV (DATA, ICOUNT, DATA_TYPE, ISRC, ITAG,&MPI_COMM_WORLD, ISTATUS, IERR)引数DATA是要收受的资料起黠ICOUNT是要收受的资料数量DATA_
44、TYPE 是要收受的资料别ISRC是送出资料的CPU idITAG是要收受的资料襟籁ISTATUS是轨行MPI_RECV副程式之接的状况ISTATUS悬一整数障列,列的是度悬在mpif.h裹已定的常数MPI_STATUS_SIZE , 瘾法如下INTEGER ISTATUS(MPI_STATUS_SIZE)一他CPU同畴要收受多他CPU送来的资料畴,若不依照特定的JIIM序,而是先到先收,即其 指令悬CALL MPI_RECV( BUFF, ICOUNT, DATA_TYPE, MPI_ANY_SOURCE, ITAG,1MPI_COMM_WORLD, ISTATUS, IERR)若要判别送出资料的CPU id畴就要用到ISTATUS燮数如下ISRC = ISTATUS( MPI_SOURCE )MPI在停送资料(MPLSEND、MPI_RECV)畤,是以下列四项横成其 信封,(envelope),用以别一件息(message)o1 .送出资料的CPU id2 .收受资料的CPU id3 .资料襟ig4 . communicator所以一(固CPU送给另外一他CPU多槿资料畴,不同的资料要用不同的资料襟籁,以别。2.2 辗遏界资料交换的循序