Параллельное программирование с использованием MPI. Антонов (2004) (Параллельное программирование с использованием MPI. Антонов (2004).pdf), страница 10
Описание файла
PDF-файл из архива "Параллельное программирование с использованием MPI. Антонов (2004).pdf", который расположен в категории "". Всё это находится в предмете "суперкомпьютерное моделирование и технологии" из 11 семестр (3 семестр магистратуры), которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 10 страницы из PDF
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).
I-c [ehd gZqbgZ_lky q_j_aDISPLS(I)[ZclkgZqZeZ[mn_jZihkuedb<ke_^mxs_fijbf_j_kha^Z_lkygh\uclbi^Zgguo newtypedhlhjucihke_j_]bkljZpbbfh`_l[ulvbkihevah\Zg^eyi_j_kuedbdZd_^bgh]hp_eh]hiylbwe_f_glh\ ^Zgguo dhlhju_ fh`gh ij_^klZ\blv ke_^mxsbf h[jZahf lbiwe_f_glZ^Zgguodhebq_kl\h[ZclhlgZqZeZ[mn_jZihkuedb{(MPI_DOUBLE_PRECISION, 0), (MPI_DOUBLE_PRECISION, 8),65(MPI_DOUBLE_PRECISION, 16), (MPI_CHARACTER, 24), (MPI_CHARACTER, 25)}blocklens(1) = 3blocklens(2) = 2types(1) = MPI_DOUBLE_PRECISIONtypes(2) = MPI_CHARACTERdispls(1) = 0displs(2) = 24call MPI_TYPE_STRUCT(2, blocklens, displs, types,&newtype, ierr)MPI_TYPE_COMMIT(DATATYPE, IERR)INTEGER DATATYPE, IERRJ_]bkljZpbykha^Zggh]hijhba\h^gh]hlbiZ^Zgguo DATATYPEIhke_j_]bkljZpbb wlhl lbi ^Zgguo fh`gh bkihevah\Zlv \ hi_jZpbyo h[f_gZ gZjZ\g_ kij_^hij_^_e_ggufblbiZfb^ZgguoIj_^hij_^_e_ggu_lbiu^Zgguoj_]bkljbjh\Zlvg_gm`ghMPI_TYPE_FREE(DATATYPE, IERR)INTEGER DATATYPE, IERR:ggmebjh\Zgb_ ijhba\h^gh]h lbiZ ^Zgguo DATATYPE IZjZf_lj DATATYPEmklZgZ\eb\Z_lky \ agZq_gb_ MPI_DATATYPE_NULL =ZjZglbjm_lky qlh ex[hcgZqZluc h[f_g bkihevamxsbc ^Zggu_ Zggmebjm_fh]h lbiZ [m^_lghjfZevgh aZ\_jr_g Ijb wlhf ijhba\h^gu_ hl DATATYPE lbiu ^ZgguohklZxlky b fh]ml bkihevah\Zlvky ^Zevr_ Ij_^hij_^_e_ggu_ lbiu ^Zgguog_fh]ml[ulvZggmebjh\ZguMPI_TYPE_SIZE(DATATYPE, SIZE, IERR)INTEGER DATATYPE, SIZE, IERRHij_^_e_gb_jZaf_jZ SIZElbiZ^Zgguo DATATYPE\[ZclZoh[t_fZiZfylbaZgbfZ_fh]hh^gbfwe_f_glhf^Zggh]hlbiZMPI_ADDRESS(LOCATION, ADDRESS, IERR)<type> LOCATION(*)INTEGER ADDRESS, IERRHij_^_e_gb_ Z[khexlgh]h [Zcl-Z^j_kZ ADDRESS jZaf_s_gby fZkkb\ZLOCATION \ hi_jZlb\ghc iZfylb dhfivxl_jZ :^j_k hlkqblu\Z_lky hl [Zah\h]h Z^j_kZ agZq_gb_ dhlhjh]h kh^_j`blky \ kbkl_fghc dhgklZgl_MPI_BOTTOM Ijhp_^mjZ iha\hey_l hij_^_eylv Z[khexlgu_ Z^j_kZ h[t_dlh\dZd \ yaud_ NhjljZg lZd b \ Kb ohly \ Kb ^ey wlh]h ij_^mkfhlj_gu bgu_kj_^kl\Z<yaud_KbiZjZf_ljADDRESSbf__llbiMPI_Aint.<ke_^mxs_fijbf_j_hibku\Z_lkygh\uclbi^Zgguonewtypedhlhjucihke_ j_]bkljZpbb bkihevam_lky ^ey i_j_kuedbdZd_^bgh]hp_eh]h^\mowe_f_glh\^Zgguolbih\ double precisionb character(1)<dZq_kl\_Z^j_kZ[mn_jZihkuedbbkihevam_lky[Zah\ucZ^j_k MPI_BOTTOMZ^eyhij_^_e_gbykf_s_gbc we_f_glh\ ^Zgguo dat1 b dat2 bkihevamxlky \uah\u ijhp_^mju66MPI_ADDRESSI_j_^i_j_kuedhcgh\uclbij_]bkljbjm_lkyijbihfhsb\uah\Zijhp_^mju MPI_TYPE_COMMITAZf_lbfqlhi_j_kueZ_lkyh^bgwe_f_gl^Zgguo ijhba\h^gh]h lbiZ ohly hg b khklhbl ba ^\mo jZaghlbiguowe_f_glh\blocklens(1) = 1blocklens(2) = 1types(1) = MPI_DOUBLE_PRECISIONtypes(2) = MPI_CHARACTERcall MPI_ADDRESS(dat1, address(1), ierr)displs(1) = address(1)call MPI_ADDRESS(dat2, address(2), ierr)displs(2) = address(2)call MPI_TYPE_STRUCT(2, blocklens, displs, types,&newtype, ierr)call MPI_TYPE_COMMIT(newtype, ierr)call MPI_SEND(MPI_BOTTOM, 1, newtype, dest, tag,&MPI_COMM_WORLD, ierr)MPI_TYPE_LB(DATATYPE, DISPL, IERR)INTEGER DATATYPE, DISPL, IERRHij_^_e_gb_kf_s_gby DISPL\[ZclZogb`g_c]jZgbpuwe_f_glZlbiZ^ZgguoDATATYPEhlgZqZeZ[mn_jZ^ZgguoMPI_TYPE_UB(DATATYPE, DISPL, IERR)INTEGER DATATYPE, DISPL, IERRHij_^_e_gb_kf_s_gby DISPL\[ZclZo\_jog_c]jZgbpuwe_f_glZlbiZ^ZgguoDATATYPEhlgZqZeZ[mn_jZ^ZgguoMPI_TYPE_EXTENT(DATATYPE, EXTENT, IERR)INTEGER DATATYPE, EXTENT, IERRHij_^_e_gb_ ^bZiZahgZ EXTENT jZagbpu f_`^m \_jog_c b gb`g_c ]jZgbpZfbwe_f_glZ^Zggh]hlbiZlbiZ^ZgguoDATATYPE\[ZclZo< ke_^mxs_f ijbf_j_ ijhba\h^guc lbi ^Zgguo bkihevam_lky ^ey i_j_klZgh\dbklhe[ph\fZljbpu\h[jZlghfihjy^d_Lbi^Zgguo matr_revkha^Z\Z_fucijhp_^mjhc MPI_TYPE_VECTORhibku\Z_lehdZevgmxqZklvfZljbpu^Zggh]hijhp_kkZ\i_j_klZ\e_ggufb\h[jZlghfihjy^d_klhe[pZfbIhke_j_]bkljZpbb wlhl lbi ^Zgguo fh`_l bkihevah\Zlvky ijb i_j_kued_Ijh]jZffZ jZ[hlZ_l ijZ\bevgh _keb jZaf_j fZljbpu N ^_eblky gZp_eh gZqbkehijhp_kkh\ijbeh`_gby67program example19include 'mpif.h'integer ierr, rank, size, N, nlparameter (N = 8)double precision a(N, N), b(N, N)call MPI_INIT(ierr)call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr)call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)nl = (N-1)/size+1call work(a, b, N, nl, size, rank)call MPI_FINALIZE(ierr)endsubroutine work(a, b, n, nl, size, rank)include 'mpif.h'integer ierr, rank, size, n, nl, ii, matr_revdouble precision a(n, nl), b(n, nl)integer i, j, status(MPI_STATUS_SIZE)do j = 1, nldo i = 1, nb(i,j) = 0.d0ii = j+rank*nla(i,j) = 100*ii+ienddoenddocall MPI_TYPE_VECTOR(nl, n, -n, MPI_DOUBLE_PRECISION,&matr_rev, ierr)call MPI_TYPE_COMMIT(matr_rev, ierr)call MPI_SENDRECV(a(1, nl), 1, MATR_REV, size-rank-1, 1,&b, nl*n, MPI_DOUBLE_PRECISION,&size-rank-1, 1, MPI_COMM_WORLD,&status, ierr)do j = 1, nldo i = 1, nprint *, 'process ', rank, ': ',&j+rank*nl, ' ', i, a(i,j), ' ', b(i,j)enddoenddoendMiZdh\dZ^Zgguo>eyi_j_kuehdjZaghjh^guo^ZgguogZjy^mkkha^Zgb_fijhba\h^guolbih\fh`ghbkihevah\Zlvhi_jZpbbmiZdh\dbbjZkiZdh\db^ZgguoJZaghjh^gu_bebjZkiheh`_ggu_g_\ihke_^h\Zl_evguoyq_cdZoiZfylb^Zggu_ihf_sZxlky\h^bgg_ij_ju\guc[mn_ji_j_kueZ_lkyZihlhfihemq_ggh_khh[s_gb_kgh\ZjZkij_^_ey_lkyihgm`gufyq_cdZfiZfylb68MPI_PACK(INBUF, INCOUNT, DATATYPE, OUTBUF, OUTSIZE, POSITION,COMM, IERR)<type> INBUF(*), OUTBUF(*)INTEGER INCOUNT, DATATYPE, OUTSIZE, POSITION, COMM, IERRMiZdh\dZ INCOUNT we_f_glh\ lbiZ DATATYPE ba fZkkb\Z INBUF \ fZkkb\OUTBUFkhk^\b]hf POSITION[ZclhlgZqZeZfZkkb\Z;mn_j OUTBUF^he`_gkh^_j`ZlvihdjZcg_cf_j_ OUTSIZE[ZclIhke_\uiheg_gbyijhp_^mjuiZjZf_lj POSITIONm\_ebqb\Z_lkygZqbkeh[ZcljZ\gh_jZaf_jmaZibkbIZjZf_lj COMMmdZau\Z_lgZdhffmgbdZlhj\dhlhjhf\^Zevg_cr_f[m^_li_j_-kueZlvkykhh[s_gb_>eyi_j_kuedbmiZdh\Zgguo^Zgguobkihevam_lkylbi^ZgguoMPI_PACKED.MPI_UNPACK(INBUF, INSIZE, POSITION, OUTBUF, OUTCOUNT, DATATYPE,COMM, IERR)<type> INBUF(*), OUTBUF(*)INTEGER INSIZE, POSITION, OUTCOUNT, DATATYPE, COMM, IERRJZkiZdh\dZ OUTCOUNTwe_f_glh\lbiZ DATATYPEbafZkkb\Z INBUFkhk^\b]hfPOSITION [Zcl hl gZqZeZ fZkkb\Z \ fZkkb\ OUTBUF FZkkb\ INBUF bf__ljZaf_jg_f_g__INSIZE[ZclMPI_PACK_SIZE(INCOUNT, DATATYPE, COMM, SIZE, IERR)INTEGER INCOUNT, DATATYPE, COMM, SIZE, IERRHij_^_e_gb_ g_h[oh^bfh]h h[t_fZ iZfylb SIZE \ [ZclZo ^ey miZdh\dbINCOUNT we_f_glh\ lbiZ DATATYPE G_h[oh^bfuc ^ey miZdh\db jZaf_j fh-`_lij_\urZlvkmffmjZaf_jh\iZdm_fuowe_f_glh\^Zgguo< ke_^mxs_f ijbf_j_ fZkkb\ bufbkihevam_lky\dZq_kl\_[mn_jZ^eymiZdh\db 10 we_f_glh\ fZkkb\Z a lbiZ real b 10 we_f_glh\ fZkkb\Z b lbiZcharacter Ihemq_ggh_ khh[s_gb_ i_j_kueZ_lky ijhp_^mjhc MPI_BCAST hlijhp_kkZ 0\k_fhklZevgufijhp_kkZfihemq_ggh_khh[s_gb_jZkiZdh\u\Z_lkyijbihfhsb\uah\h\ijhp_^mjMPI_UNPACK.program example20include 'mpif.h'integer ierr, rank, positionreal a(10)character b(10), buf(100)call MPI_INIT(ierr)call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)do i = 1, 10a(i) = rank + 1.0if(rank .eq.