Параллельное программирование с использованием MPI. Антонов (2004) (1186029), страница 9
Текст из файла (страница 9)
size/2) thencall MPI_GROUP_INCL(group, size/2, ranks,&new_group, ierr)elsecall MPI_GROUP_EXCL(group, size/2, ranks,&new_group, ierr)end ifcall MPI_COMM_CREATE(MPI_COMM_WORLD, new_group,&new_comm, ierr)call MPI_ALLREDUCE(sbuf, rbuf, 1, MPI_INTEGER,&MPI_SUM, new_comm, ierr)call MPI_GROUP_RANK(new_group, new_rank, ierr)print *, 'rank= ', rank, ' newrank= ',&new_rank, ' rbuf= ', rbuf53MPI_COMM_SPLIT(COMM, COLOR, KEY, NEWCOMM, IERR)INTEGER COMM, COLOR, KEY, NEWCOMM, IERRJZa[b_gb_ dhffmgbdZlhjZ COMM gZ g_kdhevdh gh\uo dhffmgbdZlhjh\ ihqbkemagZq_gbciZjZf_ljZ COLOR<h^bgdhffmgbdZlhjihiZ^Zxlijhp_kkukh^gbfagZq_gb_fCOLORIjhp_kkuk[hevrbfagZq_gb_fiZjZf_ljZKEYihemqZl[hevrbcjZg]\gh\hc]jmii_ijbh^bgZdh\hfagZq_gbbiZjZf_ljZKEYihjy^hdgmf_jZpbbijhp_kkh\\u[bjZ_lkykbkl_fhcIjhp_kkudhlhju_g_^he`gu\hclb\gh\u_dhffmgbdZlhjumdZau\Zxl\dZq_kl\_ iZjZf_ljZ COLOR dhgklZglm MPI_UNDEFINED Bf \ iZjZf_lj_NEWCOMM\_jg_lkyagZq_gb_MPI_COMM_NULL.< ke_^mxs_f ijbf_j_ dhffmgbdZlhj MPI_COMM_WORLD jZa[b\Z_lky gZ ljbqZklb<i_j\mx\hc^mlijhp_kkukghf_jZfb0, 3, 6bl^\h\lhjmx– 1, 4, 7bl^Z\lj_lvx– 2, 5, 8bl^AZ^Zgb_\dZq_kl\_iZjZf_ljZKEYi_j_f_gghcrank]ZjZglbjm_lqlhihjy^hdgmf_jZpbbijhp_kkh\\kha^Z\Z_fuo]jmiiZokhhl\_lkl\m_l ihjy^dm gmf_jZpbb \ bkoh^ghc ]jmii_ lh _klv ihjy^dmi_j_qbke_gby\ur_call MPI_COMM_SPLIT(MPI_COMM_WORLD, mod(rank, 3),rank, new_comm, ierr)&MPI_COMM_FREE(COMM, IERR)INTEGER COMM, IERRM^Ze_gb_ dhffmgbdZlhjZ COMM Ihke_ \uiheg_gby ijhp_^mju i_j_f_gghcCOMMijbk\Zb\Z_lkyagZq_gb_MPI_COMM_NULL?kebkwlbfdhffmgbdZlhjhfdfhf_glm\uah\Zijhp_^mjum`_\uihegy_lkydZdZy-lhhi_jZpbylhhgZ[m^_laZ\_jr_gZ<ke_^mxs_fijbf_j_kha^Z_lkyh^bggh\ucdhffmgbdZlhjcomm_revs\dhlhjuc \oh^yl \k_ ijhp_kku ijbeh`_gby ijhgmf_jh\Zggu_ \ h[jZlghf ihjy^d_Dh]^ZdhffmgbdZlhjklZgh\blkyg_gm`gufhgm^Zey_lkyijbihfhsb\uah\Z ijhp_^mju MPI_COMM_FREE LZd fh`gh bkihevah\Zlv ijhp_^mjmMPI_COMM_SPLIT^eyi_j_gmf_jZpbbijhp_kkh\program example17include 'mpif.h'integer ierr, rank, sizeinteger comm_revs, rank1call MPI_INIT(ierr)call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr)call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)call MPI_COMM_SPLIT(MPI_COMM_WORLD, 1, size-rank,&comm_revs, ierr)call MPI_COMM_RANK(comm_revs, rank1, ierr)print *, 'rank = ', rank,' rank1 = ', rank1call MPI_COMM_FREE(comm_revs, ierr)54call MPI_FINALIZE(ierr)endAZ^Zgby• DZdb_]jmiiuijhp_kkh\kms_kl\mxlijbaZimkd_ijbeh`_gby"• Fh]mleb]jmiiuijhp_kkh\bf_lvg_imklh_i_j_k_q_gb_g_kh\iZ^Zxs__gbkh^ghcbagboiheghklvx"• <q_fhlebqb_f_`^m]jmiihcijhp_kkh\bdhffmgbdZlhjhf"• Fh]ml eb h[f_gb\Zlvky ^Zggufb ijhp_kku ijbgZ^e_`Zsb_ jZagufdhffmgbdZlhjZf"• Fh`_leb\dZdhc-lh]jmii_g_[ulvijhp_kkZkghf_jhf0?• Fh`_l eb \ dZdmx-eb[h ]jmiim g_ \hclb ijhp_kk k ghf_jhf 0 \dhffmgbdZlhj_MPI_COMM_WORLD?• Fh`_leblhevdhh^bgijhp_kk\g_dhlhjhc]jmii_\ua\Zlvijhp_^mjmMPI_GROUP_INCL?• DZd kha^Zlv gh\mx ]jmiim ba ijhp_kkh\ 3, 4 b 7 dhffmgbdZlhjZMPI_COMM_WORLD?• JZa[blv \k_ ijhp_kku ijbeh`_gby gZ ljb ijhba\hevguo ]jmiiu bgZi_qZlZlv jZg]b \ MPI_COMM_WORLD l_o ijhp_kkh\ qlh ihiZeb \ i_j\u_^\_]jmiiughg_ihiZeb\lj_lvx• DZdb_dhffmgbdZlhjukms_kl\mxlijbaZimkd_ijbeh`_gby"• Fh`gh eb \ ijhp_kk_ \uiheg_gby ijh]jZffu baf_gblv qbkehijhp_kkh\\dhffmgbdZlhj_MPI_COMM_WORLD?• Fh`_l eb lhevdh h^bg ijhp_kk \ g_dhlhjhf dhffmgbdZlhj_ \ua\Zlvijhp_^mjmMPI_COMM_CREATE?• Fh`gh eb ijb ihfhsb ijhp_^mju MPI_COMM_SPLIT kha^Zlv jh\ghh^bggh\ucdhffmgbdZlhj"• Fh`gh eb ijb ihfhsb ijhp_^mju MPI_COMM_SPLIT kha^Zlv klhevdhgh\uo dhffmgbdZlhjh\ kdhevdh ijhp_kkh\ \oh^bl \ [Zah\uc dhffmgbdZlhj"• J_Zebah\Zlv jZa[b_gb_ ijhp_kkh\ gZ ^\_ ]jmiiu \ h^ghc ba dhlhjuohkms_kl\ey_lkyh[f_g^ZggufbihdhevpmZ\^jm]hc–dhffmgbdZpbbihko_f_PDVWHU-slave.<bjlmZevgu_lhiheh]bbLhiheh]by –wlhf_oZgbafkhihklZ\e_gbyijhp_kkZfg_dhlhjh]hdhffmgbdZlhjZZevl_jgZlb\ghcko_fuZ^j_kZpbb<03,lhiheh]bb\bjlmZevgulh_klvhgb g_ k\yaZgu k nbabq_kdhc lhiheh]b_c dhffmgbdZpbhgghc k_lb Lhiheh]bybkihevam_lkyijh]jZffbklhf^ey[he__m^h[gh]hh[hagZq_gbyijhp_kkh\55b lZdbf h[jZahf ijb[eb`_gby iZjZee_evghc ijh]jZffu d kljmdlmj_ fZl_fZlbq_kdh]h Ze]hjblfZ Djhf_ lh]h lhiheh]by fh`_l bkihevah\Zlvkykbkl_fhc ^ey hilbfbaZpbb jZkij_^_e_gby ijhp_kkh\ ih nbabq_kdbfijhp_kkhjZf bkihevam_fh]h iZjZee_evgh]h dhfivxl_jZ ijb ihfhsbbaf_g_gbyihjy^dZgmf_jZpbbijhp_kkh\\gmljbdhffmgbdZlhjZ<MPIij_^mkfhlj_gu^\ZlbiZlhiheh]bc• ^_dZjlh\Z lhiheh]byjZaf_jghklb• lhiheh]by]jZnZ.ijyfhm]hevgZyj_r_ldZijhba\hevghcMPI_TOPO_TEST(COMM, TYPE, IERR)INTEGER COMM, TYPE, IERRIjhp_^mjZhij_^_e_gbylbiZlhiheh]bbk\yaZgghckdhffmgbdZlhjhf COMM.<hafh`gu_\ha\jZsZ_fu_agZq_gbyiZjZf_ljZTYPE:• MPI_GRAPH^eylhiheh]bb]jZnZ• MPI_CART^ey^_dZjlh\hclhiheh]bb• MPI_UNDEFINED – k dhffmgbdZlhjhf COMM g_ k\yaZgZ gbdZdZy lhiheh]by>_dZjlh\Zlhiheh]byMPI_CART_CREATE(COMM, NDIMS, DIMS, PERIODS, REORDER, COMM_CART,IERR)INTEGER COMM, NDIMS, DIMS(*), COMM_CART, IERRLOGICAL PERIODS(*), REORDERKha^Zgb_ dhffmgbdZlhjZ COMM_CART h[eZ^Zxs_]h ^_dZjlh\hc lhiheh]b_cba ijhp_kkh\ dhffmgbdZlhjZ COMM IZjZf_lj NDIMS aZ^Z_l jZaf_jghklvihemqZ_fhc^_dZjlh\hcj_r_ldbDIMS(I) –qbkehwe_f_glh\\baf_j_gbbI,1INDIMS.
PERIODS – eh]bq_kdbc fZkkb\ ba NDIMS we_f_glh\hij_^_eyxsbcy\ey_lkyebj_r_ldZi_jbh^bq_kdhcagZq_gb_.TRUE.\^hevdZ`^h]hbaf_j_gbyREORDER –eh]bq_kdbciZjZf_ljhij_^_eyxsbcqlhijbagZq_gbb .TRUE. kbkl_f_ jZaj_r_gh f_gylv ihjy^hd gmf_jZpbb ijhp_kkh\^ey hilbfbaZpbb jZkij_^_e_gby ijhp_kkh\ ih nbabq_kdbf ijhp_kkhjZfbkihevam_fh]hiZjZee_evgh]hdhfivxl_jZIjhp_^mjZ y\ey_lky dhee_dlb\ghc Z agZqbl ^he`gZ [ulv \ua\ZgZ \k_fbijhp_kkZfb dhffmgbdZlhjZ COMM ?keb dhebq_kl\h ijhp_kkh\ \ aZ^Z\Z_fhclhiheh]bb COMM_CART f_gvr_ qbkeZ ijhp_kkh\ \ bkoh^ghf dhffmgbdZlhj_KHFFlhg_dhlhjufijhp_kkZffh`_l\_jgmlvkyagZq_gb_ MPI_COMM_NULLZagZqblhgbg_[m^mlijbgbfZlvmqZklby\kha^Z\Z_fhclhiheh]bb?kebdh56ebq_kl\h ijhp_kkh\ \ aZ^Z\Z_fhc lhiheh]bb [hevr_ qbkeZ ijhp_kkh\ \ bkoh^ghfdhffmgbdZlhj_lh\uah\[m^_lhrb[hqguf<ke_^mxs_fijbf_j_kha^Z_lkylj_of_jgZylhiheh]by 4×3×2dZ`^h_baf_j_gb_dhlhjhcy\ey_lkyi_jbh^bq_kdbfdjhf_lh]hjZaj_rZ_lkyi_j_mihjy^hq_gb_ijhp_kkh\>ZggucnjZ]f_gl^he`_g\uihegylvkyg_f_g__q_fgZ24ijhp_kkZodims(1) = 4dims(2) = 3dims(3) = 2periods(1) = .TRUE.periods(2) = .TRUE.periods(3) = .TRUE.call MPI_CART_CREATE(MPI_COMM_WORLD, 3, dims, periods,&.TRUE., comm_cart, ierr)MPI_DIMS_CREATE(NNODES, NDIMS, DIMS, IERR)INTEGER NNODES, NDIMS, DIMS(*), IERRIjhp_^mjZihfh]Z_lhij_^_eblvjZaf_ju DIMS(I)^eydZ`^hcba NDIMSjZaf_jghkl_cijbkha^Zgbb^_dZjlh\hclhiheh]bb^ey NNODESijhp_kkh\Ij_^-ihqlbl_evgufkqblZ_lkykha^Zgb_lhiheh]bb\dhlhjhcqbkehijhp_kkh\ihjZagufjZaf_jghklyfijbf_jghh^ghblh`_Ihevah\Zl_evfh`_lmijZ\eylvqbkehfijhp_kkh\\g_dhlhjuojZaf_jghklyoke_^mxsbfh[jZahfAgZq_gb_DIMS(I)jZkkqblu\Z_lky^Zgghcijhp_^mjhc_kebi_j_^\uah\hfhghjZ\gh0 bgZq_ hklZ\ey_lky [_a baf_g_gbc HljbpZl_evgu_ agZq_gby we_f_glh\fZkkb\Z DIMS y\eyxlky hrb[hqgufb I_j_^ \uah\hf ijhp_^mju agZq_gb_NNODES ^he`gh [ulv djZlgh ijhba\_^_gbx g_gme_\uo agZq_gbc fZkkb\ZDIMS <uoh^gu_ agZq_gby fZkkb\Z DIMS i_j_hij_^_e_ggu_ ^Zgghcijhp_^mjhc [m^ml mihjy^hq_gu \ ihjy^d_ m[u\Zgby Ijhp_^mjZ y\ey_lkyehdZevghcbg_lj_[m_lf_`ijhp_kkgh]h\aZbfh^_ckl\by<ke_^mxs_clZ[ebp_ijb\_^_guq_luj_ijbf_jZbkihevah\Zgbyijhp_^mjuMPI_DIMS_CREATE^eykha^Zgbylj_of_jguolhiheh]bc<i_j\hfijbf_j_ 6ijhp_kkh\h[jZamxlj_r_ldm3×2×1ijbq_fjZaf_jumihjy^hq_gu\ihjy^d_m[u\Zgby<h\lhjhfijbf_j_^_eZ_lkyihiuldZjZkij_^_eblv7ijhp_kkh\ihlj_f baf_j_gbyf _^bgkl\_gguc \hafh`guc \ZjbZgl – j_r_ldZ 7×1×1 <lj_lv_fijbf_j_^ey\lhjhcjZaf_jghklbbagZqZevghaZ^ZghagZq_gb_ 3^\_hklZ\rb_kyjZaf_jghklbhij_^_eyxlj_r_ldm 2×3×1Q_l\_jluc\uah\hrb[hq_g lZd dZd h[s__ qbkeh ijhp_kkh\ 7 g_ ^_eblky gZp_eh gZ aZ^ZggucjZaf_j\h\lhjhcjZaf_jghklb3).57dimsi_j_^\uah\hf(0,(0,(0,(0,0,0,3,3,0)0)0)0)\uah\ijhp_^mjuMPI_DIMS_CREATE(6,MPI_DIMS_CREATE(7,MPI_DIMS_CREATE(6,MPI_DIMS_CREATE(7,3,3,3,3,dims,dims,dims,dims,dimsihke_\uah\Zierr)ierr)ierr)ierr)(3, 2, 1)(7, 1, 1)(2, 3, 1)hrb[dZMPI_CART_COORDS(COMM, RANK, MAXDIMS, COORDS, IERR)INTEGER COMM, RANK, MAXDIMS, COORDS(*), IERRHij_^_e_gb_^_dZjlh\uodhhj^bgZlijhp_kkZih_]hjZg]m RANK\dhffmgbdZlhj_ COMMDhhj^bgZlu\ha\jZsZxlky\fZkkb\_ COORDSkqbkehfwe_f_glh\MAXDIMSHlkq_ldhhj^bgZlihdZ`^hfmbaf_j_gbxgZqbgZ_lkykgmeyMPI_CART_RANK(COMM, COORDS, RANK, IERR)INTEGER COMM, COORDS(*), RANK, IERRHij_^_e_gb_jZg]Z RANKijhp_kkZ\dhffmgbdZlhj_ COMMih_]h^_dZjlh\ufdhhj^bgZlZf COORDS>eyi_jbh^bq_kdboj_r_lhddhhj^bgZlu\g_^himklb-fuo bgl_j\Zeh\ i_j_kqblu\Zxlky ^ey g_i_jbh^bq_kdbo j_r_lhd hgb y\eyxlkyhrb[hqgufbMPI_CART_SUB(COMM, DIMS, NEWCOMM, IERR)INTEGER COMM, NEWCOMM, IERRLOGICAL DIMS(*)JZks_ie_gb_ dhffmgbdZlhjZ COMM k dhlhjuf k\yaZgZ ^_dZjlh\Z lhiheh]byijb ihfhsb ijhp_^mju MPI_CART_CREATE gZih^]jmiiukhhl\_lkl\mxsb_^_dZjlh\uf ih^j_r_ldZf f_gvr_c jZaf_jghklb I–uc we_f_gl eh]bq_kdh]hfZkkb\Z DIMS mklZgZ\eb\Z_lky jZ\guf agZq_gbx .TRUE.
_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.