А.С. Антонов - Параллельное программирование с использованием технологии MPI (1162620), страница 7
Текст из файла (страница 7)
0) thendo 1 i = 1, sizedo 1 j = 1, sizesbuf(i, j)=...end ifif (numtasks .eq. size) thencall MPI_SCATTER(sbuf, size, MPI_REAL,&rbuf, size, MPI_REAL,&0, MPI_COMM_WORLD, ierr)end ifMPI_SCATTERV(SBUF, SCOUNTS, DISPLS, STYPE, RBUF, RCOUNT, RTYPE,ROOT, COMM, IERR)<type> SBUF(*), RBUF(*)INTEGER SCOUNTS(*), DISPLS(*), STYPE, RCOUNT, RTYPE, ROOT, COMM,IERRJZkkuedZ jZaebqgh]h dhebq_kl\Z ^Zgguo ba fZkkb\Z SBUF GZqZeh ihjpbcjZkkueZ_fuo^ZgguoaZ^Z_lfZkkb\DISPLS.SCOUNTS –p_ehqbke_ggucfZkkb\kh^_j`Zsbcdhebq_kl\hwe_f_glh\i_j_-^Z\Z_fuo dZ`^hfm ijhp_kkm bg^_dk jZ\_g jZg]m Z^j_kZlZ ^ebgZ jZ\gZqbkemijhp_kkh\\dhffmgbdZlhj_COMM).DISPLS – p_ehqbke_gguc fZkkb\ kh^_j`Zsbc kf_s_gby hlghkbl_evgh gZqZeZfZkkb\Z SBUFbg^_dkjZ\_gjZg]mZ^j_kZlZ^ebgZjZ\gZqbkemijhp_kkh\\dhffmgbdZlhj_COMM).>Zggu_ihkueZ_fu_ijhp_kkhfROOTijhp_kkmJ-1jZaf_s_gu\J-hf[ehd_[mn_jZSBUFdhlhjucgZqbgZ_lkykhkf_s_gb_f\DISPLS(J)we_f_glh\lbiZSTYPEkgZqZeZ[mn_jZSBUF.41MPI_ALLGATHER(SBUF, SCOUNT, STYPE, RBUF, RCOUNT, RTYPE, COMM,IERR)<type> SBUF(*), RBUF(*)INTEGER SCOUNT, STYPE, RCOUNT, RTYPE, COMM, IERRK[hjdZ ^Zgguo ba fZkkb\h\ SBUF kh \k_o ijhp_kkh\ dhffmgbdZlhjZ COMM \[mn_j_ RBUFdZ`^h]hijhp_kkZ>Zggu_khojZgyxlky\ihjy^d_\hajZklZgbyghf_jh\ijhp_kkh\;ehd^ZgguoihkeZggucijhp_kkhf J-1jZaf_sZ_lky\J-hf[ehd_[mn_jZRBUFijbgbfZxs_]hijhp_kkZHi_jZpbxfh`ghjZkkfZljb\ZlvdZd MPI_GATHERijbdhlhjhcj_amevlZlihemqZ_lkygZ\k_oijhp_kkZodhffmgbdZlhjZCOMM.Ke_^mxsZyko_fZbeexkljbjm_l^_ckl\b_ijhp_^mjuMPI_ALLGATHER.MPI_ALLGATHERV(SBUF, SCOUNT, STYPE, RBUF, RCOUNTS, DISPLS,RTYPE, COMM, IERR)<type> SBUF(*), RBUF(*)INTEGER SCOUNT, STYPE, RCOUNTS(*), DISPLS(*), RTYPE, COMM, IERRK[hjdZ gZ \k_o ijhp_kkZo dhffmgbdZlhjZ COMM jZaebqgh]h dhebq_kl\Z ^ZgguobafZkkb\h\ SBUFIhjy^hdjZkiheh`_gby^Zgguo\fZkkb\_RBUFaZ^Z_lfZkkb\DISPLS.MPI_ALLTOALL(SBUF, SCOUNT, STYPE, RBUF, RCOUNT, RTYPE, COMM,IERR)<type> SBUF(*), RBUF(*)INTEGER SCOUNT, STYPE, RCOUNT, RTYPE, COMM, IERRJZkkuedZdZ`^ufijhp_kkhfdhffmgbdZlhjZCOMMjZaebqguoihjpbc^Zgguo\k_f^jm]bfijhp_kkZf J-c[ehd^Zgguo[mn_jZ SBUF (I-1)-]hijhp_kkZihiZ^Z_l\I-c[ehd^Zgguo[mn_jZRBUF (J-1)-]hijhp_kkZKe_^mxsZyko_fZbeexkljbjm_l^_ckl\b_ijhp_^mjuMPI_ALLTOALL.42MPI_ALLTOALLV(SBUF, SCOUNTS, SDISPLS, STYPE, RBUF, RCOUNTS,RDISPLS, RTYPE, COMM, IERR)<type> SBUF(*), RBUF(*)INTEGER SCOUNTS(*), SDISPLS(*), STYPE, RCOUNTS(*), RDISPLS(*),RTYPE, COMM, IERRJZkkuedZ kh \k_o ijhp_kkh\ dhffmgbdZlhjZ COMM jZaebqgh]h dhebq_kl\Z^Zgguo \k_f ijhp_kkZf ^Zggh]h dhffmgbdZlhjZ JZaf_s_gb_ ^Zgguo \ [mn_j_ SBUFhlkueZxs_]hijhp_kkZhij_^_ey_lkyfZkkb\hf SDISPLSZjZaf_s_gb_ ^Zgguo \ [mn_j_ RBUF ijbgbfZxs_]h ijhp_kkZ hij_^_ey_lky fZkkb\hfRDISPLS.MPI_REDUCE(SBUF, RBUF, COUNT, DATATYPE, OP, ROOT, COMM, IERR)<type> SBUF(*), RBUF(*)INTEGER COUNT, DATATYPE, OP, ROOT, COMM, IERR<uiheg_gb_ COUNT g_aZ\bkbfuo ]eh[Zevguo hi_jZpbc OP gZ^ khhl\_lkl\mxsbfbwe_f_glZfbfZkkb\h\SBUFJ_amevlZl\uiheg_gbyhi_jZpbbOPgZ^I-fbwe_f_glZfbfZkkb\h\SBUF\k_oijhp_kkh\dhffmgbdZlhjZCOMMihemqZ_lky\I-hfwe_f_gl_fZkkb\ZRBUFijhp_kkZROOT.<MPIij_^mkfhlj_gjy^ij_^hij_^_e_gguo]eh[Zevguohi_jZpbchgbaZ^Zxlkyke_^mxsbfbdhgklZglZfb• MPI_MAX, MPI_MIN – hij_^_e_gb_ fZdkbfZevgh]h b fbgbfZevgh]hagZq_gby• MPI_MINLOC, MPI_MAXLOC– hij_^_e_gb_ fZdkbfZevgh]h b fbgbfZevgh]hagZq_gbybbof_klhiheh`_gby• MPI_SUM, MPI_PROD – \uqbke_gb_ ]eh[Zevghc kmffu b ]eh[Zevgh]hijhba\_^_gby• MPI_LAND, MPI_LOR, MPI_LXOR –eh]bq_kdb_³B´³BEB´bkdexqZxs__³BEB´• MPI_BAND, MPI_BOR, MPI_BXOR –ih[blh\u_³B´³BEB´bkdexqZxs__³BEB´43Djhf_lh]hijh]jZffbklfh`_laZ^Zlvk\hxnmgdpbx^ey\uiheg_gby]eh[Zevghchi_jZpbbijbihfhsbijhp_^mjuMPI_OP_CREATE.< ke_^mxs_f ijbf_j_ hi_jZpby ]eh[Zevgh]h kmffbjh\Zgby fh^_ebjm_lkyijb ihfhsb ko_fu k^\Zb\Zgby k bkihevah\Zgb_f i_j_kuehd ^Zgguo lbiZlhqdZ-lhqdZWnn_dlb\ghklvlZdh]hfh^_ebjh\ZgbykjZ\gb\Z_lkykbkihevah\Zgb_fdhee_dlb\ghchi_jZpbbMPI_REDUCE.program example14include 'mpif.h'integer ierr, rank, i, size, n, nprocparameter (n = 1 000 000)double precision time_start, time_finishdouble precision a(n), b(n), c(n)integer status(MPI_STATUS_SIZE)call MPI_INIT(ierr)call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr)call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)nproc = sizedo i = 1, na(i) = 1.d0/sizeend docall MPI_BARRIER(MPI_COMM_WORLD, ierr)time_start = MPI_WTIME(ierr)do i = 1, nc(i) = a(i)end dodo while (nproc .gt.
1)if(rank .lt. nproc/2) thencall MPI_RECV(b, n, MPI_DOUBLE_PRECISION,&nproc-rank-1, 1, MPI_COMM_WORLD,&status, ierr)do i = 1, nc(i) = c(i) + b(i)end doelse if(rank .lt. nproc) thencall MPI_SEND(c, n, MPI_DOUBLE_PRECISION,&nproc-rank-1, 1, MPI_COMM_WORLD, ierr)end ifnproc = nproc/2end dodo i = 1, nb(i) = c(i)end dotime_finish = MPI_WTIME(ierr)-time_startif(rank .eq. 0) print *, 'model b(1)=', b(1)print *, 'rank=', rank, ' model time =', time_finishdo i = 1, na(i) = 1.d0/sizeend docall MPI_BARRIER(MPI_COMM_WORLD, ierr)44time_start = MPI_WTIME(ierr)call MPI_REDUCE(a, b, n, MPI_DOUBLE_PRECISION, MPI_SUM, 0,&MPI_COMM_WORLD, ierr)time_finish = MPI_WTIME(ierr)-time_startif(rank .eq.
0) print *, 'reduce b(1)=', b(1)print *, 'rank=', rank, ' reduce time =', time_finishcall MPI_FINALIZE(ierr)endMPI_ALLREDUCE(SBUF, RBUF, COUNT, DATATYPE, OP, COMM, IERR)<type> SBUF(*), RBUF(*)INTEGER COUNT, DATATYPE, OP, COMM, IERR<uiheg_gb_ COUNT g_aZ\bkbfuo ]eh[Zevguo hi_jZpbc OP gZ^ khhl\_lkl\mxsbfb we_f_glZfb fZkkb\h\ SBUF Hlebqb_ hl ijhp_^mju MPI_REDUCE \lhfqlhj_amevlZlihemqZ_lky\fZkkb\_RBUFdZ`^h]hijhp_kkZ< ke_^mxs_f ijbf_j_ dZ`^uc ijhp_kk \uqbkey_l ihkljhqgu_ kmffu we_f_glh\ehdZevgh]hfZkkb\Z aihke_q_]hihemq_ggu_kmffukh\k_oijhp_kkh\kdeZ^u\Zxlkyijbihfhsbijhp_^mjuMPI_ALLREDUCEbj_amevlZlihemqZ_lky\fZkkb\_rgZ\k_oijhp_kkZoijbeh`_gbydo i = 1, ns(i) = 0.0end dodo i = 1, ndo j = 1, ms(i) = s(i)+a(i, j)end doend docall MPI_ALLREDUCE(s, r, n, MPI_REAL, MPI_SUM,&MPI_COMM_WORLD, IERR)MPI_REDUCE_SCATTER(SBUF, RBUF, RCOUNTS, DATATYPE, OP, COMM,IERR)<type> SBUF(*), RBUF(*)INTEGER RCOUNTS(*), DATATYPE, OP, COMM, IERR<uiheg_gb_I RCOUNTS(I)g_aZ\bkbfuo]eh[Zevguohi_jZpbc OPgZ^khhl\_lkl\mxsbfbwe_f_glZfbfZkkb\h\SBUFNmgdpbhgZevghwlhwd\b\Ze_glghlhfm qlh kgZqZeZ \uihegyxlky ]eh[Zevgu_ hi_jZpbb aZl_f j_amevlZl jZkkueZ_lky ih ijhp_kkZf I-uc ijhp_kk ihemqZ_l (I+1)-mx ihjpbx j_amevlZlh\ba RCOUNTS(I+1)we_f_glh\bihf_sZ_l\fZkkb\ RBUFFZkkb\ RCOUNTS^he`_g[ulvh^bgZdh\ufgZ\k_oijhp_kkZodhffmgbdZlhjZCOMM.45MPI_SCAN(SBUF, RBUF, COUNT, DATATYPE, OP, COMM, IERR)<type> SBUF(*), RBUF(*)INTEGER COUNT, DATATYPE, OP, COMM, IERR<uiheg_gb_ COUNTg_aZ\bkbfuoqZklbqguo]eh[Zevguohi_jZpbc OPgZ^khhl\_lkl\mxsbfbwe_f_glZfbfZkkb\h\ SBUF.
I-ucijhp_kk\uihegy_l COUNT]eh[Zevguohi_jZpbcgZ^khhl\_lkl\mxsbfbwe_f_glZfbfZkkb\Z SBUFijhp_kkh\kghf_jZfbhl 0^h I\dexqbl_evghbihf_sZ_lihemq_ggucj_amevlZl\fZkkb\RBUFIhegucj_amevlZl]eh[Zevghchi_jZpbbihemqZ_lky\fZkkb\_RBUFihke_^g_]hijhp_kkZMPI_OP_CREATE(FUNC, COMMUTE, OP, IERR)EXTERNAL FUNCLOGICAL COMMUTEINTEGER OP, IERRKha^Zgb_ ihevah\Zl_evkdhc ]eh[Zevghc hi_jZpbb OP dhlhjZy [m^_l \uqbkeylvkynmgdpb_c FUNCKha^Z\Z_fZyhi_jZpby^he`gZ[ulvZkkhpbZlb\ghcZ_kebiZjZf_lj COMMUTEjZ\_g .TRUE.lhhgZ^he`gZ[ulvlZd`_bdhffmlZlb\ghc ?keb iZjZf_lj COMMUTE jZ\_g .FALSE.
lh ihjy^hd \uiheg_gby]eh[Zevghc hi_jZpbb kljh]h nbdkbjm_lky kh]eZkgh m\_ebq_gbx ghf_jh\ijhp_kkh\gZqbgZykijhp_kkZkghf_jhf0.FUNCTION FUNC(INVEC(*), INOUTVEC(*), LEN, TYPE)<type> INVEC(LEN), INOUTVEC(LEN)INTEGER LEN, TYPELZdbfh[jZahfaZ^Z_lkybgl_jn_ckihevah\Zl_evkdhcnmgdpbb^eykha^Zgby]eh[Zevghc hi_jZpbb I_j\uc Zj]mf_gl hi_jZpbb [_j_lky ba iZjZf_ljZINVEC\lhjhcZj]mf_gl–baiZjZf_ljZINOUTVECZj_amevlZl\ha\jZsZ_lky\iZjZf_lj_ INOUTVECIZjZf_lj LENaZ^Z_ldhebq_kl\hwe_f_glh\\oh^gh]hb\uoh^gh]hfZkkb\h\ZiZjZf_lj TYPE –lbi\oh^guob\uoh^guo^Zgguo<ihevah\Zl_evkdhc nmgdpbb g_ ^he`gu ijhba\h^blvky gbdZdb_ h[f_gu^Zggufbkbkihevah\Zgb_f\uah\h\ijhp_^mjMPI.MPI_OP_FREE(OP, IERR)INTEGER OP, IERRMgbqlh`_gb_ ihevah\Zl_evkdhc ]eh[Zevghc hi_jZpbb Ih \uiheg_gbb ijhp_^mjui_j_f_gghcOPijbk\Zb\Z_lkyagZq_gb_MPI_OP_NULL.Ke_^mxsbc ijbf_j ^_fhgkljbjm_l aZ^Zgb_ ihevah\Zl_evkdhc nmgdpbb ^eybkihevah\Zgby \ dZq_kl\_ ]eh[Zevghc hi_jZpbb AZ^Z_lky nmgdpby smod5,\uqbkeyxsZy ihwe_f_glgmx kmffm ih fh^mex 5 \_dlhjh\ p_ehqbke_gguoZj]mf_glh\>ZggZynmgdpbyh[ty\ey_lky\dZq_kl\_]eh[Zevghchi_jZpbbop\ \uah\_ ijhp_^mju MPI_OP_CREATE aZl_f bkihevam_lky \ ijhp_^mj_MPI_REDUCE ihke_ q_]h m^Zey_lky k ihfhsvx \uah\Z ijhp_^mjuMPI_OP_FREE.program example1546include 'mpif.h'integer ierr, rank, i, nparameter (n = 1 000)integer a(n), b(n)integer opexternal smod5call MPI_INIT(ierr)call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)do i = 1, na(i) = i + rankend doprint *, 'process ', rank, ' a(1) =', a(1)call MPI_OP_CREATE(smod5, .TRUE., op, ierr)call MPI_REDUCE(a, b, n, MPI_INTEGER, op, 0,&MPI_COMM_WORLD, ierr)call MPI_OP_FREE(op, ierr)if(rank .eq.
0) print *, ' b(1) =', b(1)call MPI_FINALIZE(ierr)endinteger function smod5(in, inout, l, type)integer l, typeinteger in(l), inout(l), ido i = 1, linout(i) = mod(in(i)+inout(i), 5)end doreturnendAZ^Zgby• Q_f dhee_dlb\gu_ hi_jZpbb hlebqZxlky hl \aZbfh^_ckl\bc lbiZlhqdZ-lhqdZ"• <_jgh eb qlh \ dhee_dlb\guo \aZbfh^_ckl\byo mqZkl\mxl \k_ ijhp_kkuijbeh`_gby?• Fh]mleb\hagbdZlvdhgnebdluf_`^mh[uqgufbkhh[s_gbyfbihkueZ_fufbijhp_kkZfb^jm]^jm]mbkhh[s_gbyfbdhee_dlb\guohi_jZpbc"?keb^ZdZdhgbjZaj_rZxlky"• Fh`gh eb ijb ihfhsb ijhp_^mju MPI_RECV ijbgylv khh[s_gb_ ihkeZggh_ijhp_^mjhcMPI_BCAST?• Kfh^_ebjh\Zlv [Zjv_jgmx kbgojhgbaZpbx ijb ihfhsb i_j_kuehdlhqdZ-lhqdZbkjZ\gblvwnn_dlb\ghklvlZdhcj_ZebaZpbbbklZg^Zjlghcijhp_^mjuMPI_BARRIER.• < q_f jZaebqb_ \ nmgdpbhgZevghklb ijhp_^mj MPI_BCAST bMPI_SCATTER?• Kfh^_ebjh\Zlv]eh[Zevgh_kmffbjh\Zgb_f_lh^hfk^\Zb\ZgbybkjZ\gblv wnn_dlb\ghklv lZdhc j_ZebaZpbb k bkihevah\Zgb_f klZg^Zjlghcijhp_^mjuMPI_REDUCE.47• Kfh^_ebjh\Zlv ijhp_^mjm MPI_ALLREDUCE ijb ihfhsb ijhp_^mjMPI_REDUCEbMPI_BCAST.• GZibrbl_k\hc\ZjbZglijhp_^mjuMPI_GATHERbkihevamynmgdpbbihkuedbkhh[s_gbclbiZlhqdZ-lhqdZ• Ih^mfZcl_ dZd hj]Zgbah\Zlv dhee_dlb\guc Zkbgojhgguc h[f_g ^ZggufbZgZeh]bqgucnmgdpbbZMPI_REDUCE[MPI_ALLTOALL.• Bkke_^h\Zlv fZkrlZ[bjm_fhklv aZ\bkbfhklv \j_f_gb \uiheg_gby hlqbkeZ ijhp_kkh\ jZaebqguo dhee_dlb\guo hi_jZpbc gZ dhgdj_lghckbkl_f_=jmiiubdhffmgbdZlhju< MPI kms_kl\mxl rbjhdb_ \hafh`ghklb ^ey hi_jZpbc gZ^ ]jmiiZfb ijhp_kkh\bdhffmgbdZlhjZfbWlh[u\Z_lg_h[oh^bfh\h-i_j\uoqlh[u^Zlv\hafh`ghklv g_dhlhjhc ]jmii_ ijhp_kkh\ jZ[hlZlv gZ^ k\h_c g_aZ\bkbfhcih^aZ^Zq_c<h-\lhjuo_kebhkh[_gghklvZe]hjblfZlZdh\ZqlhlhevdhqZklvijhp_kkh\ ^he`gZ h[f_gb\Zlvky ^Zggufb [u\Z_l m^h[gh aZ\_klb ^ey bo\aZbfh^_ckl\by hl^_evguc dhffmgbdZlhj <-lj_lvbo ijb kha^Zgbb[b[ebhl_d ih^ijh]jZff gm`gh ]ZjZglbjh\Zlv qlh i_j_kuedb ^Zgguo \[b[ebhl_qguofh^meyog_i_j_k_dmlkyki_j_kuedZfb\hkgh\ghcijh]jZff_J_r_gb_wlboaZ^Zqfh`ghh[_ki_qblv\iheghfh[t_f_lhevdhijbihfhsbkha^Zgbygh\h]hg_aZ\bkbfh]hdhffmgbdZlhjZHi_jZpbbk]jmiiZfbijhp_kkh\=jmiiZ – wlh mihjy^hq_ggh_ fgh`_kl\h ijhp_kkh\ DZ`^hfm ijhp_kkm \]jmii_ khihklZ\e_gh p_eh_ qbkeh – jZg] beb ghf_j.
MPI_GROUP_EMPTY –imklZy ]jmiiZ g_ kh^_j`ZsZy gb h^gh]h ijhp_kkZ MPI_GROUP_NULL –agZq_gb_bkihevam_fh_^eyhrb[hqghc]jmiiuGh\u_]jmiiufh`ghkha^Z\ZlvdZdgZhkgh\_m`_kms_kl\mxsbo]jmiilZdb gZ hkgh\_ dhffmgbdZlhjh\ gh \ hi_jZpbyo h[f_gZ fh]ml bkihevah\ZlvkylhevdhdhffmgbdZlhju;Zah\Zy]jmiiZbadhlhjhckha^Zxlky\k_hklZevgu_]jmiiuijhp_kkh\k\yaZgZkdhffmgbdZlhjhf MPI_COMM_WORLD\g__\oh^yl\k_ ijhp_kku ijbeh`_gby Hi_jZpbb gZ^ ]jmiiZfb ijhp_kkh\ y\eyxlky ehdZevgufb\gbo\h\e_dZ_lkylhevdh\ua\Z\rbcijhp_^mjmijhp_kkZ\uiheg_gb_ g_ lj_[m_l f_`ijhp_kkgh]h h[f_gZ ^Zggufb Ex[hc ijhp_kk fh`_lijhba\h^blv hi_jZpbb gZ^ ex[ufb ]jmiiZfb \ lhf qbke_ gZ^ lZdbfbdhlhju_ g_ kh^_j`Zl ^Zgguc ijhp_kk Ijb hi_jZpbyo gZ^ ]jmiiZfb fh`_lihemqblvkyimklZy]jmiiZMPI_GROUP_EMPTY.48MPI_COMM_GROUP(COMM, GROUP, IERR)INTEGER COMM, GROUP, IERRIhemq_gb_ ]jmiiu GROUP khhl\_lkl\mxs_c dhffmgbdZlhjm COMM < yaud_KbiZjZf_lj GROUPbf__lij_^hij_^_e_gguclbi MPI_GroupIhkdhevdmba-gZqZevghkms_kl\m_l _^bgkl\_gguc g_ljb\bZevguc dhffmgbdZlhjMPI_COMM_WORLD kgZqZeZ gm`gh ihemqblv khhl\_lkl\mxsmx _fm ]jmiimijhp_kkh\Wlhfh`ghk^_eZlvijbihfhsbke_^mxs_]h\uah\Zcall MPI_COMM_GROUP(MPI_COMM_WORLD, group, ierr)MPI_GROUP_INCL(GROUP, N, RANKS, NEWGROUP, IERR)INTEGER GROUP, N, RANKS(*), NEWGROUP, IERRKha^Zgb_]jmiiu NEWGROUPba Nijhp_kkh\ij_`g_c]jmiiu GROUPkjZg]ZfbRANKS(1),…,RANKS(N) ijbq_f jZg]m RANKS(I) \ klZjhc ]jmii_ khhl\_lkl\m_l jZg] I-1 \ gh\hc ]jmii_ Ijb N=0 kha^Z_lky imklZy ]jmiiZMPI_GROUP_EMPTY<hafh`ghbkihevah\Zgb_wlhcijhp_^mju^eyaZ^Zgbygh-\h]hihjy^dZijhp_kkh\\]jmii_MPI_GROUP_EXCL(GROUP, N, RANKS, NEWGROUP, IERR)INTEGER GROUP, N, RANKS(*), NEWGROUP, IERRKha^Zgb_]jmiiu NEWGROUPbaijhp_kkh\]jmiiu GROUPbkdexqZyijhp_kkuk jZg]Zfb RANKS(1),…,RANKS(N) ijbq_f ihjy^hd hklZ\rboky ijhp_kkh\ \gh\hc ]jmii_ khhl\_lkl\m_l ihjy^dm ijhp_kkh\ \ klZjhc ]jmii_ Ijb N=0kha^Z_lky]jmiiZb^_glbqgZyklZjhc]jmii_< ke_^mxs_f ijbf_j_ kha^Z_lky ^\_ g_i_j_k_dZxsboky ]jmiiu ijhp_kkh\group1b group2gZhkgh\_ijhp_kkh\]jmiiu group<dZ`^mxbakha^Z\Z_fuo ]jmii \hc^_l ijbf_jgh iheh\bgZ ijhp_kkh\ ij_`g_c ]jmiiu ijb g_q_lghf qbke_ ijhp_kkh\ \ ]jmiim group2 \hc^_l gZ h^bg ijhp_kk [hevr_Ihjy^hdgmf_jZpbbijhp_kkh\\h\gh\vkha^Z\Z_fuo]jmiiZokhojZgblkysize1 = 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)Ke_^mxsb_ ljb ijhp_^mju hij_^_eyxl hi_jZpbb gZ^ ]jmiiZfb ijhp_kkh\dZd gZ^fgh`_kl\ZfbBa-aZhkh[_gghkl_cgmf_jZpbbijhp_kkh\gbh[t_^bg_gb_gbi_j_k_q_gb_]jmiig_dhffmlZlb\gughZkkhpbZlb\guMPI_GROUP_INTERSECTION(GROUP1, GROUP2, NEWGROUP, IERR)INTEGER GROUP1, GROUP2, NEWGROUP, IERRKha^Zgb_ ]jmiiu NEWGROUP ba i_j_k_q_gby ]jmii GROUP1 b GROUP2 Ihemq_ggZy ]jmiiZ kh^_j`bl \k_ ijhp_kku ]jmiiu GROUP1 \oh^ysb_ lZd`_ \]jmiimGROUP2bmihjy^hq_ggu_dZd\i_j\hc]jmii_49MPI_GROUP_UNION(GROUP1, GROUP2, NEWGROUP, IERR)INTEGER GROUP1, GROUP2, NEWGROUP, IERRKha^Zgb_ ]jmiiu NEWGROUP ba h[t_^bg_gby ]jmii GROUP1 b GROUP2 Ihemq_ggZy]jmiiZkh^_j`bl\k_ijhp_kku]jmiiu GROUP1\ij_`g_fihjy^d_aZdhlhjufbke_^mxlijhp_kku]jmiiu GROUP2g_\hr_^rb_\]jmiim GROUP1,lZd`_\ij_`g_fihjy^d_MPI_GROUP_DIFFERENCE(GROUP1, GROUP2, NEWGROUP, IERR)INTEGER GROUP1, GROUP2, NEWGROUP, IERRKha^Zgb_]jmiiu NEWGROUPbajZaghklb]jmii GROUP1b GROUP2Ihemq_ggZy]jmiiZkh^_j`bl\k_we_f_glu]jmiiuGROUP1g_\oh^ysb_\]jmiimGROUP2bmihjy^hq_ggu_dZd\i_j\hc]jmii_GZijbf_jimklv\]jmiim gr1\oh^ylijhp_kku 0, 1, 2, 4, 5Z\]jmiim gr2 ijhp_kku 0, 2, 3 gmf_jZpby ijhp_kkh\ aZ^ZgZ \ ]jmii_ khhl\_lkl\mxs_cdhffmgbdZlhjmMPI_COMM_WORLDLh]^Zihke_\uah\h\call MPI_GROUP_INTERSECTION(gr1, gr2, newgr1, ierr)call MPI_GROUP_UNION(gr1, gr2, newgr2, ierr)call MPI_GROUP_DIFFERENCE(gr1, gr2, newgr3, ierr)\]jmiimnewgr1\oh^ylijhp_kku0, 2;\]jmiimnewgr2\oh^ylijhp_kku0, 1, 2, 4, 5, 3;\]jmiimnewgr3\oh^ylijhp_kku1, 4, 5.Ihjy^hdgmf_jZpbbijhp_kkh\\ihemq_gguo]jmiiZokhhl\_lkl\m_lihjy^dmboi_j_qbke_gbyMPI_GROUP_SIZE(GROUP, SIZE, IERR)INTEGER GROUP, SIZE, IERRHij_^_e_gb_dhebq_kl\ZSIZEijhp_kkh\\]jmii_GROUP.MPI_GROUP_RANK(GROUP, RANK, IERR)INTEGER GROUP, RANK, IERRHij_^_e_gb_ghf_jZijhp_kkZRANK\]jmii_GROUP?keb\ua\Z\rbcijhp_kkg_\oh^bl\]jmiimGROUPlh\ha\jZsZ_lkyagZq_gb_MPI_UNDEFINED.MPI_GROUP_TRANSLATE_RANKS(GROUP1, N, RANKS1, GROUP2, RANKS2,IERR)INTEGER GROUP1, N, RANKS1(*), GROUP2, RANKS2(*), IERR<fZkkb\_ RANKS2\ha\jZsZxlkyjZg]b\]jmii_ GROUP2ijhp_kkh\kjZg]ZfbRANKS1 \ ]jmii_ GROUP1 IZjZf_lj N aZ^Z_l qbkeh ijhp_kkh\ ^ey dhlhjuogm`ghhij_^_eblvjZg]bMPI_GROUP_COMPARE(GROUP1, GROUP2, RESULT, IERR)INTEGER GROUP1, GROUP2, RESULT, IERR50KjZ\g_gb_]jmiiGROUP1bGROUP2?keb]jmiiuGROUP1bGROUP2iheghklvxkh\iZ^Zxl lh \ iZjZf_lj_ RESULT \ha\jZsZ_lky agZq_gb_ MPI_IDENT ?keb]jmiiu hlebqZxlky lhevdh jZg]Zfb ijhp_kkh\ lh \ha\jZsZ_lky agZq_gb_MPI_SIMILARBgZq_\ha\jZsZ_lkyagZq_gb_MPI_UNEQUAL.MPI_GROUP_FREE(GROUP, IERR)INTEGER GROUP, IERRMgbqlh`_gb_ ]jmiiu GROUP.