mpibook_Antonov
.pdfMPI_GRAPH_NEIGHBORS_COUNT(COMM, RANK, NNEIGHBORS, IERR) INTEGER COMM, RANK, NNEIGHBORS, IERR
Hij_^_e_gb_ dhebq_kl\Z NNEIGHBORS g_ihkj_^kl\_gguo khk_^_c ijhp_kkZ k jZg]hf RANK \ ]jZnh\hc lhiheh]bb k\yaZgghc k dhffmgbdZlhjhf COMM.
MPI_GRAPH_NEIGHBORS(COMM, RANK, MAX, NEIGHBORS, IERR) INTEGER COMM, RANK, MAX, NEIGHBORS(*), IERR
Hij_^_e_gb_ jZg]h\ g_ihkj_^kl\_gguo khk_^_c ijhp_kkZ k jZg]hf RANK \ ]jZnh\hc lhiheh]bb k\yaZgghc k dhffmgbdZlhjhf COMM JZg]b khk_^_c \ha- \jZsZxlky \ fZkkb\_ NEIGHBORS, MAX aZ^Z_l h]jZgbq_gb_ gZ dhebq_kl\h kh- k_^_c fh`_l [ulv ihemq_gh gZijbf_j \uah\hf ijhp_^mju
MPI_GRAPH_NEIGHBORS_COUNT).
MPI_GRAPHDIMS_GET(COMM, NNODES, NEDGES, IERR) INTEGER COMM, NNODES, NEDGES, IERR
Hij_^_e_gb_ qbkeZ \_jrbg NNODES b qbkeZ j_[_j NEDGES ]jZnh\hc lhiheh- ]bb k\yaZgghc k dhffmgbdZlhjhf COMM.
MPI_GRAPH_GET(COMM, MAXINDEX, MAXEDGES, INDEX, EDGES, IERR) INTEGER COMM, MAXINDEX, MAXEDGES, INDEX(*), EDGES(*), IERR
Hij_^_e_gb_ bgnhjfZpbb h lhiheh]bb ]jZnZ k\yaZgghc k dhffmgbdZlhjhf COMM < fZkkb\Zo INDEX b EDGES \ha\jZsZ_lky hibkZgb_ ]jZnh\hc lhiheh]bb \ lhf \b^_ dZd hgZ aZ^Z_lky ijb kha^Zgbb lhiheh]bb k ihfhsvx ijhp_^mju
MPI_GRAPH_CREATE IZjZf_lju MAXINDEX b MAXEDGES aZ^Zxl h]jZgbq_gby gZ
jZaf_ju khhl\_lkl\mxsbo fZkkb\h\ fh]ml [ulv ihemq_gu gZijbf_j \uah-
\hf ijhp_^mju MPI_GRAPHDIMS_GET).
< ke_^mxs_f ijbf_j_ kha^Z_lky ]jZnh\Zy lhiheh]by comm_graph ^ey h[s_- gby ijhp_kkh\ ih dhffmgbdZpbhgghc ko_f_ PDVWHU-VODYH <k_ ijhp_kku \ jZfdZo ^Zgghc lhiheh]bb fh]ml h[sZlvky lhevdh k gme_\uf ijhp_kkhf Ihke_ kha^Zgby lhiheh]bb k ihfhsvx \uah\Z ijhp_^mju MPI_GRAPH_CREATE dZ`^uc ijhp_kk hij_^_ey_l dhebq_kl\h k\hbo g_ihkj_^kl\_gguo khk_^_c \ jZfdZo ^Zgghc lhiheh]bb k ihfhsvx \uah\Z ijhp_^mju MPI_GRAPH_NEIGHBORS_COUNT b jZg]b ijhp_kkh\-khk_^_c k ihfhsvx \u- ah\Z ijhp_^mju MPI_GRAPH_NEIGHBORS Ihke_ wlh]h dZ`^uc ijhp_kk fh`_l \ jZfdZo ^Zgghc lhiheh]bb h[f_gb\Zlvky ^Zggufb kh k\hbfb g_ihkj_^kl- \_ggufb khk_^yfb gZijbf_j ijb ihfhsb \uah\Z ijhp_^mju MPI_SENDRECV.
61
program example18 include 'mpif.h'
integer ierr, rank, rank1, i, size, MAXPROC, MAXEDGES parameter (MAXPROC = 128, MAXEDGES = 512)
integer a, b
integer status(MPI_STATUS_SIZE)
integer comm_graph, index(MAXPROC), edges(MAXEDGES) integer num, neighbors(MAXPROC)
call MPI_INIT(ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr) call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) do i = 1, size
index(i) = size+i-2 end do
do i = 1, size-1 edges(i) = i edges(size+i-1) = 0
|
end do |
|
call MPI_GRAPH_CREATE(MPI_COMM_WORLD, size, index, edges, |
& |
.TRUE., comm_graph, ierr) |
|
call MPI_GRAPH_NEIGHBORS_COUNT(comm_graph, rank, num, |
& |
ierr) |
|
call MPI_GRAPH_NEIGHBORS(comm_graph, rank, num, neighbors, |
& |
ierr) |
|
do i = 1, num |
|
call MPI_SENDRECV(rank, 1, MPI_INTEGER, neighbors(i), |
& |
1, rank1, 1, MPI_INTEGER, |
& |
neighbors(i), 1, comm_graph, |
& |
status, ierr) |
|
print *, 'procecc ', rank, ' communicate with process', |
& |
rank1 |
|
end do |
|
call MPI_FINALIZE(ierr) |
|
end |
AZ^Zgby
•H[yaZgZ eb \bjlmZevgZy lhiheh]by ih\lhjylv nbabq_kdmx lhiheh]bx p_e_\h]h dhfivxl_jZ"
•Ex[hc eb dhffmgbdZlhj fh`_l h[eZ^Zlv \bjlmZevghc lhiheh]b_c"
•Fh`_l eb ijhp_kk \oh^blv h^gh\j_f_ggh \ ^_dZjlh\m lhiheh]bx b \ lhiheh]bx ]jZnZ"
•Fh`gh eb \ua\Zlv ijhp_^mjm MPI_CART_CREATE lhevdh gZ iheh\bg_ ijhp_kkh\ dhffmgbdZlhjZ"
•G_h[oh^bfh eb bkihevah\Zlv ijhp_^mjm MPI_DIMS_CREATE i_j_^ \uah-
\hf ijhp_^mju MPI_CART_CREATE?
•Fh`gh eb bkihevah\Zlv dhhj^bgZlu ijhp_kkZ \ ^_dZjlh\hc lhiheh]bb \ ijhp_^mjZo h[f_gZ ^Zggufb"
62
• DZdb_ |
i_j_kuedb |
^Zgguo |
hkms_kl\eyxlky |
ijhp_^mjhc |
MPI_CART_SHIFT?
•DZd hij_^_eblv k dZdbfb ijhp_kkZfb \ lhiheh]bb ]jZnZ k\yaZg ^Zg- guc ijhp_kk"
•DZd kha^Zlv lhiheh]bx ]jZnZ \ dhlhjhc dZ`^uc ijhp_kk k\yaZg k dZ`- ^uf"
•J_Zebah\Zlv jZa[b_gb_ ijhp_kkh\ gZ ^\_ ]jmiiu \ h^ghc ba dhlhjuo hkms_kl\ey_lky h[f_g ih dhevpm ijb ihfhsb k^\b]Z \ h^ghf_jghc ^_- dZjlh\hc lhiheh]bb Z \ ^jm]hc – dhffmgbdZpbb ih ko_f_PDVWHU-slave, j_Zebah\Zgghc ijb ihfhsb lhiheh]bb ]jZnZ
•Bkihevah\Zlv ^\mf_jgmx ^_dZjlh\m lhiheh]bx ijhp_kkh\ ijb j_ZebaZ- pbb iZjZee_evghc ijh]jZffu i_j_fgh`_gby fZljbp
I_j_kuedZ jZaghlbiguo ^Zgguo
Ih^ khh[s_gb_f \ MPI ihgbfZ_lky fZkkb\ h^ghlbiguo ^Zgguo jZkiheh- `_gguo \ ihke_^h\Zl_evguo yq_cdZo iZfylb QZklh \ ijh]jZffZo lj_[mxlky i_j_kuedb [he__ keh`guo h[t_dlh\ ^Zgguo khklhysbo ba jZaghlbiguo we_- f_glh\ beb jZkiheh`_gguo g_ \ ihke_^h\Zl_evguo yq_cdZo iZfylb < wlhf kemqZ_ fh`gh eb[h ihkueZlv ^Zggu_ g_[hevrbfb ihjpbyfb jZkiheh`_gguo ih^jy^ we_f_glh\ h^gh]h lbiZ eb[h bkihevah\Zlv dhibjh\Zgb_ ^Zgguo i_j_^ hlkuedhc \ g_dhlhjuc ijhf_`mlhqguc [mn_j H[Z \ZjbZglZ y\eyxlky ^hklZ- lhqgh g_m^h[gufb b lj_[mxl ^hihegbl_evguo aZljZl dZd \j_f_gb lZd b hi_jZlb\ghc iZfylb
>ey i_j_kuedb jZaghlbiguo ^Zgguo \ MPI ij_^mkfhlj_gu ^\Z ki_pbZevguo kihkh[Z
•Ijhba\h^gu_ lbiu ^Zgguo;
•MiZdh\dZ ^Zgguo.
Ijhba\h^gu_ lbiu ^Zgguo
Ijhba\h^gu_ lbiu ^Zgguo kha^Zxlky \h \j_fy \uiheg_gby ijh]jZffu k ih- fhsvx ijhp_^mj-dhgkljmdlhjh\ gZ hkgh\_ kms_kl\mxsbo d fhf_glm \uah\Z dhgkljmdlhjZ lbih\ ^Zgguo
Kha^Zgb_ lbiZ ^Zgguo khklhbl ba ^\mo wlZih\
1.Dhgkljmbjh\Zgb_ lbiZ
2.J_]bkljZpby lbiZ
63
Ihke_ j_]bkljZpbb ijhba\h^guc lbi ^Zgguo fh`gh bkihevah\Zlv gZjy^m k ij_^hij_^_e_ggufb lbiZfb \ hi_jZpbyo i_j_kuedb \ lhf qbke_ b \ dhee_d- lb\guo hi_jZpbyo Ihke_ aZ\_jr_gby jZ[hlu k ijhba\h^guf lbihf ^Zgguo _]h j_dhf_g^m_lky Zggmebjh\Zlv Ijb wlhf \k_ ijhba\_^_ggu_ gZ _]h hkgh\_ gh\u_ lbiu ^Zgguo hklZxlky b fh]ml bkihevah\Zlvky ^Zevr_
Ijhba\h^guc lbi ^Zgguo oZjZdl_jbam_lky ihke_^h\Zl_evghklvx [Zah\uo lb- ih\ ^Zgguo b gZ[hjhf p_ehqbke_gguo agZq_gbc kf_s_gby we_f_glh\ lbiZ hlghkbl_evgh gZqZeZ [mn_jZ h[f_gZ Kf_s_gby fh]ml [ulv dZd iheh`bl_ev- gufb lZd b hljbpZl_evgufb g_ h[yaZgu jZaebqZlvky g_ lj_[m_lky bo mih- jy^hq_gghklv LZdbf h[jZahf ihke_^h\Zl_evghklv we_f_glh\ ^Zgguo \ ijh- ba\h^ghf lbi_ fh`_l hlebqZlvky hl ihke_^h\Zl_evghklb bkoh^gh]h lbiZ Z h^bg we_f_gl ^Zgguo fh`_l \klj_qZlvky \ dhgkljmbjm_fhf lbi_ fgh]h- djZlgh
MPI_TYPE_CONTIGUOUS(COUNT, TYPE, NEWTYPE, IERR) INTEGER COUNT, TYPE, NEWTYPE, IERR
Kha^Zgb_ gh\h]h lbiZ ^Zgguo NEWTYPE khklhys_]h ba COUNT ihke_^h\Z- l_evgh jZkiheh`_gguo we_f_glh\ [Zah\h]h lbiZ ^Zgguo TYPE NZdlbq_kdb kha^Z\Z_fuc lbi ^Zgguo ij_^klZ\ey_l fZkkb\ ^Zgguo [Zah\h]h lbiZ dZd hl- ^_evguc h[t_dl
< ke_^mxs_f ijbf_j_ kha^Z_lky gh\uc lbi ^Zgguo newtype dhlhjuc \ ^Zevg_cr_f ihke_ j_]bkljZpbb lbiZ fh`_l bkihevah\Zlvky ^ey i_j_kuedb iylb jZkiheh`_gguo ih^jy^ p_euo qbk_e
call MPI_TYPE_CONTIGUOUS(5, MPI_INTEGER, newtype, ierr)
MPI_TYPE_VECTOR(COUNT, BLOCKLEN, STRIDE, TYPE, NEWTYPE, IERR) INTEGER COUNT, BLOCKLEN, STRIDE, TYPE, NEWTYPE, IERR
Kha^Zgb_ gh\h]h lbiZ ^Zgguo NEWTYPE khklhys_]h ba COUNT [ehdh\ ih BLOCKLEN 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_f ijbf_j_ kha^Z_lky gh\uc lbi ^Zgguo newtype dhlhjuc ihke_ j_]bkljZpbb fh`_l [ulv bkihevah\Zg ^ey i_j_kuedb dZd _^bgh]h p_eh]h r_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 ih- kuedb
{(MPI_REAL, 0), (MPI_REAL, 1), (MPI_REAL, 2), (MPI_REAL, 5), (MPI_REAL, 6), (MPI_REAL, 7)}
64
count = 2 blocklen = 3 stride = 5
|
call 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, IERR
Kha^Zgb_ gh\h]h lbiZ ^Zgguo NEWTYPE khklhys_]h ba COUNT [ehdh\ ih BLOCKLEN we_f_glh\ [Zah\h]h lbiZ ^Zgguo TYPE Ke_^mxsbc [ehd gZqbgZ- _lky q_j_a STRIDE [Zcl ihke_ gZqZeZ ij_^u^ms_]h [ehdZ
MPI_TYPE_INDEXED(COUNT, BLOCKLENS, DISPLS, TYPE, NEWTYPE, IERR) INTEGER COUNT, BLOCKLENS(*), DISPLS(*), TYPE, NEWTYPE, IERR
Kha^Zgb_ gh\h]h lbiZ ^Zgguo NEWTYPE khklhys_]h ba COUNT [ehdh\ ih BLOCKLENS(I) we_f_glh\ [Zah\h]h lbiZ ^Zgguo I-c [ehd gZqbgZ_lky q_j_a DISPLS(I) we_f_glh\ [Zah\h]h lbiZ ^Zgguo k gZqZeZ [mn_jZ ihkuedb Ihem- q_gguc lbi ^Zgguo fh`gh kqblZlv h[h[s_gb_f \_dlhjgh]h lbiZ
< ke_^mxs_f ijbf_j_ aZ^Z_lky lbi ^Zgguo newtype ^ey hibkZgby gb`g_- lj_m]hevghc fZljbpu lbiZ double precision ijb wlhf mqblu\Z_lky qlh \ yaud_ NhjljZg fZkkb\u ojZgylky ih klhe[pZf
do i = 1, n blocklens(i) = n-i+1
displs(i) = n*(i-1)+i-1 end do
call 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, IERR
Kha^Zgb_ gh\h]h lbiZ ^Zgguo NEWTYPE khklhys_]h ba COUNT [ehdh\ ih BLOCKLENS(I) we_f_glh\ [Zah\h]h lbiZ ^Zgguo I-c [ehd gZqbgZ_lky q_j_a DISPLS(I) [Zcl k gZqZeZ [mn_jZ ihkuedb
MPI_TYPE_STRUCT(COUNT, BLOCKLENS, DISPLS, TYPES, NEWTYPE, IERR) INTEGER COUNT, BLOCKLENS(*), DISPLS(*), TYPES(*), NEWTYPE, IERR
Kha^Zgb_ kljmdlmjgh]h lbiZ ^Zgguo NEWTYPE ba COUNT [ehdh\ ih BLOCKLENS(I) we_f_glh\ lbiZ TYPES(I). I-c [ehd gZqbgZ_lky q_j_a DISPLS(I) [Zcl k gZqZeZ [mn_jZ ihkuedb
< ke_^mxs_f ijbf_j_ kha^Z_lky gh\uc lbi ^Zgguo newtype dhlhjuc ihke_ j_]bkljZpbb fh`_l [ulv bkihevah\Zg ^ey i_j_kuedb dZd _^bgh]h p_eh]h iylb we_f_glh\ ^Zgguo dhlhju_ fh`gh ij_^klZ\blv ke_^mxsbf h[jZahf lbi we_f_glZ ^Zgguo dhebq_kl\h [Zcl hl gZqZeZ [mn_jZ ihkuedb
{(MPI_DOUBLE_PRECISION, 0), (MPI_DOUBLE_PRECISION, 8),
65
(MPI_DOUBLE_PRECISION, 16), (MPI_CHARACTER, 24), (MPI_CHARACTER, 25)}
|
blocklens(1) = 3 |
|
blocklens(2) = 2 |
|
types(1) = MPI_DOUBLE_PRECISION |
|
types(2) = MPI_CHARACTER |
|
displs(1) = 0 |
|
displs(2) = 24 |
|
call MPI_TYPE_STRUCT(2, blocklens, displs, types, |
& |
newtype, ierr) |
MPI_TYPE_COMMIT(DATATYPE, IERR) INTEGER DATATYPE, IERR
J_]bkljZpby kha^Zggh]h ijhba\h^gh]h lbiZ ^Zgguo DATATYPE Ihke_ j_]bkl- jZpbb wlhl lbi ^Zgguo fh`gh bkihevah\Zlv \ hi_jZpbyo h[f_gZ gZjZ\g_ k ij_^hij_^_e_ggufb lbiZfb ^Zgguo Ij_^hij_^_e_ggu_ lbiu ^Zgguo j_]b- kljbjh\Zlv g_ gm`gh
MPI_TYPE_FREE(DATATYPE, IERR) INTEGER DATATYPE, IERR
:ggmebjh\Zgb_ ijhba\h^gh]h lbiZ ^Zgguo DATATYPE IZjZf_lj DATATYPE mklZgZ\eb\Z_lky \ agZq_gb_ MPI_DATATYPE_NULL =ZjZglbjm_lky qlh ex[hc gZqZluc h[f_g bkihevamxsbc ^Zggu_ Zggmebjm_fh]h lbiZ [m^_l ghjfZevgh aZ\_jr_g Ijb wlhf ijhba\h^gu_ hl DATATYPE lbiu ^Zgguo hklZxlky b fh]ml bkihevah\Zlvky ^Zevr_ Ij_^hij_^_e_ggu_ lbiu ^Zgguo g_ fh]ml [ulv Zggmebjh\Zgu
MPI_TYPE_SIZE(DATATYPE, SIZE, IERR) INTEGER DATATYPE, SIZE, IERR
Hij_^_e_gb_ jZaf_jZ SIZE lbiZ ^Zgguo DATATYPE \ [ZclZo h[t_fZ iZfylb aZgbfZ_fh]h h^gbf we_f_glhf ^Zggh]h lbiZ
MPI_ADDRESS(LOCATION, ADDRESS, IERR) <type> LOCATION(*)
INTEGER ADDRESS, IERR
Hij_^_e_gb_ Z[khexlgh]h [Zcl-Z^j_kZ ADDRESS jZaf_s_gby fZkkb\Z LOCATION \ 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_ Kb iZjZf_lj ADDRESS bf__l lbi MPI_Aint.
< ke_^mxs_f ijbf_j_ hibku\Z_lky gh\uc lbi ^Zgguo newtype dhlhjuc ih- ke_ j_]bkljZpbb bkihevam_lky ^ey i_j_kuedb dZd _^bgh]h p_eh]h ^\mo we_- f_glh\ ^Zgguo lbih\ double precision b character(1) < dZq_kl\_ Z^j_kZ [mn_jZ ihkuedb bkihevam_lky [Zah\uc Z^j_k MPI_BOTTOM Z ^ey hij_^_e_gby kf_s_gbc we_f_glh\ ^Zgguo dat1 b dat2 bkihevamxlky \uah\u ijhp_^mju
66
MPI_ADDRESS I_j_^ i_j_kuedhc gh\uc lbi j_]bkljbjm_lky ijb ihfhsb \u- ah\Z ijhp_^mju MPI_TYPE_COMMIT AZf_lbf qlh i_j_kueZ_lky h^bg we_f_gl ^Zgguo ijhba\h^gh]h lbiZ ohly hg b khklhbl ba ^\mo jZaghlbiguo we_f_glh\
|
blocklens(1) = 1 |
|
blocklens(2) = 1 |
|
types(1) = MPI_DOUBLE_PRECISION |
|
types(2) = MPI_CHARACTER |
|
call 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, IERR
Hij_^_e_gb_ kf_s_gby DISPL \ [ZclZo gb`g_c ]jZgbpu we_f_glZ lbiZ ^Zg- guo DATATYPE hl gZqZeZ [mn_jZ ^Zgguo
MPI_TYPE_UB(DATATYPE, DISPL, IERR) INTEGER DATATYPE, DISPL, IERR
Hij_^_e_gb_ kf_s_gby DISPL \ [ZclZo \_jog_c ]jZgbpu we_f_glZ lbiZ ^Zg- guo DATATYPE hl gZqZeZ [mn_jZ ^Zgguo
MPI_TYPE_EXTENT(DATATYPE, EXTENT, IERR) INTEGER DATATYPE, EXTENT, IERR
Hij_^_e_gb_ ^bZiZahgZ EXTENT jZagbpu f_`^m \_jog_c b gb`g_c ]jZgb- pZfb we_f_glZ ^Zggh]h lbiZ lbiZ ^Zgguo DATATYPE \ [ZclZo
< ke_^mxs_f ijbf_j_ ijhba\h^guc lbi ^Zgguo bkihevam_lky ^ey i_j_klZ- gh\db klhe[ph\ fZljbpu \ h[jZlghf ihjy^d_ Lbi ^Zgguo matr_rev kha^Z- \Z_fuc ijhp_^mjhc MPI_TYPE_VECTOR hibku\Z_l ehdZevgmx qZklv fZljbpu ^Zggh]h ijhp_kkZ \ i_j_klZ\e_ggufb \ h[jZlghf ihjy^d_ klhe[pZfb Ihke_ 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 gZ qbkeh ijhp_kkh\ ijbeh`_gby
67
program example19 include 'mpif.h'
integer ierr, rank, size, N, nl parameter (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+1
call work(a, b, N, nl, size, rank) call MPI_FINALIZE(ierr)
end
subroutine work(a, b, n, nl, size, rank) include 'mpif.h'
integer ierr, rank, size, n, nl, ii, matr_rev double precision a(n, nl), b(n, nl)
integer i, j, status(MPI_STATUS_SIZE) do j = 1, nl
do i = 1, n
|
b(i,j) = 0.d0 |
|
ii = j+rank*nl |
|
a(i,j) = 100*ii+i |
|
enddo |
|
enddo |
|
call 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, nl |
|
do i = 1, n |
|
print *, 'process ', rank, ': ', |
& |
j+rank*nl, ' ', i, a(i,j), ' ', b(i,j) |
|
enddo |
|
enddo |
|
end |
MiZdh\dZ ^Zgguo
>ey i_j_kuehd jZaghjh^guo ^Zgguo gZjy^m k kha^Zgb_f ijhba\h^guo lbih\ fh`gh bkihevah\Zlv hi_jZpbb miZdh\db b jZkiZdh\db ^Zgguo JZaghjh^gu_ beb jZkiheh`_ggu_ g_ \ ihke_^h\Zl_evguo yq_cdZo iZfylb ^Zggu_ ihf_sZ- xlky \ h^bg g_ij_ju\guc [mn_j i_j_kueZ_lky Z ihlhf ihemq_ggh_ khh[s_- gb_ kgh\Z jZkij_^_ey_lky ih gm`guf yq_cdZf iZfylb
68
MPI_PACK(INBUF, INCOUNT, DATATYPE, OUTBUF, OUTSIZE, POSITION, COMM, IERR)
<type> INBUF(*), OUTBUF(*)
INTEGER INCOUNT, DATATYPE, OUTSIZE, POSITION, COMM, IERR
MiZdh\dZ INCOUNT we_f_glh\ lbiZ DATATYPE ba fZkkb\Z INBUF \ fZkkb\ OUTBUF kh k^\b]hf POSITION [Zcl hl gZqZeZ fZkkb\Z ;mn_j OUTBUF ^he`_g kh^_j`Zlv ih djZcg_c f_j_ OUTSIZE [Zcl Ihke_ \uiheg_gby ijhp_^mju iZ- jZf_lj POSITION m\_ebqb\Z_lky gZ qbkeh [Zcl jZ\gh_ jZaf_jm aZibkb IZjZ- f_lj COMM mdZau\Z_l gZ dhffmgbdZlhj \ dhlhjhf \ ^Zevg_cr_f [m^_l i_j_- kueZlvky khh[s_gb_ >ey i_j_kuedb miZdh\Zgguo ^Zgguo bkihevam_lky lbi
^Zgguo MPI_PACKED.
MPI_UNPACK(INBUF, INSIZE, POSITION, OUTBUF, OUTCOUNT, DATATYPE, COMM, IERR)
<type> INBUF(*), OUTBUF(*)
INTEGER INSIZE, POSITION, OUTCOUNT, DATATYPE, COMM, IERR
JZkiZdh\dZ OUTCOUNT we_f_glh\ lbiZ DATATYPE ba fZkkb\Z INBUF kh k^\b]hf POSITION [Zcl hl gZqZeZ fZkkb\Z \ fZkkb\ OUTBUF FZkkb\ INBUF bf__l jZaf_j g_ f_g__ INSIZE [Zcl
MPI_PACK_SIZE(INCOUNT, DATATYPE, COMM, SIZE, IERR) INTEGER INCOUNT, DATATYPE, COMM, SIZE, IERR
Hij_^_e_gb_ g_h[oh^bfh]h h[t_fZ iZfylb SIZE \ [ZclZo ^ey miZdh\db INCOUNT we_f_glh\ lbiZ DATATYPE G_h[oh^bfuc ^ey miZdh\db jZaf_j fh- `_l ij_\urZlv kmffm jZaf_jh\ iZdm_fuo we_f_glh\ ^Zgguo
< ke_^mxs_f ijbf_j_ fZkkb\ buf bkihevam_lky \ dZq_kl\_ [mn_jZ ^ey miZ- dh\db 10 we_f_glh\ fZkkb\Z a lbiZ real b 10 we_f_glh\ fZkkb\Z b lbiZ character Ihemq_ggh_ khh[s_gb_ i_j_kueZ_lky ijhp_^mjhc MPI_BCAST hl ijhp_kkZ 0 \k_f hklZevguf ijhp_kkZf ihemq_ggh_ khh[s_gb_ jZkiZdh\u\Z- _lky ijb ihfhsb \uah\h\ ijhp_^mj MPI_UNPACK.
program example20 include 'mpif.h'
integer ierr, rank, position real a(10)
character b(10), buf(100) call MPI_INIT(ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) do i = 1, 10
a(i) = rank + 1.0 if(rank .eq. 0) then
b(i) = 'a' else
b(i) = 'b' end if
end do position=0
69
if(rank |
.eq. 0) then |
call |
MPI_PACK(a, 10, MPI_REAL, buf, 100, position, |
& |
MPI_COMM_WORLD, ierr) |
call |
MPI_PACK(b, 10, MPI_CHARACTER, buf, 100, position, |
& |
MPI_COMM_WORLD, ierr) |
call |
MPI_BCAST(buf, 100, MPI_PACKED, 0, |
& |
MPI_COMM_WORLD, ierr) |
else |
|
call MPI_BCAST(buf, 100, MPI_PACKED, 0, |
|
& |
MPI_COMM_WORLD, ierr) |
position=0 |
|
call MPI_UNPACK(buf, 100, position, a, 10, MPI_REAL, |
|
& |
MPI_COMM_WORLD, ierr) |
call MPI_UNPACK(buf, 100, position, b, 10, |
|
& |
MPI_CHARACTER, MPI_COMM_WORLD, ierr) |
end if
print *, 'procecc ', rank, ' a=', a, ' b=', b call MPI_FINALIZE(ierr)
end
AZ^Zgby
•Kha^Zlv ijhba\h^guc lbi ^Zgguo ^ey i_j_kuehd ^bZ]hgZevghc fZl- jbpu
•DZd khhlghkylky agZq_gby \ha\jZsZ_fu_ ijhp_^mjZfb MPI_TYPE_SIZE
b MPI_TYPE_EXTENT?
•Fh`gh eb bkihevah\Zlv ijhba\h^gu_ lbiu ^Zgguo [_a \uah\Z ijhp_-
^mju MPI_TYPE_COMMIT?
•I_j_keZlv gme_\hfm ijhp_kkm hl \k_o ijhp_kkh\ ijbeh`_gby kljmd- lmjm khklhysmx ba jZg]Z ijhp_kkZ b gZa\Zgby maeZ gZ dhlhjhf ^Zgguc ijhp_kk aZims_g ihemq_ggh]h k ihfhsvx ijhp_^mju
MPI_GET_PROCESSOR_NAME).
•Ijyfhm]hevgZy fZljbpZ jZkij_^_e_gZ ih ijhp_kkZf ih kljhdZf I_j_klZ\blv kljhdb fZljbpu \ h[jZlghf ihjy^d_ bkihevamy ^ey i_j_- kuehd ijhba\h^guc lbi ^Zgguo
•K^_eZlv ij_^u^msmx aZ^Zqm k bkihevah\Zgb_f i_j_kuehd miZdh\Zg- guo ^Zgguo
•< q_f ij_bfms_kl\Z b g_^hklZldb bkihevah\Zgby i_j_kuehd miZdh\Zg- guo ^Zgguo ih kjZ\g_gbx k i_j_kuedZfb ^Zgguo ijhba\h^guo lbih\"
•GZibkZlv ijh]jZffm ljZgkihgbjh\Zgby fZljbpu k bkihevah\Zgb_f ijhba\h^guo lbih\ ^Zgguo
70