Параллельное программирование с использованием MPI. Антонов (2004) (1186029), страница 5
Текст из файла (страница 5)
0) thendo while(.TRUE.)call slave(a, N)call MPI_SEND(a, N, MPI_DOUBLE_PRECISION, 0, 5,&MPI_COMM_WORLD, ierr)end doelsedo i = 1, size-1call MPI_IRECV(a(1, i), N, MPI_DOUBLE_PRECISION, i,&5, MPI_COMM_WORLD, req(i), ierr)end dodo while(.TRUE.)call MPI_WAITSOME(size-1, req, num, indexes,&statuses, ierr)do i = 1, numcall 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 doend doend ifcall MPI_FINALIZE(ierr)endsubroutine slave(a, n)double precision ainteger n&h[jZ[hldZehdZevghcqZklbfZkkb\ZDendsubroutine master(a, n)double precision ainteger n&h[jZ[hldZfZkkb\ZDEnd26MPI_TEST(REQUEST, FLAG, STATUS, IERR)LOGICAL FLAGINTEGER REQUEST, IERR, STATUS(MPI_STATUS_SIZE)Ijh\_jdZ aZ\_jr_gghklb Zkbgojhgghchi_jZpbb MPI_ISENDbeb MPI_IRECV,Zkkhpbbjh\Zgghckb^_glbnbdZlhjhf REQUEST<iZjZf_lj_ FLAG\ha\jZsZ_lkyagZq_gb_ .TRUE._kebhi_jZpbyaZ\_jr_gZbagZq_gb_ .FALSE.
-\ijhlb\ghf kemqZ_\ yaud_ Kb – 1 beb 0 khhl\_lkl\_ggh ?kebaZ\_jr_gZijh-p_^mjZ ijb_fZ lh Zljb[mlu b ^ebgm ihemq_ggh]h khh[s_gby fh`ghhij_^_eblv h[uqguf h[jZahf k ihfhsvx iZjZf_ljZ STATUS Ihke_\uiheg_gby ijhp_^mju khhl\_lkl\mxsbc we_f_gl iZjZf_ljZ REQUESTmklZgZ\eb\Z_lky\agZq_gb_MPI_REQUEST_NULL.MPI_TESTALL(COUNT, REQUESTS, FLAG, STATUSES, IERR)LOGICAL FLAGINTEGER COUNT, REQUESTS(*), STATUSES(MPI_STATUS_SIZE,*), IERRIjh\_jdZ aZ\_jr_gghklb COUNT Zkbgojhgguo hi_jZpbc Zkkhpbbjh\Zgguokb^_glbnbdZlhjZfb REQUESTS < iZjZf_lj_ FLAG ijhp_^mjZ \ha\jZsZ_l agZq_gb_ .TRUE. \ yaud_ Kb – 1 _keb \k_ hi_jZpbb Zkkhpbbjh\Zggu_ k mdZ-aZggufb b^_glbnbdZlhjZfb aZ\_jr_gu < wlhf kemqZ_ iZjZf_ljukhh[s_gbc[m^mlmdZaZgu\fZkkb\_ STATUSES?kebdZdZy-eb[hbahi_jZpbcg_aZ\_jrbeZkvlh\ha\jZsZ_lky.FALSE.\yaud_Kb– 0bhij_^_e_gghklvwe_f_glh\ fZkkb\Z STATUSES g_ ]ZjZglbjm_lky Ihke_ \uiheg_gbyREQUESTSijhp_^mjukhhl\_lkl\mxsb_we_f_gluiZjZf_ljZmklZgZ\eb\Zxlky\agZq_gb_MPI_REQUEST_NULL.MPI_TESTANY(COUNT, REQUESTS, INDEX, FLAG, STATUS, IERR)LOGICAL FLAGINTEGER COUNT, REQUESTS(*), INDEX, STATUS(MPI_STATUS_SIZE), IERRIjh\_jdZaZ\_jr_gghklbohly[uh^ghcZkbgojhgghchi_jZpbbZkkhpbbjh\Zgghckb^_glbnbdZlhjhfbafZkkb\ZREQUESTS<iZjZf_lj_FLAG\ha\jZsZ_lky agZq_gb_ .TRUE.
\ yaud_ Kb – 1 _keb ohly [u h^gZ ba hi_jZpbcZkbgojhggh]hh[f_gZaZ\_jr_gZijbwlhf INDEXkh^_j`blghf_jkhhl\_lkl\mxs_]hwe_f_glZ\fZkkb\_REQUESTSZSTATUS — iZjZf_ljukhh[s_gby<ijhlb\ghf kemqZ_ \ iZjZf_lj_ FLAG [m^_l \ha\jZs_gh agZq_gb_ .FALSE. \yaud_Kb– 0?kebdfhf_glm\uah\ZaZ\_jrbebkvg_kdhevdhbah`b^Z_fuohi_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 REQUESTSmklZgZ\eb\Z_lky\agZq_gb_MPI_REQUEST_NULL.27MPI_TESTSOME(INCOUNT, REQUESTS, OUTCOUNT, INDEXES, STATUSES,IERR)INTEGER INCOUNT, REQUESTS(*), OUTCOUNT, INDEXES(*), IERR,STATUSES(MPI_STATUS_SIZE,*):gZeh]ijhp_^mju MPI_WAITSOMEgh\ha\jZlijhbkoh^blg_f_^e_ggh?kebgbh^gZbal_klbjm_fuohi_jZpbcdfhf_glm\uah\Zg_aZ\_jrbeZkvlhagZq_gb_OUTCOUNT[m^_ljZ\ghgmexKe_^mxsbc ijbf_j ^_fhgkljbjm_l ijbf_g_gb_ g_[ehdbjmxsbo hi_jZpbc^eyj_ZebaZpbbljZgkihgbjh\Zgbyd\Z^jZlghcfZljbpujZkij_^_e_gghcf_`^m ijhp_kkZfb ih kljhdZf KgZqZeZ dZ`^uc ijhp_kk ehdZevgh hij_^_ey_lnlkljhdfZkkb\ZaAZl_fijbihfhsbg_[ehdbjmxsbohi_jZpbcMPI_ISENDb MPI_IRECVbgbpbZebabjmxlky\k_g_h[oh^bfu_^eyljZgkihgbjh\Zgbyh[f_gu ^Zggufb GZ nhg_ gZqbgZxsboky h[f_gh\ dZ`^uc ijhp_kk ljZgkihgbjm_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 qZklvfZkkb\Z a H[jZ[hldZ ijh^he`Z_lky ^h l_o ihj ihdZ g_ [m^ml ihemq_gukhh[s_gby hl \k_o ijhp_kkh\ < dhgp_ bkoh^guc fZkkb\ a bljZgkihgbjh\ZggucfZkkb\bjZki_qZlu\Zxlkyprogram example11include 'mpif.h'integer ierr, rank, size, N, nl, i, jparameter (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+1call work(a, b, N, nl, size, rank)call MPI_FINALIZE(ierr)endsubroutine work(a, b, n, nl, size, rank)include 'mpif.h'integer ierr, rank, size, n, MAXPROC, nl, i, j, ii, jj, irparameter (MAXPROC = 64)double precision a(nl, n), b(nl, n), cinteger irr, status(MPI_STATUS_SIZE), req(MAXPROC*2)do i = 1, nldo j = 1, nii = i+rank*nlif(ii .le.
n) a(i, j) = 100*ii+jend doend dodo ir = 0, size-1if(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 doreq(rank+1) = MPI_REQUEST_NULLdo ir = 0, size-1if(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 doir = rankdo i = 1, nlii = i+ir*nldo j = i+1, nljj = j+ir*nlb(i, jj) = a(j, ii)b(j, ii) = a(i, jj)end dob(i, ii) = a(i, ii)end dodo irr = 1, size-1call MPI_WAITANY(size, req, ir, status, ierr)ir = ir-1do i = 1, nlii = i+ir*nldo j = i+1, nljj = j+ir*nlc = b(i, jj)b(i, jj) = b(j, ii)b(j, ii) = cend doend doend dodo i = 1, nldo j = 1, Nii = i+rank*nlif(ii .le. n) print *, 'process ', rank,&': a(', ii, ', ', j, ') =', a(i,j),&', b(', ii, ', ', j, ') =', b(i,j)end doend doend29Hleh`_ggu_aZijhkugZ\aZbfh^_ckl\b_Ijhp_^mju ^Zgghc ]jmiiu iha\heyxl kgbablv gZdeZ^gu_ jZkoh^u \hagbdZxsb_\jZfdZoh^gh]hijhp_kkhjZijbh[jZ[hld_ijb_fZi_j_^Zqbbi_j_f_s_gbbg_h[oh^bfhcbgnhjfZpbbf_`^mijhp_kkhfbk_l_\ufdhgljhee_jhf QZklh \ ijh]jZff_ ijboh^blky fgh]hdjZlgh \uihegylv h[f_gu k h^bgZdh\ufbiZjZf_ljZfbgZijbf_j\pbde_<wlhfkemqZ_fh`ghh^bgjZabgbpbZebabjh\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 baZ\_^_gb_khhl\_lkl\mxsbo\gmlj_ggbokljmdlmj^ZgguoDjhf_lh]hlZdbfh[jZahf g_kdhevdh aZijhkh\ gZ ijb_f bbeb i_j_^Zqm fh]ml h[t_^bgylvky\f_kl_^eylh]hqlh[u^Ze__bofh`gh[ueh[uaZimklblvh^ghcdhfZg^hc\ijhq_f wlh kh\k_f g_h[yaZl_evgh ohjhrh ihkdhevdm fh`_l ijb\_klb di_j_]jmad_dhffmgbdZpbhgghck_lbKihkh[ 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 kihkh[hffh`_l[ulvijbgylhdZdh[uqgufkihkh[hflZdbkihfhsvxhleh`_gguoaZijhkh\MPI_SEND_INIT(BUF, COUNT, DATATYPE, DEST, MSGTAG, COMM, REQUEST,IERR)<type> BUF(*)INTEGER COUNT, DATATYPE, DEST, MSGTAG, COMM, REQUEST, IERRNhjfbjh\Zgb_hleh`_ggh]haZijhkZgZihkuedmkhh[s_gbyKZfZhi_jZpbyi_j_kuedbijbwlhfg_gZqbgZ_lky:gZeh]bqgh lj_f fh^bnbdZpbyf ijhp_^mj MPI_SEND b MPI_ISEND ij_^mkfhlj_guljb^hihegbl_evguo\ZjbZglZijhp_^mjuMPI_SEND_INIT:• MPI_BSEND_INIT — nhjfbjh\Zgb_ hleh`_ggh]h aZijhkZ gZ i_j_^Zqmkhh[s_gbyk[mn_jbaZpb_c• MPI_SSEND_INIT — nhjfbjh\Zgb_ hleh`_ggh]h aZijhkZ gZ i_j_^Zqmkhh[s_gbykkbgojhgbaZpb_c• MPI_RSEND_INIT — nhjfbjh\Zgb_ hleh`_ggh]h aZijhkZ gZ i_j_^Zqmkhh[s_gbyih]hlh\ghklbMPI_RECV_INIT(BUF, COUNT, DATATYPE, SOURCE, MSGTAG, COMM,REQUEST, IERR)<type> BUF(*)INTEGER COUNT, DATATYPE, SOURCE, MSGTAG, COMM, REQUEST, IERRNhjfbjh\Zgb_ hleh`_ggh]h aZijhkZ gZ ijb_f khh[s_gby KZfZ hi_jZpbyijb_fZijbwlhfg_gZqbgZ_lky30MPI_START(REQUEST, IERR)INTEGER REQUEST, IERRBgbpbZebaZpbyhleh`_ggh]haZijhkZgZ\uiheg_gb_hi_jZpbbh[f_gZkhhl\_lkl\mxs_c agZq_gbx iZjZf_ljZ REQUEST Hi_jZpby aZimkdZ_lky dZd g_[ehdbjmxsZyMPI_STARTALL(COUNT, REQUESTS, IERR)INTEGER COUNT, REQUESTS, IERRBgbpbZebaZpby COUNT hleh`_gguo aZijhkh\ gZ \uiheg_gb_ hi_jZpbc h[f_gZ khhl\_lkl\mxsbo agZq_gbyf i_j\uo COUNT we_f_glh\ fZkkb\ZREQUESTSHi_jZpbbaZimkdZxlkydZdg_[ehdbjmxsb_< hlebqb_ hl g_[ehdbjmxsbo hi_jZpbc ih aZ\_jr_gbb \uiheg_gbyhi_jZpbbaZims_gghcijbihfhsbhleh`_ggh]haZijhkZgZ\aZbfh^_ckl\b_agZq_gb_iZjZf_ljZREQUEST (REQUESTSkhojZgy_lkybfh`_lbkihevah\Zlvky\^Zevg_cr_fMPI_REQUEST_FREE(REQUEST, IERR)INTEGER REQUEST, IERR>ZggZy ijhp_^mjZ m^Zey_l kljmdlmju ^Zgguo k\yaZggu_ k iZjZf_ljhfREQUESTIhke___\uiheg_gbyiZjZf_ljREQUESTmklZgZ\eb\Z_lky\agZq_gb_MPI_REQUEST_NULL ?keb hi_jZpby k\yaZggZy k wlbf aZijhkhf m`_\uihegy_lkylhhgZ[m^_laZ\_jr_gZ<ke_^mxs_fijbf_j_bgbpbZebabjmxlkyhleh`_ggu_aZijhkugZhi_jZpbb^\mgZijZ\e_ggh]h h[f_gZ k khk_^gbfb ijhp_kkZfb \ dhevp_\hc lhiheh]bbKZfb hi_jZpbb aZimkdZxlky gZ dZ`^hc bl_jZpbb ihke_^mxs_]h pbdeZ IhaZ\_jr_gbbpbdeZhleh`_ggu_aZijhkum^Zeyxlkyprev = rank - 1next = rank + 1if(rank .eq.
0) prev = size - 1if(rank .eq. size - 1) next = 0call MPI_RECV_INIT(rbuf(1), 1, MPI_REAL, prev, 5,&MPI_COMM_WORLD, reqs(1), ierr)call MPI_RECV_INIT(rbuf(2), 1, MPI_REAL, next, 6,&MPI_COMM_WORLD, reqs(2), ierr)call MPI_SEND_INIT(sbuf(1), 1, MPI_REAL, prev, 6,&MPI_COMM_WORLD, reqs(3), ierr)call MPI_SEND_INIT(sbuf(2), 1, MPI_REAL, next, 5,&MPI_COMM_WORLD, reqs(4), ierr)do i=...sbuf(1)=...sbuf(2)=...call MPI_STARTALL(4, reqs, ierr)...call MPI_WAITALL(4, reqs, stats, ierr);...end do31callcallcallcallMPI_REQUEST_FREE(reqs(1),MPI_REQUEST_FREE(reqs(2),MPI_REQUEST_FREE(reqs(3),MPI_REQUEST_FREE(reqs(4),ierr)ierr)ierr)ierr)Lmibdh\u_kblmZpbbGHDGORFNBkihevah\Zgb_[ehdbjmxsboijhp_^mjijb_fZbihkuedbk\yaZghk\hafh`guf\hagbdgh\_gb_flmibdh\hckblmZpbbIj_^iheh`bfqlhjZ[hlZxl^\ZiZjZee_evguoijhp_kkZbhgb^he`guh[f_gylvky^Zggufb;ueh[u\iheg__kl_kl\_ggh \ dZ`^hf ijhp_kk_ kgZqZeZ \hkihevah\Zlvky ijhp_^mjhcMPI_SENDZaZl_fijhp_^mjhcMPI_RECV.Ghbf_gghwlh]hbg_klhbl^_eZlv>_eh \ lhfqlhfuaZjZg__g_agZ_fdZdj_Zebah\ZgZijhp_^mjZ MPI_SEND.?keb jZajZ[hlqbdb ^ey ]ZjZglbb dhjj_dlgh]h ih\lhjgh]h bkihevah\Zgby[mn_jZ ihkuedb aZeh`beb ko_fm ijb dhlhjhc ihkueZxsbc ijhp_kk `^_lgZqZeZijb_fZlh\hagbdg_ldeZkkbq_kdbclmibdI_j\ucijhp_kkg_fh`_l\_jgmlvky ba ijhp_^mju ihkuedb ihkdhevdm \lhjhc g_ gZqbgZ_l ijb_fkhh[s_gby:\lhjhcijhp_kkg_fh`_lgZqZlvijb_fkhh[s_gbyihkdhevdmkZfihihoh`_cijbqbg_aZkljyegZihkued_?s_om`_kblmZpbydh]^Zh[Zijhp_kkZkgZqZeZihiZ^ZxlgZ[ehdbjmxsmxijhp_^mjm ijb_fZ MPI_RECV Z ebrv aZl_f gZ ihkuedm ^Zgguo < lZdhfkemqZ_lmibd\hagbdg_lg_aZ\bkbfhhlkihkh[Zj_ZebaZpbbijhp_^mjijb_fZbihkuedb^Zgguoijhp_kk0:ijhp_kk1:MPI_RECVhlijhp_kkZMPI_SENDijhp_kkmMPI_RECVhlijhp_kkZMPI_SENDijhp_kkm<hagbdZ_llmibdijhp_kk0:ijhp_kk1:MPI_SENDijhp_kkmMPI_RECVhlijhp_kkZMPI_SENDijhp_kkmMPI_RECVhlijhp_kkZFh`_l\hagbdgmlvlmibdJZkkfhljbfjZaebqgu_kihkh[ujZaj_r_gbylmibdh\uokblmZpbc1.
Ijhkl_crbf\ZjbZglhfjZaj_r_gbylmibdh\hckblmZpbb[m^_lbaf_g_gb_ihjy^dZ ke_^h\Zgby ijhp_^mj ihkuedb b ijb_fZ khh[s_gby gZ hghf baijhp_kkh\dZdihdZaZghgb`_ijhp_kk0:ijhp_kk1:MPI_SENDijhp_kkmMPI_RECVhlijhp_kkZMPI_RECVhlijhp_kkZMPI_SENDijhp_kkm32Lmibdg_\hagbdZ_l2. >jm]bf \ZjbZglhf jZaj_r_gby lmibdh\hc kblmZpbb fh`_l [ulvbkihevah\Zgb_ g_[ehdbjmxsbo hi_jZpbc AZf_gbf \uah\ ijhp_^mjuijb_fZkhh[s_gbyk[ehdbjh\dhcgZ\uah\ijhp_^mju MPI_IRECVJZkiheh`bf _]h i_j_^ \uah\hf ijhp_^mju MPI_SEND l_ ij_h[jZam_f njZ]f_glke_^mxsbfh[jZahfIjhp_kk0:ijhp_kk1:MPI_SENDijhp_kkmMPI_RECVhlijhp_kkZMPI_IRECVhlijhp_kkZMPI_SENDijhp_kkmMPI_WAITLmibdg_\hagbdZ_l< lZdhc kblmZpbb lmibd ]ZjZglbjh\Zggh g_ \hagbdg_l ihkdhevdm d fhf_glm\uah\Zijhp_^mjuMPI_SEND aZijhkgZijb_fkhh[s_gbym`_[m^_l\uklZ\e_g Z agZqbl i_j_^ZqZ ^Zgguo fh`_l gZqZlvky Ijb wlhfj_dhf_g^m_lky\uklZ\eylvijhp_^mjm MPI_IRECV\ijh]jZff_dZdfh`ghjZgvr_ qlh[u jZgvr_ ij_^hklZ\blv \hafh`ghklv gZqZeZ i_j_kuedb bfZdkbfZevghbkihevah\Zlvij_bfms_kl\ZZkbgojhgghklb3.