0HVVDJH3DVVLQJ3URJUDPPLQJ
03,8VHUV·*XLGHLQ
)2575$1
,QWURGXFWLRQWR0HVVDJHSDVVLQJSURJUDPPLQJ
03,8VHU*XLGHLQ)2575$1
'U3HWHU63DFKHFR'HSDUWPHQWRI0DWKHPDWLFV8QLYHUVLW\\RI6DQ)UDQFLVFR6DQ)UDQFLVFR&$
0DUFK:RR&KDW0LQJ&RPSXWHU&HQWUH8QLYHUVLW\\RI+RQJ.RQJ
+RQJ.RQJ0DUFK
1. Introduction2. Greetings !
2.1 General MPI Programs
2.2 Finding out About the Rest of the World2.3 Message : Data + Envelope2.4 MPI_Send and MPI_Recv3. An Application3.1 Serial program
3.2 Parallelizing the Trapezoid Rule3.3 I/O on Parallel Processors4. Collective Communication4.1 Tree-Structured Communication4.2 Broadcast4.3 Reduce
4.4 Other Collective Communication Functions5. Grouping Data for Communication5.1 The Count Parameter
5.2 Derived Types and MPI_Type_struct5.3 Other Derived Datatype Constructors5.4 Pack/Unpack
5.5 Deciding Which Method to Use6. Communicators and Topologies6.1 Fox's Algorithm6.2 Communicators
6.3 Working with Groups, Contexts, and Communicators6.4 MPI_Comm_split6.5 Topologies6.6 MPI_Cart_sub
6.7 Implementation of Fox's Algorithm7. Where To Go From Here7.1 What We Haven't Discussed7.2 Implementations of MPI7.3 More Information on MPI7.4 The Future of MPI
8. Compiling and Running MPI Programs9. Reference
,QWURGXFWLRQ
KH0HVVDJH3DVVLQJ,QWHUIDFHRU03,LVDOLEUDU\\RIIXQFWLRQVDQGPDFURVWKDWFDQEHXVHGLQ&)2575$1DQG&SURJUDPV$VLWVQDPHLPSOLHV03,LVLQWHQGHGIRUXVHLQSURJUDPVWKDWH[SORLWWKHH[LVWHQFHRIPXOWLSOHSURFHVVRUVE\\PHVVDJHSDVVLQJ
03,ZDVGHYHORSHGLQE\\DJURXSRIUHVHDUFKHUVIURPLQGXVWU\\JRYHUQPHQWDQGDFDGHPLD$VVXFKLWLVRQHRIWKHILUVWVWDQGDUGVIRUSURJUDPPLQJSDUDOOHOSURFHVVRUVDQGLWLVWKHILUVWWKDWLVEDVHGRQPHVVDJHSDVVLQJ
,Q$8VHU·V*XLGHWR03,KDVEHHQZULWWHQE\\'U3HWHU63DFKHFR7KLVLVDEULHIWXWRULDOLQWURGXFWLRQWRVRPHRIWKHPRUHLPSRUWDQWIHDWXUHRIWKH03,IRU&SURJUDPPHUV,WLVDQLFHO\\ZULWWHQGRFXPHQWDWLRQDQGXVHUVLQRXUXQLYHUVLW\\ILQGLWYHU\\FRQFLVHDQGHDV\\WRUHDG
+RZHYHUPDQ\\XVHUVRISDUDOOHOFRPSXWHUDUHLQWKHVFLHQWLILFDQGHQJLQHHUVFRPPXQLW\\DQGPRVWRIWKHPXVH)2575$1DVWKHLUSULPDU\\FRPSXWHUODQJXDJH0RVWRIWKHPGRQ·WXVH&ODQJXDJHSURILFLHQWO\\7KLVVLWXDWLRQRFFXUVYHU\\IUHTXHQWO\\LQ+RQJ.RQJ$DUHVXOWWKH$8VHU·V*XLGHWR03,LVWUDQVODWHGWRWKLVJXLGHLQ)RUWUDQWRDGGUHVVIRUWKHQHHGRIVFLHQWLILFSURJUDPPHUV
$FNQRZOHGJPHQWV,JUDWHIXOO\\DFNQRZOHGJH'U3HWHU63DFKHFRIRUWKHXVHRI&YHUVLRQRIWKHXVHUJXLGHRQZKLFKWKLVJXLGHLVEDVHG,ZRXOGDOVRJUDWHIXOO\\WKDQNVWRWKH&RPSXWHU&HQWUHRIWKH8QLYHUVLW\\RI+RQJ.RQJIRUWKHLUKXPDQUHVRXUFHVXSSRUWRIWKLVZRUN$QG,DOVRWKDQNVWRDOOWKHUHVHDUFKLQVWLWXWLRQZKLFKVXSSRUWHGWKHRULJLQDOZRUNE\\'U3DFKHFR
*UHHWLQJV
7KHILUVWSURJUDPWKDWPRVWRIXVVDZZDVWKH+HOORZRUOGSURJUDPLQPRVWRILQWURGXFWRU\\SURJUDPPLQJERRNV,WVLPSO\\SULQWVWKHPHVVDJH+HOORZRUOG$YDULDQWWKDWPDNHVVRPHXVHRIPXOWLSOHSURFHVVHVLVWRKDYHHDFKSURFHVVVHQGDJUHHWLQJWRDQRWKHUSURFHVV
,Q03,WKHSURFHVVLQYROYHGLQWKHH[HFXWLRQRIDSDUDOOHOSURJUDPDUHLGHQWLILHGE\\DVHTXHQFHRIQRQQHJDWLYHLQWHJHUV,IWKHUHDUHSSURFHVVHVH[HFXWLQJDSURJUDPWKH\\ZLOOKDYHUDQNVS7KHIROORZLQJSURJUDPKDVHDFKSURFHVVRWKHUWKDQVHQGDPHVVDJHWRSURFHVVDQGSURFHVVSULQWVRXWWKHPHVVDJHVLWUHFHLYHGprogram greetingsinclude 'mpif.h'integer my_rankinteger pinteger sourceinteger destinteger tag
character*100 message
character*10 digit_stringinteger size
integer status(MPI_STATUS_SIZE)integer ierr
call MPI_Init(ierr)
call MPI_Comm_rank(MPI_COMM_WORLD, my_rank, ierr)call MPI_Comm_size(MPI_COMM_WORLD, p, ierr)if (my_rank .NE. 0) then
write(digit_string,FMT=\"(I3)\") my_rankmessage = 'Greetings from process '+ // trim(digit_string) // ' !'dest = 0tag = 0
call MPI_Send(message, len_trim(message),
+ MPI_CHARACTER, dest, tag, MPI_COMM_WORLD, ierr)else
do source = 1, p-1tag = 0
call MPI_Recv(message, 100, MPI_CHARACTER,+ source, tag, MPI_COMM_WORLD, status, ierr)write(6,FMT=\"(A)\") messageenddoendif
call MPI_Finalize(ierr)end program greetings
7KHGHWDLOVRIFRPSLOLQJDQGH[HFXWLQJWKLVSURJUDPLVLQFKDSWHU
:KHQWKHSURJUDPLVFRPSLOHGDQGUXQZLWKWZRSURFHVVHVWKHRXWSXWVKRXOGEHGreetings from process 1!
,ILW·VUXQZLWKIRXUSURFHVVHVWKHRXWSXWVKRXOGEHGreetings from process 1!
Greetings from process 2!Greetings from process 3!
$OWKRXJKWKHGHWDLOVRIZKDWKDSSHQVZKHQWKHSURJUDPLVH[HFXWHGYDU\\IURPPDFKLQHWRPDFKLQHWKHHVVHQWLDOVDUHWKHVDPHRQDOOPDFKLQHV3URYLGHGZHUXQRQHSURFHVVRQHDFKSURFHVVRU
7KHXVHULVVXHVDGLUHFWLYHWRWKHRSHUDWLQJV\\VWHPZKLFKKDVWKHHIIHFWRISODFLQJDFRS\\RIWKHH[HFXWDEOHSURJUDPRQHDFKSURFHVVRU (DFKSURFHVVRUEHJLQVH[HFXWLRQRILWVFRS\\RIWKHH[HFXWDEOH
'LIIHUHQWSURFHVVHVFDQH[HFXWHGLIIHUHQWVWDWHPHQWVE\\EUDQFKLQJZLWKLQWKH
SURJUDP7\\SLFDOO\\WKHEUDQFKLQJZLOOEHEDVHGRQSURFHVVUDQNV
6RWKHGreetingsSURJUDPXVHVWKH6LQJOH3URJUDP0XOWLSOH'DWDRU630'SDUDGLJP7KDWLVZHREWDLQWKHHIIHFWRIGLIIHUHQWSURJUDPVUXQQLQJRQGLIIHUHQWSURFHVVRUVE\\WDNLQJEUDQFKHVZLWKLQDVLQJOHSURJUDPRQWKHEDVLVRISURFHVVUDQNWKHVWDWHPHQWVH[HFXWHGE\\SURFHVVDUHGLIIHUHQWIURPWKRVHH[HFXWHGE\\WKHRWKHUSURFHVVHVHYHQWKRXJKDOOSURFHVVHVDUHUXQQLQJWKHVDPHSURJUDP7KLVLVWKHPRVWFRPPRQO\\XVHGPHWKRGIRUZULWLQJ0,0'SURJUDPVDQGZH·OOXVHLWH[FOXVLYHO\\LQWKLV*XLGH
*HQHUDO03,3URJUDPV
(YHU\\03,SURJUDPPXVWFRQWDLQWKHSUHSUHFHVVRUGLUHFWLYHinclude ‘mpif.h’
7KLVILOHPSLIKFRQWDLQVWKHGHILQLWLRQVPDFURVDQGIXQFWLRQSURWRW\\SHVQHFHVVDU\\
IRUFRPSLOLQJDQ03,SURJUDP
%HIRUHDQ\\RWKHU03,IXQFWLRQVFDQEHFDOOHGWKHIXQFWLRQMPI_InitPXVWEHFDOOHGDQGLWVKRXOGRQO\\EHFDOOHGRQFH)RUWUDQ03,URXWLQHVKDYHDQIERROR DUJXPHQWWKLVFRQWDLQVWKHHUURUFRGH$IWHUDSURJUDPKDVILQLVKHGXVLQJ03,OLEUDU\\LWPXVWFDOOMPI_Finialize7KLVFOHDQVXSDQ\\XQILQLVKHGEXVLQHVVOHIWE\\03,HJSHQGLQJUHFHLYHVWKDWZHUHQHYHUFRPSOHWHG6RDW\\SLFDO03,SURJUDPKDVWKHIROORZLQJOD\\RXW...
include 'mpif.h'...
call MPI_Init(ierr)..
.
call MPI_Finialize(ierr)...
end program
)LQGLQJRXW$ERXWWKH5HVWRIWKH:RUOG
03,SURYLGHVWKHIXQFWLRQMPI_Comm_rankZKLFKUHWXUQVWKHUDQNRIDSURFHVVLQLWVVHFRQGLQLWVVHFRQGDUJXPHQW,WVV\\QWD[LV
call MPI_Comm_rank(COMM, RANK, IERROR)integer COMM, RANK, IERROR
7KHILUVWDUJXPHQWLVDFRPPXQLFDWRU(VVHQWLDOO\\DFRPPXQLFDWRULVDFROOHFWLRQRISURFHVVHVWKDWFDQVHQGPHVVDJHWRHDFKRWKHU)RUEDVLFSURJUDPVWKHRQO\\FRPPXQLFDWRUQHHGHGLVMPI_COMM_WORLD,WLVSUHGHILQHGLQ03,DQGFRQVLVWVRIDOOWKHSURFHVVHVUXQQLQJZKHQSURJUDPH[HFXWLRQEHJLQV
0DQ\\RIWKHFRQVWUXFWVLQRXUSURJUDPVDOVRGHSHQGRQWKHQXPEHURISURFHVVHVH[HFXWLQJWKHSURJUDP6R03,SURYLGHVWKHIXQFWLRQVMPI_Comm_sizeIRUGHWHUPLQLQJWKLV,WVILUVWDUJXPHQWLVDFRPPXQLFDWRU,WUHWXUQVWKHQXPEHURISURFHVVHVLQDFRPPXQLFDWRULQLWVVHFRQGDUJXPHQW,WVV\\QWD[LVcall MPI_Comm_size(COMM, P, IERROR)integer COMM, P, IERROR
0HVVDJH'DWD(QYHORSH
7KHDFWXDOPHVVDJHSDVVLQJLQRXUSURJUDPLVFDUULHGRXWE\\WKH03,IXQFWLRQVMPI_Send DQG
MPI_Recv7KHILUVWFRPPDQGVHQGVDPHVVDJHWRDGHVLJQDWHGSURFHVV7KHVHFRQGUHFHLYHVDPHVVDJHIURPDSURFHVV7KHVHDUHWKHPRVWEDVLFPHVVDJHSDVVLQJFRPPDQGVLQ03,,QRUGHUIRUWKHPHVVDJHWREHVXFFHVVIXOO\\FRPPXQLFDWHGWKHV\\VWHPPXVWDSSHQGVRPHLQIRUPDWLRQWRWKHGDWDWKDWWKHDSSOLFDWLRQSURJUDPZLVKHVWRWUDQVPLW7KLVDGGLWLRQDOLQIRUPDWLRQIRUPVWKHHQYHORSHRIWKHPHVVDJH,Q03,LWFRQWDLQVWKHIROORZLQJLQIRUPDWLRQ
7KHUDQNRIWKHUHFHLYHU 7KHUDQNRIWKHVHQGHU $WDJ
$FRPPXQLFDWRU
7KHVHLWHPVFDQEHXVHGE\\WKHUHFHLYHUWRGLVWLQJXLVKDPRQJLQFRPLQJPHVVDJHV7KHVRXUFHDUJXPHQWFDQEHXVHGWRGLVWLQJXLVKPHVVDJHVUHFHLYHGIURPGLIIHUHQWSURFHVVHV7KHWDJLVDXVHUVSHFLILHGintegerWKDWFDQEHXVHGWRGLVWLQJXLVKPHVVDJHVUHFHLYHGIRUPDVLQJOHSURFHVV)RU
H[DPSOHVXSSRVHSURFHVV$LVVHQGLQJWZRPHVVDJHVWRSURFHVV%ERWKPHVVDJHVFRQWDLQVDVLQJOHUHDOQXPEHU2QHRIWKHUHDOQXPEHULVWREHXVHGLQDFDOFXODWLRQZKLOHWKHRWKHULVWREHSULQWHG,QRUGHUWRGHWHUPLQHZKLFKLVZKLFK$FDQXVHGLIIHUHQWWDJVIRUWKHWZRPHVVDJHV,I%XVHVWKHVDPHWZRWDJVLQWKHFRUUHVSRQGLQJUHFHLYHVZKHQLWUHFHLYHVWKHPHVVDJHVLWZLOONQRZZKDWWRGRZLWKWKHP03,JXDUDQWHHVWKDWWKHLQWHJHUVFDQEHXVHGDVWDJV0RVWLPSOHPHQWDWLRQVDOORZPXFKODUJHUYDOXHV
$VZHQRWHGDERYHDFRPPXQLFDWRULVEDVLFDOO\\DFROOHFWLRQRISURFHVVHVWKDWFDQVHQGPHVVDJHVWRHDFKRWKHU:KHQWZRSURFHVVHVDUHFRPPXQLFDWLQJXVLQJMPI_SendDQGMPI_RecvLWVLPSRUWDQFHDULVHVZKHQVHSDUDWHPRGXOHVRIDSURJUDPKDYHEHHQZULWWHQLQGHSHQGHQWO\\RIHDFKRWKHU)RUH[DPSOHVXSSRVHZHZLVKWRVROYHDV\\VWHPRIGLIIHUHQWLDOHTXDWLRQVDQGLQWKHFRXUVHRIVROYLQJWKHV\\VWHPZHQHHGWRVROYHDV\\VWHPRIOLQHDUHTXDWLRQ5DWKHUWKDQZULWLQJWKHOLQHDUV\\VWHPVROYHUIURPVFUDWFKZHPLJKWZDQWWRXVHDOLEUDU\\RIIXQFWLRQVIRUVROYLQJOLQHDUV\\VWHPVWKDWZDVZULWWHQE\\VRPHRQHHOVHDQGWKDWKDVEHHQKLJKO\\RSWLPL]HGIRUWKHV\\VWHPZH·UHXVLQJ+RZGRZHDYRLGFRQIXVLQJWKHPHVVDJHVZHVHQGIURPSURFHVV$WRSURFHVV%ZLWKWKRVHVHQWE\\WKHOLEUDU\\IXQFWLRQV\"%HIRUHWKHDGYHQWRIFRPPXQLFDWRUVZHZRXOGSUREDEO\\KDYHWRSDUWLWLRQWKHVHWRIYDOLGWDJVVHWWLQJDVLGHVRPHRIWKHPIRUH[FOXVLYHXVHE\\WKHOLEUDU\\IXQFWLRQV7KLVLVWHGLRXVDQGLWZLOOFDXVHSUREOHPVLIZHWU\\WRUXQRXUSURJUDPRQDQRWKHUV\\VWHPWKHRWKHUV\\VWHP·VOLQHDUVROYHUPD\\QRWSUREDEO\\ZRQ·WUHTXLUHWKHVDPHVHWRIWDJV:LWKWKHDGYHQWRIFRPPXQLFDWRUVZHVLPSO\\FUHDWHDFRPPXQLFDWRUWKDWFDQEHXVHGH[FOXVLYHO\\E\\WKHOLQHDUVROYHUDQGSDVVLWDVDQDUJXPHQWLQFDOOVWRWKHVROYHU:H·OOGLVFXVVWKHGHWDLOVRIWKLVODWHU)RUQRZZHFDQJHWDZD\\ZLWKXVLQJWKHSUHGHILQHGFRPPXQLFDWRUMPI_COMM_WORLD,WFRQVLVWVRIDOOWKHSURFHVVHVUXQQLQJWKHSURJUDPZKHQH[HFXWLRQEHJLQV
03,B6HQGDQG03,B5HFY
7RVXPPDUL]HOHW·VGHWDLOWKHV\\QWD[RIMPI_SendDQGMPI_Recv
MPI_Send( Message, count, datatype, dest, tag, comm, ierror) INTEGER count, datatype, dest, tag, comm, ierrorMPI_Recv( message, count, datatype, source, tag,comm, status, ierror) INTEGER count, datatype, dest, tag, commINTEGER status(MPI_STATUS_SIZE),ierror 0RVW03,IXQFWLRQVVWRUHVDQLQWHJHUHUURUFRGHLQWKHDUJXPHQWLHUURU+RZHYHUZHZLOOLJQRUH WKHVHUHWXUQYDOXHVLQPRVWFDVHV 7KHFRQWHQWVRIWKHPHVVDJHDUHVWRUHGLQDEORFNRIPHPRU\\UHIHUHQFHGE\\WKHDUJXPHQWmessage7KHQH[WWZRDUJXPHQWVcountDQGdatatypeDOORZWKHV\\VWHPWRLGHQWLI\\WKHHQGRIWKHPHVVDJHLWFRQWDLQVDVHTXHQFHRIcountYDOXHVHDFKKDYLQJ03,W\\SHdatatype7KLVW\\SHLVQRWD)RUWUDQW\\SHDOWKRXJKPRVWRIWKHSUHGHILQHGW\\SHVFRUUHVSRQG)RUWUDQW\\SHV7KHSUHGHILQHG03,W\\SHVDQGWKHFRUUHVSRQGLQJ)2575$1W\\SHVLIWKH\\H[LVWDUHOLVWHGLQWKHIROORZLQJWDEOH 03,GDWDW\\SH )2575$1GDWDW\\SH 03,B,17(*(503,B5($/ 03,B'28%/(B35(&,6,2103,B&203/(;03,B/2*,&$/03,B&+$5$&7(503,B%<7(03,B3$&.(' ,17(*(55($/ '28%/(35(&,6,21&203/(;/2*,&$/&+$5$&7(5 7KHODVWWZRW\\SHVMPI_BYTEDQGMPI_PACKEDGRQ·WFRUUHVSRQGWRVWDQGDUG)RUWUDQW\\SHV7KH03,B%<7(W\\SHFDQEHXVHGLI\\RXZLVKWRIRUFHWKHV\\VWHPWRSHUIRUPQRFRQYHUVLRQEHWZHHQGLIIHUHQWGDWDUHSUHVHQWDWLRQVHJRQDKHWHURJHQHRXVQHWZRUNRIZRUNVWDWLRQVXVLQJGLIIHUHQWUHSUHVHQWDWLRQVRIGDWD:H·OOGLVFXVVWKHW\\SHMPI_PACKEDODWHU 1RWHWKDWWKHDPRXQWRIVSDFHDOORFDWHGIRUWKHUHFHLYLQJEXIIHUGRHVQRWKDYHWRPDWFKWKHH[DFWDPRXQWRIVSDFHLQWKHPHVVDJHEHLQJUHFHLYHG)RUH[DPSOHZKHQRXUSURJUDPLVUXQWKHVL]HRIWKHPHVVDJHWKDWSURFHVVVHQGVlen_trim(message)LVFKDUDFWHUVEXWSURFHVVUHFHLYHVWKHPHVVDJHLQDEXIIHUWKDWKDVVWRUDJHIRUFKDUDFWHUV7KVLPDNHVVHQVH,QJHQHUDOWKHUHFHLYLQJSURFHVVPD\\QRWNQRZWKHH[DFWVL]HRIWKHPHVVDJHEHLQJVHQW6R03,DOORZVDPHVVDJHWREHUHFHLYHGDVORQJDVWKHUHLVVXIILFLHQWVWRUDJHDOORFDWHG,IWKHUHLVQ·WVXIILFLHQWVWRUDJHDQRYHUIORZHUURURFFXUV>@ 7KHDUJXPHQWVdestDQGsourceDUHUHVSHFWLYHO\\WKHUDQNVRIWKHUHFHLYLQJDQGWKHVHQGLQJSURFHVVHV03,DOORZVsourceWREHZLOGFDUG7KHUHLVDSUHGHILQHGFRQVWDQWMPI_ANY_SOURCEWKDWFDQEHXVHGLIDSURFHVVLVUHDG\\WRUHFHLYHDPHVVDJHIURPDQ\\VHQGLQJSURFHVVUDWKHUWKDQDSDUWLFXODUVHQGLQJSURFHVV7KHUHLVQRWDZLOGFDUGIRUdest $VZHQRWHGHUOLHU03,KDVWZRPHFKDQLVPVVSHFLILFDOO\\GHVLJQHGIRUSDUWLWLRQLQJWKHPHVVDJHVSDFHWDJVDQGFRPPXQLFDWRUV7KHDUJXPHQWVtagDQGcommDUHUHVSHFWLYHO\\WKHWDJDQGFRPPXQLFDWRU7KHtagLVDQLQWHJHUDQGIRUQRZRXURQO\\FRPPXQLFDWRULVMPI_COMM_WORLDZKLFKDVZHQRWHGHDUOLHULVSUHGHILQHGRQDOO03,V\\VWHPVDQGFRQVLVWVRIDOOWKHSURFHVVHVUXQQLQJZKHQH[HFXWLRQRIWKHSURJUDPEHJLQV7KHUHLVDZLOGFDUGMPI_ANY_TAGWKDWMPI_RecvFDQXVHIRUWKHWDJ7KHUHLVQRZLOGFDUGIRUWKHFRPPXQLFDWRU,QRWKHUZRUGVLQRUGHUIRUSURFHVV$WRVHQGDPHVVDJHWRSURFHVV%WKHDUJXPHQWcommWKDW$XVHVLQMPI_SendPXVWEHLGHQWLFDOWRWKHDUJXPHQWWKDW%XVHVLQMPI_Recv 7KHODVWDUJXPHQWRIMPI_RecvstatusUHWXUQVLQIRUPDWLRQRQWKHGDWDWKDWZDVDFWXDOO\\UHFHLYHG,WUHIHUHQFHVDDUUD\\ZLWKWZRHOHPHQWVRQHIRUWKHVRXUFHDQGRQHIRUWKHWDJV6RLIIRUH[DPSOHWKHsourceRIWKHUHFHLYHZDVMPI_ANY_SOURCEWKHQstatusZLOOFRQWDLQWKHUDQNRIWKHSURFHVVWKDWVHQWWKHPHVVDJH $Q$SSOLFDWLRQ 1RZWKDWZHNQRZKRZWRVHQGPHVVDJHZLWK03,OHW·VZULWHDSURJUDPWKDWXVHVPHVVDJH SDVVLQJWRFDOFXODWHDGHILQLWHLQWHJUDOZLWKWKHWUDSH]RLGUXOH 6HULDOSURJUDP 5HFDOOWKDWWKHWUDSH]RLGUXOHHVWLPDWHVE\\GLYLGLQJWKHLQWHUYDO>DE@LQWRQ VHJPHQWVRIHTXDODQGFDOFXODWLQJWKHIROORZLQJVXP +HUHK EDQDQG[L DLKL Q %\\SXWWLQJI[LQWRDVXESURJUDPZHFDQZULWHDVHULDOSURJUDPIRUFDOFXODWLQJDQLQWHJUDOXVLQJWKHWUDSH]RLGUXOH C serial.f -- calculate definite integral usingtrapezoidalC rule.C C The function f(x) is hardwired.C Input: a, b, n. C Output: estimate of integral from a to b of f(x)C using n trapezoids.PROGRAM serialIMPLICIT NONEreal integralreal areal binteger nreal hreal xinteger ireal fexternal f print *, 'Enter a, b, and n'read *, a, b, n h = (b-a)/n integral = (f(a) + f(b))/2.0x = a do i = 1 , n-1x = x + h integral = integral + f(x)enddo integral = integral*h print *,'With n =', n,' trapezoids, our estimate'print *,'of the integral from ', a, ' to ',b, ' = ' ,+integralend C****************************************************** real function f(x)IMPLICIT NONEreal x C Calculate f(x).f = x*xreturnend C****************************************************** 3DUDOOHOL]LQJWKH7UDSH]RLG5XOH 2QHDSSURDFKWRSDUDOOHOL]LQJWKLVSURJUDPLVWRVLPSO\\VSOLWWKHLQWHUYDO>DE@XSDPRQJWKH SURFHVVHVDQGHDFKSURFHVVFDQHVWLPDWHWKHLQWHJUDORII[RYHULWVVXELQWHUYDO,QRUGHUWRHVWLPDWHWKHWRWDOLQWHJUDOWKHSURFHVVHV·ORFDOFDOFXODWLRQVDUHDGGHG 6XSSRVHWKHUHDUHSSURFHVVHVDQGQWUDSH]RLGVDQGLQRUGHUWRVLPSOLI\\WKHGLVFXVVLRQDOVRVXSSRVHWKDWQLVHYHQO\\GLYLVLEOHE\\S7KHQLWLVQDWXUDOIRUWKHILUVWSURFHVVWRFDOFXODWHWKHDUHDRIWKHILUVWQSWUDSH]RLGVWKHVHFRQGSURFHVVWRFDOFXODWHWKHDUHDRIWKHQH[WQSHWF6RSURFHVVTZLOOHVWLPDWHWKHLQWHJUDORYHUWKHLQWHUYDO 7KXVHDFKSURFHVVQHHGVWKHIROORZLQJLQIRUPDWLRQ • 7KHQXPEHURISURFHVVHVS• ,WVUDQN • 7KHHQWLUHLQWHUYDORILQWHJUDWLRQ>DE@• 7KHQXPEHURIVXELQWHUYDOVQ 5HFDOOWKDWWKHILUVWWZRLWHPVFDQEHIRXQGE\\FDOOLQJWKH03,IXQFWLRQVMPI_Comm_sizeDQGMPI_Comm_Rank7KHODWWHUWZRLWHPVVKRXOGSUREDEO\\EHLQSXWE\\WKHXVHU%XWWKLVFDQUDLVHVRPHGLIILFXOWSUREOHPV6RIRURXUILUVWDWWHPSWDWFDOFXODWLQJWKHLQWHJUDOOHW·VKDUGZLUHWKHVHYDOXHVE\\VLPSO\\VHWWLQJWKHLUYDOXHVZLWKDVVLJQPHQWVWDWHPHQWV $VWUDLJKWIRUZDUGDSSURDFKWRVXPPLQJWKHSURFHVVHV·LQGLYLGXDOFDOFXODWLRQVLVWRKDYHHDFKSURFHVVVHQGLWVORFDOFDOFXODWLRQWRSURFHVVDQGKDYHSURFHVVGRWKHILQDODGGLWLRQ:LWKWKHVHDVVXPSWLRQVZHFDQZULWHDSDUDOOHOWUDSH]RLGUXOHSURJUDP c trap.f -- Parallel Trapezoidal Rule, first versionc c Input: None. c Output: Estimate of the integral from a to b of f(x)c using the trapezoidal rule and n trapezoids.c c Algorithm: c 1. Each process calculates \"its\" interval ofc integration. c 2. Each process estimates the integral of f(x)c over its interval using the trapezoidal rule.c 3a. Each process != 0 sends its integral to 0.c 3b. Process 0 sums the calculations received fromc the individual processes and prints the result.c c Note: f(x), a, b, and n are all hardwired.c program trapezoidal c IMPLICIT NONEinclude 'mpif.h'c integer my_rank ! My process rank.integer p ! The number of processes.real a ! Left endpoint.real b ! Right endpoint. integer n ! Number of trapezoids.real h ! Trapezoid base length. real local_a ! Left endpoint for my process.real local_b ! Right endpoint my process.integer local_n ! Number of trapezoids for my! calculation. real integral ! Integral over my interval.real total ! Total integral. integer source ! Process sending integal.integer dest ! All messages go to 0.integer tag integer status(MPI_STATUS_SIZE)integer ierrreal Trap data a, b, n, dest, tag /0.0, 1.0, 1024, 0, 50/C Let the system do what it needs to start up MPI.call MPI_INIT(ierr)C Get my process rank. call MPI_COMM_RANK(MPI_COMM_WORLD, my_rank, ierr)C Find out how many processes are being used.call MPI_COMM_SIZE(MPI_COMM_WORLD, p, ierr) h = (b-a)/n ! h is the same for all processes.local_n = n/p ! So is the number of trapezoids. C Length of each process' interval of integration = local_n*h.C So my interval starts at :local_a = a + my_rank*local_n*hlocal_b = local_a + local_n*h integral = Trap(local_a, local_b, local_n, h)C Add up the integals calculated by each process.if (my_rank .EQ. 0) thentotal = integraldo source = 1, p-1 call MPI_RECV(integral, 1, MPI_REAL, source, tag,+ MPI_COMM_WORLD, status, ierr)total = total + integralenddoelse call MPI_SEND(integral, 1, MPI_REAL, dest,+ tag, MPI_COMM_WORLD, ierr)endif C Print the result.if (my_rank .EQ. 0) thenwrite(6,200) n 200 format(' ','With n = ',I4,' trapezoids, our estimate')write(6,300) a, b, total 300 format(' ','of the integral from ',f6.2,' to ',f6.2,+ ' = ',f11.5)endif C Shut down MPI. call MPI_FINALIZE(ierr)end program trapezoidal real function Trap(local_a, local_b, local_n, h) IMPLICIT NONEreal local_areal local_binteger local_nreal h real integral ! Store result in integal.real xreal ireal f integral = (f(local_a) + f(local_b))/2.0x = local_a do i = 1, local_n - 1x = x + h integral = integral + f(x) enddo integal = integral*hTrap = integralreturnend real function f(x)IMPLICIT NONEreal xf = x*xend 2EVHUYHWKDWWKLVSURJUDPDOVRXVHVWKH630'SDUDGLJP(YHQWKRXJKSURFHVVH[HFXWHVDQHVVHQWLDOO\\GLIIHUHQWVHWRIFRPPDQGVIURPWKHUHPDLQLQJSURFHVVHVLWVWLOOUXQVWKHVDPHSURJUDP7KHGLIIHUHQWFRPPDQGVDUHH[HFXWHGE\\EUDQFKLQJEDVHGRQWKHSURFHVVUDQN ,2RQ3DUDOOHO3URFHVVRUV 2QHREYLRXVSUREOHPZLWKRXUSURJUDPLVLWVODFNRIJHQHUDOLW\\WKHGDWDDEDQGQDUHKDUGZLUHG 7KHXVHUVKRXOGEHDEOHWRHQWHUWKHVHYDOXHVGXULQJH[HFXWLRQ/HW·VORRNPRUHFDUHIXOO\\DWWKHSUREOHPRI,2RQSDUDOOHOPDFKLQHV ,QRXUgreetingsDQGtrapezoidSURJUDPVZHDVVXPHGWKDWSURFHVVFRXOGZULWHWRVWDQGDUGRXWSXWWKHWHUPLQDOVFUHHQ0RVWSDUDOOHOSURFHVVRUVSURYLGHWKLVPXFK,2,QIDFWPRVWSDUDOOHOSURFHVVRUVDOORZDOOSURFHVVRUVWRERWKUHDGIURPVWDQGDUGLQSXWDQGZULWHWRVWDQGDUGRXWSXW+RZHYHUGLIILFXOWDULVHZKHQVHYHUDOSURFHVVHVDUHVLPXOWDQHRXVO\\WU\\LQJWRH[HFXWH,2IXQFWLRQV,QRUGHUWRXQGHUVWDQGWKLVOHW·VORRNDWDQH[DPSOH 6XSSRVHZHPRGLI\\WKHtrapezoidSURJUDPVRWKDWHDFKSURFHVVDWWHPSWVWRUHDGWKHYDOXHVDEDQGQE\\DGGLQJWKHVWDWHPHQWread *, a , b, n 6XSSRVHDOVRWKDWZHUXQWKHSURJUDPZLWKWZRSURFHVVHVDQGWKHXVHUW\\SHVLQ0 1 1024 :KDWKDSSHQ\"'RERWKSURFHVVHVJHWWKHGDWD\"'RHVRQO\\RQH\"2UHYHQZRUVHGRHVVD\\SURFHVVJHWWKHDQGZKLOHSURFHVVJHWVWKH\",IDOOWKHSURFHVVHVJHWWKHGDWDZKDWKDSSHQVZKHQZHZULWHDSURJUDPZKHUHZHZDQWSURFHVVJHWVWKHGDWDZKDWKDSSHQVWRWKHRWKHUV\",VLWHYHQUHDVRQDEOHWRKDYHPXOWLSOHSURFHVVHVUHDGLQJGDWDIURPDVLQJOHWHUPLQDO\" 2QWKHRWKHUKDQGZKDWKDSSHQVLIVHYHUDOSURFHVVHVDWWHPSWWRVLPXOWDQHRXVO\\ZULWHGDWDWRWKHWHUPLQDOVFUHHQ'RHVWKHGDWDIURPSURFHVVJHWSULQWHGILUVWWKHQWKHGDWDIRUPSURFHVVHWF\"2UGRHVWKHGDWDDSSHDULQVRPHUDQGRPRUGHU\"2UHYHQZRUVHGRHVWKHGDWDIURPWKHGLIIHUHQWSURFHVVHVJHWDOOPL[HGXSVD\\KDOIDOLQHIURPWZRFKDUDFWHUVIURPFKDUDFWHUVIURPWZROLQHVIURPHWF\" 7KHVWDQGDUG,2FRPPDQGVDYDLODEOHLQ)RUWUDQDQGPRVWRWKHUODQJXDJHVGRQ·WSURYLGHVLPSOHVROXWLRQVWRWKHVHSUREOHPVDQG,2FRQWLQXHVWREHWKHVXEMHFWRIFRQVLGHUDEOHUHVHDUFKLQWKHSDUDOOHOSURFHVVLQJFRPPXQLW\\6ROHW·VORRNDWVRPHQRWVRVLPSOHVROXWLRQVWRWKHVHSUREOHPV7KXVIDUZHKDYHDVVXPHGWKDWSURFHVVFDQDWOHDVWZULWHWRVWDQGDUGRXWSXW:HZLOODOVRDVVXPHWKDWLWFDQUHDGIURPVWDQGDUGLQSXW,QPRVWFDVHVZHZLOORQO\\DVVXPHWKDWSURFHVVFDQGR,2,WVKRXOGEHQRWHGWKDWWKLVLVDYHU\\ZHDNDVVXPSWLRQVLQFHDVZHQRWHGPRVWSDUDOOHOPDFKLQHVDOORZPXOWLSOHSURFHVVHVWRFDUU\\RXW,2 C ***************************************************************** C Function Get_data C Reads in the user input a, b, and n.C Input arguments: C 1. integer my_rank: rank of current process.C 2. integer p: number of processes.C Output parameters: C 1. real a: left endpoint a.C 2. real b: right endpoint b. C 3. integer n: number of trapezoids.C Algorithm: C 1. Process 0 prompts user for input andC reads in the values. C 2. Process 0 sends input values to otherC processes.C subroutine Get_data(a, b, n, my_rank, p)IMPLICIT NONEreal areal binteger ninteger my_rankinteger p INCLUDE 'mpif.h'C integer sourceinteger destinteger tag integer status(MPI_STATUS_SIZE)integer ierrdata source /0/C if (my_rank == 0) thenprint *, 'Enter a, b and n' read *, a, b, nCC do dest = 1 , p-1 tag = 0 call MPI_SEND(a, 1, MPI_REAL , dest, tag,+ MPI_COMM_WORLD, ierr )tag = 1 call MPI_SEND(b, 1, MPI_REAL , dest, tag,+ MPI_COMM_WORLD, ierr ) tag = 2 call MPI_SEND(n, 1, MPI_INTEGER, dest,+ tag, MPI_COMM_WORLD, ierr )enddoelsetag = 0 call MPI_RECV(a, 1, MPI_REAL , source, tag,+ MPI_COMM_WORLD, status, ierr )tag = 1 call MPI_RECV(b, 1, MPI_REAL , source, tag,+ MPI_COMM_WORLD, status, ierr )tag = 2 call MPI_RECV(n, 1, MPI_INTEGER, source, tag,+ MPI_COMM_WORLD, status, ierr )endifreturnendCC C **************************************************************** ** &ROOHFWLYH&RPPXQLFDWLRQ 7KHUHDUHSUREDEO\\DIHZWKLQJVLQWKHWUDSH]RLGUXOHSURJUDPWKDWZHFDQLPSURYHRQ)RUH[DPSOHWKHUHLVWKH,2LVVXH7KHUHDUHDOVRDFRXSOHRISUREOHPVZHKDYHQ·WGLVFXVVHG\\HW/HW·VORRNDWZKDWKDSSHQVZKHQWKHSURJUDPLVUXQZLWKHLJKWSURFHVVHV $OOWKHSURFHVVHVEHJLQH[HFXWLQJWKHSURJUDPPRUHRUOHVVVLPXODWDQHRXVO\\+RZHYHUDIWHUFDUU\\LQJRXWWKHEDVLFVHWXSWDVNVFDOOVWR03,B,QLW03,B&RPPBVL]HDQG03,B&RPPBUDQNSURFHVVHVDUHLGOHZKLOHSURFHVVFROOHFWVWKHLQSXWGDWD:HGRQ·WZDQWWRKDYHLGOHSURFHVVHVEXWLQYLHZRIRXUUHVWULFWLRQVRQZKLFKSURFHVVHVFDQUHDGLQSXWGDWDWKHKLJKHUUDQNSURFHVVHVPXVWFRQWLQXHWRZDLWZKLOHVHQGVWKHQSXWGDWDWRWKHORZHUUDQNSURFHVVHV7KLVLVQ·WMXVWDQ,2LVVXH1RWLFHWKDWWKHUHLVDVLPLODULQHIILFLHQF\\DWWKHHQGRIWKHSURJUDPZKHQSURFHVVGRHVDOOWKHZRUNRIFROOHFWLQJDQGGDGGLQJWKHORFDOLQWHJUDOV 2IFRXUVHWKLVLVKLJKO\\XQGHVLUDEOHWKHPDLQSRLQWRISDUDOOHOSURFHVVLQJLVWRJHWPXOWLSOHSURFHVVHVWRFROODERUDWHRQVROYLQJDSUREOHP,IRQHRIWKHSURFHVVHVLVGRLQJPRVWRIWKHZRUNZHPLJKWDVZHOOXVHDFRQYHQWLRQDOVLQJOHSURFHVVRUPDFKLQH 7UHH6WUXFWXUHG&RPPXQLFDWLRQ /HW·VWU\\WRLPSURYHRXUFRGH:H·OOEHJLQE\\IRFXVLQJRQWKHGLVWULEXWLRQRIWKHLQSXWGDWD+RZ FDQZHGLYLGHWKHZRUNPRUHHYHQO\\DPRQJWKHSURFHVVHV\"$QDWXUDOVROXWLRQLVWRLPDJLQHWKDWZHKDYHDWUHHRISURFHVVHVZLWKDWWKHURRW 'XULQJWKHILUVWVWDJHRIGDWDGLVWULEXWLRQVHQGVWKHGDWDWRVD\\'XULQJWKHQH[WVWDJHVHQGVWKHGDWDWRZKLOHVHQGVLWWR'XULQJWKHODVWVWDJHVHQGVWRZKLOHVHQGVWRVHQGVWRDQGVHQGVWRVHHILJXUH6RZHKDYHUHGXFHGRXULQSXWGLVWULEXWLRQORRSIURPVWDJHVWRVWDJHV0RUHJHQHUDOO\\LIZHKDYHSSURFHVVHVWKLVSURFHGXUHDOORZVXVWRGLVWULEXWHWKHLQSXWGDWDLQ VWDJHVUDWKHUWKDQSVWDJHVZKLFKLISLVODUJHLVDKXJHVDYLQJV )LJXUH3URFHVVRUVFRQILJXUHGDVDWUHH ,QRUGHUWRPRGLI\\WKH*HWBGDWDIXQFWLRQWRXVHDWUHHVWUXFWXUHGGLVWULEXWLRQVFKHPHZHQHHGWRLQWURGXFHDORRSZLWKFDOFXODWHDWHDFKVWDJH VWDJHV,QRUGHUWRLPSOHPHQWWKHORRSHDFKSURFHVVQHHGVWR • ZKHWKHULWUHFHLYHVDQGLIVRWKHVRXUFHDQG• ZKHWKHULWVHQGVDQGLIVRWKHGHVWLQDWLRQ $V\\RXFDQSUREDEO\\JXHVVWKHVHFDOFXODWLRQVFDQEHDELWFRPSOLFDWHGHVSHFLDOO\\VLQFHWKHUHLVQRFDQRQLFDOFKRLFHRIRUGHULQJ,QRXUH[DPSOHZHFKRVHVHQGVWR VHQGVWRVHQGVWR VHQGVWRVHQGVWRVHQGVWRVHQGVWR:HPLJKWDOVRKDYHFKRVHQIRUH[DPSOHVHQGVWR VHQGVWRVHQGVWR VHQGVWRVHQGVWRVHQGVWRVHQGVWR ,QGHHGXQOHVVZHNQRZVRPHWKLQJDERXWWKHXQGHUO\\LQJWRSRORJ\\RIRXUPDFKLQHZHFDQ·WUHDOO\\GHFLGHZKLFKVFKHPHLVEHWWHU 6RLGHDOO\\ZHZRXOGSUHIHUWRXVHDIXQFWLRQWKDWKDVEHHQVSHFLILFDOO\\WDLORUHGWRWKHPDFKLQHZH·UHXVLQJVRWKDWZHZRQ·WKDYHWRZRUU\\DERXWDOOWKHVHWHGLRXVGHWDLOVDQGZHZRQ·WKDYHWRPRGLI\\RXUFRGHHYHU\\WLPHZHFKDQJHPDFKLQHV$V\\RXPD\\KDYHJXHVV03,SURYLGHVVXFKDIXQFWLRQ %URDGFDVW $FRPPXQLFDWLRQSDWWHUQWKDWLQYROYHVDOOWKHSURFHVVHVLQDFRPPXQLFDWRULVD FROOHFWLYHFRPPXQLFDWLRQ$VDFRQVHTXHQFHDFROOHFWLYHFRPPXQLFDWLRQXVXDOO\\LQYROYHVPRUHWKDQWZRSURFHVVHV$EURDGFDVWLVDFROOHFWLYHFRPPXQLFDWLRQLQZKLFKDVLQJOHSURFHVVVHQGVWKHVDPHGDWDWRSHYHU\\SURFHVV,Q03,WKHIXQFWLRQIRUEURDGFDVWLQJGDWDLV03,B%FDVW MPI_BCAST( BUFFER, COUNT, DATATYPE, ROOT, COMM, IERROR) INTEGER COUNT, DATA, ROOT, COMM, IERROR ,WVLPSO\\VHQGVDFRS\\RIWKHGDWDLQ%8))(5RQSURFHVV5227WRHDFKSURFHVVLQWKHFRPPXQLFDWRU&200,7VKRXOGEHFDOOHGE\\DOOWKHSURFHVVHVLQWKHFRPPXQLFDWRUZLWKWKHVDPHDUJXPHQWVIRU5227DQG&200+HQFHDEURDGFDVWPHVVDJHFDQQRWEHUHFHLYHGZLWK03,B5HFY7KHSDUDPHWHUV&2817DQG'$7$7<3(KDYHWKHVDPHIXQFWLRQWKDWWKH\\KDYHLQ03,B6HQGDQG03B5HFYWKH\\VSHFLI\\WKHH[WHQWRIWKHPHVVDJH+RZHYHUXQOLNHWKHSRLQWWRSRLQWIXQFWLRQV03,LQVLVWVWKDWLQFROOHFWLYHFRPPXQLFDWLRQ&2817DQG'$7$7<3(EHWKHVDPHRQDOOWKHSURFHVVHVLQWKHFRPPXQLFDWRU>@7KHUHDVRQIRUWKLVLVWKDWLQVRPHFROOHFWLYHRSHUDWLRQVVHHEHORZDVLQJOHSURFHVVZLOOUHFHLYHGDWDIURPPDQ\\RWKHUSURFHVVHVDQGLQRUGHUIRUDSURJUDPWRGHWHUPLQHKRZPXFKGDWDKDVEHHQUHFHLYHGLWZRXOGQHHGDQHQWLUHDUUD\\RIUHWXUQVWDWXVHV:HFDQUHZULWHWKH*HWBGDWDIXQFWLRQXVLQJ03,B%FDVWDVIROORZVsubroutine Get_data2(a, b, n, my_rank)real areal binteger ninteger my_rankinteger ierrinclude 'mpif.h'CC if (my_rank .EQ. 0) thenprint *, 'Enter a, b, and n' read *, a, b, n endifC call MPI_BCAST(a, 1, MPI_REAL , 0, MPI_COMM_WORLD,ierr ) call MPI_BCAST(b, 1, MPI_REAL , 0, MPI_COMM_WORLD,ierr ) call MPI_BCAST(n, 1, MPI_INTEGER, 0, MPI_COMM_WORLD,ierr ) end subroutine Get_data2CC C ****************************************************************** &HUWDLQO\\WKLVYHUVLRQRI*HWBGDWDLVPXFKPRUHFRPSDFWDQGUHDGLO\\FRPSUHKHQVLEOHWKDQWKHRULJLQDODQGLI03,B%FDVWKDVEHHQRSWLPL]HGIRU\\RXUV\\VWHPLWZLOODOVREHDJRRGGHDOIDVWHU 5HGXFH ,QWKHWUDSH]RLGUXOHSURJUDPDIWHUWKHLQSXWSKDVHHYHU\\SURFHVVRUH[HFXWHVHVVHQWLDOO\\WKHVDPH FRPPDQGVXQWLOWKHILQDOVXPPDWLRQSKDVH6RXQOHVVRXUIXQFWLRQI[LVIDLUO\\FRPSOLFDWHGLHLWUHTXLUHVFRQVLGHUDEO\\PRUHZRUNWRHYDOXDWHRYHUFHUWDLQSDUWVRI>DE@WKLVSDUWRIWKHSURJUDPGLVWULEXWHVWKHZRUNHTXDOO\\DPRQJWKHSURFHVVRUV$VZHKDYHDOUHDG\\QRWHGWKLVLVQRWWKHFDVHZLWKWKHILQDOVXPPDWLRQSKDVHZKHQRQFHDJDLQSURFHVVJHWVDGLVSURSRUWLRQDWHDPRXQWRIWKHZRUN+RZHYHU\\RXKDYHSUREDEO\\DOUHDG\\QRWLFHGWKDWE\\UHYHUVLQJWKHDUURZVLQILJXUHZHFDQXVHWKHVDPHLGHDZHXVHGLQVHFWLRQ7KDWLVZHFDQGLVWULEXWHWKHZRUNRIFDOFXODWLQJWKHVXPDPRQJWKHSURFHVVRUVDVIROORZV DVHQGVWRVHQGVWRVHQGVWRVHQGVWR EDGGVLWVLQWHJUDOWRWKDWRIDGGVLWVLQWHJUDOWRWKDWRIHWF DVHQGVWRVHQGVWR EDGGVDGGV DVHQGVWRD DGGV 2IFRXUVHZHUXQLQWRWKHVDPHTXHVWLRQWKDWRFFXUUHGZKHQZHZHUHZULWLQJRXURZQEURDGFDVWLVWKLVWUHHVWUXFWXUHPDNLQJRSWLPDOXVHRIWKHWRSRORJ\\RIRXUPDFKLQH\"2QFHDJDLQZHKDYHWRDQVZHUWKDWWKLVGHSHQGVRQWKHPDFKLQH6RDVEHIRUHZHVKRXOGOHW03,GRWKHZRUNE\\XVLQJDQRSWLPL]HGIXQFWLRQ 7KHJOREDOVXPWKDWZHZLVKWRFDOFXODWHLVDQH[DPSOHRIDJHQHUDOFODVVRIFROOHFWLYHFRPPXQLFDWLRQRSHUDWLRQVFDOOHGUHGXFWLRQRSHUDWLRQV,QDJOREDOUHGXFWLRQRSHUDWLRQDOOWKHSURFHVVHVLQDFRPPXQLFDWRUFRQWULEXWHGDWDZKLFKLVFRPELQHGXVLQJDELQDU\\RSHUDWLRQ7\\SLFDOELQDU\\RSHUDWLRQVDUHDGGLWLRQPD[PLQORJLFDODQGHWF7KH03,IXQFWLRQIRUSHUIRUPLQJDUHGXFWLRQRSHUDWLRQLV MPI_Reduce(OPERAND, RESULT, COUNT, DATATYEP, OP, ROOT, COMM,IERROR) INTEGER COUNT, DATATYPE, OP, ROOT, COMM, IERROR 03,B5HGXFHFRPELQHVWKHRSHUDQGVVWRUHGLQ23(5$1'XVLQJRSHUDWLRQ23DQGVWRUHVWKHUHVXOWLQ5(68/7RQSURFHVV5227%RWK23(5$1'DQG5(68/7UHIHUWR&2817PHPRU\\ORFDWLRQVZLWKW\\SH'$7$7<3(03,B5HGXFHPXVWEHFDOOHGE\\DOOSURFHVVHVLQWKHFRPPXQLFDWRU&200DQG&2817'$7$7<3(DQG23PXVWEHWKHVDPHRQHDFKSURFHVV7KHDUJXPHQW23FDQWDNHRQRQHRIWKHIROORZLQJSUHGHILQHGYDOXHV 2SHUDWLRQ1DPH03,B0$;03,B0,103,B68003,B352'03,B/$1'03,B%$1'03,B/2503,B%2503,B/;2503,B%;2503,B0$;/2&03,B0,1/2& 0HDQLQJ0D[LPXP0LQLPXP6XP3URGXFW/RJLFDO$QG%LWZLVH$QG/RJLFDO2U%LWZLVW2U /RJLFDO([FOXVLYH2U%LWZLVH([FOXVLYH2U 0D[LPXPDQG/RFDWLRQRI0D[LPXP0LQLPXPDQG/RFDWLRQRI0LQLPXP ,WLVDOVRSRVVLEOHWRGHILQHDGGLWLRQDORSHUDWLRQV)RUGHWDLOVVHH>@ $VDQH[DPSOHOHW·VUHZULWHWKHODVWIHZOLQHVRIWKHWUDSH]RLGUXOHSURJUDPC Add up the integrals calculated by each process.MPI_Reduce( INTEGRAL, TOTAL, 1, MPI_REAL, MPI_SUM, 0,+ MPI_COMM_WORLD, ierr)C Print the result. 1RWHWKDWHDFKSURFHVVRUFDOOV03,B5HGXFHZLWKWKHVDPHDUJXPHQWV,QSDUWLFXODUHYHQWKRXJKWRWDORQO\\KDVVLJQLILFDQFHRQSURFHVVHDFKSURFHVVPXVWVXSSO\\DQDUJXPHQW 2WKHU&ROOHFWLYH&RPPXQLFDWLRQ)XQFWLRQV03,VXSSOLHVPDQ\\RWKHUFROOHFWLYHFRPPXQLFDWLRQIXQFWLRQV:HEULHIO\\HQXPHUDWHVRPHRIWKHVHKHUH)RUIXOOGHWDLOVVHH>@ • MPI_Barrier( COMM, IERROR)INTEGER COMM, IERROR 03,B%DUULHUSURYLGHVDPHFKDQLVPIRUV\\QFKURQL]LQJDOOWKHSURFHVVHVLQWKHFRPPXQLFDWRUFRPP(DFKSURFHVVEORFNVLHSDXVHVXQWLOHYHU\\SURFHVVLQFRPPKDVFDOOHG03,B%DUULHUMPI_Gather(SEND_BUF, SEND_COUNT, SEND_TYPE, RECV_BUF,RECV_COUNT, RECV_TYPE, ROOT, COMM, IERROR ) INTEGER SEND_COUNT,SEND_TYPE,RECV_COUNT,RECV_TYPE,ROOT,COMM,IERROR (DFKSURFHVVLQFRPPVHQGVWKHFRQWHQWVRIVHQGBEXIWRSURFHVVZLWKUDQNURRW7KHUSRFHVVURRWFRQFDWHQDWHVWKHUHFHLYHGGDWDLQSURFHVVUDQNRUGHULQUHFYBEXI7KDWLVWKHGDWDIURPSURFHVVLVIROORZHGE\\WKHGDWDIURPSURFHVVZKLFKLVIROORZHGE\\WKHGDWDIURPSURFHVVHWF7KHUHFYDUJXPHQWVDUHVLJQLILFDQWRQO\\RQWKHSURFHVVZLWKUDQNURRW7KHDUJXPHQWUHFYBFRXQWLQGLFDWHVWKHQXPEHURILWHPVUHFHLYHGIURPHDFKSURFHVVQRWWKHWRWDOQXPEHUUHFHLYHGMPI_Scatter(SEND_BUF, SEND_COUNT, SEND_TYPE, RECV_BUF,RECV_COUNT, RECV_TYPE, ROOT, COMM, IERROR ) INTEGER SEND_COUNT,SEND_TYPE,RECV_COUNT,RECV_TYPE,ROOT,COMM,IERROR 7KHSURFHVVZLWKUDQNURRWGLVWULEXWHVWKHFRQWHQWVRIVHQGBEXIDPRQJWKHSURFHVVHV7KHFRQWHQWVRIVHQGBEXIDUHVSOLWLQWRSVHJPHQWVHDFKFRQVLVWLQJRIVHQGBFRXQWLWHPV7KHILUVWVHJPHQWJRHVWRSURFHVVWKHVHFRQGWRSURFHVVHWF7KHVHQGDUJXPHQWVDUHVLJQLILFDQWRQO\\RQSURFHVVURRWMPI_Allgather(SEND_BUF, SEND_COUNT, SEND_TYPE, RECV_BUF,RECV_COUNT, RECV_TYPE, ROOT, COMM, IERROR ) INTEGER SEND_COUNT,SEND_TYPE,RECV_COUNT,RECV_TYPE,ROOT,COMM,IERROR 03,B$OOJDWKHUJDWKHUVWKHFRQWHQWVRIHDFKVHQGBEXIRQHDFKSURFHVV,WVHIIHFWLVWKHVDPHDVLIWKHUHZHUHDVHTXHQFHRISFDOOVWR03,B*DWKHUHDFKRIZKLFKKDVDGLIIHUHQWSURFHVVDFWLQJDVURRW MPI_AllReduce(OPERAND, RESULT, COUNT, DATATYPE, OP, COMM, IERROR) INTEGER COUNT, DATATYPE, OP ,COMM,IERROR 03,B$OOUHGXFHVWRUHVWKHUHVXOWRIWKHUHGXFHRSHUDWLRQ23LQHDFKSURFHVV·UHVXOWEXIIHU *URXSLQJ'DWDIRU&RPPXQLFDWLRQ :LWKFXUUHQWJHQHUDWLRQPDFKLQHVVHQGLQJDPHVVDJHLVDQH[SHQVLYHRSHUDWLRQ6RDVDUXOHRIWKXPEWKHIHZHUPHVVDJHVVHQWWKHEHWWHUWKHRYHUDOOSHUIRUPDQFHRIWKHSURJUDP+RZHYHULQHDFKRIRXUWUDSH]RLGUXOHSURJUDPVZKHQZHGLVWULEXWHGWKHLQSXWGDWDZHVHQWDEDQGQLQVHSDUDWHPHVVDJHVZKHWKHUZHXVHG03,B6HQGDQG03,B5HFYRU03,B%FDVW6RZHVKRXOGEHDEOHWRLPSURYHWKHSHUIRUPDQFHRIWKHSURJUDPE\\VHQGLQJWKHWKUHHLQSXWYDOXHVLQDVLQJOHPHVVDJH03,SURYLGHVWKUHHPHFKDQLVPVIRUJURXSLQJLQGLYLGXDOGDWDLWHPVLQWRDVLQJOHPHVVDJHWKHFRXQWSDUDPHWHUWRWKHYDULRXVFRPPXQLFDWLRQURXWLQHVGHULYHGGDWDW\\SHVDQG03,B3DFN03,B8QSDFN:HH[DPLQHHDFKRIWKHVHRSWLRQVLQWXUQ 7KH&RXQW3DUDPHWHU 5HFDOOWKDW03,B6HQG03,B5HFY03,B%FDVWDQG03,B5HGXFHDOOKDYHDFRXQW DQGDdatatypeDUJXPHQW7KHVHWZRSDUDPHWHUVDOORZWKHXVHUWRJURXSGDWDLWHPVKDYLQJWKHVDPHEDVLFW\\SHLQWRDVLQJOHPHVVDJH,QRUGHUWRXVHWKLVWKHJURXSHGGDWDLWHPVPXVWEHVWRUHGLQFRQWLJXRXVPHPRU\\ORFDWLRQV6LQFH)RUWUDQJXDUDQWHHVWKDWDUUD\\HOHPHQWVDUHVWRUHGLQFRQWLJXRXVPHPRU\\ORFDWLRQVLIZHZLVKWRVHQGWKHHOHPHQWVRIDQDUUD\\RUDVXEVHWRIDQDUUD\\ZHFDQGRVRLQDVLQJOHPHVVDJH,QIDFWZH·YHDOUHDG\\GRQHWKLVLQVHFWLRQZKHQZHVHQWDQDUUD\\RIcharacter$VDQRWKHUH[DPSOHVXSSRVHZHZLVKWRVHQGWKHVHFRQGKDOIRIDYHFWRUFRQWDLQLQJUHDOQXPEHUVIURPSURFHVVWRSURFHVV real vector(100) integer status(MPI_STATUS_SIZE)integer p, my_rank, ierrinteger i... if (my_rank == 0) then C Initialize vector and send.tag = 47count = 50dest = 1 call MPI_SEND(vector(51), count, MPI_REAL, dest, tag,+ MPI_COMM_WORLD, ierr)elsetag = 47count = 50source = 0 call MPI_RECV(vector(51), count, MPI_REAL, source,tag, + MPI_COMM_WORLD, status, ierr)endif 8QIRUWXQDWHO\\WKLVGRHVQ·WKHOSXVZLWKWKHWUDSH]RLGUXOHSURJUDP7KHGDWDZHZLVKWRGLVWULEXWHWRWKHRWKHUSURFHVVHVDEDQGQDUHVWRUHGLQDQDUUD\\6RHYHQLIZHGHFODUHGWKHPRQHDIWHUWKHRWKHULQRXUSURJUDPreal areal binteger n )RUWUDQGRHVQRWJXDUDQWHHWKDWWKH\\DUHVWRUHGLQFRQWLJXRXVPHPRU\\ORFDWLRQV2QHPLJKWEHWHPSWHGWRVWRUHQDVDIORDWDQGSXWWKHWKUHHYDOXHVLQDQDUUD\\EXWWKLVZRXOGEHSRRUSURJUDPPLQJVW\\OHDQGLWZRXOGQ·WDGGUHVVWKHIXQGDPHQWDOLVVXH,QRUGHUWRVROYHWKHSUREOHPZHQHHGWRXVHRQHRI03,·VRWKHUIDFLOLWLHVIRUJURXSLQJGDWD 'HULYHG7\\SHVDQG03,B7\\SHBVWUXFW ,WPLJKWVHHPWKDWDQRWKHURSWLRQZRXOGEHWRVWRUHDEDQGQLQDGHULYHGW\\SHZLWK WKUHHPHPEHUVWZRUHDOVDQGDQLQWHJHUDQGWU\\WRXVHWKHGDWDW\\SHDUJXPHQWWR03,B%FDVW7KHGLIILFXOW\\KHUHLVWKDWWKHW\\SHRIGDWDW\\SHLV03,B'DWDW\\SHZKLFKLVDQDFWXDOW\\SHLWVHOIQRWWKHVDPHWKLQJDVDXVHUGHILQHGW\\SHLQ)RUWUDQ)RUH[DPSOHVXSSRVHZHLQFOXGHGWKHW\\SHGHILQLWLRQtype INDATA_TYPEreal areal binteger nend type DQGWKHYDULDEOHGHILQLWLRQ type (INDATA_TYPE) indata1RZLIZHFDOO03,B%FDVW call MPI_Bcast(indata, 1, INDATA_TYPE, 0,MPI_COMM_WORLD,+ ierror) WKHSURJUDPZLOOIDLO7KHGHWDLOGHSHQGRQWKHLPSOHPHQWDWLRQRI03,WKDW\\RX·UHXVLQJ7KHSUREOHPKHUHLVWKDW03,LVDSUHH[LVWLQJOLEUDU\\RIIXQFWLRQV7KDWLVWKH03,IXQFWLRQVZHUHZULWWHQZLWKRXWNQRZOHGJHRIWKHGDWDW\\SHVWKDW\\RXGHILQHLQ\\RXUSURJUDP,QSDUWLFXODUQRQHRIWKH03,IXQFWLRQVNQRZVDERXW,1'$7$B7<3( 03,SURYLGHVDSDUWLDOVROXWLRQWRWKLVSUREOHPE\\DOORZLQJWKHXVHUWREXLOG03,GDWDW\\SHVDWH[HFXWLRQWLPH,QRUGHUWREXLOGDQ03,GDWDW\\SHRQHHVVHQWLDOO\\VSHFLILHVWKHOD\\RXWRIWKHGDWDLQWKHW\\SHWKHPHPEHUW\\SHVDQGWKHLUUHODWLYHORFDWLRQVLQPHPRU\\6XFKDW\\SHLVFDOOHGD03,GHULYHGGDWDW\\SH,QRUGHUWRVHHKRZWKLVZRUNVOHW·VZULWHDIXQFWLRQWKDWZLOOEXLOGD03,GHULYHGW\\SHMODULE GLOBALtype INDATA_TYPEreal areal binteger n end type INDATA_TYPEEND MODULE GLOBAL subroutine Build_derived_type(indata, mesg_mpi_t)use GLOBALINCLUDE 'mpif.h'IMPLICIT NONE type(INDATA_TYPE) indatainteger mesg_mpi_tinteger ierr integer block_lengths(3)integer displacements(3)integer address(4)integer typelist(3) C Build a derived datatype consisting of two real andan integer. C First specify the types.typelist(1) = MPI_REALtypelist(2) = MPI_REALtypelist(3) = MPI_INTEGER C Specify the number of elements of each type.block_lengths(1) = 1block_lengths(2) = 1block_lengths(3) = 1 C Calculate the displacements of the members relativeto indata. call MPI_Address(indata, address(1), ierr)call MPI_Address(indata%a, address(2), ierr)call MPI_Address(indata%b, address(3), ierr)call MPI_Address(indata%n, address(4), ierr)displacements(1) = address(2) - address(1)displacements(2) = address(3) - address(1)displacements(3) = address(4) - address(1)C Build the derived datatype call MPI_TYPE_STRUCT(3, block_lengths, displacements,+ typelist, mesg_mpi_t, ierr) C Commit it -- tell system we'll be using it forcommunication. call MPI_TYPE_COMMIT(mesg_mpi_t, ierr)returnend 7KHILUVWWKUHHVWDWHPHQWVVSHFLI\\WKHW\\SHVRIWKHPHPEHUVRIWKH03,GHULYHGW\\SHDQGWKHQH[WWKUHHVSHFLILHVWKHQXPEHURIHOHPHQWVRIHDFKW\\SH7KHQH[WIRXUFDOFXODWHWKHDGGUHVVHVRIWKHWKUHHPHPEHUVRIindata7KHQH[WWKUHHVWDWHPHQWVXVHWKHFDOFXODWHGDGGUHVVHVWRGHWHUPLQHWKHGLVSODFHPHQWVRIWKHWKUHHPHPEHUVUHODWLYHWRWKHDGGUHVVRIWKHILUVWZKLFKLVJLYHQGLVSODFHPHQW:LWKWKLVLQIRUPDWLRQZHNQRZWKHW\\SHVVL]HVDQGUHODWLYHORFDWLRQVRIWKHPHPEHUVRIDYDULDEOHKDYLQJ)RUWUDQW\\SH,1'$7$B7<3(DQGKHQFHZHFDQGHILQHDGHULYHGGDWDW\\SHWKDWFRUUHVSRQGVWRWKH)RUWUDQW\\SH7KLVLVGRQHE\\FDOOLQJWKHIXQFWLRQVMPI_Type_structDQGMPI_Type_commit 7KHQHZO\\FUHDWHG03,GDWDW\\SHFDQEHXVHGLQDQ\\RIWKH03,FRPPXQLFDWLRQIXQFWLRQV,QRUGHUWRXVHLWZHVLPSO\\XVHWKHVWDUWLQJDGGUHVVRIDYDULDEOHRIW\\SH,1'$7$B7<3(DVWKHILUVWDUJXPHQWDQGWKHGHULYHGW\\SHLQWKHGDWDW\\SHDUJXPHQW)RUH[DPSOHZHFRXOGUHZULWHWKH*HWBGDWDIXQFWLRQDVIROORZVsubroutine Get_data3(indata, my_rank)use global type(INDATA_TYPE) indatainteger my_rankinteger mesg_mpi_tinteger ierrinclude 'mpif.h'if (my_rank == 0) thenprint *, 'Enter a, b, and n' read *, indata%a, indata%b, indata%nendif call Build_derived_type(indata, mesg_mpi_t)call MPI_BCAST(indata, 1, mesg_mpi_t, 0,MPI_COMM_WORLD,+ierr ) returnend 7RVXPPDUL]HWKHQZHFDQEXLOGJHQHUDO03,GHULYHGGDWDW\\SHVE\\FDOOLQJMPI_Type_struct7KHV\\QWD[LV call MPI_TYPE_STRUCT(count, array_of_block_lengths,+array_of_displacements, array_of_types, newtype,ierror) integer count, array_of_block_lengths(*), integer array_of_displacements(*) , array_of_types(*)integer array_of_types(*), newtype, ierror 7KHDUJXPHQWcountLVWKHQXPEHURIHOHPHQWVLQWKHGHULYHGW\\SH,WLVDOVRWKHVL]HRIWKHWKUHHDUUD\\Varray_of_block_lengthsarray_of_displacementsDQGarray_of_types7KHDUUD\\array_of_block_lengthsFRQWDLQVWKHQXPEHURIHQWULHVLQHDFKHOHPHQWRIWKHW\\SH6RLIDQHOHPHQWRIWKHW\\SHLVDQDUUD\\RIPYDOXHVWKHQWKHFRUUHVSRQGLQJHQWU\\LQarray_of_block_lengthsLVP7KHDUUD\\array_of_displacementsFRQWDLQVWKHGLVSODFHPHQWRIHDFKHOHPHQWIURPWKHEHJLQQLQJRIWKHPHVVDJHDQGWKHDUUD\\array_of_typesFRQWDLQVWKH03,GDWDW\\SHRIHDFKHQWU\\7KHDUJXPHQWnewtypeUHWXUQVDSRLQWHUWRWKH03,GDWDW\\SHFUHDWHGE\\WKHFDOOWRMPI_Type_struct 1RWHDOVRWKDWnewtypeDQGWKHHQWULHVLQarray_of_typesDOOKDYHWSHMPI_Datatype6RMPI_Type_structFDQEHFDOOHGUHFXUVLYHO\\WREXLOGPRUHFRPSOH[GHULYHGGDWDW\\SHV 2WKHU'HULYHG'DWDW\\SH&RQVWUXFWRUV MPI_Type_structLVWKHPRVWJHQHUDOGDWDW\\SHFRQVWUXFWRULQ03,DQGDVD FRQVHTXHQFHWKHXVHUPXVWSURYLGHDFRPSOHWHGHVFULSWLRQRIHDFKHOHPHQWRIWKHW\\SH,IWKHGDWDWREHWUDQVPLWWHGFRQVLVWVRIDVXEVHWRIWKHHQWULHVLQDQDUUD\\ZHVKRXOGQWQHHGWRSURYLGHVXFKGHWDLOHGLQIRUPDWLRQVLQFHDOOWKHHOHPHQWVKDYHWKHVDPHEDVLFW\\SH03,SURYLGHVWKUHHGHULYHGGDWDW\\SHFRQVWUXFWRUVIRUGHDOLQJZLWKWKLVVLWXDWLRQMPI_Type_ContiguousMPI_Type_vectorDQGMPI_Type_indexed7KHILUVWFRQVWUXFWRUEXLOGVDGHULYHGW\\SHZKRVHHOHPHQWVDUHFRQWLJXRXVHQWULHVLQDQDUUD\\7KHVHFRQGEXLOGVDW\\SHZKRVHHOHPHQWVDUHHTXDOO\\VSDFHGHQWULHVRIDQDUUD\\DQGWKHWKLUGEXLOGVDW\\SHZKRVHHOHPHQWVDUHDUELWUDU\\HQWULHVRIDQDUUD\\1RWHWKDWEHIRUHDQ\\GHULYHGW\\SHFDQEHXVHGLQFRPPXQLFDWLRQLWPXVWEHFRPPLWWHGZLWKDFDOOWRMPI_Type_commit'HWDLOVRIWKHV\\QWD[RIWKHDGGLWLRQDOW\\SHFRQVWUXFWRUVIROORZ MPI_Type_contiguous(count, oldtype, newtype, ierror)integer count, oldtype, newtype, ierror MPI_Type_contiguousFUHDWHVDGHULYHGGDWDW\\SHFRQVLVWLQJRIcountHOHPHQWVRIW\\SHoldtype7KHHOHPHQWVEHORQJWRFRQWLJXRXVPHPRU\\ORFDWLRQV MPI_Type_vector(count, block_length, stride,+element_type, newtype, ierror) integer count, blocklength, stride oldtype, newtype,ierror MPI_Type_vectorFUHDWHVDGHULYHGW\\SHFRQVLVWLQJRIcountHOHPHQWV(DFKHOHPHQWFRQWDLQVblock_lengthHQWULHVRIW\\SHelement_typeStrideLVWKHQXPEHURIHOHPHQWVRIW\\SHelement_typeEHWZHHQVXFFHVVLYHHOHPHQWVRInew_type MPI_Type_indexed(count, array_of_block_lengths, +array_of_displacements, element_type, newtype, ierrorinteger count, array_of_block_lengths(*), +array_of_displacements, element_type, newtype, ierrorMPI_Type_indexedFUHDWHVDGHULYHGW\\SHFRQVLVWLQJRIcountHOHPHQWV7KHLWKHOHPHQWL countFRQVLVWVRIarray_of_block_lengths[i]HQWULHVRIW\\SHelement_typeDQGLWLVGLVSODFHGarray_of_displacements[i]XQLWVRIW\\SHelement_typeIURPWKHEHJLQQLQJRInewtype 3DFN8QSDFN $QDOWHUQDWLYHDSSURDFKWRJURXSLQJGDWDLVSURYLGHGE\\WKH03,IXQFWLRQV MPI_PackDQGMPI_UnpackMPI_PackDOORZVRQHWRH[SOLFLWO\\VWRUHQRQFRQWLJXRXVGDWDLQFRQWLJXRXVPHPRU\\ORFDWLRQVDQGMPI_UnpackFDQEHXVHGWRFRS\\GDWDIURPDFRQWLJXRXVEXIIHULQWRQRQFRQWLJXRXVPHPRU\\ORFDWLRQV,QRUGHUWRVHHKRZWKH\\DUHXVHGOHWVUHZULWHGet_dataRQHODVWWLPHsubroutine Get_data4(a, b, n, my_rank)real areal binteger ninteger my_rankC INCLUDE 'mpif.h'integer ierr character buffer(100)integer positionC in the bufferC if (my_rank .EQ. 0) thenprint *,'Enter a, b, and n'read *, a, b, nC C Now pack the data into buffer. Position = 0C says start at beginning of buffer.position = 0C C Position is in/out call MPI_PACK(a, 1, MPI_REAL , buffer, 100,+ position, MPI_COMM_WORLD, ierr ) C Position has been incremented: it now refer-C ences the first free location in buffer.C call MPI_PACK(b, 1, MPI_REAL , buffer, 100,+ position, MPI_COMM_WORLD, ierr )C Position has been incremented again.C call MPI_PACK(n, 1, MPI_INTEGER, buffer, 100,+ position, MPI_COMM_WORLD, ierr )C Position has been incremented again.C C Now broadcast contents of buffer call MPI_BCAST(buffer, 100, MPI_PACKED, 0,+ MPI_COMM_WORLD, ierr )else call MPI_BCAST(buffer, 100, MPI_PACKED, 0,+ MPI_COMM_WORLD, ierr )C C Now unpack the contents of buffer position = 0 call MPI_UNPACK(buffer, 100, position, a, 1,+ MPI_REAL , MPI_COMM_WORLD, ierr ) C Once again position has been incremented:C it now references the beginning of b.C call MPI_UNPACK(buffer, 100, position, b, 1,+ MPI_REAL , MPI_COMM_WORLD, ierr ) call MPI_UNPACK(buffer, 100, position, n, 1,+ MPI_INTEGER, MPI_COMM_WORLD, ierr )endifreturnendC ,QWKLVYHUVLRQRIGet_dataSURFHVVXVHVMPI_PackWRFRS\\aWRbufferDQGWKHQDSSHQGbDQGn$IWHUWKHEURDGFDVWRIbufferWKHUHPDLQLQJSURFHVVHVXVHMPI_UnpackWRVXFFHVVLYHO\\H[WUDFWabDQGnIURPbuffer1RWHWKDWWKHGDWDW\\SHIRUWKHFDOOVWRMPI_BcastLVMPI_PACKED7KHV\\QWD[RIMPI_PackLV MPI_Pack( pack_data, in_count, datatype, buffer, size,+position_ptr, comm, ierror) integer in_count, datatype, size, position_ptr, comm,ierror 7KHSDUDPHWHUpack_dataUHIHUHQFHVWKHGDWDWREHEXIIHUHG,WVKRXOGFRQVLVWRIin_countHOHPHQWVHDFKKDYLQJW\\SHdatatype7KHSDUDPHWHUposition_ptr LVDQLQRXWSDUDPHWHU2QLQSXWWKHGDWDUHIHUHQFHGE\\pack_dataLVFRSLHGLQWRPHPRU\\VWDUWLQJDWDGGUHVVbuffer + position_ptr2QUHWXUQposition_ptrUHIHUHQFHVWKHILUVWORFDWLRQLQbufferDIWHUWKHGDWDWKDWZDVFRSLHG7KHSDUDPHWHUsizeFRQWDLQVWKHVL]HLQE\\WHVRIWKHPHPRU\\UHIHUHQFHGE\\bufferDQGcommLVWKHFRPPXQLFDWRUWKDWZLOOEHXVLQJbuffer7KHV\\QWD[RIMPI_UnpackLV MPI_Unpack(buffer, size, position_ptr, unpack_data,+count, datatype, comm, ierror) integer insize, position, outcount, datatype, comm,ierror 7KHSDUDPHWHUbufferUHIHUHQFHVWKHGDWDWREHXQSDFNHG,WFRQVLVWVRIsizeE\\WHV7KHSDUDPHWHUposition_ptrLVRQFHDJDLQDQLQRXWSDUDPHWHU:KHQMPI_UnpackLVFDOOHGWKHGDWDVWDUWLQJDWDGGUHVVbuffer + position_ptrLVFRSLHGLQWRWKHPHPRU\\UHIHUHQFHGE\\unpack_data2QUHWXUQposition_ptrUHIHUHQFHVWKHILUVWORFDWLRQLQbufferDIWHUWKHGDWDWKDWZDVMXVWFRSLHGMPI_UnpackZLOOFRS\\countHOHPHQWVKDYLQJW\\SHdatatypeLQWRunpack_data7KHFRPPXQLFDWRUDVVRFLDWHGZLWKbufferLVcomm 'HFLGLQJ:KLFK0HWKRGWR8VH ,IWKHGDWDWREHVHQWLVVWRUHGLQFRQVHFXWLYHHQWULHVRIDQDUUD\\WKHQRQHVKRXOGVLPSO\\XVHWKHcountDQGdatatypeDUJXPHQWVWRWKHFRPPXQLFDWLRQIXQFWLRQV7KLVDSSURDFKLQYROYHVQRDGGLWLRQDORYHUKHDGLQWKHIRUPRIFDOOVWRGHULYHGGDWDW\\SHFUHDWLRQIXQFWLRQVRUFDOOVWRMPI_Pack/MPI_Unpack ,IWKHUHDUHDODUJHQXPEHURIHOHPHQWVWKDWDUHQRWLQFRQWLJXRXVPHPRU\\ORFDWLRQVWKHQEXLOGLQJDGHULYHGW\\SHZLOOSUREDEO\\LQYROYHOHVVRYHUKHDGWKDQDODUJHQXPEHURIFDOOVWRMPI_Pack/MPI_Unpack ,IWKHGDWDDOOKDYHWKHVDPHW\\SHDQGDUHVWRUHGDWUHJXODULQWHUYDOVLQPHPRU\\HJDFROXPQRIDPDWUL[WKHQLWZLOODOPRVWFHUWDLQO\\EHPXFKHDVLHUDQGIDVWHUWRXVHDGHULYHGGDWDW\\SHWKDQLWZLOOEHWRXVHMPI_Pack/MPI_Unpack)XUWKHUPRUHLIWKHGDWDDOOKDYHWKHVDPHW\\SHEXWDUHVWRUHGLQLUUHJXODUO\\VSDFHGORFDWLRQVLQPHPRU\\LWZLOOVWLOOSUREDEO\\EHHDVLHUDQGPRUHHIILFLHQWWRFUHDWHDGHULYHGW\\SHXVLQJMPI_Type_indexed)LQDOO\\LIWKHGDWDDUHKHWHURJHQHRXVDQGRQHLVUHSHDWHGO\\VHQGLQJWKHVDPHFROOHFWLRQRIGDWDHJURZQXPEHUFROXPQQXPEHUPDWUL[HQWU\\WKHQLWZLOOEHEHWWHUWRXVHDGHULYHGW\\SHVLQFHWKHRYHUKHDGRIFUHDWLQJWKHGHULYHGW\\SHLVLQFXUUHGRQO\\RQFHZKLOHWKHRYHUKHDGRIFDOOLQJMPI_Pack/MPI_UnpackPXVWEHLQFXUUHGHYHU\\WLPHWKHGDWDLVFRPPXQLFDWHG7KLVOHDYHVWKHFDVHZKHUHRQHLVVHQGLQJKHWHURJHQHRXVGDWDRQO\\RQFHRUYHU\\IHZWLPHV,QWKLVFDVHLWPD\\EHDJRRGLGHDWRFROOHFWVRPHLQIRUPDWLRQRQWKHFRVWRIGHULYHGW\\SHFUHDWLRQDQGSDFNLQJXQSDFNLQJWKHGDWD)RUH[DPSOHRQDQQ&8%(UXQQLQJWKH03,&+LPSOHPHQWDWLRQRI03,LWWDNHVDERXWPLOOLVHFRQGVWRFUHDWHWKHGHULYHGW\\SHXVHGLQGet_data3ZKLOHLWRQO\\WDNHVDERXWPLOOLVHFRQGVWRSDFNRUXQSDFNWKHGDWDLQGet_data42IFRXUVHWKHVDYLQJLVQWDVJUHDWDVLWVHHPVEHFDXVHRIWKHDV\\PPHWU\\LQWKHSDFNXQSDFNSURFHGXUH7KDWLVZKLOHSURFHVVSDFNVWKHGDWDWKHRWKHUSURFHVVHVDUHLGOHDQGWKHHQWLUHIXQFWLRQZRQWFRPSOHWHXQWLOERWKWKHSDFNDQGXQSDFNDUHH[HFXWHG6RWKHFRVWUDWLRLVSUREDEO\\PRUHOLNHWKDQ 7KHUHDUHDOVRDFRXSOHRIVLWXDWLRQVLQZKLFKWKHXVHRIMPI_PackDQGMPI_UnpackLVSUHIHUUHG1RWHILUVWWKDWLWPD\\EHSRVVLEOHWRDYRLGWKHXVHRIV\\VWHPEXIIHULQJZLWKSDFNVLQFHWKHGDWDLVH[SOLFLWO\\VWRUHGLQDXVHUGHILQHGEXIIHU7KHV\\VWHPFDQH[SORLWWKLVE\\QRWLQJWKDWWKHPHVVDJHGDWDW\\SHLVMPI_PACKED$OVRQRWHWKDWWKHXVHUFDQVHQGYDULDEOHOHQJWKPHVVDJHVE\\SDFNLQJWKHQXPEHURIHOHPHQWVDWWKHEHJLQQLQJRIWKHEXIIHU)RUH[DPSOHVXSSRVHZHZDQWWRVHQGURZVRIDVSDUVHPDWUL[,IZHKDYHVWRUHGDURZDVDSDLURIDUUD\\VRQHFRQWDLQLQJWKHFROXPQVXEVFULSWVDQGRQHFRQWDLQLQJWKHFRUUHVSRQGLQJPDWUL[HQWULHVZHFRXOGVHQGDURZIURPSURFHVVWRSURFHVVDVIROORZV PROGRAM SpaRowINCLUDE 'mpif.h'integer HUGE parameter (HUGE = 100)integer pinteger my_rankreal entries(10) integer column_subscripts(10)integer nonzeroesinteger positioninteger row_numbercharacter buffer *100 integer status(MPI_STATUS_SIZE)integer ierrinteger i data nonzeroes /10/C call MPI_INIT( ierr) call MPI_COMM_SIZE(MPI_COMM_WORLD, p, ierr )call MPI_COMM_RANK(MPI_COMM_WORLD, my_rank, ierr )C if (my_rank .EQ. 0) then C Get the number of nonzeros in the row.C Initialize entries and column_subscriptsdo i = 1, nonzeroesentries(i) = 2*i column_subscripts(i) = 3*ienddoC C Now pack the data and send position = 1 call MPI_PACK( nonzeroes, 1, MPI_INTEGER, buffer, HUGE,+ position, MPI_COMM_WORLD, ierr ) call MPI_PACK( row_number, 1, MPI_INTEGER, buffer, HUGE,+ position, MPI_COMM_WORLD, ierr ) call MPI_PACK(entries, nonzeroes, MPI_REAL , buffer,+ HUGE, position, MPI_COMM_WORLD, ierr ) call MPI_PACK(column_subscripts,nonzeroes,MPI_INTEGER,+ buffer, HUGE, position, MPI_COMM_WORLD, ierr )call MPI_SEND(buffer, position, MPI_PACKED, 1, 0,+ MPI_COMM_WORLD, ierr )else call MPI_RECV(buffer, HUGE, MPI_PACKED, 0, 0,+ MPI_COMM_WORLD, status, ierr )position = 1 call MPI_UNPACK(buffer, HUGE, position, nonzeroes,+ 1, MPI_INTEGER, MPI_COMM_WORLD, ierr ) call MPI_UNPACK(buffer, HUGE, position, row_number,+ 1, MPI_INTEGER, MPI_COMM_WORLD, ierr ) call MPI_UNPACK(buffer,HUGE, position, entries,+ nonzeroes, MPI_REAL , MPI_COMM_WORLD, ierr )call MPI_UNPACK(buffer, HUGE, position,+ column_subscripts, + nonzeroes, MPI_INTEGER, MPI_COMM_WORLD, ierr )do i = 1, nonzeroes print *, entries(i), column_subscripts(i)enddoendifC call MPI_FINALIZE(ierr) end &RPPXQLFDWRUVDQG7RSRORJLHV 7KHXVHRIFRPPXQLFDWRUVDQGWRSRORJLHVPDNHV03,GLIIHUHQWIURPPRVWRWKHUPHVVDJHSDVVLQJV\\VWHPV5HFROOHFWWKDWORRVHO\\VSHDNLQJDFRPPXQLFDWRULVDFROOHFWLRQRISURFHVVHVWKDWFDQVHQGPHVVDJHVWRHDFKRWKHU$WRSRORJ\\LVDVWUXFWXUHLPSRVHGRQWKHSURFHVVHVLQDFRPPXQLFDWRUWKDWDOORZVWKHSURFHVVHVWREHDGGUHVVHGLQGLIIHUHQWZD\\V,QRUGHUWRLOOXVWUDWHWKHVHLGHDVZHZLOOGHYHORSFRGHWRLPSOHPHQW)R[VDOJRULWKPIRUPXOWLSO\\LQJWZRVTXDUHPDWULFHV )R[V$OJRULWKP :HDVVXPHWKDWWKHIDFWRUPDWULFHV$ DLMDQG% ELMKDYHRUGHUQ:HDOVRDVVXPHWKDWWKHQXPEHURISURFHVVHVSLVDSHUIHFWVTXDUHZKRVHVTXDUHURRWHYHQO\\GLYLGHVQ6D\\S TDQG QT,Q)R[VDOJRULWKPWKHIDFWRUPDWULFHVDUHSDUWLWLRQHGDPRQJWKHSURFHVVHVLQDEORFNFKHFNHUERDUGIDVKLRQ6RZHYLHZRXUSURFHVVHVDVDYLUWXDOWZRGLPHQVLRQDOT[TJULGDQGHDFKSURFHVVLVDVVLJQHGDQ[VXEPDWUL[RIHDFKRIWKHIDFWRUPDWULFHV0RUHIRUPDOO\\ZHKDYHDPDSSLQJ WKDWLVERWKRQHWRRQHDQGRQWR7KLVGHILQHVRXUJULGRISURFHVVHVSURFHVVLEHORQJVWRWKHURZDQGFROXPQJLYHQE\\ )XUWKHUWKHSURFHVVZLWKUDQN LVDVVLJQHGWKHVXEPDWULFHV DQG )RUH[DPSOHLIS 3URFHVV [[PRGDQGQ WKHQ$ZRXOGEHSDUWLWLRQHGDVIROORZV 3URFHVV 3URFHVV 3URFHVV3URFHVV3URFHVV 3URFHVV3URFHVV3URFHVV ,Q)R[VDOJRULWKPWKHEORFNVXEPDWULFHV$UVDQG%VWV TDUHPXOWLSOLHGDQGDFFXPXODWHGRQSURFHVVdo step = 0, q - 1 1. Choose a submatrix of A from each row of processes.2. In each row of processes broadcast the submatrix chosen in that row to the other processes in that row.3. On each process, multiply the newly received submatrixof A by the submatrix of B currently residing on theprocess.4. On each process, send the submatrix of B to theprocess directly above. (On processes in the firstrow, send the submatrix to the last row.) enddo 7KHVXEPDWUL[FKRVHQLQWKHUWKURZLV$UXZKHUH X UstepPRGT7KHEDVLFDOJRULWKPLV &RPPXQLFDWRUV ,IZHWU\\WRLPSOHPHQW)R[VDOJRULWKPLWEHFRPHVDSSDUHQWWKDWRXUZRUNZLOOEHJUHDWO\\IDFLOLWDWHG LIZHFDQWUHDWFHUWDLQVXEVHWVRISURFHVVHVDVDFRPPXQLFDWLRQXQLYHUVHDWOHDVWRQDWHPSRUDU\\EDVLV)RUH[DPSOHLQWKHSVHXGRFRGH 1. In each row of processes broadcast the submatrix chosen in that row to the other processes in that row. LWZRXOGEHXVHIXOWRWUHDWHDFKURZRISURFHVVHVDVDFRPPXQLFDWLRQXQLYHUVHZKLOHLQWKHVWDWHPHQW 1. On each process, send the submatrix of B to theprocess directly above. (On processes in the firstrow, send the submatrix to the last row.) LWZRXOGEHXVHIXOWRWUHDWHDFKFROXPQRISURFHVVHVDVDFRPPXQLFDWLRQXQLYHUVH 7KHPHFKDQLVPWKDW03,SURYLGHVIRUWUHDWLQJDVXEVHWRISURFHVVHVDVDFRPPXQLFDWLRQXQLYHUVHLVWKHFRPPXQLFDWRU8SWRQRZZHYHEHHQORRVHO\\GHILQLQJDFRPPXQLFDWRUDVDFROOHFWLRQRISURFHVVHVWKDWFDQVHQGPHVVDJHVWRHDFKRWKHU+RZHYHUQRZWKDWZHZDQWWRFRQVWUXFWRXURZQ FRPPXQLFDWRUVZHZLOOQHHGDPRUHFDUHIXOGLVFXVVLRQ ,Q03,WKHUHDUHWZRW\\SHVRIFRPPXQLFDWRUVLQWUDFRPPXQLFDWRUVDQGLQWHUFRPPXQLFDWRUV ,QWUDFRPPXQLFDWRUVDUHHVVHQWLDOO\\DFROOHFWLRQRISURFHVVHVWKDWFDQVHQGPHVVDJHVWRHDFKRWKHUDQGHQJDJHLQFROOHFWLYHFRPPXQLFDWLRQRSHUDWLRQV)RUH[DPSOHMPI_COMM_WORLDLVDQLQWUDFRPPXQLFDWRUDQGZHZRXOGOLNHIRUHDFKURZDQGHDFKFROXPQRISURFHVVHVLQ)R[VDOJRULWKPWRIRUPDQLQWUDFRPPXQLFDWRU,QWHUFRPPXQLFDWRUVDVWKHQDPHLPSOLHVDUHXVHGIRUVHQGLQJPHVVDJHVEHWZHHQSURFHVVHVEHORQJLQJWRGLVMRLQWLQWUDFRPPXQLFDWRUV)RUH[DPSOHDQLQWHUFRPPXQLFDWRUZRXOGEHXVHIXOLQDQHQYLURQPHQWWKDWDOORZHGRQHWRG\\QDPLFDOO\\FUHDWHSURFHVVHVDQHZO\\FUHDWHGVHWRISURFHVVHVWKDWIRUPHGDQLQWUDFRPPXQLFDWRUFRXOGEHOLQNHGWRWKHRULJLQDOVHWRISURFHVVHVHJMPI_COMM_WORLDE\\DQLQWHUFRPPXQLFDWRU:HZLOORQO\\GLVFXVVLQWUDFRPPXQLFDWRUV7KHLQWHUHVWHGUHDGHULVUHIHUUHGWR>@IRUGHWDLOVRQWKHXVHRILQWHUFRPPXQLFDWRUV $PLQLPDOLQWUDFRPPXQLFDWRULVFRPSRVHGRI • D*URXSDQG• D&RQWH[W $JURXSLVDQRUGHUHGFROOHFWLRQRISURFHVVHV,IDJURXSFRQVLVWVRISSURFHVVHVHDFKSURFHVVLQWKHJURXSLVDVVLJQHGDXQLTXHUDQNZKLFKLVMXVWDQRQQHJDWLYHLQWHJHULQWKHUDQJHS$FRQWH[WFDQEHWKRXJKWRIDVDV\\VWHPGHILQHGWDJWKDWLVDWWDFKHGWRDJURXS6RWZRSURFHVVHVWKDWEHORQJWRWKHVDPHJURXSDQGWKDWXVHWKHVDPHFRQWH[WFDQFRPPXQLFDWH7KLVSDLULQJRIDJURXSZLWKDFRQWH[WLVWKHPRVWEDVLFIRUPRIDFRPPXQLFDWRU2WKHUGDWDFDQEHDVVRFLDWHGWRDFRPPXQLFDWRU,QSDUWLFXODUDVWUXFWXUHRUWRSRORJ\\FDQEHLPSRVHGRQWKHSURFHVVHVLQDFRPPXQLFDWRUDOORZLQJDPRUHQDWXUDODGGUHVVLQJVFKHPH:HOOGLVFXVVWRSRORJLHVLQVHFWLRQ :RUNLQJZLWK*URXSV&RQWH[WVDQG&RPPXQLFDWRUV 7RLOOXVWUDWHWKHEDVLFVRIZRUNLQJZLWKFRPPXQLFDWRUVOHWVFUHDWHDFRPPXQLFDWRUZKRVHXQGHUO\\LQJJURXSFRQVLVWVRIWKHSURFHVVHVLQWKHILUVWURZRIRXUYLUWXDOJULG6XSSRVHWKDWMPI_COMM_WORLDFRQVLVWVRISSURFHVVHVZKHUHT S/HWVDOVRVXSSRVHWKDW [T[PRGT6RWKHILUVWURZRISURFHVVHVFRQVLVWVRIWKHSURFHVVHVZLWKUDQNVT+HUHWKHUDQNVDUHLQ03,B&200B:25/',QRUGHUWRFUHDWHWKHJURXSRIRXUQHZFRPPXQLFDWRUZHFDQH[HFXWHWKHIROORZLQJFRGHPROGRAM ComCrtINCLUDE 'mpif.h'IMPLICIT NONE integer, parameter :: MAX_PROCS = 100integer preal p_realinteger qinteger my_rank integer MPI_GROUP_WORLDinteger first_row_groupinteger first_row_comm integer process_ranks(0:MAX_PROCS-1)integer procinteger testinteger sum integer my_rank_in_first_rowinteger ierrCC test = 0 call MPI_INIT( ierr) call MPI_COMM_SIZE(MPI_COMM_WORLD, p, ierr )call MPI_COMM_RANK(MPI_COMM_WORLD, my_rank, ierr )C p_real = pq = sqrt(p_real)C C Make a list of the processes in the new communicator.do proc = 0, q-1 process_ranks(proc) = procenddoC C Get the group underlying MPI_COMM_WORLD call MPI_COMM_GROUP(MPI_COMM_WORLD, MPI_GROUP_WORLD, ierr )C C Create the new group call MPI_GROUP_INCL(MPI_GROUP_WORLD, q, process_ranks,+ first_row_group, ierr) C C Create the new communicator call MPI_COMM_CREATE(MPI_COMM_WORLD, first_row_group,+ first_row_comm, ierr)C 7KLVFRGHSURFHHGVLQDIDLUO\\VWUDLJKWIRUZDUGIDVKLRQWREXLOGWKHQHZFRPPXQLFDWRU)LUVWLWFUHDWHVDOLVWRIWKHSURFHVVHVWREHDVVLJQHGWRWKHQHZFRPPXQLFDWRU7KHQLWFUHDWHVDJURXSFRQVLVWLQJRIWKHVHSURFHVVHV7KLVUHTXLUHGWZRFRPPDQGVILUVWJHWWKHJURXSDVVRFLDWHGZLWKMPI_COMM_WORLDVLQFHWKLVLVWKHJURXSIURPZKLFKWKHSURFHVVHVLQWKHQHZJURXSZLOOEHWDNHQWKHQFUHDWHWKHJURXSZLWKMPI_Group_incl)LQDOO\\WKHDFWXDOFRPPXQLFDWRULVFUHDWHGZLWKDFDOOWRMPI_Comm_create7KHFDOOWRMPI_Comm_createLPSOLFLWO\\DVVRFLDWHVDFRQWH[WZLWKWKHQHZJURXS7KHUHVXOWLVWKHFRPPXQLFDWRUfirst_row_comm1RZWKHSURFHVVHVLQfirst_row_commFDQSHUIRUPFROOHFWLYHFRPPXQLFDWLRQRSHUDWLRQV)RUH[DPSOHSURFHVVLQfirst_row_groupFDQEURDGFDVW$WRWKHRWKHUSURFHVVHVLQfirst_row_groupinteger my_rank_in_first_row real, allocatable , dimension( :,: ) :: A_00if (my_rank < q) then call MPI_COMM_RANK(first_row_comm,+ my_rank_in_first_row, ierr) ! Allocate space for A_00, order n_bar.allocate (A_00(n_bar,n_bar)) if (my_rank_in_first_row == 0) then! initialize A_00endif call MPI_BCAST( A_00, n_bar*n_bar, MPI_INTEGER, 0,+ first_row_comm, ierr)endif *URXSVDQGFRPPXQLFDWRUVDUHRSDTXHREMHFWV)URPDSUDFWLFDOVWDQGSRLQWWKLVPHDQVWKDWWKHGHWDLOVRIWKHLULQWHUQDOUHSUHVHQWDWLRQGHSHQGRQWKHSDUWLFXODULPSOHPHQWDWLRQRI03,DQGDVDFRQVHTXHQFHWKH\\FDQQRWEHGLUHFWO\\DFFHVVHGE\\WKHXVHU5DWKHUWKHXVHUDFFHVVHVDKDQGOHWKDWUHIHUHQFHVWKHRSDTXHREMHFWDQGWKHRSDTXHREMHFWVDUHPDQLSXODWHGE\\VSHFLDO03,IXQFWLRQVIRUH[DPSOHMPI_Comm_createMPI_Group_inclDQGMPI_Comm_group &RQWH[WVDUHQRWH[SOLFLWO\\XVHGLQDQ\\03,IXQFWLRQV5DWKHUWKH\\DUHLPSOLFLWO\\DVVRFLDWHGZLWKJURXSVZKHQFRPPXQLFDWRUVDUHFUHDWHG7KHV\\QWD[RIWKHFRPPDQGVZHXVHGWRFUHDWHfirst_row_commLVIDLUO\\VHOIH[SODQDWRU\\7KHILUVWFRPPDQGMPI_Comm_group(comm, group, ierror) integer comm, group, ierror VLPSO\\UHWXUQVWKHJURXSXQGHUO\\LQJWKHFRPPXQLFDWRUcomm7KHVHFRQGFRPPDQG MPI_Group_incl(old_group, new_group_size,+ranks_in_old_group, new_group, ierror)integer old_group, new_group_size, integer ranks_in_old_group(*), new_group, ierror FUHDWHVDQHZJURXSIURPDOLVWRISURFHVVHVLQWKHH[LVWLQJJURXSold_group7KHQXPEHURISURFHVVHVLQWKHQHZJURXSLVnew_group_sizeDQGWKHSURFHVVHVWREHLQFOXGHGDUHOLVWHGLQranks_in_old_group3URFHVVLQnew_groupKDVUDQNranks_in_old_group(0)LQold_groupSURFHVVLQnew_groupKDVUDQNranks_in_old_group(1)LQold_groupHWF7KHILQDOFRPPDQG MPI_Comm_create(old_comm, new_group, new_comm, ierror)integer old_comm, new_group, new_comm, ierror DVVRFLDWHVDFRQWH[WZLWKWKHJURXSnew_groupDQGFUHDWHVWKHFRPPXQLFDWRUnew_comm$OORIWKHSURFHVVHVLQnew_groupEHORQJWRWKHJURXSXQGHUO\\LQJold_comm 7KHUHLVDQH[WUHPHO\\LPSRUWDQWGLVWLQFWLRQEHWZHHQWKHILUVWWZRIXQFWLRQVDQGWKHWKLUGMPI_Comm_groupDQGMPI_Group_inclDUHERWKORFDORSHUDWLRQV7KDWLVWKHUHLVQRFRPPXQLFDWLRQDPRQJSURFHVVHVLQYROYHGLQWKHLUH[HFXWLRQ+RZHYHUMPI_Comm_createLVDFROOHFWLYHRSHUDWLRQ$OOWKHSURFHVVHVLQold_commPXVWFDOOMPI_Comm_createZLWKWKHVDPHDUJXPHQWV7KH6WDQGDUG>@JLYHVWKUHHUHDVRQVIRUWKLV ,WDOORZVWKHLPSOHPHQWDWLRQWROD\\HUMPI_Comm_createRQWRSRIUHJXODUFROOHFWLYHFRPPXQLFDWLRQV ,WSURYLGHVDGGLWLRQDOVDIHW\\ ,WSHUPLWVLPSOHPHQWDWLRQVWRDYRLGFRPPXQLFDWLRQUHODWHGWRFRQWH[WFUHDWLRQ 1RWHWKDWVLQFHMPI_Comm_createLVFROOHFWLYHLWZLOOEHKDYHLQWHUPVRIWKHGDWDWUDQVPLWWHGDVLILWV\\QFKURQL]HV,QSDUWLFXODULIVHYHUDOFRPPXQLFDWRUVDUHEHLQJFUHDWHGWKH\\PXVWEHFUHDWHGLQWKHVDPHRUGHURQDOOWKHSURFHVVHV 03,B&RPPBVSOLW ,QRXUPDWUL[PXOWLSOLFDWLRQSURJUDPZHQHHGWRFUHDWHPXOWLSOHFRPPXQLFDWRUV RQHIRUHDFKURZRISURFHVVHVDQGRQHIRUHDFKFROXPQ7KLVZRXOGEHDQH[WUHPHO\\WHGLRXVSURFHVVLISZHUHODUJHDQGZHKDGWRFUHDWHHDFKFRPPXQLFDWRUXVLQJWKHWKUHHIXQFWLRQVGLVFXVVHGLQWKHSUHYLRXVVHFWLRQ)RUWXQDWHO\\03,SURYLGHVDIXQFWLRQMPI_Comm_splitWKDWFDQFUHDWHVHYHUDOFRPPXQLFDWRUVVLPXOWDQHRXVO\\$VDQH[DPSOHRILWVXVHZHOOFUHDWHRQHFRPPXQLFDWRUIRUHDFKURZRISURFHVVHVinteger my_row_comm integer my_row C my_rank is rank in MPI_COMM_WORLD.C q*q = p my_row = my_rank/q call MPI_COMM_SPLIT(MPI_COMM_WORLD, my_row, my_rank,+ my_row_comm, ierr) 7KHVLQJOHFDOOWRMPI_Comm_splitFUHDWHVTQHZFRPPXQLFDWRUVDOORIWKHPKDYLQJWKHVDPHQDPHmy_row_comm)RUH[DPSOHLIS WKHJURXSXQGHUO\\LQJmy_row_commZLOOFRQVLVWRIWKHSURFHVVHVDQGRQSURFHVVHVDQG2QSURFHVVHVDQGWKHJURXSXQGHUO\\LQJmy_row_commZLOOFRQVLVWRIWKHSURFHVVHVDQGDQGRQSURFHVVHVDQGLWZLOOFRQVLVWRISURFHVVHVDQG 7KHV\\QWD[RIMPI_Comm_splitLV MPI_COMM_SPLIT(old_comm, split_key, rank_key,+ new_comm, ierror) integer old_comm, split_key, rank_key, new_comm,ierror ,WFUHDWHVDQHZFRPPXQLFDWRUIRUHDFKYDOXHRIsplit_key3URFHVVHVZLWKWKHVDPHYDOXHRIsplit_keyIRUPDQHZJURXS7KHUDQNLQWKHQHZJURXSLVGHWHUPLQHGE\\WKHYDOXHRIrank_key,ISURFHVV$DQGSURFHVV%FDOOMPI_Comm_splitZLWKWKHVDPHYDOXHRIsplit_keyDQGWKHrank_keyDUJXPHQWSDVVHGE\\SURFHVV$LVOHVVWKDQWKDWSDVVHGE\\SURFHVV%WKHQWKHUDQNRI$LQWKHJURXSXQGHUO\\LQJnew_commZLOOEHOHVVWKDQWKHUDQNRISURFHVV%,IWKH\\FDOOWKHIXQFWLRQZLWKWKHVDPHYDOXHRIrank_keyWKHV\\VWHPZLOODUELWUDULO\\DVVLJQRQHRIWKHSURFHVVHVDORZHUUDQN MPI_Comm_splitLVDFROOHFWLYHFDOODQGLWPXVWEHFDOOHGE\\DOOWKHSURFHVVHVLQold_comm7KHIXQFWLRQFDQEHXVHGHYHQLIWKHXVHUGRHVQWZLVKWRDVVLJQHYHU\\SURFHVVWRDQHZFRPPXQLFDWRU7KLVFDQEHDFFRPSOLVKHGE\\SDVVLQJWKHSUHGHILQHGFRQVWDQWMPI_UNDEFINEDDVWKHsplit_keyDUJXPHQW3URFHVVHVGRLQJWKLVZLOOKDYHWKHSUHGHILQHGYDOXHMPI_COMM_NULLUHWXUQHGLQnew_comm 7RSRORJLHV 5HFROOHFWWKDWLWLVSRVVLEOHWRDVVRFLDWHDGGLWLRQDOLQIRUPDWLRQLQIRUPDWLRQEH\\RQGWKHJURXSDQG FRQWH[WZLWKDFRPPXQLFDWRU7KLVDGGLWLRQDOLQIRUPDWLRQLVVDLGWREHFDFKHGZLWKWKHFRPPXQLFDWRUDQGRQHRIWKHPRVWLPSRUWDQWSLHFHVRILQIRUPDWLRQWKDWFDQEHFDFKHGZLWKDFRPPXQLFDWRULVDWRSRORJ\\,Q03,DWRSRORJ\\LVMXVWDPHFKDQLVPIRUDVVRFLDWLQJGLIIHUHQWDGGUHVVLQJVFKHPHVZLWKWKHSURFHVVHVEHORQJLQJWRDJURXS1RWHWKDW03,WRSRORJLHVDUHYLUWXDOWRSRORJLHVWKHUHPD\\EHQRVLPSOHUHODWLRQEHWZHHQWKHSURFHVVVWUXFWXUHGHILQHGE\\DYLUWXDOWRSRORJ\\DQGWKHDFWXDOXQGHUO\\LQJSK\\VLFDOVWUXFWXUHRIWKHSDUDOOHOPDFKLQH 7KHUHDUHHVVHQWLDOO\\WZRW\\SHVRIYLUWXDOWRSRORJLHVWKDWFDQEHFUHDWHGLQ03,DFDUWHVLDQRUJULGWRSRORJ\\DQGDJUDSKWRSRORJ\\&RQFHSWXDOO\\WKHIRUPHULVVXEVXPHGE\\WKHODWWHU+RZHYHUEHFDXVHRIWKHLPSRUWDQFHRIJULGVLQDSSOLFDWLRQVWKHUHLVDVHSDUDWHFROOHFWLRQRIIXQFWLRQVLQ03,ZKRVHSXUSRVHLVWKHPDQLSXODWLRQRIYLUWXDOJULGV ,Q)R[VDOJRULWKPZHZLVKWRLGHQWLI\\WKHSURFHVVHVLQMPI_COMM_WORLDZLWKWKHFRRUGLQDWHVRIDVTXDUHJULGDQGHDFKURZDQGHDFKFROXPQRIWKHJULGQHHGVWRIRUPLWVRZQFRPPXQLFDWRU/HWVORRNDWRQHPHWKRGIRUEXLOGLQJWKLVVWUXFWXUH :HEHJLQE\\DVVRFLDWLQJDVTXDUHJULGVWUXFWXUHZLWKMPI_COMM_WORLD,QRUGHUWRGRWKLVZHQHHGWRVSHFLI\\WKHIROORZLQJLQIRUPDWLRQ 7KHQXPEHURIGLPHQVLRQVLQWKHJULG:HKDYH 7KHVL]HRIHDFKGLPHQVLRQ,QRXUFDVHWKLVLVMXVWWKHQXPEHURIURZVDQGWKHQXPEHURI FROXPQV:HKDYHTURZVDQGTFROXPQV 7KHSHULRGLFLW\\RIHDFKGLPHQVLRQ,QRXUFDVHWKLVLQIRUPDWLRQVSHFLILHVZKHWKHUWKHILUVW HQWU\\LQHDFKURZRUFROXPQLVDGMDFHQWWRWKHODVWHQWU\\LQWKDWURZRUFROXPQUHVSHFWLYHO\\6LQFHZHZDQWDFLUFXODUVKLIWRIWKHVXEPDWULFHVLQHDFKFROXPQZHZDQWWKHVHFRQGGLPHQVLRQWREHSHULRGLF,WVXQLPSRUWDQWZKHWKHUWKHILUVWGLPHQVLRQLVSHULRGLF )LQDOO\\03,JLYHVWKHXVHUWKHRSWLRQRIDOORZLQJWKHV\\VWHPWRRSWLPL]HWKHPDSSLQJRIWKHJULGRISURFHVVHVWRWKHXQGHUO\\LQJSK\\VLFDOSURFHVVRUVE\\SRVVLEO\\UHRUGHULQJWKHSURFHVVHVLQWKHJURXSXQGHUO\\LQJWKHFRPPXQLFDWRU6LQFHZHGRQWQHHGWRSUHVHUYHWKHRUGHULQJRIWKHSURFHVVHVLQMPI_COMM_WORLDZHVKRXOGDOORZWKHV\\VWHPWRUHRUGHU+DYLQJPDGHDOOWKHVHGHFLVLRQVZHVLPSO\\H[HFXWHWKHIROORZLQJFRGHinteger grid_comminteger dim_sizes(0:1)logical wrap_around(0:1)logical reorder = .TRUE.dim_sizes(0) = qdim_sizes(1) = q wrap_around(0) = .TRUE.wrap_around(1) = .TRUE. call MPI_CART_CREATE(MPI_COMM_WORLD, 2, dim_sizes,+ wrap_around, reorder, grid_comm, ierr) $IWHUH[HFXWLQJWKLVFRGHWKHFRPPXQLFDWRUgrid_commZLOOFRQWDLQDOOWKHSURFHVVHVLQMPI_COMM_WORLDSRVVLEO\\UHRUGHUHGDQGLWZLOOKDYHDWZRGLPHQVLRQDOFDUWHVLDQFRRUGLQDWHV\\VWHPDVVRFLDWHG,QRUGHUIRUDSURFHVVWRGHWHUPLQHLWVFRRUGLQDWHVLWVLPSO\\FDOOVWKHIXQFWLRQMPI_Cart_coordsinteger coordinates(0:1)integer my_grid_rank call MPI_COMM_RANK(grid_comm, my_grid_rank, ierr)call MPI_CART_COORDS(grid_comm, my_grid_rank, 2,+ coordinates, ierr) 1RWLFHWKDWZHQHHGHGWRFDOOMPI_Comm_rankLQRUGHUWRJHWWKHSURFHVVUDQNLQgrid_comm7KLVZDVQHFHVVDU\\EHFDXVHLQRXUFDOOWRMPI_Cart_createZHVHWWKHreorder IODJWR.TRUE.DQGKHQFHWKHRULJLQDOSURFHVVUDQNLQJLQMPI_COMM_WORLD PD\\KDYHEHHQFKDQJHGLQgrid_comm 7KHLQYHUVHWRMPI_Cart_coordsLVMPI_Cart_rank call MPI_CART_RANK(grid_comm, coordinates, grid_rank,+ ierr) integer grid_comm, coordinates(*), grid_rank, ierr *LYHQWKHFRRUGLQDWHVRIDSURFHVVMPI_Cart_rankUHWXUQVWKHUDQNRIWKHSURFHVVLQLWVWKLUGSDUDPHWHUprocess_rank7KHV\\QWD[RIMPI_Cart_createLV call MPI_CART_CREATE(old_comm, number_of_dims, dim_sizes,+ periods, reorder, cart_comm, ierror) integer old_comm, number_of_dims, dim_sizes(*)logical periods(*), reorderinteger cart_comm, ierror MPI_Cart_createFUHDWHVDQHZFRPPXQLFDWRUcart_commE\\FDFKLQJDFDUWHVLDQWRSRORJ\\ZLWKold_comm,QIRUPDWLRQRQWKHVWUXFWXUHRIWKHFDUWHVLDQWRSRORJ\\LVFRQWDLQHGLQWKHSDUDPHWHUVnumber_of_dimsdim_sizesDQGperiods7KHILUVWRIWKHVHnumber_of_dimsFRQWDLQVWKHQXPEHURIGLPHQVLRQVLQWKHFDUWHVLDQFRRUGLQDWHV\\VWHP7KHQH[WWZRdim_sizesDQGperiodsDUHDUUD\\VZLWKRUGHUHTXDOWRnumber_of_dims7KHDUUD\\dim_sizesVSHFLILHVWKHRUGHURIHDFKGLPHQVLRQDQGperiodsVSHFLILHVZKHWKHUHDFKGLPHQVLRQLVFLUFXODURUOLQHDU 7KHSURFHVVHVLQcart_commDUHUDQNHGLQURZPDMRURUGHU7KDWLVWKHILUVWURZFRQVLVWVRISURFHVVHVGLPBVL]HVWKHVHFRQGURZFRQVLVWVRISURFHVVHVGLPBVL]HVGLPBVL]HVGLPBVL]HVHWF7KXVLWPD\\EHDGYDQWDJHRXVWRFKDQJHWKHUHODWLYHUDQNLQJRIWKHSURFHVVHVLQold_comm)RUH[DPSOHVXSSRVHWKHSK\\VLFDOWRSRORJ\\LVD[JULGDQGWKHSURFHVVHVQXPEHUVLQold_commDUHDVVLJQHGWRWKHSURFHVVRUVJULGVTXDUHVDVIROORZV &OHDUO\\WKHSHUIRUPDQFHRI)R[VDOJRULWKPZRXOGEHLPSURYHGLIZHUHQXPEHUHGWKHSURFHVVHV+RZHYHUVLQFHWKHXVHUGRHVQWNQRZZKDWWKHH[DFWPDSSLQJRISURFHVVHVWRSURFHVVRUVLVZHPXVWOHWWKHV\\VWHPGRLWE\\VHWWLQJWKHreorderSDUDPHWHUWR.TRUE. 6LQFHMPI_Cart_createFRQVWUXFWVDQHZFRPPXQLFDWRULWLVDFROOHFWLYHRSHUDWLRQ7KHV\\QWD[RIWKHDGGUHVVLQIRUPDWLRQIXQFWLRQVLV MPI_Cart_rank(comm, coordinates, rank, ierror)integer comm, coordinates(*), rank, ierror MPI_Cart_coords(comm, rank, number_of_dims, coordinates,+ ierror) integer comm, rank, number_of_dims, coordinates(*), ierror MPI_Cart_rankUHWXUQVWKHUDQNLQWKHFDUWHVLDQFRPPXQLFDWRUcommRIWKHSURFHVVZLWKFDUWHVLDQFRRUGLQDWHVcoordinates6Rcoordinates LVDQDUUD\\ZLWKRUGHUHTXDOWRWKHQXPEHURIGLPHQVLRQVLQWKHFDUWHVLDQWRSRORJ\\DVVRFLDWHGZLWKcommMPI_Cart_coordsLVWKHLQYHUVHWRMPI_Cart_rankLWUHWXUQVWKHFRRUGLQDWHVRIWKHSURFHVVZLWKUDQNrankLQWKHFDUWHVLDQFRPPXQLFDWRUcomm1RWHWKDWERWKRIWKHVHIXQFWLRQVDUHORFDO 03,B&DUWBVXE :HFDQDOVRSDUWLWLRQDJULGLQWRJULGVRIORZHUGLPHQVLRQ)RUH[DPSOHZHFDQ FUHDWHDFRPPXQLFDWRUIRUHDFKURZRIWKHJULGDVIROORZVlogical varying_coords(0:1)integer row_comm varying_coords(0) = .FALSE.varying_coords(1) = .TRUE. call MPI_CART_SUB(grid_comm, varying_coords, row_comm,ierr) 7KHFDOOWRMPI_Cart_subFUHDWHVTQHZFRPPXQLFDWRUV7KHvarying_coordsDUJXPHQWLVDQDUUD\\RIERROHDQ,WVSHFLILHVZKHWKHUHDFKGLPHQVLRQEHORQJVWRWKHQHZFRPPXQLFDWRU6LQFHZHUHFUHDWLQJFRPPXQLFDWRUVIRUWKHURZVRIWKHJULGHDFKQHZFRPPXQLFDWRUFRQVLVWVRIWKHSURFHVVHVREWDLQHGE\\IL[LQJWKHURZFRRUGLQDWHDQGOHWWLQJWKHFROXPQFRRUGLQDWHYDU\\+HQFHZHDVVLJQHGvarying_coordsWKHYDOXH)$/6(WKHILUVWFRRUGLQDWHGRHVQWYDU\\DQGZHDVVLJQHGvarying_coordsWKHYDOXH758(WKHVHFRQGFRRUGLQDWHYDULHV2QHDFKSURFHVVWKHQHZFRPPXQLFDWRULVUHWXUQHGLQrow_comm,QRUGHUWRFUHDWHWKHFRPPXQLFDWRUVIRUWKHFROXPQVZHVLPSO\\UHYHUVHWKHDVVLJQPHQWVWRWKHHQWULHVLQvarying_coordsinteger col_comm varying_coords(0) = .TRUE.varying_coords(1) = .FALSE. call MPI_CART_SUB(grid_comm, varying_coords, row_comm,ierr) 1RWHWKHVLPLODULW\\RIMPI_Cart_subWRMPI_Comm_split7KH\\SHUIRUPVLPLODUIXQFWLRQVWKH\\ERWKSDUWLWLRQDFRPPXQLFDWRULQWRDFROOHFWLRQRIQHZFRPPXQLFDWRUV+RZHYHUMPI_Cart_subFDQRQO\\EHXVHGZLWKDFRPPXQLFDWRUWKDWKDVDQDVVRFLDWHGFDUWHVLDQWRSRORJ\\DQGWKHQHZFRPPXQLFDWRUVFDQRQO\\EHFUHDWHGE\\IL[LQJRUYDU\\LQJRQHRUPRUHGLPHQVLRQVRIWKHROGFRPPXQLFDWRUV$OVRQRWHWKDWMPI_Cart_subLVOLNHMPI_Comm_splitDFROOHFWLYHRSHUDWLRQ ,PSOHPHQWDWLRQRI)R[V$OJRULWKP 7RFRPSOHWHRXUGLVFXVVLRQOHWVZULWHWKHFRGHWRLPSOHPHQW)R[VDOJRULWKP)LUVWZHOOZULWHD IXQFWLRQWKDWFUHDWHVWKHYDULRXVFRPPXQLFDWRUVDQGDVVRFLDWHGLQIRUPDWLRQ6LQFHWKLVUHTXLUHVDODUJHQXPEHURIYDULDEOHVDQGZHOOEHXVLQJWKLVLQIRUPDWLRQLQRWKHUIXQFWLRQVZHOOSXWLWLQWRD)RUWUDQGHULYHGW\\SHWRIDFLOLWDWHSDVVLQJLWDPRQJWKHYDULRXVIXQFWLRQV 1RWLFHWKDWVLQFHHDFKRIRXUFRPPXQLFDWRUVKDVDQDVVRFLDWHGWRSRORJ\\ZHFRQVWUXFWHGWKHPXVLQJWKHWRSRORJ\\FRQVWUXFWLRQIXQFWLRQVMPI_Cart_createDQGMPI_Cart_subUDWKHUWKDQWKHPRUHJHQHUDOFRPPXQLFDWRUFRQVWUXFWLRQIXQFWLRQVMPI_Comm_createDQGMPI_Comm_splitprogram myfoxinclude 'mpif.h'IMPLICIT NONEtype GRID_INFO_TYPE integer p ! Total number of processes. integer comm ! Communicator for the entire grid.integer row_comm ! Communicator for my row.integer col_comm ! Communicator for my col.integer q ! Order of grid.integer my_row ! My row number.integer my_col ! My column number. integer my_rank ! My rank in the grid communicator.end type GRID_INFO_TYPE TYPE (GRID_INFO_TYPE) :: grid_infointeger my_rank, ierr real, allocatable, dimension(:,:) :: A,B,Cinteger n, n_barcall MPI_INIT(ierr) call Setup_grid(grid_info) call MPI_Comm_rank(MPI_COMM_WORLD, my_rank, ierr)if (my_rank == 0) then print *, 'What is the order of the matrices?'read *, nendif call MPI_BCAST(n,1,MPI_INTEGER, 0, MPI_COMM_WORLD,ierr)n_bar = n/(grid_info%q) ! Allocate local storage for local matrix.allocate( A(n_bar,n_bar) )allocate( B(n_bar,n_bar) )allocate( C(n_bar,n_bar) )A = 1.0B = 2.0 call Fox(n,grid_info,A,B,C,n_bar)print *, Ccontains subroutine Setup_grid(grid) TYPE (GRID_INFO_TYPE), intent(inout) :: gridinteger old_rank integer dimensions(0:1)logical periods(0:1)integer coordinates(0:1)logical varying_coords(0:1)integer ierr ! Set up Global Grid Information. call MPI_Comm_size(MPI_COMM_WORLD, grid%p, ierr)call MPI_Comm_rank(MPI_COMM_WORLD, old_rank, ierr )grid%q = int(sqrt(dble(grid%p)))dimensions(0) = grid%qdimensions(1) = grid%q periods(0) = .TRUE.periods(1) = .TRUE. call MPI_Cart_create(MPI_COMM_WORLD, 2, + dimensions, periods, .TRUE. , grid%comm, ierr)call MPI_Comm_rank (grid%comm, grid%my_rank, ierr )call MPI_Cart_coords(grid%comm, grid%my_rank, 2,+ coordinates, ierr ) grid%my_row = coordinates(0)grid%my_col = coordinates(1) ! Set up row and column communicators.varying_coords(0) = .FALSE.varying_coords(1) = .TRUE. call MPI_Cart_sub(grid%comm,varying_coords,+ grid%row_comm,ierr)varying_coords(0) = .TRUE.varying_coords(1) = .FALSE. call MPI_Cart_sub(grid%comm,varying_coords,+ grid%col_comm,ierr)end subroutine Setup_grid subroutine Fox(n,grid,local_A,local_B,loca l_C,n_bar)integer, intent(in) :: n, n_bar TYPE(GRID_INFO_TYPE), intent(in) :: grid real, intent(in) , dimension(:,:) :: local_A, local_Breal, intent(out), dimension (:,:) :: local_Creal temp_A( SIZE(A,DIM=1),SIZE(A,DIM=2) )integer step, source, dest, request integer status(MPI_STATUS_SIZE), bcast_rootlocal_C = 0.0 source = mod( (grid%my_row + 1), grid%q ) dest = mod( (grid%my_row + grid%q -1), (grid%q) ) temp_A = 0.0 do step = 0, grid%q -1 bcast_root = mod( (grid%my_row + step), (grid%q) )if (bcast_root == grid%my_col) then call MPI_BCAST(local_A,n_bar*n_bar,MPI_REAL,+ bcast_root, grid%row_comm, ierr) call sgemm('N','N',n_bar,n_bar,n_bar,1.0, + local_A,n_bar,local_B,n_bar,1.0,local_C,n_bar)else call MPI_BCAST(temp_A,n_bar*n_bar,MPI_REAL,+ bcast_root, grid%row_comm, ierr) call sgemm('N','N',n_bar,n_bar,n_bar,1.0,+ temp_A,n_bar,local_B,n_bar,1.0,local_C,n_bar)endif call MPI_Send(local_B,n_bar*n_bar,MPI_REAL,dest, 0,+ grid%col_comm, ierr) call MPI_Recv(local_B,n_bar*n_bar,MPI_REAL,source,0,+ grid%col_comm, status, ierr )enddo end subroutine Foxend program myfox :KHUH7R*R)URP+HUH :KDW:H+DYHQW'LVFXVVHG 03,LVDODUJHOLEUDU\\7KH6WDQGDUG>@LVRYHUSDJHVORQJDQGLWGHILQHVPRUHWKDQ IXQFWLRQV$VDFRQVHTXHQFHWKLV*XLGHKDVFRYHUHGRQO\\DVPDOOIUDFWLRQRI03,DQGPDQ\\UHDGHUVZLOOIDLOWRILQGDGLVFXVVLRQRIIXQFWLRQVWKDWWKH\\ZRXOGILQGYHU\\XVHIXOLQWKHLUDSSOLFDWLRQV6RZHEULHIO\\OLVWVRPHRIWKHPRUHLPSRUWDQWLGHDVLQ03,WKDWZHKDYHQRWGLVFXVVHGKHUH &RPPXQLFDWLRQ0RGHV:HKDYHXVHGRQO\\WKHVWDQGDUGFRPPXQLFDWLRQPRGHIRUsend7KLVPHDQVWKDWLWLVXSWRWKHV\\VWHPWRGHFLGHZKHWKHUWKHPHVVDJHLVEXIIHUHG03,SURYLGHVWKUHHRWKHUFRPPXQLFDWLRQPRGHVEXIIHUHGV\\QFKURQRXVDQGUHDG\\,QEXIIHUHGPRGHWKHXVHUH[SOLFLWO\\FRQWUROVWKHEXIIHULQJRIRXWJRLQJPHVVDJHV,QV\\QFKURQRXVPRGHDVHQGZLOOQRWFRPSOHWHXQWLODPDWFKLQJUHFHLYHLVSRVWHG,Q UHDG\\PRGHDVHQGPD\\EHVWDUWHGRQO\\LIDPDWFKLQJUHFHLYHKDVDOUHDG\\EHHQSRVWHG03,SURYLGHVWKUHHDGGLWLRQDOVHQGIXQFWLRQVIRUWKHVHPRGHV 1RQEORFNLQJ&RPPXQLFDWLRQ:HKDYHXVHGRQO\\EORFNLQJVHQGVDQGUHFHLYHV MPI_Send DQGMPI_Recv)RUWKHVHQGWKLVPHDQVWKDWWKHFDOOZRQWUHWXUQXQWLOWKHPHVVDJHGDWDDQGHQYHORSHKDYHEHHQEXIIHUHGRUVHQWLHXQWLOWKHPHPRU\\UHIHUHQFHGLQWKHFDOOWRMPI_SendLVDYDLODEOHIRUUHXVH)RUWKHUHFHLYHWKLVPHDQVWKDWWKHFDOOZRQWUHWXUQXQWLOWKHGDWDKDVEHHQUHFHLYHGLQWRWKHPHPRU\\UHIHUHQFHGLQWKHFDOOWRMPI_Recv0DQ\\DSSOLFDWLRQVFDQLPSURYHWKHLUSHUIRUPDQFHE\\XVLQJQRQEORFNLQJFRPPXQLFDWLRQ7KLVPHDQVWKDWWKHFDOOVWRVHQGUHFHLYHPD\\UHWXUQEHIRUHWKHRSHUDWLRQFRPSOHWHV)RUH[DPSOHLIWKHPDFKLQHKDVDVHSDUDWHFRPPXQLFDWLRQSURFHVVRUDQRQEORFNLQJVHQGFRXOGVLPSO\\QRWLI\\WKHFRPPXQLFDWLRQSURFHVVRUWKDWLWVKRXOGEHJLQFRPSRVLQJDQGVHQGLQJWKHPHVVDJH03,SURYLGHVQRQEORFNLQJVHQGVLQHDFKRIWKHIRXUPRGHVDQGDQRQEORFNLQJUHFHLYH,WDOVRSURYLGHVYDULRXVXWLOLW\\IXQFWLRQVIRUGHWHUPLQLQJWKHFRPSOHWLRQVWDWXVRIDQRQEORFNLQJRSHUDWLRQ ,QWHUFRPPXQLFDWRUV5HFROOHFWWKDW03,SURYLGHVWZRW\\SHVRIFRPPXQLFDWRUVLQWUDFRPPXQLFDWRUVDQGLQWHUFRPPXQLFDWRUV,QWHUFRPPXQLFDWRUVFDQEHXVHGIRUSRLQWWRSRLQWFRPPXQLFDWLRQVEHWZHHQSURFHVVHVEHORQJLQJWRGLVWLQFWLQWUDFRPPXQLFDWRUV 7KHUHDUHPDQ\\RWKHUIXQFWLRQVDYDLODEOHWRXVHUVRI03,,IZHKDYHQWGLVFXVVHGDIDFLOLW\\\\RXQHHGSOHDVHFRQVXOWWKH6WDQGDUG>@WRGHWHUPLQHZKHWKHULWLVSDUWRI03, ,PSOHPHQWDWLRQVRI03, ,I\\RXGRQWKDYHDQLPSOHPHQWDWLRQRI03,WKHUHDUHWKUHHYHUVLRQVWKDWDUHIUHHO\\DYDLODEOHE\\ DQRQ\\PRXVIWSIURPWKHIROORZLQJVLWHV • $UJRQQH1DWLRQDO/DE0LVVLVVLSSL6WDWH8QLYHUVLW\\ info.mcs.anl.govDQGWKHGLUHFWRU\\LVpub/mpi 7KH DGGUHVV LV • (GLQEXUJK8QLYHUVLW\\7KHDGGUHVVLVftp.epcc.ed.ac.ukDQGWKHGLUHFWRU\\LVpub/chimp/release• 2KLR6XSHUFRPSXWHU&HQWHU7KHDGGUHVVLVtbag.osc.eduDQGWKHGLUHFWRU\\LV SXEODP $OORIWKHVHUXQRQQHWZRUNVRI81,;ZRUNVWDWLRQV7KH$UJRQQH0LVVLVVLSSL6WDWHDQG(GLQEXUJKYHUVLRQVDOVRUXQRQYDULRXVSDUDOOHOSURFHVVRUV&KHFNWKH5($'0(ILOHVWRVHHLI\\RXUPDFKLQHVDUHVXSSRUWHG 0RUH,QIRUPDWLRQRQ03, 7KHUHLVDQ03,)$4DYDLODEOHE\\DQRQ\\PRXVIWSDW • 0LVVLVVLSSL6WDWH8QLYHUVLW\\7KHDGGUHVVLVftp.erc.msstate.eduDQGWKHILOHLV pub/mpi/faq 7KHUHDUHDOVRQXPHURXVZHESDJHVGHYRWHGWR03,$IHZRIWKHVHDUH • http://www.epm.ornl.gov/~walker/mpi7KH2DN5LGJH1DWLRQDO/DE03,ZHE SDJH • http://www.erc.msstate.edu/mpi7KH0LVVLVVLSSL6WDWH03,ZHESDJH• http://www.mcs.anl.gov/mpi7KH$UJRQQH03,ZHESDJH (DFKRIWKHVHVLWHVFRQWDLQVDZHDOWKRILQIRUPDWLRQDERXW03,2ISDUWLFXODUQRWHWKH0LVVLVVLSSL6WDWHSDJHFRQWDLQVDELEOLRJUDSK\\RISDSHUVRQ03,DQGWKH$UJRQQHSDJHFRQWDLQVDFROOHFWLRQRIWHVW03,SURJUDPV 7KH03,6WDQGDUG>@LVFXUUHQWO\\DYDLODEOHIURPHDFKRIWKHVLWHVDERYH7KLVLVRIFRXUVHWKHGHILQLWLYHVWDWHPHQWRIZKDW03,LV6RLI\\RXUHQRWFOHDURQVRPHWKLQJWKLVLVWKHILQDODUELWHU,WDOVRFRQWDLQVDODUJHQXPEHURIQLFHH[DPSOHVRIXVHVRIWKHYDULRXV03,IXQFWLRQV6RLWLVFRQVLGHUDEO\\PRUHWKDQMXVWDUHIHUHQFH&XUUHQWO\\VHYHUDOPHPEHUVRIWKH03,)RUXPDUHZRUNLQJRQDQDQQRWDWHGYHUVLRQRIWKH03,VWDQGDUG>@ 7KHERRN>@LVDWXWRULDOLQWURGXFWLRQWR03,,WSURYLGHVQXPHURXVFRPSOHWHH[DPSOHVRI03,SURJUDPV 7KHERRN>@FRQWDLQVDWXWRULDOLQWURGXFWLRQWR03,RQZKLFKWKLVJXLGHLVEDVHG,WDOVRFRQWDLQVDPRUHJHQHUDOLQWURGXFWLRQWRSDUDOOHOSURFHVVLQJDQGWKHSURJUDPPLQJRIPHVVDJHSDVVLQJPDFKLQHV 7KH8VHQHWQHZVJURXScomp.parallel.mpiSURYLGHVLQIRUPDWLRQRQXSGDWHVWRDOORIWKHVHGRFXPHQWVDQGVRIWZDUH 7KH)XWXUHRI03, $VLWLVFXUUHQWO\\GHILQHG03,IDLOVWRVSHFLI\\WZRFULWLFDOFRQFHSWV,2DQGWKH FUHDWLRQGHVWUXFWLRQRISURFHVVHV:RUNKDVDOUHDG\\EHHQVWDUWHGRQWKHGHYHORSPHQWRIERWK,2IDFLOLWLHVDQGG\\QDPLFSURFHVVFUHDWLRQ,QIRUPDWLRQRQWKHIRUPHUFDQEHREWDLQHGIURPhttp://lovelace.nas.nasa.gov/MPI-IO/mpi-io.htmlDQGLQIRUPDWLRQRQWKHODWWHUFDQEHIRXQGRQWKH$UJRQQH03,ZHESDJH6LJQLILFDQWGHYHORSPHQWVDUHLQYDULDEO\\SRVWHGWRcomp.parallel.mpi &RPSLOLQJDQG5XQQLQJ03,3URJUDPV 7KLVVHFWLRQLVLQWHQGHGWRJLYHWKHRXWOLQHRIKRZWRFRPSLOHDQGUXQDSURJUDPLQWKH,%063 03,SURJUDPZULWWHQLQ)RUWUDQRU)RUWUDQFDQEHFRPSLOHGXVLQJWKHIROORZLQJFRPPDQG mpif77 program.f %\\GHIDXOWWKHSURJUDPZLOOEHUXQQLQJRQSURFHVVRUVRIWKH637KHSURJUDPFDQEHLQYRNHGE\\WKHQDPHRIH[HFXWDEOHa.out 7KHQXPEHURISURFHVVHVLVFRQWUROHGE\\WKHHQYLURQPHQWYDULDEOH03B352&67KHZHESDJHKWWSZZZKNXKNFFVSWHFKQLFDOVHWHQYKWPOKDVPDQXDOVIRUVHWWLQJWKHHQYLURQPHQWYDULDEOH 5HIHUHQFH >@*HRIIUH\\)R[HWDO6ROYLQJ3UREOHPVRQ&RQFXUUHQW3URFHVVRUV(QJOHZRRG&OLIIV1-3UHQWLFH+DOO >@:LOOLDP*URSS(ZLQJ/XVNDQG$QWKRQ\\6NMHOOXP8VLQJ03,3RUWDEOH3DUDOOHO3URJUDPPLQJZLWKWKH0HVVDJH3DVVLQJ,QWHUIDFH&DPEULGJH0$0,73UHVV >@%ULDQ:.HUQLJKDQDQG'HQQLV05LWFKLH7KH&3URJUDPPLQJ/DQJXDJHQGHG(QJOHZRRG&OLIIV1-3UHQWLFH+DOO >@0HVVDJH3DVVLQJ,QWHUIDFH)RUXP03,$0HVVDJH3DVVLQJ,QWHUIDFH6WDQGDUG,QWHUQDWLRQDO-RXUQDORI6XSHUFRPSXWHU$SSOLFDWLRQVYROQRV$OVRDYDLODEOHDV7HFKQLFDO5HSRUW&6&RPSXWHU6FLHQFH'HSW8QLYHUVLW\\RI7HQQHVVHH.QR[YLOOH71 >@6WHYH2WWRHWDO03,$QQRWDWHG5HIHUHQFH0DQXDO&DPEULGJH0$0,73UHVVWRDSSHDU>@3HWHU63DFKHFR3URJUDPPLQJ3DUDOOHOZLWK03,6DQ)UDQFLVFR&$0RUJDQ.DXIPDQQ>@3HWHU63DFKHFR$8VHU·V*XLGHWR03,
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- 99spj.com 版权所有 湘ICP备2022005869号-5
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务