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

mpibook_Antonov

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

 

do i = 1, NTIMES

 

if(rank .eq. 0) then

 

call MPI_SEND(a, n, MPI_DOUBLE_PRECISION, 1, 1,

&

MPI_COMM_WORLD, ierr)

 

call MPI_RECV(a, n, MPI_DOUBLE_PRECISION, 1, 1,

&

MPI_COMM_WORLD, status, ierr)

 

end if

 

if(rank .eq. 1) then

 

call MPI_RECV(a, n, MPI_DOUBLE_PRECISION, 0, 1,

&

MPI_COMM_WORLD, status, ierr)

 

call MPI_SEND(a, n, MPI_DOUBLE_PRECISION, 0, 1,

&

MPI_COMM_WORLD, ierr)

 

end if

 

enddo

 

time = (MPI_WTIME(ierr)-time_start)/2/NTIMES

 

bandwidth = (8*n*1.d0/(2**20))/time

 

if(max .lt. bandwidth) then

 

max = bandwidth

 

lmax = 8*n

 

end if

 

if(rank .eq. 0) then

 

if(n .eq. 0) then

 

print *, 'latency = ', time, ' seconds'

 

else

 

print *, 8*n, ' bytes, bandwidth =', bandwidth,

&

' Mb/s'

 

end if

 

end if

 

if(n .eq. 0) then

 

n = 1

 

else

 

n = 2*n

 

end if

 

end do

 

if(rank .eq. 0) then

 

print *, 'max bandwidth =', max, ' Mb/s , length =',

&

lmax, ' bytes'

 

end if

 

call MPI_FINALIZE(ierr)

 

end

I_j_^ZqZ ijb_f khh[s_gbc [_a [ehdbjh\db

< MPI ij_^mkfhlj_g gZ[hj ijhp_^mj ^ey hkms_kl\e_gby Zkbgojhgghc i_j_^Zqb ^Zgguo < hlebqb_ hl [ehdbjmxsbo ijhp_^mj \ha\jZl ba ijhp_^mj ^Zgghc ]jmiiu ijhbkoh^bl kjZam ihke_ \uah\Z [_a dZdhc-eb[h hklZgh\db jZ- [hlu ijhp_kkh\ GZ nhg_ ^Zevg_cr_]h \uiheg_gby ijh]jZffu h^gh\j_- f_ggh ijhbkoh^bl b h[jZ[hldZ Zkbgojhggh aZims_gghc hi_jZpbb

21

< ijbgpbi_ ^ZggZy \hafh`ghklv bkdexqbl_evgh ihe_agZ ^ey kha^Zgby wn- n_dlb\guo ijh]jZff < kZfhf ^_e_ ijh]jZffbkl agZ_l qlh \ g_dhlhjuc fhf_gl _fm ihlj_[m_lky fZkkb\ dhlhjuc \uqbkey_l ^jm]hc ijhp_kk Hg aZ- jZg__ \uklZ\ey_l \ ijh]jZff_ Zkbgojhgguc aZijhk gZ ihemq_gb_ ^Zggh]h fZkkb\Z Z ^h lh]h fhf_glZ dh]^Z fZkkb\ j_Zevgh ihlj_[m_lky hg fh`_l \u- ihegylv ex[mx ^jm]mx ihe_agmx jZ[hlm Hiylv `_ \h fgh]bo kemqZyo kh- \_jr_ggh g_ h[yaZl_evgh ^h`b^Zlvky hdhgqZgby ihkuedb khh[s_gby ^ey \u- iheg_gby ihke_^mxsbo \uqbke_gbc >ey aZ\_jr_gby Zkbgojhggh]h h[f_gZ lj_[m_lky \uah\ ^hihegbl_evghc ijhp_^mju dhlhjZy ijh\_jy_l aZ\_jrb- eZkv eb hi_jZpby beb ^h`b^Z_lky __ aZ\_jr_gby Lhevdh ihke_ wlh]h fh`gh bkihevah\Zlv [mn_j ihkuedb ^ey ^jm]bo p_e_c [_a hiZk_gby aZihjlblv hl- ijZ\ey_fh_ khh[s_gb_

?keb _klv \hafh`ghklv hi_jZpbb ijb_fZ i_j_^Zqb khh[s_gbc kdjulv gZ nhg_ \uqbke_gbc lh wlbf \jh^_ [u gZ^h [_ah]h\hjhqgh ihevah\Zlvky H^- gZdh gZ ijZdlbd_ g_ \k_ \k_]^Z kh]eZkm_lky k l_hjb_c Fgh]h_ aZ\bkbl hl dhgdj_lghc j_ZebaZpbb D kh`Ze_gbx ^Ze_dh g_ \k_]^Z Zkbgojhggu_ hi_jZ- pbb wnn_dlb\gh ih^^_j`b\Zxlky ZiiZjZlmjhc b kbkl_fguf hdjm`_gb_f Ihwlhfm g_ klhbl m^b\eylvky _keb wnn_dl hl \uiheg_gby \uqbke_gbc gZ nhg_ i_j_kuehd hdZ`_lky gme_\uf beb kh\k_f g_[hevrbf K^_eZggu_ aZf_qZgby dZkZxlky lhevdh \hijhkh\ wnn_dlb\ghklb < hlghr_gbb ij_^hklZ\ey_fhc nmgdpbhgZevghklb Zkbgojhggu_ hi_jZpbb bkdexqbl_evgh ihe_agu ihwlhfm hgb ijbkmlkl\mxl ijZdlbq_kdb \ dZ`^hc j_Zevghc ijh]jZff_

MPI_ISEND(BUF, COUNT, DATATYPE, DEST, MSGTAG, COMM, REQUEST, IERR)

<type> BUF(*)

INTEGER COUNT, DATATYPE, DEST, MSGTAG, COMM, REQUEST, IERR

G_[ehdbjmxsZy ihkuedZ ba [mn_jZ BUF COUNT we_f_glh\ khh[s_gby lbiZ DATATYPE k b^_glbnbdZlhjhf MSGTAG ijhp_kkm DEST dhffmgbdZlhjZ COMM. <ha\jZl ba ijhp_^mju ijhbkoh^bl kjZam ihke_ bgbpbZebaZpbb ijhp_kkZ i_- j_^Zqb [_a h`b^Zgby h[jZ[hldb \k_]h khh[s_gby gZoh^ys_]hky \ [mn_j_ BUF Wlh hagZqZ_l qlh g_evay ih\lhjgh bkihevah\Zlv ^Zgguc [mn_j ^ey ^jm- ]bo p_e_c [_a ihemq_gby ^hihegbl_evghc bgnhjfZpbb ih^l\_j`^Zxs_c aZ- \_jr_gb_ ^Zgghc ihkuedb Hij_^_eblv lhl fhf_gl \j_f_gb dh]^Z fh`gh ih\lhjgh bkihevah\Zlv [mn_j BUF [_a hiZk_gby bkihjlblv i_j_^Z\Z_fh_ kh- h[s_gb_ fh`gh k ihfhsvx \ha\jZsZ_fh]h iZjZf_ljZ REQUEST b ijhp_^mj k_f_ckl\ MPI_WAIT b MPI_TEST IZjZf_lj REQUEST bf__l \ yaud_ NhjljZg lbi INTEGER \ yaud_ Kb ij_^hij_^_e_gguc lbi MPI_Request b bkihevam- _lky ^ey b^_glbnbdZpbb dhgdj_lghc g_[ehdbjmxs_c hi_jZpbb

:gZeh]bqgh lj_f fh^bnbdZpbyf ijhp_^mju MPI_SEND ij_^mkfhlj_gu ljb ^hihegbl_evguo \ZjbZglZ ijhp_^mju MPI_ISEND:

22

MPI_IBSEND g_[ehdbjmxsZy i_j_^ZqZ khh[s_gby k [mn_jbaZpb_c

MPI_ISSEND g_[ehdbjmxsZy i_j_^ZqZ khh[s_gby k kbgojhgbaZpb_c

MPI_IRSEND g_[ehdbjmxsZy i_j_^ZqZ khh[s_gby ih ]hlh\ghklb

D baeh`_gghc \ur_ k_fZglbd_ jZ[hlu wlbo ijhp_^mj ^h[Z\ey_lky hlkmlkl\b_ [ehdbjh\db

MPI_IRECV(BUF, COUNT, DATATYPE, SOURCE, MSGTAG, COMM, REQUEST, IERR)

<type> BUF(*)

INTEGER COUNT, DATATYPE, SOURCE, MSGTAG, COMM, REQUEST, IERR

G_[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 \ dhffmgbdZlhj_ COMM k aZiheg_gb_f fZkkb\Z STATUS < hlebqb_ hl [ehdb- jmxs_]h ijb_fZ \ha\jZl ba ijhp_^mju ijhbkoh^bl kjZam ihke_ bgbpbZebaZ- pbb ijhp_kkZ ijb_fZ [_a h`b^Zgby ihemq_gby \k_]h khh[s_gby b _]h aZibkb \ [mn_j_ BUF HdhgqZgb_ ijhp_kkZ ijb_fZ fh`gh hij_^_eblv k ihfhsvx iZ- jZf_ljZ REQUEST b ijhp_^mj k_f_ckl\ MPI_WAIT b MPI_TEST.

Khh[s_gb_ hlijZ\e_ggh_ ex[hc ba ijhp_^mj MPI_SEND, MPI_ISEND b ex[hc ba lj_o bo fh^bnbdZpbc fh`_l [ulv ijbgylh ex[hc ba ijhp_^mj MPI_RECV

b MPI_IRECV.

H[jZlbf hkh[h_ \gbfZgb_ gZ lh qlh ^h aZ\_jr_gby g_[ehdbjmxs_c hi_jZpbb g_ ke_^m_l aZibku\Zlv \ bkihevam_fuc fZkkb\ ^Zgguo

MPI_IPROBE(SOURCE, MSGTAG, COMM, FLAG, STATUS, IERR) LOGICAL FLAG

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 [_a [ehdbjh\db < iZjZf_lj_ FLAG \ha\jZsZ_lky agZq_gb_ .TRUE. _keb khh[s_gb_ k ih^oh^ysbfb Zljb[mlZfb m`_ fh`_l [ulv ijbgylh \ wlhf kemqZ_ ^_ckl\b_ ijhp_^mju iheghklvx ZgZeh]bqgh MPI_PROBE b agZq_gb_ .FALSE. _keb khh[s_gby k mdZaZggufb Zljb[mlZfb _s_ g_l

MPI_WAIT(REQUEST, STATUS, IERR)

INTEGER REQUEST, IERR, STATUS(MPI_STATUS_SIZE)

H`b^Zgb_ aZ\_jr_gby Zkbgojhgghc hi_jZpbb Zkkhpbbjh\Zgghc k b^_glbnb- dZlhjhf REQUEST b aZims_gghc \uah\hf ijhp_^mju MPI_ISEND beb MPI_IRECV IhdZ ZkbgojhggZy hi_jZpby g_ [m^_l aZ\_jr_gZ ijhp_kk \uihe- gb\rbc ijhp_^mjm MPI_WAIT [m^_l aZ[ehdbjh\Zg >ey hi_jZpbb g_[ehdbjmxs_]h ijb_fZ hij_^_ey_lky iZjZf_lj STATUS Ihke_ \uiheg_gby

23

ijhp_^mju b^_glbnbdZlhj g_[ehdbjmxs_c hi_jZpbb REQUEST mklZgZ\eb\Z_lky \ agZq_gb_ MPI_REQUEST_NULL.

MPI_WAITALL(COUNT, REQUESTS, STATUSES, IERR)

INTEGER COUNT, REQUESTS(*), STATUSES(MPI_STATUS_SIZE,*), IERR

H`b^Zgb_ aZ\_jr_gby COUNT Zkbgojhgguo hi_jZpbc Zkkhpbbjh\Zgguo k b^_glbnbdZlhjZfb fZkkb\Z REQUESTS >ey hi_jZpbc g_[ehdbjmxsbo ijb_fh\ hij_^_eyxlky khhl\_lkl\mxsb_ iZjZf_lju \ fZkkb\_ STATUSES. ?keb \h \j_fy h^ghc beb g_kdhevdbo hi_jZpbc h[f_gZ \hagbdeb hrb[db lh ihe_ hrb[db \ we_f_glZo fZkkb\Z STATUSES [m^_l mklZgh\e_gh \ khhl\_lkl\mxs__ agZq_gb_ Ihke_ \uiheg_gby ijhp_^mju khhl\_lkl\mxsb_ we_f_glu iZjZf_ljZ REQUESTS mklZgZ\eb\Zxlky \ agZq_gb_

MPI_REQUEST_NULL.

Gb`_ ihdZaZg ijbf_j njZ]f_glZ ijh]jZffu \ dhlhjhc \k_ ijhp_kku h[f_- gb\Zxlky khh[s_gbyfb k [eb`Zcrbfb khk_^yfb \ khhl\_lkl\bb k lhiheh- ]b_c dhevpZ ijb ihfhsb g_[ehdbjmxsbo hi_jZpbc AZf_lbf qlh bkihevah- \Zgb_ ^ey wlbo p_e_c [ehdbjmxsbo hi_jZpbc fh]eh ijb\_klb d \hagbdgh\_- gbx lmibdh\hc kblmZpbb

 

program example9

 

include 'mpif.h'

 

integer ierr, rank, size, prev, next, reqs(4), buf(2)

 

integer stats(MPI_STATUS_SIZE, 4)

 

call MPI_INIT(ierr)

 

call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr)

 

call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)

 

prev = rank - 1

 

next = rank + 1

 

if (rank .eq. 0) prev = size - 1

 

if (rank .eq. size - 1) next = 0

 

call MPI_IRECV(buf(1), 1, MPI_INTEGER, prev, 5,

&

MPI_COMM_WORLD, reqs(1), ierr)

 

call MPI_IRECV(buf(2), 1, MPI_INTEGER, next, 6,

&

MPI_COMM_WORLD, reqs(2), ierr)

 

call MPI_ISEND(rank, 1, MPI_INTEGER, prev, 6,

&

MPI_COMM_WORLD, reqs(3), ierr)

 

call MPI_ISEND(rank, 1, MPI_INTEGER, next, 5,

&

MPI_COMM_WORLD, reqs(4), ierr)

call MPI_WAITALL(4, reqs, stats, ierr); print *, ‘process ’, rank,

& ‘ prev=’, buf(1), ‘ next=’, buf(2) call MPI_FINALIZE(ierr)

end

MPI_WAITANY(COUNT, REQUESTS, INDEX, STATUS, IERR)

INTEGER COUNT, REQUESTS(*), INDEX, STATUS(MPI_STATUS_SIZE), IERR

H`b^Zgb_ aZ\_jr_gby h^ghc ba COUNT Zkbgojhgguo hi_jZpbc Zkkhpbbjh- \Zgguo k b^_glbnbdZlhjZfb REQUESTS ?keb d fhf_glm \uah\Z aZ\_jrbebkv

24

g_kdhevdh ba h`b^Z_fuo hi_jZpbc lh kemqZcguf h[jZahf [m^_l \u[jZgZ h^gZ ba gbo IZjZf_lj INDEX kh^_j`bl ghf_j we_f_glZ \ fZkkb\_ REQUESTS, kh^_j`Zs_]h b^_glbnbdZlhj aZ\_jr_gghc hi_jZpbb >ey g_[ehdbjmxs_]h ijb_fZ hij_^_ey_lky iZjZf_lj STATUS Ihke_ \uiheg_gby ijhp_^mju khhl- \_lkl\mxsbc we_f_gl iZjZf_ljZ REQUESTS mklZgZ\eb\Z_lky \ agZq_gb_

MPI_REQUEST_NULL.

MPI_WAITSOME(INCOUNT, REQUESTS, OUTCOUNT, INDEXES, STATUSES, IERR)

INTEGER INCOUNT, REQUESTS(*), OUTCOUNT, INDEXES(*), IERR, STATUSES(MPI_STATUS_SIZE,*)

H`b^Zgb_ aZ\_jr_gby ohly [u h^ghc ba INCOUNT Zkbgojhgguo hi_jZpbc Zk- khpbbjh\Zgguo k b^_glbnbdZlhjZfb REQUESTS IZjZf_lj OUTCOUNT kh^_j- `bl qbkeh aZ\_jr_gguo hi_jZpbc Z i_j\u_ OUTCOUNT we_f_glh\ fZkkb\Z INDEXES kh^_j`Zl ghf_jZ we_f_glh\ fZkkb\Z REQUESTS k bo b^_glbnbdZlh- jZfb I_j\u_ OUTCOUNT we_f_glh\ fZkkb\Z STATUSES kh^_j`Zl iZjZf_lju aZ\_jr_gguo hi_jZpbc ^ey g_[ehdbjmxsbo ijb_fh\ Ihke_ \uiheg_gby ijhp_^mju khhl\_lkl\mxsb_ we_f_glu iZjZf_ljZ REQUESTS mklZgZ\eb\Z-

xlky \ agZq_gb_ MPI_REQUEST_NULL.

< ke_^mxs_f ijbf_j_ ^_fhgkljbjm_lky ko_fZ bkihevah\Zgby ijhp_^mju MPI_WAITSOME ^ey hj]ZgbaZpbb dhffmgbdZpbhgghc ko_fu³master-slave´\k_ ijhp_kku h[sZxlky k h^gbf \u^_e_gguf ijhp_kkhf <k_ ijhp_kku djhf_ ijhp_kkZ 0 gZ dZ`^hc bl_jZpbb pbdeZ hij_^_eyxl k ihfhsvx \uah\Z ijhp_- ^mju slave k\hx ehdZevgmx qZklv fZkkb\Z a ihke_ q_]h ihkueZxl __ ]eZ\- ghfm ijhp_kkm Ijhp_kk 0 kgZqZeZ bgbpbZebabjm_l g_[ehdbjmxsb_ ijb_fu hl \k_o hklZevguo ijhp_kkh\ ihke_ q_]h ^h`b^Z_lky ijboh^Z ohly [u h^gh]h khh[s_gby >ey ijbr_^rbo khh[s_gbc ijhp_kk 0 \uau\Z_l ijhp_^mjm h[jZ- [hldb master ihke_ q_]h kgh\Z \uklZ\ey_l g_[ehdbjmxsb_ ijb_fu LZdbf h[jZahf ijhp_kk 0 h[jZ[Zlu\Z_l l_ ihjpbb ^Zgguo dhlhju_ ]hlh\u gZ ^Zgguc fhf_gl Ijb wlhf ^ey dhjj_dlghklb jZ[hlu ijh]jZffu gm`gh h[_ki_qblv qlh[u ijhp_kk 0 mki_\Ze h[jZ[hlZlv ijboh^ysb_ khh[s_gby lh _klv qlh[u ijhp_^mjZ slave jZ[hlZeZ agZqbl_evgh ^hevr_ ijhp_^mju master \ ijhlb\ghf kemqZ_ b jZkiZjZee_eb\Zgb_ g_ bf__l hkh[h]h kfukeZ

Djhf_ lh]h \ ijbf_j_ gZibkZg [_kdhg_qguc pbde ihwlhfm ^ey dhgdj_lghc ijh]jZffu gm`gh ij_^mkfhlj_lv mkeh\b_ aZ\_jr_gby

25

program example10 include 'mpif.h'

integer rank, size, ierr, N, MAXPROC parameter(N = 1000, MAXPROC = 128)

integer req(MAXPROC), num, indexes(MAXPROC) integer statuses(MPI_STATUS_SIZE, MAXPROC) double precision a(N, MAXPROC)

call MPI_INIT(ierr)

call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr) call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) if(rank .ne. 0) then

 

do while(.TRUE.)

 

call slave(a, N)

 

call MPI_SEND(a, N, MPI_DOUBLE_PRECISION, 0, 5,

&

MPI_COMM_WORLD, ierr)

 

end do

 

else

 

do i = 1, size-1

 

call MPI_IRECV(a(1, i), N, MPI_DOUBLE_PRECISION, i,

&

5, MPI_COMM_WORLD, req(i), ierr)

 

end do

 

do while(.TRUE.)

 

call MPI_WAITSOME(size-1, req, num, indexes,

&

statuses, ierr)

 

do i = 1, num

 

call master(a(1, indexes(i)), N)

 

call MPI_IRECV(a(1, indexes(i)), N,

&

MPI_DOUBLE_PRECISION,

&

indexes(i), 5, MPI_COMM_WORLD,

&

req(indexes(i)), ierr)

 

end do

 

end do

 

end if

 

call MPI_FINALIZE(ierr)

 

end

subroutine slave(a, n) double precision a integer n

&h[jZ[hldZ ehdZevghc qZklb fZkkb\ZD end

subroutine master(a, n) double precision a integer n

&h[jZ[hldZ fZkkb\ZD

End

26

MPI_TEST(REQUEST, FLAG, STATUS, IERR) LOGICAL FLAG

INTEGER REQUEST, IERR, STATUS(MPI_STATUS_SIZE)

Ijh\_jdZ aZ\_jr_gghklb Zkbgojhgghc hi_jZpbb MPI_ISEND beb MPI_IRECV, Zkkhpbbjh\Zgghc k b^_glbnbdZlhjhf REQUEST < iZjZf_lj_ FLAG \ha\jZsZ- _lky agZq_gb_ .TRUE. _keb hi_jZpby aZ\_jr_gZ b agZq_gb_ .FALSE. - \ ijh- lb\ghf kemqZ_ \ yaud_ Kb 1 beb 0 khhl\_lkl\_ggh ?keb aZ\_jr_gZ ijh- p_^mjZ ijb_fZ lh Zljb[mlu b ^ebgm ihemq_ggh]h khh[s_gby fh`gh hij_^_eblv h[uqguf h[jZahf k ihfhsvx iZjZf_ljZ STATUS Ihke_ \uiheg_gby ijhp_^mju khhl\_lkl\mxsbc we_f_gl iZjZf_ljZ REQUEST mklZgZ\eb\Z_lky \ agZq_gb_ MPI_REQUEST_NULL.

MPI_TESTALL(COUNT, REQUESTS, FLAG, STATUSES, IERR) LOGICAL FLAG

INTEGER COUNT, REQUESTS(*), STATUSES(MPI_STATUS_SIZE,*), IERR

Ijh\_jdZ aZ\_jr_gghklb COUNT Zkbgojhgguo hi_jZpbc Zkkhpbbjh\Zgguo k b^_glbnbdZlhjZfb REQUESTS < iZjZf_lj_ FLAG ijhp_^mjZ \ha\jZsZ_l agZ- q_gb_ .TRUE. \ yaud_ Kb 1 _keb \k_ hi_jZpbb Zkkhpbbjh\Zggu_ k mdZ- aZggufb b^_glbnbdZlhjZfb aZ\_jr_gu < wlhf kemqZ_ iZjZf_lju khh[s_gbc [m^ml mdZaZgu \ fZkkb\_ STATUSES ?keb dZdZy-eb[h ba hi_jZpbc g_ aZ\_jrbeZkv lh \ha\jZsZ_lky .FALSE. \ yaud_ Kb 0 b hij_^_e_gghklv we_f_glh\ fZkkb\Z STATUSES g_ ]ZjZglbjm_lky Ihke_ \uiheg_gby ijhp_^mju khhl\_lkl\mxsb_ we_f_glu iZjZf_ljZ REQUESTS mklZgZ\eb\Zxlky \ agZq_gb_ MPI_REQUEST_NULL.

MPI_TESTANY(COUNT, REQUESTS, INDEX, FLAG, STATUS, IERR) LOGICAL FLAG

INTEGER COUNT, REQUESTS(*), INDEX, STATUS(MPI_STATUS_SIZE), IERR

Ijh\_jdZ aZ\_jr_gghklb ohly [u h^ghc Zkbgojhgghc hi_jZpbb Zkkhpbbjh- \Zgghc k b^_glbnbdZlhjhf ba fZkkb\Z REQUESTS < iZjZf_lj_ FLAG \ha\jZsZ- _lky agZq_gb_ .TRUE. \ yaud_ Kb 1 _keb ohly [u h^gZ ba hi_jZpbc Zkbgojhggh]h h[f_gZ aZ\_jr_gZ ijb wlhf INDEX kh^_j`bl ghf_j khhl\_lkl- \mxs_]h we_f_glZ \ fZkkb\_ REQUESTS Z STATUS iZjZf_lju khh[s_gby < ijhlb\ghf kemqZ_ \ iZjZf_lj_ FLAG [m^_l \ha\jZs_gh agZq_gb_ .FALSE. \ yaud_ Kb 0 ?keb d fhf_glm \uah\Z aZ\_jrbebkv g_kdhevdh ba h`b^Z_fuo hi_jZpbc lh kemqZcguf h[jZahf [m^_l \u[jZgZ h^gZ ba gbo Ihke_ \uiheg_gby ijhp_^mju khhl\_lkl\mxsbc we_f_gl iZjZf_ljZ REQUESTS mklZgZ\eb\Z_lky \ agZq_gb_ MPI_REQUEST_NULL.

27

MPI_TESTSOME(INCOUNT, REQUESTS, OUTCOUNT, INDEXES, STATUSES, IERR)

INTEGER INCOUNT, REQUESTS(*), OUTCOUNT, INDEXES(*), IERR, STATUSES(MPI_STATUS_SIZE,*)

:gZeh] ijhp_^mju MPI_WAITSOME gh \ha\jZl ijhbkoh^bl g_f_^e_ggh ?keb gb h^gZ ba l_klbjm_fuo hi_jZpbc d fhf_glm \uah\Z g_ aZ\_jrbeZkv lh agZ- q_gb_ OUTCOUNT [m^_l jZ\gh gmex

Ke_^mxsbc ijbf_j ^_fhgkljbjm_l ijbf_g_gb_ g_[ehdbjmxsbo hi_jZpbc ^ey j_ZebaZpbb ljZgkihgbjh\Zgby d\Z^jZlghc fZljbpu jZkij_^_e_gghc f_- `^m ijhp_kkZfb ih kljhdZf KgZqZeZ dZ`^uc ijhp_kk ehdZevgh hij_^_ey_l nl kljhd fZkkb\Z a AZl_f ijb ihfhsb g_[ehdbjmxsbo hi_jZpbc MPI_ISEND b MPI_IRECV bgbpbZebabjmxlky \k_ g_h[oh^bfu_ ^ey ljZgkihgbjh\Zgby h[- f_gu ^Zggufb GZ nhg_ gZqbgZxsboky h[f_gh\ dZ`^uc ijhp_kk ljZgkih- gbjm_l k\hx ehdZevgmx qZklv fZkkb\Z a Ihke_ wlh]h ijhp_kk ijb ihfhsb \uah\Z ijhp_^mju MPI_WAITANY ^h`b^Z_lky ijboh^Z khh[s_gby hl ex[h]h ^jm]h]h ijhp_kkZ b ljZgkihgbjm_l ihemq_ggmx hl ^Zggh]h ijhp_kkZ qZklv fZkkb\Z a H[jZ[hldZ ijh^he`Z_lky ^h l_o ihj ihdZ g_ [m^ml ihemq_gu khh[s_gby hl \k_o ijhp_kkh\ < dhgp_ bkoh^guc fZkkb\ a b ljZgkihgbjh\Zgguc fZkkb\ b jZki_qZlu\Zxlky

program example11 include 'mpif.h'

integer ierr, rank, size, N, nl, i, j parameter (N = 9)

double precision a(N, N), b(N, N) call MPI_INIT(ierr)

call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr) call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) nl = (N-1)/size+1

call work(a, b, N, nl, size, rank) call MPI_FINALIZE(ierr)

end

subroutine work(a, b, n, nl, size, rank) include 'mpif.h'

integer ierr, rank, size, n, MAXPROC, nl, i, j, ii, jj, ir parameter (MAXPROC = 64)

double precision a(nl, n), b(nl, n), c

integer irr, status(MPI_STATUS_SIZE), req(MAXPROC*2) do i = 1, nl

do j = 1, n

ii = i+rank*nl

if(ii .le. n) a(i, j) = 100*ii+j end do

end do

do ir = 0, size-1 if(ir .ne. rank)

& call MPI_IRECV(b(1, ir*nl+1), nl*nl,

28

&

MPI_DOUBLE_PRECISION, ir,

&

MPI_ANY_TAG, MPI_COMM_WORLD,

&

req(ir+1), ierr)

 

end do

 

req(rank+1) = MPI_REQUEST_NULL

do ir = 0, size-1 if(ir .ne. rank)

&call MPI_ISEND(a(1, ir*nl+1), nl*nl,

&

MPI_DOUBLE_PRECISION, ir,

&

1, MPI_COMM_WORLD,

&

req(ir+1+size), ierr)

 

end do

 

ir = rank

 

do i = 1, nl

 

ii = i+ir*nl

 

do j = i+1, nl

 

jj = j+ir*nl

 

b(i, jj) = a(j, ii)

 

b(j, ii) = a(i, jj)

 

end do

 

b(i, ii) = a(i, ii)

 

end do

 

do irr = 1, size-1

 

call MPI_WAITANY(size, req, ir, status, ierr)

 

ir = ir-1

 

do i = 1, nl

 

ii = i+ir*nl

 

do j = i+1, nl

 

jj = j+ir*nl

 

c = b(i, jj)

 

b(i, jj) = b(j, ii)

 

b(j, ii) = c

 

end do

 

end do

 

end do

 

do i = 1, nl

 

do j = 1, N

 

ii = i+rank*nl

 

if(ii .le. n) print *, 'process ', rank,

&

': a(', ii, ', ', j, ') =', a(i,j),

&

', b(', ii, ', ', j, ') =', b(i,j)

 

end do

 

end do

 

end

29

MPI_RSEND_INIT
MPI_SSEND_INIT
MPI_BSEND_INIT

Hleh`_ggu_ aZijhku gZ \aZbfh^_ckl\b_

Ijhp_^mju ^Zgghc ]jmiiu iha\heyxl kgbablv gZdeZ^gu_ jZkoh^u \hagb- dZxsb_ \ jZfdZo h^gh]h ijhp_kkhjZ ijb h[jZ[hld_ ijb_fZ i_j_^Zqb b i_j_- f_s_gbb g_h[oh^bfhc bgnhjfZpbb f_`^m ijhp_kkhf b k_l_\uf dhgljhee_- jhf QZklh \ ijh]jZff_ ijboh^blky fgh]hdjZlgh \uihegylv h[f_gu k h^b- gZdh\ufb iZjZf_ljZfb gZijbf_j \ pbde_ < wlhf kemqZ_ fh`gh h^bg jZa bgbpbZebabjh\Zlv hi_jZpbx h[f_gZ b ihlhf fgh]hdjZlgh __ aZimkdZlv g_ ljZly gZ dZ`^hc bl_jZpbb ^hihegbl_evgh]h \j_f_gb gZ bgbpbZebaZpbx b aZ\_^_gb_ khhl\_lkl\mxsbo \gmlj_ggbo kljmdlmj ^Zgguo Djhf_ lh]h lZdbf h[jZahf g_kdhevdh aZijhkh\ gZ ijb_f b beb i_j_^Zqm fh]ml h[t_^bgylvky \f_kl_ ^ey lh]h qlh[u ^Ze__ bo fh`gh [ueh [u aZimklblv h^ghc dhfZg^hc\ijhq_f wlh kh\k_f g_h[yaZl_evgh ohjhrh ihkdhevdm fh`_l ijb\_klb d i_j_]jmad_ dhffmgbdZpbhgghc k_lb

Kihkh[ ijb_fZ khh[s_gby gbdZd g_ aZ\bkbl hl kihkh[Z _]h ihkuedb khh[- s_gb_ hlijZ\e_ggh_ k ihfhsvx hleh`_gguo aZijhkh\ eb[h h[uqguf kih- kh[hf fh`_l [ulv ijbgylh dZd h[uqguf kihkh[hf lZd b k ihfhsvx hleh- `_gguo aZijhkh\

MPI_SEND_INIT(BUF, COUNT, DATATYPE, DEST, MSGTAG, COMM, REQUEST, IERR)

<type> BUF(*)

INTEGER COUNT, DATATYPE, DEST, MSGTAG, COMM, REQUEST, IERR

Nhjfbjh\Zgb_ hleh`_ggh]h aZijhkZ gZ ihkuedm khh[s_gby KZfZ hi_jZpby i_j_kuedb ijb wlhf g_ gZqbgZ_lky

:gZeh]bqgh lj_f fh^bnbdZpbyf ijhp_^mj MPI_SEND b MPI_ISEND ij_^m- kfhlj_gu ljb ^hihegbl_evguo \ZjbZglZ ijhp_^mju MPI_SEND_INIT:

nhjfbjh\Zgb_ hleh`_ggh]h aZijhkZ gZ i_j_^Zqm khh[s_gby k [mn_jbaZpb_c

nhjfbjh\Zgb_ hleh`_ggh]h aZijhkZ gZ i_j_^Zqm khh[s_gby k kbgojhgbaZpb_c

nhjfbjh\Zgb_ hleh`_ggh]h aZijhkZ gZ i_j_^Zqm khh[s_gby ih ]hlh\ghklb

MPI_RECV_INIT(BUF, COUNT, DATATYPE, SOURCE, MSGTAG, COMM, REQUEST, IERR)

<type> BUF(*)

INTEGER COUNT, DATATYPE, SOURCE, MSGTAG, COMM, REQUEST, IERR

Nhjfbjh\Zgb_ hleh`_ggh]h aZijhkZ gZ ijb_f khh[s_gby KZfZ hi_jZpby ijb_fZ ijb wlhf g_ gZqbgZ_lky

30

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