资源描述
Fortran普吾言.1MPI平行tt算程式1殳高十.1第一章前言.61.1 MPI平行tt算软醴.71.2 阈家高速路典tt算中心的平行tt算璟境.81.3 在IBM重月窗系统上如何使用MPI.101.3.1 IBM重月窗系统的MPI Fortran程式编群指令.101.3.2 IBM 重月窗系统的 Job command file.111.3.3 IBM甯月窗系统的平行程式的轨行指令.141.4 在PC Cluster上如何使用MPI.171.4.1 PC Cluster 上的 MPI Fortran 程式编群指令.171.4.2 PC Cluster 上的 Job command file.181.4.3 PC Cluster上的平行程式Wl行指令.19第二章瓢遏界资料交换的平行程式.212.1 MPI基本指令.222.1.1 mpifh include file.222.1.2 MPI INIT,MPI FINALIZE.232.1.3 MPI COMM SIZE,MPI COMM RANK.232.1.4 MPI SEND,MPI RECV.242.2 界资料交换的循序程式T2SEQ.282.3 资料不切割的平行程式T2CP.3022.4 MPI SCATTER,MPI GATHER,MPI REDUCE.362.4.1 MPI SCATTER,MPI GATHER.362.4.2 MPI REDUCE,MPI ALLREDUCE.392.5 资料切割的平行程式T2DCP.42第三章 需要遏界资料交换的平行程式.463.1 MPI SENDRECY MPI BCAST.473.1.1 MPISENDRECV.473.1.2 MPIBCAST.483.2 遏界资料交换的循序程式T3SEQ.503.3 资料不切割的遏界资料交换平行程式T3CP.523.4 资料切割的遏界资料交换平行程式(一)T3DCP.613.5 资料切割的遏界资料交换平行程式(二)T3DCP_2.66第四章 格黑占数不能整除的平行程式.724.1 格黑占数不能整除的循序程式T4SEQ.734.2.MPI SCATTERV.MPI GATHERV.754.3 MPI PACK、UNPACK.BARRIER.WTIME.794.3.1 MPI PACK.MPI UNPACK.794.3.2 MPI BARRIER.MPI WTIME.834.4 资料切割的平行程式T4DCP.85第五章 多雒障列的平行程式.915.1 多雒IW列的循序程式T5SEQ.9235.2 多雒障列资料不切割的平行程式T5CP.965.3 多雒障列末雉资料切割的平行程式T5DCP.1055.4 舆二雉切割有的MPI副程式.1135.4.1 垂直座襟IH示法期(Cartesian Topology).1135.4,2 界定二雉切割的 MPI 副程式 MPI_CART_CREATE、.114MPI CART COORDS.MPI CART SHIFT.1145.4.3 定羲固定隔资料的MPI副程式.118MPI TYPE VECTOR.MPI TYPE COMMIT.1185.5 多雒障列末二雉切割的平行程式T5_2D.121第六章 MPI程式的效率提昇.1366.1 Nonblocking 资料停送.1376.2 资料停送的合饼.1486.3 以遏界资料tt算取代遏界资料交换.1536.4 输出入资料的安排.1556.4.1 事先切割输入资料.1556.4.2 事彳度收集切割遇的输出资料.158第七章醇出的资料别.1617.1 醇出的资料别.1627.2 IW列的傅换.16947.3 雨方退盘帚舆管法.180第八章 多方依赖及SOR解法.1868.1 四方依$1及SOR解法.1878.2 黑白黑占隔SOR解法.1918.3 斑 SOR解法.2008.4 八方依$1典四色黑占隔SOR解法.207第九章有限元素法程式.2169.1 有限元素法的循序程式.2179.2 有限元素法的平行程式.220附一撰嘉吾言的MPI程式.231易考耆目.235Parallel Processing without Partition of 1-D Arrays.236Parallel Processing with Partition of 1-D Arrays.237Parallel on the 2nd Dimension of 2-D Arrays without Partition.238Parallel on the 2nd Dimension of 2-D Arrays with Partition.239Partition on the 3rd dimension of 3-D Arrays.2405第一章前言本章符介貂MPI平行tt算戟醴、81家高速路舆tt算中心现有的平行tt算璟境、以及在 各型械器上如何使用MPIo第一gjj曾军介貂MPI平行tf算戟醴。第二gjl介貂阈家高速路舆ft算中心现有的平行ft算璟境。第三介貂如何在IBM重月窗系统上使用MPI,包括路彳空的春殳定、平行程式的编群、及平行 程式的轨行等。第四介貂如何在PC cluster上使用MPI,包括路彳空的春殳定、平行程式的编群、及平行程式 的轨行等。61.1 MPI平行算勒醴MPI(Message Passing Interface)是第一彳用票型化的Message Passing平行百吾言。可以使用 在Fortran,C、C+等普吾言撰嘉的程式上。MPI平行程式可以在分散式言己惊醴平行系统上轨 行,也可以在共用平行系统上穹I行。目前系统商所提供的MPI敢:醴是腐於MPI1.2 版。它提供了一百多偃I副程式程式人具来IS用。MPI愤畲在1998年公布了 MPI2.0版 的规格,数年之彳度就畲有MPI 2.0版的戟醴可用了。日前美威I的Argonne National Lab已 公布了 MPICH 1.2.0版的整套朝:醴,版含有MPI2.0版的部份功能。有典趣的者可以 免费自路下载朝:醴,其址是www-unix.mcs.anl.gov/mpi/mpich也可以用anonymous ftp下载,其址是ftp.mcs.anl.gov其下目(directory)pub/mpi 裹槽名 mpich-1.2.0.tar.Z 或 mpich-120.tar.gz,在目 之下 遢有1午多舆mpi相的可供参考。71.2 阈家高速路舆言十算中心的平行言十算璟境目前阈家高速路舆tt算中心的 IBMSP2、IBM SP2 SMP.IBM p690,HP SPP2200.SGI 0rigin2000和Fujitsu VPP300等系统上均有公司自借的MPI平行勤:,PC cluster上是装 用MPICH公用平行软醴,也都有能力考I行平行程式。但是到目前悬止,只有PC cluster.IBM SP2,IBM SP2 SMP和IBM p6901殳有TEI CPU只轨行T固程式的平行璟境,其他檄器上即 瓢此槿春殳定。例如,若有一偃I用户要用四偃I CPU来轨行其平行程式,他在IBMSP2上取得 四偃I CPU之彳缸造四他I CPU就僮只轨行造偃I平行程式直到它轨行完止,不畲有其他程 式迤来跟他揖CPU日寺但他在其他檄器(如HP SPP2000)上取得四偃I CPU之彳爰,如果所 有使用者封CPU的需求数量超系统的CPU东恩数日寺,他所取得四偃I CPU之中的每一偃I CPU,都有可能要跟其他程式以分日寺方式(time sharing)共用一偃I CPU。HP SPP2000和SGI ORIGIN2000悬共用言己惊醴平行系统,造槿重月窗系统是16 H CPU共用SP2和VPP300是於分散式言己惊醴平行系统,每一偃I CPU倩有它褐用的官己 惊醴。IBM SP2 SMP及IBM p690是共用言己惊醴及分散式混合的平行系统,SP2 SMP 每T固node借有4果会CPU共用一言己,目前借有42偃I node的SMP cluster0 p690每一 偃I node倩有32果I CPU共用一朦醴,目前借有8偃I node的SMP cluster。SP2、SP2 SMP 和p690是探用系统事腐的工作排程Qob scheduler)LoadLeveler来安排用户的批次 工作82加11 job)。使用者必须借妥LoadLeveler的job command file,使用llsubmit指令把批 次工作交余合系统来轨行。SPP2000.ORIGIN2000和VPP300是探用NQS(Network Queue8System)工作排程来安排用户的批次工作。使用者必乡期蓿妥NQS的job command file,使用qsub指令把批次工作交余合各系统来轨行。PC cluster是探用DQS(Distributed QueueSystem)工作排程取:tt来安排用户的批次工作,其使用方式似NQS。91.3 在IBM重月留系统上如何使用MPI首先,C shell用户要在自己home directory的.cshrc槽裹加入下列路彳雪51檬才能多向抓得到 include file(mpif.h%mpif90.h、mpi.h)、编群指令(mpxlf、mpxlf90%mpcc)、MPI library5 和 LoadLeveler 指令(llsubmit、llq、llstatus llcancel)oset lpath=(./usr/lpp/ppe.poe/include/usr/lpp/ppe.poe/lib)set lpath=($lpath/usr/lpp/ppe.poe/bin/home/loadl/bin)set path=($path$lpath)加好上述路彳空之彳缸感cshrc存槽,再轨行source.cshrc指令,即可迤行平行程式的臧睾舆孰 行。筵退(logout)彳度再筵到(login)之彳爰就不必再孰行source.cshrc指令。1.3.1 IBM重月窗系统的MPI Fortran程式编群指令使用MPI的Fortran 77平行程式,其编群器(compiler)一般叫做mpif77,但是在IBM S 月窗系统上郤叫做mpxlfo mpxlf常用的编群工I如下:mpxlf-03-qarch=auto-qstrict-o file.x file.f其中IS工直-03 是作最高级的最佳化(level3 0Ptimization),可使程式的tt算速度加快数倍-qarch=auto是通知编群器程式要在同型檄器上轨行-qstrict 是通知编群器不要改建tt算的J膜序10-o file.x是指定轨行槽名悬file.x,不指定日寺其内定(default)槽名悬 a.out1.3.2 IBM 重月窗系统的 Job command file要在IBM SP2(ivy)上轨行平行程式,使用者必须借妥LoadLeveler的job command file。例如,下面JS偃I job command file叫做jobp4,它要在四偃I 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=4#requirements=(Adapter=nhps_usern)#wall_clock_limit=20#queue其中 executable=/usr/bin/poe 是固定不燮,poe 是指 Parallel Operating Environmentarguments=轨行槽所在之全路彳空及槽名output=木票型输出槽名(stdout)error=金昔 Si息(error message)输出槽名class=SP2 CPU的分别,使用llclass指令可以看至IJ分别:11short(CPU日寺上限悬12小日寺,共有10 H 120MHz CPU)medium(CPU日寺上限悬24小日寺,共有64 H 160MHz CPU)long(CPU日寺上限悬96小日寺,共有24 H 120MHz CPU)min_processors=最少的 CPU 数目max_processors=最多的CPU数目requirements=(Adapter=nhps_usern)是固定不燮wall_clock_limit=job最多需要的日寺,II位悬分金童queue 是固定不建平行tt算可以使用的CPU数目,short class最多4偃I CPU,medium class最多32偃I CPU,long class最多8偃I CPUO由於MPI 1.2版不具倩取得CPU、控制CPU、和盘帚iS CPU的功能,所以min_processors和max_processors要填相同的曼(字。要在IBM SP2 SMP(ivory)上轨行平行程式,使用者必须借妥LoadLeveler的job command file。例如,下面51偃I job command file叫做jobp4,它要在四偃I CPU上书l行平行程式file.xo#!/bin/csh#network.mpi=cssO,shared,us#executable=/usr/bin/poe#arguments=/your_working_directory/file.x-euilib us12#output=outp4#error=outp4#job_t 在 e=parallel#class=medium#tasks_per_node=4#node=1#queue由於IBM SP2 SMP每偃I Node含有四棵375MHz CPU共用4GB或8GB的言引Iftg。class=SP2 SMP CPU的分别,使用llclass指令可以看至份别:short(CPU日寺上限悬12小日寺,3偃INode共有6果I CPU)medium(CPU日寺上限悬24小日寺,32偃I Node共有128 II CPU)bigmem(CPU日寺上限悬48小日寺,4偃I Node共有16果I CPU)8偃I class 偃I Node借有8GB的共用言己tasksjper_node=4 是 明一偃I Node IB用四棵 CPUnode=l 是明要用一偃I Node,一共四棵CPU平行tt算可以使用的CPU数目medium class是8值I Node 一共32 CPU。要在IBM p690上穹I行平行程式,使用者必须借妥LoadLeveler的job command file。例如,下面51彳固job command file叫做jobp8,它要在8偃I CPU上轨行平行程式file.xo#!/bin/csh#executable=/usr/bin/poe#network.mpi=csss,shared,us#arguments=/your-working-directory/file.x#output=outp813#error=outp8#job_tj)e=parallel#class=8cpu#tasks_per_node=8#node=1#queue由於IBM p690每偃I Node含有32棵1.3 GHz CPU共用128GB的官士朦醴。class=p690 CPU的分别,使用llclass指令可以看至U分别:32cpu(CPU日寺上限悬36小日寺52 偃INode 共有 64 H CPU)16cpu(CPU日寺上限悬72小日寺,1 偃1 Node 共有 32 H CPU)8cpu(CPU日寺上限悬72小日寺,6 偃INode 共有 188 MI CPU)4cpu(CPU日寺上限悬96小日寺,6 偃1 Node 共有 188 MI CPU)serial(CPU日寺上限悬168小日寺,1 偃1 Node 共有 32 H CPU)tasks_per_node=8 是 明一偃I Node IS用 8 棵 CPUnode=l 是明要用一偃I Node,一共8棵CPU1.3.3 IBM重月窗系统的平行程式的轨行指令要在IBM重月窗系统上轨行平行程式,使用者在借妥LoadLeveler的job command file之彳爰,就可以使用llsubmit指令符job command file交余合系统排除等候轨行。例如上一1i?的job command file例子jobp4即可用下述指令交付穹I行:llsubmit jobp414工作交付之彳爰,工作轨行的情形可用llq指令查前。要缩小查前的靶I可在llq指令之彳爰加 上grep指令叙明要查能)的class或user id,例如上T固例子jobp4所IB用的分另俱medium,就可用下述指令迤行查前:llq|grep mediumUq 示之内容有下列事工I:job_iduser_idsubmittedstatus priorityclassrunning onivyl.1781.0u43ycc008/13 11:24R50mediumivy 3 9ivy 1.1814.0u50pao008/13 20:12R50shortivy 3 5其中job_id是LoadLeveler*合交付的工作编定的工作代虢userid是使用者的login namesubmitted是交付工作的日寺刻,月/日日寺:分status是工作轨行的情形R 表 RunningI 表 Idle(=waiting in queue)ST 表 Start executionNQ表Not Queued,ifi在陈伍之外Priority是交付工作的僵先次序,不用更勤它Class是CPU分别Running on是孰行交付工作的第一偃1 CPU代虢15工作交付孰行之彳爰,如果要中止工作的轨行可用llcancel指令被掉工作。llcancel job_id此虑的job_id就是使用Uq指令所最直示之使用者交付工作的工作代虢。轨行遇llcancel指令 之彳度,再使用llq指令就可以看出工作已消失不见了。161.4 在PC Cluster上如何使用MPI首先,使用MPICH的C shell用户要在自己home directory的.cshrc槽裹加入下列路彳空5 iSW 才能多句抓得到 include file(mpif.h、mpi.h)、编群指令(mpif77、mpicc)、MPI library、和 DQS 指令。不同的PC Cluster iS些存放的路彳空可能不同,要向系统的管理人前冏。其路彳空定 如下:setenv PGI/usr/local/pgiset path=(./usr/local/pgi/linux86/bin$path)set path=(/package/DQS _hpcserv2/bin Spath)set path=(/package/mpich _hpcserv2/bin Spath)其中第一行是PGI公司(Portland Group Inc.)存放的路彳空,第二行是PGI公司Fortran77 微睾器pgf77存放的路彳空,第三行是DQS批次工作排程琳:体存放的路彳空,第四行是MPICH褊 群系统存放的路彳空。没有It用PGI公司的朝:醴日寺前面雨行可以省略。1.4.1 PC Cluster上的MPI Fortran程式编群指令MPICH的Fortran77平行程式编群器叫做mpif77,其底JW是使用GNU的g77来编群,因此可以使用g77的工I。聚例如下:mpif77-03-o file.x file.f其中IS工I17-03 是IS用g77最高JW次的工I-o file.x是指定编群筐生的穹l行槽悬file.x没有指定日寺,内定的轨行槽悬 a.outfile.f 是Fortran77平行程式如果逗用PGI公司的MPI平行程式编群器mpif77,其底JW是使用公司的pgf77来编群,因此可以使用pgf77及pgf90的工I。其makefile聚例如下:OBJ=file.oEXE=file.xMPI=/home/package/mpichPGILIB=$(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是 明 51 是偃1 C shell script#$-1 qty.eq.4是向DQS要求四偃1 CPU,qty是数量(quantity)#$-N HUP4是明if偃1工作的名字(Name)叫做HUP4#$-A user_id是明付费幔虢(Account)就是使用者幔虢#$-cwd是明要在垣在51偃1路彳空(working directory)上轨行程式内定的路彳空是home directory#$-jy是明金昔副1息要输出到木票型输出槽SHOSTFILE是DQS安排余合造工1工作的node list-np 4 hubksp是告鼠斥mpirun要在四他I CPU上轨行平行程式hubksp&outp4是要把木票型输出槽嘉入。utp41.4.3 PC Cluster上的平行程式轨行指令要在PC cluster上第l行平行程式,使用者在借妥DQS的job command file之彳缸 就可以使 用qsub32指令job command file交余合PC cluster排除等候轨行例如上一u5的job command file例子jobp4即可用下述指令交付Wl行:19qsub32 jobp4工作交付之彳度,可以使用qstat32指令(不加参数)查前整偃I cluster交付工作孰行的情形,使用qstat32-f指令查能)整偃I cluster各偃I node的状况 上述指令qsub32 jobp4之彳爰使用qstat32 指令最直示的内容如下:cOOtchOO HUP4hpcsOOl620:1rRUNNING02/26/99 10:51:23cOOtchOO HUP4hpcs002620:1rRUNNING02/26/99 10:51:23cOOtchOO HUP4hpcs003620:1rRUNNING02/26/99 10:51:23cOOtchOO HUP4hpcs004620:1rRUNNING02/26/99 10:51:23Pending Jobs-cOOtchOO RAD5700:2QUEUED02/26/99 19:24:32第一楠是usejid,第二楠是交付工作的名耦,第三楠是CPU代虢,第四楠是DQS替交付的 工作编定的工作编虢job_id(62),第五楠0:1的0是交付工作的僵先序虢,0:1的1是用 户交付的第一他1工作,第六楠的r和第七楠的RUNNING表示工作正在轨行中,最彳爰是 工作交付日寺的日寺刻,月/日/年日寺:分:秒。排II等待轨行的工作即出现在Pending Jobs之列,RUNNING 的楠位即悬 QUEUEDo工作交付孰行之彳爰,如果要中止工作的寻I行可用qdel32指令杀殳掉工作。Qdel32 job_id此虑的job_id就是使用qstat32指令所累直示之第四棍 穹I行遇qdel32指令之彳爰,再使用qstat32 指令就可以看出工作已消失不兄了。20第二章辗遏界资料交换的平行程式最曾II的平行程式就是舞遏界资料交换的平行程式。本章符利用一偃I很曾II的循序程式(sequential program)使用MPI指令加以平行化,她比较其tt算余吉果以资瞬H。2.1 6(5介貂六偃IMPI 基本指令 MPI_INIT、MPI FINALIZE.MPI COMM SIZE.MPI COMM RANK.MPI SEND、MPI RECVo2.2 g(5介貂辗遏界资料交换的循序程式T2SEQO2.3 g(5明使用if六偃I MPI基本指令平行化循序程式T2SEQ而成悬平行程式T2CPO2.4 g|I介貂另外四偃I常用的 MPI 指令 MPI SCATTER.MPI GATHER.MPI REDUCE.MPIALLREDUCEo2.5 gU是使用道些指令平行化循序程式T2SEQ而成悬平行程式T2DCPO212.1 MPI基本指令MPI的基本指令有下列六偃I,符於本g15分段加以介貂。MPI INIT,MPI FINALIZE,MPI COMM SIZE,MPI COMM RANK,MPI SEND,MPI RECV2.1.1 mpif.h include file使用MPI撰嘉Fortran平行程式日寺,必须在每一偃I程式(包括主程式和副程式)的宣告段落 裹加上INCLUDE,mpifh谏述(statement)o mpif.h槽案裹含有编群MPI平行程式所必须的 MPI字麋典MPI常数(constant)o例如:PROGRAM DRIVERIMPLICIT REAL*8INCLUDE mpif.HCALLCHEF(.)STOP ENDSUBROUTINE CHEF(.)IMPLICIT REAL*8INCLUDE mpif.hRETURNEND者可以在MPI敢:醴所在之路彳空裹查看mpif.h的内容。不同商定的MPI常数也三午不翥相同,但是所使用的MPI字麋即是完全一致。222.1.2 MPIJNIT,MPI_FINALIZE在叫用(CALL)其他MPI函数或副程式之前必须先叫用MPIJNIT副程式,来做勤程式 在多偃I CPU上的平行言十算工信在程式结束(STOP)之前必须叫用MPI_FINALIZE副程式,以结束平行tt算工作。所以MPIJNIT和MPI_FINALIZE在主程式裹只要叫用一次就多向了,例如:PROGRAM T2CPPARAMETER(.)INCLUDE mpifh REAL*8 INTEGER CALL MPIINIT(IERR)CALL MPIFINALIZE(IERR)STOP END所有MPI副程式引数(argument)的资料类直别除了资料名耦之外,其绘的都是整数(integer),停回的引数IERR其值悬零日寺是正常结束,否即就有金昔生。2.1.3 MPI_COMM_SIZE,MPI_COMM_RANK通常在叫用谩MPI INIT之彳爰,就必须叫用MPI COMM SIZE以得知参舆平行tt算的CPU 偃I数(NPROC),及叫用MPI COMM RANK以得知我是第黑偃I CPU(MYID),第黑偃I CPU 是彳住0 始起算。所以第一偃I CPU的MYID值悬零,第二他I CPU的MYID值悬1,第三他 CPU的MYID值悬2,iOIfto通常要在黑偃I CPU上作平行tl算是在下轨行命令日寺决定的,而不是在程式裹事先定。富然,使用者也可以在程式裹事先春殳定要在黑偃I CPU上作平行tt 23算,其意羲只供程式人具做参考,除上使用黑偃I CPU作平行tt算是根撼job command file裹min_processors和max_processors的言殳定值,或-np的旨殳定值。MPI 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,参舆程式平行tt算的全 部CPU都是腐於同一偃I communicatoto 腐於同一偃I communicator 的各偃I CPU之才可以 停送资料。MPI 1.2版不具借CPU的取得舆控制功能,易舆平行tt算的CPU H数彳住程式始 轨行到程式结束都是固定不建的。因此,MPI副程式在一偃I程式裹只要叫用一次就可 以了。例如:PROGRAM T2CPPARAMETER(.)INCLUDE mpif.H REAL*8 INTEGER NPROC,MYID CALL MPI INIT(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参舆平行H算的各偃|CPU之的资料停送方式有雨槿,一槿叫做嘿睡寸黑占通朗/(point to 24point communication),另外一槿叫做,集通哥T(collective communication)o 此虑先介貂 嘿耀寸黠通歌 的MPI_SEND和MPI_RECV,其他常用的嘿睡寸黠通歌及集醴通那指令 容彳度再介貂。一偃I CPU典另外一他I CPU之的资料停送腐於嘿睡寸黑占通朗/,送出资料的CPU要叫用 MPI SEND来送资料,而收受资料的CPU要叫用MPI RECV来收资料。一偃I MPI SEND必 须要有一偃I望寸的MPI_RECV典之配合5才能完成一份资料的停送工作。MPI_SEND的叫 用格式如下:CALL MPI SEND(DATA,ICOUNT,DATA TYPE,IDEST,ITAG,&MPI COMM WORLD,IERR)引敦DATA 要送出去的资料起黑占,可以是触量(scalar)或障列(array)资料ICOUNT 要送出去的资料数量,常ICOUNT的值大於一日寺,DATA必须是障列DATA_TYPE 是要送出去的资料别,MPI内定的资料别如表1.1IDEST 是收受资料的CPU idITAG 要送出去的资料木票MPI data typesFortran data typesMPICHARACTERCHARACTERMPILOGICALLOGICALMPIINTEGERINTEGERMPI REAL,MPI REAL4REAL,REAL*4MPI REAL8,MPI DOUBLE PRECISIONREAL*8,DOUBLE PRECISIONMPI COMPLEX,MPI COMPLEX8COMPLEX,COMPLEXESMPI COMPLEX16,MPI DOUBLE COMPLEXCOMPLEX*16表 1.1 MPI data types25MPI RECV的叫用格式如下:CALL MPI RECV(DATA,ICOUNT,DATA TYPE,ISRC,ITAG,&MPI COMM WORLD,ISTATUS,IERR)引敦DATA是要收受的资料起黑占ICOUNT是要收受的资料数量DATATYPE是要收受的资料别ISRC是送出资料的CPU idITAG是要收受的资料襟籁ISTATUS是孰行MPI RECV副程式之彳度的状况【STATUS悬一整数障列,列的是度悬在mpifh裹已殳定的常数MPI_STATUS_SIZE,嘉法如下INTEGER ISTATUS(MPI_STATUS_SIZE)一偃I CPU同日寺要收受多偃I CPU送来的资料日寺,若不依照特定的J演序,而是先到先收,即其 指令悬CALL MPI_RECV(BUFF,ICOUNT,DATA TYPE,MPI_ANY_SOURCE,ITAG,1MPI COMM WORLD,ISTATUS,IERR)若要判别送出资料的CPU id日寺就要用到【STATUS燮数如下26ISRC=ISTATUS(MPI SOURCE)MPI在停送资料(MPI_SEND、MPI RECV)日寺,是以下列四工I横成其 信封(envelope)5用以别一件Si息(message)o1.送出资料的CPU id2.收受资料的CPU id3.资料檄籁municator所以一偃I CPU送余合另外一偃I CPU多槿资料日寺,不同的资料要用不同的资料木票,以别。272.2 瓢遏界资料交换的循序程式T2SEQT2SEQ是偃界资料交换的循序程式,在test data generation段落裹得殳定障列R C D的 值,然彳爰把51些障列嘉到磁槽上。其目的是便利往彳度的轮例程式可以入同一资料作平行 tt算,用来瞬II其tt算的结果是否正硅。道偃I程式的tt算部份只有一偃I DO loop,而且loop裹只有雨偃Iff算竦述,其目的是方便 往彳菱明如何符道一类直DO loop平行化。的ft算程式也1午有数百偃I或数千低I DO bop,但是其平行化的方法是一檬的。PROGRAM T2SEQPARAMETER(NTOTAL=200)REAL*8 A(NTOTAL),B(NTOTAL),C(NTOTAL),D(NTOTAL),SUMACC test data generation and write to file input.datCDO I=1,NTOTALB(I)=3.D0/DFLOAT(I)+1.0C(I)=2.DO/DFLOAT(I)+1.0D(I)=1.DO/DFLOAT(I)+1.0ENDDOOPEN(7,FILE=input.dat,FORM=UNFORMATTED)WRITE(7)BWRITE(7)CWRITE(7)D CLOSE(7)CC read input.dat,compute and write out the resultCOPEN(79FILE=,input.dat,9STATUS=lOLD,9FORM=,UNFORMArTEDf)READ BREAD(7)C28READ D SUMA=0.0 DO I=1,NTOTALA(I)=B(I)+C(I)*D(I)SUMA=SUMA+A(I)ENDDOWRITE(*,101)(A(I)1,NTOTAL,5)101 FORMAT(10F8.3)WRITE(*,102)SUMA102 FORMAT(SUM of array A=f,E15.5)STOPEND循序程式T2SEQ的测果如下:10.0003.0562.5622.3832.2902.1182.1082.0992.0912.0852.0602.0572.0542.0522.0502.0402.0392.0372.0362.035SUM of array A=.43855E+032.2342.1962.1682.1482.1312.0792.0742.0702.0662.0632.0482.0462.0442.0432.0412.0342.0332.0322.0312.031292.3 资料不切割的平行程式T2CP平行程式的切割(decomposition/partition)方式有雨槿。一槿是tt算切割而资料不切割,另 外一槿是tt算和资料都切割。前一槿切割方式不能多向gjS省惊醴的使用量是其缺黑占,但是障 列的描述舆循序版(sequential version)完全相同,程式容易解亶也容易雉是其僵飘彳爰一 槿切割方式能多向III省惊醴的使用量是其最大侵黑占,但是障列的描述典循序版差昇较大,程 式的舆雒比较困辘是其缺黑i如何符循序程式T2SEQ平行化呢?ii gj5先介貂唁十算切割而资料不切割,的方法,2.5 115 再介貂唁十算及资料同日寺切割,的方法。假如T2SEQ程式要在四偃I CPU上平行tt算而资料不切割日寺,就把一雒障列A、B、C、D 均分悬四段,各偃I CPU负责tt算其中的一段,分工合作完成整偃Iff算工作。此虑是利用
展开阅读全文