А.С. Антонов - Параллельное программирование с использованием технологии MPI (1162620), страница 9
Текст из файла (страница 9)
_keb I–h_baf_j_gb_ ^he`gh hklZlvky \ nhjfbjm_fhc ih^j_r_ld_ k\yaZgghc kdhffmgbdZlhjhfNEWCOMM.<havf_f lj_of_jgmx lhiheh]bx kha^Zggmx \ ij_^u^ms_f ijbf_j_ Gb`_ihdZaZghdZdjZks_iblvlhiheh]bx 4×3×2gZ 3^\mf_jguoih^j_r_ldb 4×2ih8ijhp_kkh\\dZ`^hcdims(0) = .TRUE.dims(1) = .FALSE.dims(2) = .TRUE.call MPI_CART_SUB(comm_cart, dims, newcomm, ierr)MPI_CARTDIM_GET(COMM, NDIMS, IERR)INTEGER COMM, NDIMS, IERRHij_^_e_gb_jZaf_jghklb NDIMS^_dZjlh\hclhiheh]bbk\yaZgghckdhffmgbdZlhjhfCOMM.MPI_CART_GET(COMM, MAXDIMS, DIMS, PERIODS, COORDS, IERR)INTEGER COMM, MAXDIMS, DIMS(*), COORDS(*), IERR58LOGICAL PERIODS(*)Ihemq_gb_ bgnhjfZpbb h ^_dZjlh\hc lhiheh]bb dhffmgbdZlhjZ COMM b dhhj^bgZlZo\g_c\ua\Z\r_]hijhp_kkZ MAXDIMSaZ^Z_ljZaf_jghklv^_dZjlh\hc lhiheh]bb < iZjZf_lj_ DIMS \ha\jZsZ_lky dhebq_kl\h ijhp_kkh\ ^eydZ`^h]hbaf_j_gby\iZjZf_lj_PERIODS –i_jbh^bqghklvihdZ`^hfmbaf_j_gbx\iZjZf_lj_COORDS –dhhj^bgZlu\ua\Z\r_]hijhp_kkZ\^_dZjlh\hclhiheh]bbMPI_CART_SHIFT(COMM, DIRECTION, DISP, SOURCE, DEST, IERR)INTEGER COMM, DIRECTION, DISP, SOURCE, DEST, IERRIhemq_gb_ghf_jh\ihkueZxs_]hSOURCEbijbgbfZxs_]hDESTijhp_kkh\\^_dZjlh\hclhiheh]bbdhffmgbdZlhjZ COMM^eyhkms_kl\e_gbyk^\b]Z\^hevbaf_j_gbyDIRECTIONgZ\_ebqbgmDISP.>eyi_jbh^bq_kdbobaf_j_gbchkms_kl\ey_lkypbdebq_kdbck^\b]^eyg_i_jbh^bq_kdbo – ebg_cguc k^\b] < kemqZ_ ebg_cgh]h k^\b]Z gZ g_dhlhjuoijhp_kkZo \ dZq_kl\_ ghf_jh\ ihkueZxs_]h beb ijbgbfZxs_]h ijhp_kkh\fh`_l [ulv ihemq_gh agZq_gb_ MPI_PROC_NULL hagZqZxs__ \uoh^ aZ ]jZgbpu ^bZiZahgZ < kemqZ_ pbdebq_kdh]h k^\b]Z ihke_^gbc ijhp_kk ih^Zgghfm baf_j_gbx hkms_kl\ey_l h[f_gu k gme_\uf ijhp_kkhf >ey nf_jghc^_dZjlh\hcj_r_ldbagZq_gb_ DIRECTION^he`gh[ulv\ij_^_eZohl0^hn-1.AgZq_gby SOURCEb DESTfh`ghbkihevah\ZlvgZijbf_j^eyh[f_gZkihfhsvxijhp_^mjuMPI_SENDRECV.< ke_^mxs_f ijbf_j_ kha^Z_lky ^\mf_jgZy ^_dZjlh\Z j_r_ldZ i_jbh^bq_kdZyihh[hbfbaf_j_gbyfhij_^_eyxlkydhhj^bgZluijhp_kkZ\^Zgghcj_r_ld_ Ihlhf ijb ihfhsb ijhp_^mju MPI_CART_SHIFT \uqbkeyxlky dhhj^bgZluijhp_kkh\kdhlhjufbgm`ghkh\_jrblvh[f_g^Zggufb^eyhkms_kl\e_gbypbdebq_kdh]hk^\b]ZkrZ]hf2ihbaf_j_gbx1<dhgp_njZ]f_glZihemq_ggu_agZq_gbyghf_jh\ijhp_kkh\bkihevamxlky^eyh[f_gZ^Zggufbijbihfhsbijhp_^mjuMPI_SENDRECV_REPLACE.periods(1) = .TRUE.periods(2) = .TRUE.call MPI_CART_CREATE(MPI_COMM_WORLD, 2, dims,&periods, .TRUE., comm, ierr)call MPI_COMM_RANK(comm, rank, ierr)call MPI_CART_COORDS(comm, rank, 2, coords, ierr)shift = 2dest = 1call MPI_CART_SHIFT(comm, 0, shift, source, dest, ierr)call MPI_SENDRECV_REPLACE(a, 1, MPI_REAL, dest, 0,&source, 0, comm, status, ierr)59Lhiheh]by]jZnZMPI_GRAPH_CREATE(COMM, NNODES, INDEX, EDGES, REORDER,COMM_GRAPH, IERR)INTEGER COMM, NNODES, INDEX(*), EDGES(*), COMM_GRAPH, IERRLOGICAL REORDERKha^Zgb_gZhkgh\_dhffmgbdZlhjZ COMMgh\h]hdhffmgbdZlhjZ COMM_GRAPHklhiheh]b_c]jZnZIZjZf_lj NNODESaZ^Z_lqbkeh\_jrbg]jZnZ INDEX(I)kh^_j`bl kmffZjgh_ dhebq_kl\h khk_^_c ^ey i_j\uo I \_jrbg FZkkb\EDGES kh^_j`bl mihjy^hq_gguc kibkhd ghf_jh\ ijhp_kkh\-khk_^_c \k_o\_jrbgIZjZf_lj REORDERijbagZq_gbb .TRUE.hagZqZ_lqlhkbkl_f_jZa-j_r_ghf_gylvihjy^hdgmf_jZpbbijhp_kkh\Ijhp_^mjZ y\ey_lky dhee_dlb\ghc Z agZqbl ^he`gZ [ulv \ua\ZgZ \k_fbijhp_kkZfbbkoh^gh]hdhffmgbdZlhjZ?kebNNODESf_gvr_qbkeZijhp_kkh\dhffmgbdZlhjZ COMM lh g_dhlhjuf ijhp_kkZf \_jg_lky agZq_gb_MPI_COMM_NULL Z agZqbl hgb g_ [m^ml ijbgbfZlv mqZklby \ kha^Z\Z_fhclhiheh]bb ?keb NNODES [hevr_ qbkeZ ijhp_kkh\ dhffmgbdZlhjZ COMM lh\uah\ijhp_^mjuy\ey_lkyhrb[hqguf<ke_^mxs_clZ[ebqd_ijb\_^_gijbf_jhibkZgby]jZnZq_j_aaZ^Zgb_\k_okhk_^_cdZ`^hc\_jrbguIjhp_kkKhk_^b01231, 3030, 2>eyhibkZgbylZdh]h]jZnZgm`ghaZihegblvke_^mxsb_kljmdlmju^ZgguoINDEX=2, 3, 4, 6EDGES=1, 3, 0, 3, 0, 2Ihke_ wlh]h fh`gh kha^Zlv lhiheh]bx ]jZnZ gZijbf_j k ihfhsvxke_^mxs_]h \uah\Z \uah\ [m^_l dhjj_dlguf ijb \uiheg_gbb gZ g_ f_g__q_fgZ4ijhp_kkZocall MPI_GRAPH_CREATE(MPI_COMM_WORLD, 4, INDEX, EDGES,.TRUE., comm_graph, ierr)&60MPI_GRAPH_NEIGHBORS_COUNT(COMM, RANK, NNEIGHBORS, IERR)INTEGER COMM, RANK, NNEIGHBORS, IERRHij_^_e_gb_ dhebq_kl\Z NNEIGHBORS g_ihkj_^kl\_gguo khk_^_c ijhp_kkZ kjZg]hfRANK\]jZnh\hclhiheh]bbk\yaZgghckdhffmgbdZlhjhfCOMM.MPI_GRAPH_NEIGHBORS(COMM, RANK, MAX, NEIGHBORS, IERR)INTEGER COMM, RANK, MAX, NEIGHBORS(*), IERRHij_^_e_gb_ jZg]h\ g_ihkj_^kl\_gguo khk_^_c ijhp_kkZ k jZg]hf RANK \]jZnh\hclhiheh]bbk\yaZgghckdhffmgbdZlhjhf COMMJZg]bkhk_^_c\ha\jZsZxlky \ fZkkb\_ NEIGHBORS, MAX aZ^Z_l h]jZgbq_gb_gZdhebq_kl\hkhk_^_c fh`_l [ulv ihemq_gh gZijbf_j \uah\hf ijhp_^mjuMPI_GRAPH_NEIGHBORS_COUNT).MPI_GRAPHDIMS_GET(COMM, NNODES, NEDGES, IERR)INTEGER COMM, NNODES, NEDGES, IERRHij_^_e_gb_ qbkeZ \_jrbg NNODES b qbkeZ j_[_j NEDGES]jZnh\hclhiheh]bbk\yaZgghckdhffmgbdZlhjhfCOMM.MPI_GRAPH_GET(COMM, MAXINDEX, MAXEDGES, INDEX, EDGES, IERR)INTEGER COMM, MAXINDEX, MAXEDGES, INDEX(*), EDGES(*), IERRHij_^_e_gb_ bgnhjfZpbb h lhiheh]bb ]jZnZ k\yaZgghc k dhffmgbdZlhjhfCOMM<fZkkb\Zo INDEXbEDGES\ha\jZsZ_lkyhibkZgb_]jZnh\hclhiheh]bb\lhf\b^_dZdhgZaZ^Z_lkyijbkha^Zgbblhiheh]bbkihfhsvxijhp_^mjuMPI_GRAPH_CREATEIZjZf_lju MAXINDEXbMAXEDGESaZ^Zxlh]jZgbq_gbygZjZaf_jukhhl\_lkl\mxsbofZkkb\h\fh]ml[ulvihemq_gugZijbf_j\uah\hfijhp_^mjuMPI_GRAPHDIMS_GET).<ke_^mxs_fijbf_j_kha^Z_lky]jZnh\Zylhiheh]by comm_graph^eyh[s_gby ijhp_kkh\ ih dhffmgbdZpbhgghc ko_f_ PDVWHU-VODYH <k_ ijhp_kku \jZfdZo ^Zgghc lhiheh]bb fh]ml h[sZlvky lhevdh k gme_\uf ijhp_kkhfIhke_kha^Zgbylhiheh]bbkihfhsvx\uah\Zijhp_^mjuMPI_GRAPH_CREATEdZ`^uc ijhp_kk hij_^_ey_l dhebq_kl\h k\hbo g_ihkj_^kl\_gguo khk_^_c \jZfdZo ^Zgghc lhiheh]bb k ihfhsvx \uah\Z ijhp_^mjuMPI_GRAPH_NEIGHBORS_COUNT b jZg]b ijhp_kkh\-khk_^_c k ihfhsvx \uah\Zijhp_^mju MPI_GRAPH_NEIGHBORSIhke_wlh]hdZ`^ucijhp_kkfh`_l\ jZfdZo ^Zgghc lhiheh]bb h[f_gb\Zlvky ^Zggufb kh k\hbfb g_ihkj_^kl\_ggufbkhk_^yfbgZijbf_jijbihfhsb\uah\Zijhp_^mjuMPI_SENDRECV.61program example18include 'mpif.h'integer ierr, rank, rank1, i, size, MAXPROC, MAXEDGESparameter (MAXPROC = 128, MAXEDGES = 512)integer a, binteger status(MPI_STATUS_SIZE)integer comm_graph, index(MAXPROC), edges(MAXEDGES)integer num, neighbors(MAXPROC)call MPI_INIT(ierr)call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr)call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)do i = 1, sizeindex(i) = size+i-2end dodo i = 1, size-1edges(i) = iedges(size+i-1) = 0end docall MPI_GRAPH_CREATE(MPI_COMM_WORLD, size, index, edges,&.TRUE., comm_graph, ierr)call MPI_GRAPH_NEIGHBORS_COUNT(comm_graph, rank, num,&ierr)call MPI_GRAPH_NEIGHBORS(comm_graph, rank, num, neighbors,&ierr)do i = 1, numcall MPI_SENDRECV(rank, 1, MPI_INTEGER, neighbors(i),&1, rank1, 1, MPI_INTEGER,&neighbors(i), 1, comm_graph,&status, ierr)print *, 'procecc ', rank, ' communicate with process',&rank1end docall MPI_FINALIZE(ierr)endAZ^Zgby• H[yaZgZ eb \bjlmZevgZy lhiheh]by ih\lhjylv nbabq_kdmx lhiheh]bxp_e_\h]hdhfivxl_jZ"• Ex[hcebdhffmgbdZlhjfh`_lh[eZ^Zlv\bjlmZevghclhiheh]b_c"• Fh`_l eb ijhp_kk \oh^blv h^gh\j_f_ggh \ ^_dZjlh\m lhiheh]bx b \lhiheh]bx]jZnZ"• Fh`gh eb \ua\Zlv ijhp_^mjm MPI_CART_CREATE lhevdh gZ iheh\bg_ijhp_kkh\dhffmgbdZlhjZ"• G_h[oh^bfhebbkihevah\Zlvijhp_^mjmMPI_DIMS_CREATEi_j_^\uah\hfijhp_^mjuMPI_CART_CREATE?• Fh`ghebbkihevah\Zlvdhhj^bgZluijhp_kkZ\^_dZjlh\hclhiheh]bb\ijhp_^mjZoh[f_gZ^Zggufb"62• DZdb_••••i_j_kuedb^Zgguohkms_kl\eyxlkyijhp_^mjhcMPI_CART_SHIFT?DZd hij_^_eblv k dZdbfb ijhp_kkZfb \ lhiheh]bb ]jZnZ k\yaZg ^Zggucijhp_kk"DZdkha^Zlvlhiheh]bx]jZnZ\dhlhjhcdZ`^ucijhp_kkk\yaZgkdZ`^uf"J_Zebah\Zlv jZa[b_gb_ ijhp_kkh\ gZ ^\_ ]jmiiu \ h^ghc ba dhlhjuohkms_kl\ey_lkyh[f_gihdhevpmijbihfhsbk^\b]Z\h^ghf_jghc^_dZjlh\hclhiheh]bbZ\^jm]hc–dhffmgbdZpbbihko_f_PDVWHU-slave,j_Zebah\Zgghcijbihfhsblhiheh]bb]jZnZBkihevah\Zlv^\mf_jgmx^_dZjlh\mlhiheh]bxijhp_kkh\ijbj_ZebaZpbbiZjZee_evghcijh]jZffui_j_fgh`_gbyfZljbpI_j_kuedZjZaghlbiguo^ZgguoIh^ khh[s_gb_f \ MPI ihgbfZ_lky fZkkb\ h^ghlbiguo ^Zgguo jZkiheh`_gguo\ihke_^h\Zl_evguoyq_cdZoiZfylbQZklh\ijh]jZffZolj_[mxlkyi_j_kuedb[he__keh`guoh[t_dlh\^ZgguokhklhysbobajZaghlbiguowe_f_glh\ beb jZkiheh`_gguo g_ \ ihke_^h\Zl_evguo yq_cdZo iZfylb < wlhfkemqZ_fh`gheb[hihkueZlv^Zggu_g_[hevrbfbihjpbyfbjZkiheh`_gguoih^jy^we_f_glh\h^gh]hlbiZeb[hbkihevah\Zlvdhibjh\Zgb_^Zgguoi_j_^hlkuedhc\g_dhlhjucijhf_`mlhqguc[mn_jH[Z\ZjbZglZy\eyxlky^hklZlhqgh g_m^h[gufb b lj_[mxl ^hihegbl_evguo aZljZl dZd \j_f_gb lZd bhi_jZlb\ghciZfylb>eyi_j_kuedbjZaghlbiguo^Zgguo\MPIij_^mkfhlj_gu^\Zki_pbZevguokihkh[Z• Ijhba\h^gu_lbiu^Zgguo;• MiZdh\dZ^Zgguo.Ijhba\h^gu_lbiu^ZgguoIjhba\h^gu_lbiu^Zgguokha^Zxlky\h\j_fy\uiheg_gbyijh]jZffukihfhsvxijhp_^mj-dhgkljmdlhjh\gZhkgh\_kms_kl\mxsbodfhf_glm\uah\ZdhgkljmdlhjZlbih\^ZgguoKha^Zgb_lbiZ^Zgguokhklhblba^\mowlZih\1.
Dhgkljmbjh\Zgb_lbiZ2. J_]bkljZpbylbiZ63Ihke_ j_]bkljZpbb ijhba\h^guc lbi ^Zgguo fh`gh bkihevah\Zlv gZjy^m kij_^hij_^_e_ggufblbiZfb\hi_jZpbyoi_j_kuedb\lhfqbke_b\dhee_dlb\guohi_jZpbyoIhke_aZ\_jr_gbyjZ[hlukijhba\h^guflbihf^Zgguo_]hj_dhf_g^m_lkyZggmebjh\ZlvIjbwlhf\k_ijhba\_^_ggu_gZ_]hhkgh\_gh\u_lbiu^ZgguohklZxlkybfh]mlbkihevah\Zlvky^Zevr_Ijhba\h^guclbi^ZgguooZjZdl_jbam_lkyihke_^h\Zl_evghklvx[Zah\uolbih\ ^Zgguo b gZ[hjhf p_ehqbke_gguo agZq_gbc kf_s_gby we_f_glh\ lbiZhlghkbl_evghgZqZeZ[mn_jZh[f_gZKf_s_gbyfh]ml[ulvdZdiheh`bl_evgufblZdbhljbpZl_evgufbg_h[yaZgujZaebqZlvkyg_lj_[m_lkybomihjy^hq_gghklvLZdbfh[jZahfihke_^h\Zl_evghklvwe_f_glh\^Zgguo\ijhba\h^ghf lbi_ fh`_l hlebqZlvky hl ihke_^h\Zl_evghklb bkoh^gh]h lbiZ Zh^bg we_f_gl ^Zgguo fh`_l \klj_qZlvky \ dhgkljmbjm_fhf lbi_ fgh]hdjZlghMPI_TYPE_CONTIGUOUS(COUNT, TYPE, NEWTYPE, IERR)INTEGER COUNT, TYPE, NEWTYPE, IERRKha^Zgb_ gh\h]h lbiZ ^Zgguo NEWTYPE khklhys_]h ba COUNT ihke_^h\Zl_evgh jZkiheh`_gguo we_f_glh\ [Zah\h]h lbiZ ^Zgguo TYPE NZdlbq_kdbkha^Z\Z_fuclbi^Zgguoij_^klZ\ey_lfZkkb\^Zgguo[Zah\h]hlbiZdZdhl^_evguch[t_dl< ke_^mxs_f ijbf_j_ kha^Z_lky gh\uc lbi ^Zgguo newtype dhlhjuc \^Zevg_cr_fihke_j_]bkljZpbblbiZfh`_lbkihevah\Zlvky^eyi_j_kuedbiylbjZkiheh`_gguoih^jy^p_euoqbk_ecall MPI_TYPE_CONTIGUOUS(5, MPI_INTEGER, newtype, ierr)MPI_TYPE_VECTOR(COUNT, BLOCKLEN, STRIDE, TYPE, NEWTYPE, IERR)INTEGER COUNT, BLOCKLEN, STRIDE, TYPE, NEWTYPE, IERRKha^Zgb_ gh\h]h lbiZ ^Zgguo NEWTYPE khklhys_]h ba COUNT [ehdh\ ihBLOCKLEN we_f_glh\ [Zah\h]h lbiZ ^Zgguo TYPE Ke_^mxsbc [ehd gZqbgZ_lky q_j_a STRIDE we_f_glh\ [Zah\h]h lbiZ ^Zgguo ihke_ gZqZeZ ij_^u^m-s_]h[ehdZ<ke_^mxs_fijbf_j_kha^Z_lkygh\uclbi^Zgguo newtypedhlhjucihke_j_]bkljZpbb fh`_l [ulv bkihevah\Zg ^ey i_j_kuedb dZd _^bgh]h p_eh]hr_klb we_f_glh\ ^Zgguo dhlhju_ fh`gh ij_^klZ\blv ke_^mxsbf h[jZahflbi we_f_glZ ^Zgguo dhebq_kl\h we_f_glh\ ^Zgguo hl gZqZeZ [mn_jZ ihkuedb{(MPI_REAL, 0), (MPI_REAL, 1), (MPI_REAL, 2),(MPI_REAL, 5), (MPI_REAL, 6), (MPI_REAL, 7)}64count = 2blocklen = 3stride = 5call MPI_TYPE_VECTOR(count, blocklen, stride,&MPI_REAL, newtype, ierr)MPI_TYPE_HVECTOR(COUNT, BLOCKLEN, STRIDE, TYPE, NEWTYPE, IERR)INTEGER COUNT, BLOCKLEN, STRIDE, TYPE, NEWTYPE, IERRKha^Zgb_ gh\h]h lbiZ ^Zgguo NEWTYPE khklhys_]h ba COUNT [ehdh\ ihBLOCKLEN we_f_glh\ [Zah\h]h lbiZ ^Zgguo TYPE Ke_^mxsbc [ehd gZqbgZ_lkyq_j_aSTRIDE[Zclihke_gZqZeZij_^u^ms_]h[ehdZMPI_TYPE_INDEXED(COUNT, BLOCKLENS, DISPLS, TYPE, NEWTYPE, IERR)INTEGER COUNT, BLOCKLENS(*), DISPLS(*), TYPE, NEWTYPE, IERRKha^Zgb_ gh\h]h lbiZ ^Zgguo NEWTYPE khklhys_]h ba COUNT [ehdh\ ihBLOCKLENS(I) we_f_glh\ [Zah\h]h lbiZ ^Zgguo I-c [ehd gZqbgZ_lky q_j_aDISPLS(I)we_f_glh\[Zah\h]hlbiZ^ZgguokgZqZeZ[mn_jZihkuedbIhem-q_gguclbi^Zgguofh`ghkqblZlvh[h[s_gb_f\_dlhjgh]hlbiZ< ke_^mxs_f ijbf_j_ aZ^Z_lky lbi ^Zgguo newtype ^ey hibkZgby gb`g_lj_m]hevghcfZljbpulbiZ double precision ijbwlhfmqblu\Z_lkyqlh\yaud_NhjljZgfZkkb\uojZgylkyihklhe[pZfdo i = 1, nblocklens(i) = n-i+1displs(i) = n*(i-1)+i-1end docall MPI_TYPE_INDEXED(n, blocklens, displs,MPI_DOUBLE_PRECISION, newtype, ierr)MPI_TYPE_HINDEXED(COUNT, BLOCKLENS, DISPLS, TYPE, NEWTYPE, IERR)INTEGER COUNT, BLOCKLENS(*), DISPLS(*), TYPE, NEWTYPE, IERRKha^Zgb_ gh\h]h lbiZ ^Zgguo NEWTYPE khklhys_]h ba COUNT [ehdh\ ihBLOCKLENS(I) we_f_glh\ [Zah\h]h lbiZ ^Zgguo I-c [ehd gZqbgZ_lky q_j_aDISPLS(I)[ZclkgZqZeZ[mn_jZihkuedbMPI_TYPE_STRUCT(COUNT, BLOCKLENS, DISPLS, TYPES, NEWTYPE, IERR)INTEGER COUNT, BLOCKLENS(*), DISPLS(*), TYPES(*), NEWTYPE, IERRKha^Zgb_ kljmdlmjgh]h lbiZ ^Zgguo NEWTYPE ba COUNT [ehdh\ ihBLOCKLENS(I) we_f_glh\ lbiZ TYPES(I).