Параллельное программирование с использованием MPI. Антонов (2004) (Параллельное программирование с использованием MPI. Антонов (2004).pdf), страница 8
Описание файла
PDF-файл из архива "Параллельное программирование с использованием MPI. Антонов (2004).pdf", который расположен в категории "". Всё это находится в предмете "суперкомпьютерное моделирование и технологии" из 11 семестр (3 семестр магистратуры), которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 8 страницы из PDF
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.
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.