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