А.С. Антонов - Параллельное программирование с использованием технологии MPI (1162620), страница 8
Текст из файла (страница 8)
Ihke_ \uiheg_gby ijhp_^mju i_j_f_ggZyGROUPijbgbfZ_lagZq_gb_ MPI_GROUP_NULL?kebkwlhc]jmiihcdfhf_glm\uah\Z ijhp_^mju m`_ \uihegy_lky dZdZy-lh hi_jZpby lh hgZ [m^_laZ\_jr_gZ<ke_^mxs_fijbf_j_\k_ijhp_kkuijbeh`_gbyjZa[b\ZxlkygZ^\_g_i_j_k_dZxsb_kyijbf_jghjZ\gu_]jmiiugroup1bgroup2Ijbg_q_lghfqbke_ijhp_kkh\ \ ]jmii_ group2fh`_lhdZaZlvkygZh^bgijhp_kk[hevr_lh]^Zihke_^gbcijhp_kkba^Zgghc]jmiiug_^he`_gh[f_gb\Zlvky^Zggufbgbkh^gbf ijhp_kkhf ba ]jmiiu group1 K ihfhsvx \uah\h\ ijhp_^mjuMPI_GROUP_TRANSLATE_RANKSdZ`^ucijhp_kkgZoh^blijhp_kkkl_f`_ghf_jhf\^jm]hc]jmii_bh[f_gb\Z_lkykgbfkhh[s_gb_fq_j_adhffmgbdZlhj MPI_COMM_WORLDijbihfhsb\uah\Zijhp_^mju MPI_SENDRECV<dhgp_ijh]jZffu g_ gm`gu_ ^Ze__ ]jmiiu mgbqlh`Zxlky k ihfhsvx \uah\h\ijhp_^mjMPI_GROUP_FREE.program example16include 'mpif.h'integer ierr, rank, i, size, size1integer a(4), b(4)integer status(MPI_STATUS_SIZE)integer group, group1, group2integer ranks(128), rank1, rank2, rank3call MPI_INIT(ierr)call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr)call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)call MPI_COMM_GROUP(MPI_COMM_WORLD, group, ierr)size1 = size/2do i = 1, size1ranks(i) = i-1enddocall MPI_GROUP_INCL(group, size1, ranks, group1, ierr)call MPI_GROUP_EXCL(group, size1, ranks, group2, ierr)call MPI_GROUP_RANK(group1, rank1, ierr)call MPI_GROUP_RANK(group2, rank2, ierr)if (rank1 .eq.
MPI_UNDEFINED) thenif(rank2 .lt. size1) thencall MPI_GROUP_TRANSLATE_RANKS(group1, 1, rank2,&group, rank3, ierr)elserank3 = MPI_UNDEFINEDend if51elsecall MPI_GROUP_TRANSLATE_RANKS(group2, 1, rank1,&group, rank3, ierr)end ifa(1) = ranka(2) = rank1a(3) = rank2a(4) = rank3if (rank3 .ne. MPI_UNDEFINED) thencall MPI_SENDRECV(a, 4, MPI_INTEGER, rank3, 1,&b, 4, MPI_INTEGER, rank3, 1,&MPI_COMM_WORLD, status, ierr)end ifcall MPI_GROUP_FREE(group, ierr)call MPI_GROUP_FREE(group1, ierr)call MPI_GROUP_FREE(group2, ierr)print *, 'process ', rank, ' a=', a, ' b=', bcall MPI_FINALIZE(ierr)endHi_jZpbbkdhffmgbdZlhjZfbDhffmgbdZlhjij_^hklZ\ey_lhl^_evgucdhgl_dklh[f_gZijhp_kkh\g_dhlhjhc]jmiiuDhgl_dklh[_ki_qb\Z_l\hafh`ghklvg_aZ\bkbfuoh[f_gh\^ZggufbDZ`^hc]jmii_ijhp_kkh\fh`_lkhhl\_lkl\h\Zlvg_kdhevdhdhffmgbdZlhjh\ghdZ`^ucdhffmgbdZlhj\ex[hcfhf_gl\j_f_gbh^ghagZqghkhhl\_lkl\m_llhevdhh^ghc]jmii_Ke_^mxsb_ dhffmgbdZlhju kha^Zxlky kjZam ihke_ \uah\Z ijhp_^mjuMPI_INIT:• MPI_COMM_WORLD –dhffmgbdZlhjh[t_^bgyxsbc\k_ijhp_kkuijbeh`_gby• MPI_COMM_NULL –agZq_gb_bkihevam_fh_^eyhrb[hqgh]hdhffmgbdZlhjZ• MPI_COMM_SELF –dhffmgbdZlhj\dexqZxsbclhevdh\ua\Z\rbcijhp_kkKha^Zgb_ dhffmgbdZlhjZ y\ey_lky dhee_dlb\ghc hi_jZpb_c b lj_[m_lhi_jZpbb f_`ijhp_kkgh]h h[f_gZ ihwlhfm lZdb_ ijhp_^mju ^he`gu\uau\Zlvky\k_fbijhp_kkZfbg_dhlhjh]hkms_kl\mxs_]hdhffmgbdZlhjZMPI_COMM_DUP(COMM, NEWCOMM, IERR)INTEGER COMM, NEWCOMM, IERRKha^Zgb_gh\h]hdhffmgbdZlhjZ NEWCOMMklhc`_]jmiihcijhp_kkh\bZljb[mlZfbqlhbmdhffmgbdZlhjZCOMM.52MPI_COMM_CREATE(COMM, GROUP, NEWCOMM, IERR)INTEGER COMM, GROUP, NEWCOMM, IERRKha^Zgb_ gh\h]h dhffmgbdZlhjZ NEWCOMM ba dhffmgbdZlhjZ COMM ^ey]jmiiu ijhp_kkh\ GROUP dhlhjZy ^he`gZ y\eylvky ih^fgh`_kl\hf ]jmiiuk\yaZgghc k dhffmgbdZlhjhf COMM <uah\ ^he`_g \klj_lblvky \h \k_oijhp_kkZo dhffmgbdZlhjZ COMM GZ ijhp_kkZo g_ ijbgZ^e_`Zsbo ]jmii_GROUP[m^_l\ha\jZs_ghagZq_gb_MPI_COMM_NULL.<ke_^mxs_fijbf_j_kha^Z_lky^\_gh\uo]jmiiuh^gZbadhlhjuokh^_j`bli_j\mxiheh\bgmijhp_kkh\Z\lhjZy–\lhjmxiheh\bgmIjbg_q_lghfqbke_ijhp_kkh\\h\lhjmx]jmiim\hc^_lgZh^bgijhp_kk[hevr_DZ`^Zy]jmiiZkha^Z_lkylhevdhgZl_oijhp_kkZodhlhju_\g__\oh^yl>eydZ`^hcgh\hc ]jmiiu kha^Z_lky khhl\_lkl\mxsbc _c dhffmgbdZlhj new_comm bhi_jZpby MPI_ALLREDUCE \uihegy_lky ih hl^_evghklb ^ey ijhp_kkh\\oh^ysbo\jZagu_]jmiiucall MPI_COMM_GROUP(MPI_COMM_WORLD, group, ierr)do i = 1, size/2ranks(i) = i-1end doif (rank .lt.
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.