Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

mpibook_Antonov

.pdf
Скачиваний:
11
Добавлен:
23.02.2015
Размер:
402.03 Кб
Скачать

program 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

MPI_SSEND

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]