Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

mpibook_Antonov

.pdf
Скачиваний:
10
Добавлен:
23.02.2015
Размер:
402.03 Кб
Скачать

MPI_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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]