mpibook_Antonov
.pdfprogram example3 include 'mpif.h'
integer ierr, rank, len, i, NTIMES parameter (NTIMES = 100) character*(MPI_MAX_PROCESSOR_NAME) name
double precision time_start, time_finish, tick call MPI_INIT(ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) call MPI_GET_PROCESSOR_NAME(name, len, ierr) tick = MPI_WTICK(ierr)
time_start = MPI_WTIME(ierr) do i = 1, NTIMES
time_finish = MPI_WTIME(ierr) end do
call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) print *, 'processor ', name(1:len),
&', process ', rank, ': tick = ', tick,
&', time = ', (time_finish-time_start)/NTIMES call MPI_FINALIZE(ierr)
end
AZ^Zgby
•Hldhfibebjh\Zlv b ijh\_jblv wnn_dlb\ghklv \uiheg_gby ijh]jZffu \uqbke_gby qbkeZ Ib gZ jZaebqghf qbke_ ijhp_kkhjh\ ijh]jZffZ h[uqgh \oh^bl \ dZq_kl\_ l_klh\h]h ijbf_jZ \ dhfie_dl ihklZ\db MPI b fh`_l gZoh^blvky gZijbf_j \ nZceZo
/usr/local/examples/mpi/fpi.f beb cpi.c).
•Fh`gh eb \ ijhp_kk_ jZ[hlu 03,-ijh]jZffu ihjh`^Zlv gh\u_ ijh- p_kku _keb \ dZdhc-lh fhf_gl ihy\bebkv k\h[h^gu_ ijhp_kkhju"
•Fh`_l eb 03,-ijh]jZffZ ijh^he`Zlv jZ[hlm ihke_ Z\Zjbcgh]h aZ\_jr_gby h^gh]h ba ijhp_kkh\"
•Hij_^_eblv kdhevdh ijhp_kkh\ \uihegyxl l_dkl ijh]jZffu ^h \uah\Z ijhp_^mju MPI_INIT b ihke_ \uah\Z ijhp_^mju MPI_FINALIZE.
•Hij_^_eblv kbgojhgbah\Zgu eb lZcf_ju jZaguo ijhp_kkh\ dhgdj_lghc kbkl_fu
I_j_^ZqZ ijb_f khh[s_gbc f_`^m hl^_evgufb ijhp_kkZfb
IjZdlbq_kdb \k_ ijh]jZffu gZibkZggu_ k bkihevah\Zgb_f dhffmgbdZpbhg- ghc l_ogheh]bb MPI ^he`gu kh^_j`Zlv kj_^kl\Z g_ lhevdh ^ey ihjh`^_gby b aZ\_jr_gby iZjZee_evguo ijhp_kkh\ gh b ^ey \aZbfh^_ckl\by aZims_gguo
11
ijhp_kkh\ f_`^m kh[hc LZdh_ \aZbfh^_ckl\b_ hkms_kl\ey_lky \ MPI ihkj_^kl\hf y\ghc ihkuedb khh[s_gbc
<k_ ijhp_^mju i_j_^Zqb khh[s_gbc \ 03, ^_eylky gZ ^\_ ]jmiiu < h^gm ]jmiim \oh^yl ijhp_^mju dhlhju_ ij_^gZagZq_gu ^ey \aZbfh^_ckl\by lhevdh ^\mo ijhp_kkh\ ijh]jZffu LZdb_ hi_jZpbb gZau\Zxlky bg^b\b^m- Zevgufb beb hi_jZpbyfb lbiZ lhqdZ-lhqdZ Ijhp_^mju ^jm]hc ]jmiiu ij_^- iheZ]Zxl qlh \ hi_jZpbx ^he`gu [ulv \h\e_q_gu \k_ ijhp_kku g_dhlhjh]h dhffmgbdZlhjZ LZdb_ hi_jZpbb gZau\Zxlky dhee_dlb\gufb
GZqg_f hibkZgb_ ijhp_^mj h[f_gZ khh[s_gbyfb k h[km`^_gby hi_jZpbc lbiZ lhqdZ-lhqdZ < lZdbo \aZbfh^_ckl\byo mqZkl\mxl ^\Z ijhp_kkZ ijbq_f h^bg ijhp_kk y\ey_lky hlijZ\bl_e_f khh[s_gby Z ^jm]hc – ihemqZl_e_f Ijhp_kk-hlijZ\bl_ev ^he`_g \ua\Zlv h^gm ba ijhp_^mj i_j_^Zqb ^Zgguo b y\gh mdZaZlv ghf_j \ g_dhlhjhf dhffmgbdZlhj_ ijhp_kkZ-ihemqZl_ey Z ijhp_kk-ihemqZl_ev ^he`_g \ua\Zlv h^gm ba ijhp_^mj ijb_fZ k mdZaZgb_f lh]h `_ dhffmgbdZlhjZ ijbq_f \ g_dhlhjuo kemqZyo hg fh`_l g_ agZlv lhqguc ghf_j ijhp_kkZ-hlijZ\bl_ey \ ^Zgghf dhffmgbdZlhj_
<k_ ijhp_^mju ^Zgghc ]jmiiu \ k\hx hq_j_^v lZd `_ ^_eylky gZ ^\Z deZkkZ ijhp_^mju k [ehdbjh\dhc k kbgojhgbaZpb_c b ijhp_^mju [_a [ehdbjh\dbZkbgojhggu_ Ijhp_^mju h[f_gZ k [ehdbjh\dhc ijbhklZgZ\eb\Zxl jZ[hlm ijhp_kkZ ^h \uiheg_gby g_dhlhjh]h mkeh\by Z \ha\jZl ba Zkbgojhgguo ijh- p_^mj ijhbkoh^bl g_f_^e_ggh ihke_ bgbpbZebaZpbb khhl\_lkl\mxs_c dhf- fmgbdZpbhgghc hi_jZpbb G_ZddmjZlgh_ bkihevah\Zgb_ ijhp_^mj k [ehdb- jh\dhc fh`_l ijb\_klb d \hagbdgh\_gbx lmibdh\hc kblmZpbb ihwlhfm ijb wlhf lj_[m_lky ^hihegbl_evgZy hklhjh`ghklv Bkihevah\Zgb_ Zkbgojhgguo hi_jZpbc d lmibdh\uf kblmZpbyf g_ ijb\h^bl h^gZdh lj_[m_l [he__ Zddm- jZlgh]h bkihevah\Zgby fZkkb\h\ ^Zgguo
I_j_^ZqZ ijb_f khh[s_gbc k [ehdbjh\dhc
MPI_SEND(BUF, COUNT, DATATYPE, DEST, MSGTAG, COMM, IERR) <type> BUF(*)
INTEGER COUNT, DATATYPE, DEST, MSGTAG, COMM, IERR
;ehdbjmxsZy ihkuedZ fZkkb\Z BUF k b^_glbnbdZlhjhf MSGTAG khklhys_]h ba COUNT we_f_glh\ lbiZ DATATYPE ijhp_kkm k ghf_jhf DEST \ dhffmgbdZ- lhj_ COMM <k_ we_f_glu ihkueZ_fh]h khh[s_gby ^he`gu [ulv jZkiheh`_gu ih^jy^ \ [mn_j_ BUF Hi_jZpby gZqbgZ_lky g_aZ\bkbfh hl lh]h [ueZ eb bgb- pbZebabjh\ZgZ khhl\_lkl\mxsZy ijhp_^mjZ ijb_fZ Ijb wlhf khh[s_gb_ fh`_l [ulv kdhibjh\Zgh dZd g_ihkj_^kl\_ggh \ [mn_j ijb_fZ lZd b ihf_- s_gh \ g_dhlhjuc kbkl_fguc [mn_j _keb wlh ij_^mkfhlj_gh \ MPI AgZq_- gb_ COUNT fh`_l [ulv gme_f Ijhp_kkm jZaj_rZ_lky i_j_^Z\Zlv khh[s_gb_
12
kZfhfm k_[_ h^gZdh wlh g_[_ahiZkgh b fh`_l ijb\_klb d \hagbdgh\_gbx lm- ibdh\hc kblmZpbb IZjZf_lj DATATYPE bf__l \ yaud_ NhjljZg lbi INTEGER\ yaud_ Kb – ij_^hij_^_e_gguc lbi MPI_Datatype Lbi i_j_^Z\Z_fuo we_- f_glh\ ^he`_g mdZau\Zlvky k ihfhsvx ij_^hij_^_e_gguo dhgklZgl lbiZ i_j_qbke_gguo ^ey yaudZ NhjljZg \ ke_^mxs_c lZ[ebp_
Lbi ^Zgguo \ MPI |
Lbi ^Zgguo \ NhjljZg_ |
MPI_INTEGER |
INTEGER |
MPI_REAL |
REAL |
MPI_DOUBLE_PRECISION |
DOUBLE PRECISION |
MPI_COMPLEX |
COMPLEX |
MPI_LOGICAL |
LOGICAL |
MPI_CHARACTER |
CHARACTER(1) |
MPI_BYTE |
[bl bkihevam_lky ^ey i_j_^Zqb |
|
g_lbibabjh\Zgguo ^Zgguo |
MPI_PACKED |
lbi ^ey miZdh\Zgguo ^Zgguo |
?keb bkihevam_fuc k MPI [Zah\uc yaud bf__l ^hihegbl_evgu_ lbiu ^Zgguo lh khhl\_lkl\mxsb_ lbiu ^he`gu [ulv h[_ki_q_gu b \ MPI. Iheguc kibkhd ij_^hij_^_e_gguo bf_g lbih\ ^Zgguo i_j_qbke_g \ nZce_
mpif.h (mpi.h).
Ijb i_j_kued_ khh[s_gbc fh`gh bkihevah\Zlv ki_pbZevgh_ agZq_gb_ MPI_PROC_NULL ^ey g_kms_kl\mxs_]h ijhp_kkZ Hi_jZpbb k lZdbf ijhp_kkhf aZ\_jrZxlky g_f_^e_ggh k dh^hf aZ\_jr_gby MPI_SUCCESS. GZijbf_j ^ey i_j_kuedb khh[s_gby ijhp_kkm k ghf_jhf gZ _^bgbpm [hevr_ fh`gh \hkihevah\Zlvky ke_^mxsbf njZ]f_glhf
|
call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr) |
|
call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) |
|
next = rank+1 |
|
if(next .eq. size) next = MPI_PROC_NULL |
|
call MPI_SEND(buf, 1, MPI_REAL, next, |
& |
5, MPI_COMM_WORLD, ierr) |
< wlhf kemqZ_ ijhp_kk k ihke_^gbf ghf_jhf g_ hkms_kl\bl gbdZdhc j_Zev- ghc ihkuedb ^Zgguo Z kjZam ihc^_l \uihegylv ijh]jZffm ^Zevr_
;ehdbjh\dZ ]ZjZglbjm_l dhjj_dlghklv ih\lhjgh]h bkihevah\Zgby \k_o iZjZ- f_ljh\ ihke_ \ha\jZlZ ba ijhp_^mju Wlh hagZqZ_l qlh ihke_ \ha\jZlZ ba MPI_SEND fh`gh bkihevah\Zlv ex[u_ ijbkmlkl\mxsb_ \ \uah\_ ^Zgghc ijhp_^mju i_j_f_ggu_ [_a hiZk_gby bkihjlblv i_j_^Z\Z_fh_ khh[s_gb_ <u[hj kihkh[Z hkms_kl\e_gby wlhc ]ZjZglbb dhibjh\Zgb_ \ ijhf_`mlhq- guc [mn_j beb g_ihkj_^kl\_ggZy i_j_^ZqZ ijhp_kkm DEST hklZ_lky aZ jZajZ- [hlqbdZfb dhgdj_lghc j_ZebaZpbb03,
13
Ke_^m_l ki_pbZevgh hlf_lblv qlh \ha\jZl ba ijhp_^mju MPI_SEND g_ hagZ- qZ_l gb lh]h qlh khh[s_gb_ ihemq_gh ijhp_kkhf DEST gb lh]h qlh khh[s_- gb_ ihdbgmeh ijhp_kkhjguc we_f_gl gZ dhlhjhf \uihegy_lky ijhp_kk \u- ihegb\rbc ^Zgguc \uah\ Ij_^hklZ\ey_lky lhevdh ]ZjZglby [_ahiZkgh]h baf_g_gby i_j_f_gguo bkihevah\Zgguo \ \uah\_ ^Zgghc ijhp_^mju Ih^h[gZy g_hij_^_e_gghklv ^Ze_dh g_ \k_]^Z mkljZb\Z_l ihevah\Zl_ey Qlh[u jZkrbjblv \hafh`ghklb i_j_^Zqb khh[s_gbc \ MPI \\_^_gu ^hihegbl_evgu_ ljb ijhp_^mju <k_ iZjZf_lju m wlbo ijhp_^mj lZdb_ `_ dZd b m MPI_SEND h^gZdh m dZ`^hc ba gbo _klv k\hy hkh[_gghklv
MPI ij_^hklZ\ey_l ke_^mxsb_ fh^bnbdZpbb ijhp_^mju i_j_^Zqb ^Zgguo k [ehdbjh\dhc MPI_SEND:
• MPI_BSEND — i_j_^ZqZ khh[s_gby k [mn_jbaZpb_c. ?keb ijb_f ihkueZ_fh]h khh[s_gby _s_ g_ [ue bgbpbZebabjh\Zg ijhp_kkhf- ihemqZl_e_f lh khh[s_gb_ [m^_l aZibkZgh \ ki_pbZevguc [mn_j b ijhbahc^_l g_f_^e_gguc \ha\jZl ba ijhp_^mju <uiheg_gb_ ^Zgghc ijhp_^mju gbdZd g_ aZ\bkbl hl khhl\_lkl\mxs_]h \uah\Z ijhp_^mju ijb_fZ khh[s_gby L_f g_ f_g__ ijhp_^mjZ fh`_l \_jgmlv dh^ hrb[db _keb f_klZ ih^ [mn_j g_^hklZlhqgh H \u^_e_gbb fZkkb\Z ^ey [mn_jbaZpbb ^he`_g aZ[hlblvky ihevah\Zl_ev
• — i_j_^ZqZ khh[s_gby k kbgojhgbaZpb_c <uoh^ ba ^Zgghc ijhp_^mju ijhbahc^_l lhevdh lh]^Z dh]^Z ijb_f ihkueZ_fh]h khh[s_gby [m^_l bgbpbZebabjh\Zg ijhp_kkhf-ihemqZl_e_f LZdbf h[jZahf aZ\_jr_gb_ i_j_^Zqb k kbgojhgbaZpb_c ]h\hjbl g_ lhevdh h \hafh`ghklb ih\lhjgh]h bkihevah\Zgby [mn_jZ ihkuedb gh b h ]ZjZglbjh\Zgghf ^hklb`_gbb ijhp_kkhf-ihemqZl_e_f lhqdb ijb_fZ khh[s_gby \ ijh]jZff_ Bkihevah\Zgb_ i_j_^Zqb khh[s_gbc k kbgojhgbaZpb_c fh`_l aZf_^eblv \uiheg_gb_ ijh]jZffu gh iha\hey_l ba[_`Zlv gZebqby \ kbkl_f_ [hevrh]h dhebq_kl\Z g_ ijbgyluo [mn_jbah\Zgguo khh[s_gbc
• MPI_RSEND — i_j_^ZqZ khh[s_gby ih ]hlh\ghklb >Zgghc ijhp_^mjhc fh`gh ihevah\Zlvky lhevdh \ lhf kemqZ_ _keb ijhp_kk-ihemqZl_ev m`_ bgbpbbjh\Ze ijb_f khh[s_gby < ijhlb\ghf kemqZ_ \uah\ ijhp_^mju \hh[s_ ]h\hjy y\ey_lky hrb[hqguf b j_amevlZl __ \uiheg_gby g_ hij_^_e_g =ZjZglbjh\Zlv bgbpbZebaZpbx ijb_fZ khh[s_gby i_j_^ \uah\hf ijhp_^mju MPI_RSEND fh`gh k ihfhsvx hi_jZpbc hkms_kl\eyxsbo y\gmx beb g_y\gmx kbgojhgbaZpbx ijhp_kkh\gZijbf_j MPI_BARRIER beb MPI_SSEND <h fgh]bo j_ZebaZpbyo ijhp_^mjZ MPI_RSEND khdjZsZ_l ijhlhdhe \aZbfh^_ckl\by f_`^m hlijZ\bl_e_f b ihemqZl_e_f mf_gvrZy gZdeZ^gu_ jZkoh^u gZ hj]ZgbaZpbx i_j_^Zqb ^Zgguo
14
Ihevah\Zl_ev ^he`_g gZagZqblv gZ ihkueZxs_f ijhp_kk_ ki_pbZevguc fZk- kb\ dhlhjuc [m^_l bkihevah\Zlvky ^ey [mn_jbaZpbb khh[s_gbc ijb \uah\_ ijhp_^mju MPI_BSEND.
MPI_BUFFER_ATTACH(BUF, SIZE, IERR) <type> BUF(*)
INTEGER SIZE, IERR
GZagZq_gb_ fZkkb\Z BUF jZaf_jZ SIZE ^ey bkihevah\Zgby ijb ihkued_ khh[- s_gbc k [mn_jbaZpb_c < dZ`^hf ijhp_kk_ fh`_l [ulv lhevdh h^bg lZdhc [mn_j :kkhpbbjh\Zgguc k [mn_jhf fZkkb\ g_ ke_^m_l bkihevah\Zlv \ ijh- ]jZff_ ^ey ^jm]bo p_e_c JZaf_j fZkkb\Z \u^_ey_fh]h ^ey [mn_jbaZpbb ^he`_g ij_\hkoh^blv h[sbc jZaf_j khh[s_gby dZd fbgbfmf gZ \_ebqbgm hij_^_ey_fmx dhgklZglhc MPI_BSEND_OVERHEAD.
MPI_BUFFER_DETACH(BUF, SIZE, IERR) <type> BUF(*)
INTEGER SIZE, IERR
Hk\h[h`^_gb_ \u^_e_ggh]h [mn_jgh]h fZkkb\Z ^ey _]h bkihevah\Zgby \ ^jm- ]bo p_eyo Ijhp_^mjZ \ha\jZsZ_l \ Zj]mf_glZo BUF b SIZE Z^j_k b jZaf_j hk- \h[h`^Z_fh]h fZkkb\Z <ua\Z\rbc ijhp_^mjm ijhp_kk [ehdbjm_lky ^h lh]h fhf_glZ dh]^Z \k_ khh[s_gby mc^ml ba ^Zggh]h [mn_jZ
H[uqgh \ MPI \u^_ey_lky g_dhlhjuc h[t_f iZfylb ^ey [mn_jbaZpbb ihku- eZ_fuo khh[s_gbc H^gZdh qlh[u g_ iheZ]Zlvky gZ hkh[_gghklb dhgdj_lghc j_ZebaZpbb j_dhf_g^m_lky y\gh \u^_eylv \ ijh]jZff_ ^hklZlhqguc [mn_j ^ey \k_o i_j_kuehd k [mn_jbaZpb_c
< ke_^mxs_f ijbf_j_ ihdZaZgh bkihevah\Zgb_ i_j_^Zqb khh[s_gby k [mn_- jbaZpb_c >ey [mn_jbaZpbb \u^_ey_lky fZkkb\ buf ihke_ aZ\_jr_gby i_j_- kuedb hg hk\h[h`^Z_lky JZaf_j g_h[oh^bfh]h [mn_jZ hij_^_ey_lky jZaf_jhf khh[s_gby h^gh p_eh_ qbkeh – [ZclZ iexk agZq_gb_ dhgklZglu
MPI_BSEND_OVERHEAD.
15
program example4 include 'mpif.h' integer BUFSIZE
parameter (BUFSIZE = 4 + MPI_BSEND_OVERHEAD)
|
byte buf(BUFSIZE) |
|
integer rank, ierr, ibufsize, rbuf |
|
integer status(MPI_STATUS_SIZE) |
|
call MPI_INIT(ierr) |
|
call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) |
|
if(rank .eq. 0) then |
|
call MPI_BUFFER_ATTACH(buf, BUFSIZE, ierr) |
|
call MPI_BSEND(rank, 1, MPI_INTEGER, 1, 5, |
& |
MPI_COMM_WORLD, ierr) |
|
call MPI_BUFFER_DETACH(buf, ibufsize, ierr) |
|
end if |
|
if(rank .eq. 1) then |
|
call MPI_RECV(rbuf, 1, MPI_INTEGER, 0, 5, |
& |
MPI_COMM_WORLD, status, ierr) |
|
print *, 'Process 1 received ', rbuf, ' from process ', |
& |
status(MPI_SOURCE) |
|
end if |
|
call MPI_FINALIZE(ierr) |
|
end |
MPI_RECV(BUF, COUNT, DATATYPE, SOURCE, MSGTAG, COMM, STATUS, IERR)
<type> BUF(*)
INTEGER COUNT, DATATYPE, SOURCE, MSGTAG, COMM, IERR, STATUS(MPI_STATUS_SIZE)
;ehdbjmxsbc ijb_f \ [mn_j BUF g_ [he__ COUNT we_f_glh\ khh[s_gby lbiZ DATATYPE k b^_glbnbdZlhjhf MSGTAG hl ijhp_kkZ k ghf_jhf SOURCE \ dhf- fmgbdZlhj_ COMM k aZiheg_gb_f fZkkb\Z Zljb[mlh\ ijboh^ys_]h khh[s_gby STATUS ?keb qbkeh j_Zevgh ijbgyluo we_f_glh\ f_gvr_ agZq_gby COUNT lh ]ZjZglbjm_lky qlh \ [mn_j_ BUF baf_gylky lhevdh we_f_glu khhl\_lkl\mxsb_ we_f_glZf ijbgylh]h khh[s_gby ?keb dhebq_kl\h we_f_glh\ \ ijbgbfZ_fhf khh[s_gbb [hevr_ agZq_gby COUNT lh \hagbdZ_l hrb[dZ i_j_iheg_gby Qlh[u ba[_`Zlv wlh]h fh`gh kgZqZeZ hij_^_eblv kljmdlmjm ijboh^ys_]h khh[s_gby ijb ihfhsb ijhp_^mju MPI_PROBE (MPI_IPROBE ?keb gm`gh magZlv lhqgh_ qbkeh we_f_glh\ \ ijbgbfZ_fhf khh[s_gbb lh fh`gh \hkihevah\Zlvky ijhp_^mjhc MPI_GET_COUNT. ;ehdbjh\dZ ]ZjZglbjm_l qlh ihke_ \ha\jZlZ ba ijhp_^mju MPI_RECV \k_ we_f_glu khh[s_gby m`_ [m^ml ijbgylu b jZkiheh`_gu \ [mn_j_ BUF.
Gb`_ ijb\_^_g ijbf_j ijh]jZffu \ dhlhjhc gme_\hc ijhp_kk ihkueZ_l kh- h[s_gb_ ijhp_kkm k ghf_jhf h^bg b `^_l hl g_]h hl\_lZ ?keb ijh]jZffZ [m^_l aZims_gZ k [hevrbf qbkehf ijhp_kkh\ lh j_Zevgh \uihegylv i_j_- kuedb \k_ jZ\gh klZgml lhevdh gme_\hc b i_j\uc ijhp_kku HklZevgu_ ijh- p_kku ihke_ bo bgbpbZebaZpbb ijhp_^mjhc MPI_INIT gZi_qZlZxl gZqZevgu_
16
agZq_gby i_j_f_gguo a b b ihke_ q_]h aZ\_jrZlky \uihegb\ ijhp_^mjm
MPI_FINALIZE.
program example5 include 'mpif.h'
integer ierr, size, rank real a, b
integer status(MPI_STATUS_SIZE) call MPI_INIT(ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr) call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) a = 0.0
b = 0.0
if(rank .eq. 0) then
|
b = 1.0 |
|
call MPI_SEND(b, 1, MPI_REAL, 1, 5, |
& |
MPI_COMM_WORLD, ierr); |
|
call MPI_RECV(a, 1, MPI_REAL, 1, 5, |
& |
MPI_COMM_WORLD, status, ierr); |
|
else |
|
if(rank .eq. 1) then |
|
a = 2.0 |
|
call MPI_RECV(b, 1, MPI_REAL, 0, 5, |
& |
MPI_COMM_WORLD, status, ierr); |
|
call MPI_SEND(a, 1, MPI_REAL, 0, 5, |
& |
MPI_COMM_WORLD, ierr); |
|
end if |
|
end if |
|
print *, 'process ', rank,' a = ', a, ', b = ', b |
|
call MPI_FINALIZE(ierr) |
|
end |
< ke_^mxs_f ijbf_j_ dZ`^uc ijhp_kk k q_lguf ghf_jhf ihkueZ_l khh[s_- gb_ k\h_fm khk_^m k ghf_jhf gZ _^bgbpm [hevrbf >hihegbl_evgh ihklZ\- e_gZ ijh\_jdZ ^ey ijhp_kkZ k fZdkbfZevguf ghf_jhf qlh[u hg g_ ihkeZe khh[s_gb_ g_kms_kl\mxs_fm ijhp_kkm AgZq_gby i_j_f_gghc b baf_gylky lhevdh gZ ijhp_kkZo k g_q_lgufb ghf_jZfb
program example6 include 'mpif.h'
integer ierr, size, rank, a, b integer status(MPI_STATUS_SIZE) call MPI_INIT(ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr) call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) a = rank
b = -1
if(mod(rank, 2) .eq. 0) then if(rank+1 .lt. size) then
&ihkueZxl \k_ ijhp_kku djhf_ ihke_^g_]h
call MPI_Send(a, 1, MPI_INTEGER, rank+1, 5,
17
& |
MPI_COMM_WORLD, ierr); |
|
end if |
|
else |
|
call MPI_Recv(b, 1, MPI_INTEGER, rank-1, 5, |
& |
MPI_COMM_WORLD, status, ierr); |
|
end if |
|
print *, 'process ', rank,' a = ', a, ', b = ', b |
|
call MPI_FINALIZE(ierr) |
|
end |
Ijb ijb_f_ khh[s_gby \f_klh Zj]mf_glh\ SOURCE b MSGTAG fh`gh bkihev- ah\Zlv ke_^mxsb_ ij_^hij_^_e_ggu_ dhgklZglu
• MPI_ANY_SOURCE — ijbagZd lh]h qlh ih^oh^bl khh[s_gb_ hl ex[h]h ijhp_kkZ
• MPI_ANY_TAG — ijbagZd lh]h qlh ih^oh^bl khh[s_gb_ k ex[uf b^_glbnbdZlhjhf
Ijb h^gh\j_f_gghf bkihevah\Zgbb wlbo ^\mo dhgklZgl [m^_l ijbgylh khh[- s_gb_ k ex[uf b^_glbnbdZlhjhf hl ex[h]h ijhp_kkZ
J_Zevgu_ Zljb[mlu ijbgylh]h khh[s_gby \k_]^Z fh`gh hij_^_eblv ih khhl\_lkl\mxsbf we_f_glZf fZkkb\Z status < NhjljZg_ iZjZf_lj status y\ey_lky p_ehqbke_gguf fZkkb\hf jZaf_jZ MPI_STATUS_SIZE. DhgklZglu MPI_SOURCE, MPI_TAG b MPI_ERROR y\eyxlky bg^_dkZfb ih ^Zgghfm fZkkb\m ^ey ^hklmiZ d agZq_gbyf khhl\_lkl\mxsbo ihe_c
•status(MPI_SOURCE) — ghf_j ijhp_kkZ-hlijZ\bl_ey khh[s_gby
•status(MPI_TAG) — b^_glbnbdZlhj khh[s_gby
•status(MPI_ERROR) — dh^ hrb[db.
< yaud_ Kb iZjZf_lj status y\ey_lky kljmdlmjhc ij_^hij_^_e_ggh]h lbiZ
MPI_Status k iheyfb MPI_SOURCE, MPI_TAG b MPI_ERROR.
H[jZlbf \gbfZgb_ gZ g_dhlhjmx g_kbff_ljbqghklv hi_jZpbc ihkuedb b ijb_fZ khh[s_gbc K ihfhsvx dhgklZglu MPI_ANY_SOURCE fh`gh ijbgylv khh[s_gb_ hl ex[h]h ijhp_kkZ H^gZdh \ kemqZ_ ihkuedb ^Zgguo lj_[m_lky y\gh mdZaZlv ghf_j ijbgbfZxs_]h ijhp_kkZ
< klZg^Zjl_ h]h\hj_gh qlh _keb h^bg ijhp_kk ihke_^h\Zl_evgh ihkueZ_l ^\Z khh[s_gby khhl\_lkl\mxsb_ h^ghfm b lhfm `_ \uah\m MPI_RECV ^jm]hfm ijhp_kkm lh i_j\uf [m^_l ijbgylh khh[s_gb_ dhlhjh_ [ueh hlijZ\e_gh jZgvr_ <f_kl_ k l_f _keb ^\Z khh[s_gby [ueb h^gh\j_f_ggh hlijZ\e_gu jZagufb ijhp_kkZfb lh ihjy^hd bo ihemq_gby ijbgbfZxsbf ijhp_kkhf aZ- jZg__ g_ hij_^_e_g
18
MPI_GET_COUNT(STATUS, DATATYPE, COUNT, IERR)
INTEGER COUNT, DATATYPE, IERR, STATUS(MPI_STATUS_SIZE)
Ih agZq_gbx iZjZf_ljZ STATUS ijhp_^mjZ hij_^_ey_l qbkeh COUNT m`_ ijb- gyluo ihke_ h[jZs_gby d MPI_RECV beb ijbgbfZ_fuo ihke_ h[jZs_gby d MPI_PROBE beb MPI_IPROBE we_f_glh\ khh[s_gby lbiZ DATATYPE >ZggZy ijhp_^mjZ \ qZklghklb g_h[oh^bfZ ^ey hij_^_e_gby jZaf_jZ h[eZklb iZ- fylb \u^_ey_fhc ^ey ojZg_gby ijbgbfZ_fh]h khh[s_gby
MPI_PROBE(SOURCE, MSGTAG, COMM, STATUS, IERR)
INTEGER SOURCE, MSGTAG, COMM, IERR, STATUS(MPI_STATUS_SIZE)
Ihemq_gb_ \ fZkkb\_ STATUS bgnhjfZpbb h kljmdlmj_ h`b^Z_fh]h khh[s_- gby k b^_glbnbdZlhjhf MSGTAG hl ijhp_kkZ k ghf_jhf SOURCE \ dhffmgbdZlhj_ COMM k [ehdbjh\dhc <ha\jZlZ ba ijhp_^mju g_ ijhbahc^_l ^h l_o ihj ihdZ khh[s_gb_ k ih^oh^ysbf b^_glbnbdZlhjhf b ghf_jhf ijhp_kkZ-hlijZ\bl_ey g_ [m^_l ^hklmigh ^ey ihemq_gby Ke_^m_l hkh[h h[jZlblv \gbfZgb_ gZ lh qlh ijhp_^mjZ hij_^_ey_l lhevdh nZdl ijboh^Z khh[s_gby gh j_Zevgh _]h g_ ijbgbfZ_l ?keb ihke_ \uah\Z MPI_PROBE \uau\Z_lky MPI_RECV k lZdbfb `_ iZjZf_ljZfb lh [m^_l ijbgylh lh `_ kZfh_ khh[s_gb_ bgnhjfZpby h dhlhjhf [ueZ ihemq_gZ k ihfhsvx \uah\Z ijhp_^mju MPI_PROBE.
Ke_^mxsbc ijbf_j ^_fhgkljbjm_l ijbf_g_gb_ ijhp_^mju MPI_PROBE ^ey hij_^_e_gby kljmdlmju ijboh^ys_]h khh[s_gby Ijhp_kk 0 `^_l khh[s_gby hl ex[h]h ba ijhp_kkh\ 1 b 2 k h^gbf b l_f `_ l_]hf H^gZdh ihkueZ_fu_ wlbfb ijhp_kkZfb ^Zggu_ bf_xl jZaguc lbi >ey lh]h qlh[u hij_^_eblv \ dZdmx i_j_f_ggmx ihf_sZlv ijboh^ys__ khh[s_gb_ ijhp_kk kgZqZeZ ijb ihfhsb \uah\Z MPI_PROBE hij_^_ey_l hl dh]h `_ bf_ggh ihklmibeh wlh kh- h[s_gb_ Ke_^mxsbc g_ihkj_^kl\_ggh ihke_ MPI_PROBE \uah\ MPI_RECV ]Z- jZglbjh\Zggh ijbf_l gm`gh_ khh[s_gb_ ihke_ q_]h ijbgbfZ_lky khh[s_gb_ hl ^jm]h]h ijhp_kkZ
program example7 include 'mpif.h'
integer rank, ierr, ibuf, status(MPI_STATUS_SIZE) real rbuf
call MPI_INIT(ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) ibuf = rank
rbuf = 1.0 * rank
if(rank .eq. 1) call MPI_SEND(ibuf, 1, MPI_INTEGER, 0, 5,
& |
|
MPI_COMM_WORLD, ierr) |
if(rank |
.eq. 2) |
call MPI_SEND(rbuf, 1, MPI_REAL, 0, 5, |
& |
|
MPI_COMM_WORLD, ierr) |
if(rank |
.eq. 0) |
then |
call |
MPI_PROBE(MPI_ANY_SOURCE, 5, MPI_COMM_WORLD, |
|
& |
|
status, ierr) |
|
|
19 |
|
if(status(MPI_SOURCE) .EQ. 1) then |
|
call MPI_RECV(ibuf, 1, MPI_INTEGER, 1, 5, |
& |
MPI_COMM_WORLD, status, ierr) |
|
call MPI_RECV(rbuf, 1, MPI_REAL, 2, 5, |
& |
MPI_COMM_WORLD, status, ierr) |
|
else |
|
if(status(MPI_SOURCE) .EQ. 2) then |
|
call MPI_RECV(rbuf, 1, MPI_REAL, 2, 5, |
& |
MPI_COMM_WORLD, status, ierr) |
|
call MPI_RECV(ibuf, 1, MPI_INTEGER, 1, 5, |
& |
MPI_COMM_WORLD, status, ierr) |
|
end if |
|
end if |
|
print *, 'Process 0 recv ', ibuf, ' from process 1, ', |
& |
rbuf, ' from process 2' |
|
end if |
|
call MPI_FINALIZE(ierr) |
|
end |
< ke_^mxs_f ijbf_j_ fh^_ebjm_lky ihke_^h\Zl_evguc h[f_g khh[s_gbyfb f_`^m ^\mfy ijhp_kkZfb aZf_jy_lky \j_fy gZ h^gm bl_jZpbx h[f_gZ hij_- ^_ey_lky aZ\bkbfhklv \j_f_gb h[f_gZ hl ^ebgu khh[s_gby LZdbf h[jZahf hij_^_eyxlky [Zah\u_ oZjZdl_jbklbdb dhffmgbdZpbhgghc k_lb iZjZee_ev- gh]h dhfivxl_jZ eZl_glghklv \j_fy gZ i_j_^Zqm khh[s_gby gme_\hc ^ebgu b fZdkbfZevgh ^hklb`bfZy ijhimkdgZy kihkh[ghklv dhebq_kl\h f_- ]Z[Zcl \ k_dmg^m dhffmgbdZpbhgghc k_lb Z lZd`_ ^ebgZ khh[s_gbc gZ dh- lhjhc hgZ ^hklb]Z_lky DhgklZglZ NMAX aZ^Z_l h]jZgbq_gb_ gZ fZdkbfZevgmx ^ebgm ihkueZ_fh]h khh[s_gby Z dhgklZglZ NTIMES hij_^_ey_l dhebq_kl\h ih\lhj_gbc ^ey mkj_^g_gby j_amevlZlZ KgZqZeZ ihkueZ_lky khh[s_gb_ gme_\hc ^ebgu ^ey hij_^_e_gby eZl_glghklb aZl_f ^ebgZ khh[s_gbc m^\Zb\Z_lky gZqbgZy k ihkuedb h^gh]h we_f_glZ lbiZ real*8.
program example8 include 'mpif.h'
integer ierr, rank, size, i, n, lmax, NMAX, NTIMES parameter (NMAX = 1 000 000, NTIMES = 10)
double precision time_start, time, bandwidth, max real*8 a(NMAX)
integer status(MPI_STATUS_SIZE)
call MPI_INIT(ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr) call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)
time_start = MPI_WTIME(ierr) n = 0
max = 0.0 lmax = 0
do while(n .le. NMAX) time_start = MPI_WTIME(ierr)
20
