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

mpibook_Antonov

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

KjZ\g_gb_ ]jmii GROUP1 b GROUP2 ?keb ]jmiiu GROUP1 b GROUP2 iheghklvx kh\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_SIMILAR BgZq_ \ha\jZsZ_lky agZq_gb_ MPI_UNEQUAL.

MPI_GROUP_FREE(GROUP, IERR) INTEGER GROUP, IERR

Mgbqlh`_gb_ ]jmiiu GROUP. Ihke_ \uiheg_gby ijhp_^mju i_j_f_ggZy GROUP ijbgbfZ_l agZq_gb_ MPI_GROUP_NULL ?keb k wlhc ]jmiihc d fhf_glm \uah\Z ijhp_^mju m`_ \uihegy_lky dZdZy-lh hi_jZpby lh hgZ [m^_l aZ\_jr_gZ

< ke_^mxs_f ijbf_j_ \k_ ijhp_kku ijbeh`_gby jZa[b\Zxlky gZ ^\_ g_i_j_- k_dZxsb_ky ijbf_jgh jZ\gu_ ]jmiiu group1 b group2 Ijb g_q_lghf qbke_ ijhp_kkh\ \ ]jmii_ group2 fh`_l hdZaZlvky gZ h^bg ijhp_kk [hevr_ lh]^Z ihke_^gbc ijhp_kk ba ^Zgghc ]jmiiu g_ ^he`_g h[f_gb\Zlvky ^Zggufb gb k h^gbf ijhp_kkhf ba ]jmiiu group1 K ihfhsvx \uah\h\ ijhp_^mju MPI_GROUP_TRANSLATE_RANKS dZ`^uc ijhp_kk gZoh^bl ijhp_kk k l_f `_ gh- f_jhf \ ^jm]hc ]jmii_ b h[f_gb\Z_lky k gbf khh[s_gb_f q_j_a dhffmgbdZ- lhj MPI_COMM_WORLD ijb ihfhsb \uah\Z ijhp_^mju MPI_SENDRECV < dhgp_ ijh]jZffu g_ gm`gu_ ^Ze__ ]jmiiu mgbqlh`Zxlky k ihfhsvx \uah\h\

ijhp_^mj MPI_GROUP_FREE.

 

program example16

 

include 'mpif.h'

 

integer ierr, rank, i, size, size1

 

integer a(4), b(4)

 

integer status(MPI_STATUS_SIZE)

 

integer group, group1, group2

 

integer ranks(128), rank1, rank2, rank3

 

call 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/2

 

do i = 1, size1

 

ranks(i) = i-1

 

enddo

 

call 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) then

 

if(rank2 .lt. size1) then

 

call MPI_GROUP_TRANSLATE_RANKS(group1, 1, rank2,

&

group, rank3, ierr)

 

else

 

rank3 = MPI_UNDEFINED

 

end if

51

else

call MPI_GROUP_TRANSLATE_RANKS(group2, 1, rank1,

&

group, rank3, ierr)

end if

a(1)

= rank

a(2)

= rank1

a(3)

= rank2

a(4)

= rank3

 

if (rank3 .ne. MPI_UNDEFINED) then

 

call MPI_SENDRECV(a, 4,

MPI_INTEGER, rank3, 1,

&

b, 4,

MPI_INTEGER, rank3, 1,

&

MPI_COMM_WORLD, status, ierr)

end if

call MPI_GROUP_FREE(group, ierr) call MPI_GROUP_FREE(group1, ierr) call MPI_GROUP_FREE(group2, ierr)

print *, 'process ', rank, ' a=', a, ' b=', b call MPI_FINALIZE(ierr)

end

Hi_jZpbb k dhffmgbdZlhjZfb

DhffmgbdZlhj ij_^hklZ\ey_l hl^_evguc dhgl_dkl h[f_gZ ijhp_kkh\ g_dhlh- jhc ]jmiiu Dhgl_dkl h[_ki_qb\Z_l \hafh`ghklv g_aZ\bkbfuo h[f_gh\ ^Zg- gufb DZ`^hc ]jmii_ ijhp_kkh\ fh`_l khhl\_lkl\h\Zlv g_kdhevdh dhffmgb- dZlhjh\ gh dZ`^uc dhffmgbdZlhj \ ex[hc fhf_gl \j_f_gb h^ghagZqgh kh- hl\_lkl\m_l lhevdh h^ghc ]jmii_

Ke_^mxsb_ dhffmgbdZlhju kha^Zxlky kjZam ihke_ \uah\Z ijhp_^mju

MPI_INIT:

MPI_COMM_WORLD dhffmgbdZlhj h[t_^bgyxsbc \k_ ijhp_kku ijbeh-

`_gby

MPI_COMM_NULL agZq_gb_ bkihevam_fh_ ^ey hrb[hqgh]h dhffmgbdZ-

lhjZ

MPI_COMM_SELF dhffmgbdZlhj \dexqZxsbc lhevdh \ua\Z\rbc ijh-

p_kk

Kha^Zgb_ dhffmgbdZlhjZ y\ey_lky dhee_dlb\ghc hi_jZpb_c b lj_[m_l hi_jZpbb f_`ijhp_kkgh]h h[f_gZ ihwlhfm lZdb_ ijhp_^mju ^he`gu \uau\Zlvky \k_fb ijhp_kkZfb g_dhlhjh]h kms_kl\mxs_]h dhffmgbdZlhjZ

MPI_COMM_DUP(COMM, NEWCOMM, IERR) INTEGER COMM, NEWCOMM, IERR

Kha^Zgb_ gh\h]h dhffmgbdZlhjZ NEWCOMM k lhc `_ ]jmiihc ijhp_kkh\ b Zl- jb[mlZfb qlh b m dhffmgbdZlhjZ COMM.

52

MPI_COMM_CREATE(COMM, GROUP, NEWCOMM, IERR) INTEGER COMM, GROUP, NEWCOMM, IERR

Kha^Zgb_ gh\h]h dhffmgbdZlhjZ NEWCOMM ba dhffmgbdZlhjZ COMM ^ey ]jmiiu ijhp_kkh\ GROUP dhlhjZy ^he`gZ y\eylvky ih^fgh`_kl\hf ]jmiiu k\yaZgghc k dhffmgbdZlhjhf COMM <uah\ ^he`_g \klj_lblvky \h \k_o ijhp_kkZo dhffmgbdZlhjZ COMM GZ ijhp_kkZo g_ ijbgZ^e_`Zsbo ]jmii_ GROUP [m^_l \ha\jZs_gh agZq_gb_ MPI_COMM_NULL.

< ke_^mxs_f ijbf_j_ kha^Z_lky ^\_ gh\uo ]jmiiu h^gZ ba dhlhjuo kh^_j- `bl i_j\mx iheh\bgm ijhp_kkh\ Z \lhjZy \lhjmx iheh\bgm Ijb g_q_lghf qbke_ ijhp_kkh\ \h \lhjmx ]jmiim \hc^_l gZ h^bg ijhp_kk [hevr_ DZ`^Zy ]jmiiZ kha^Z_lky lhevdh gZ l_o ijhp_kkZo dhlhju_ \ g__ \oh^yl >ey dZ`^hc gh\hc ]jmiiu kha^Z_lky khhl\_lkl\mxsbc _c dhffmgbdZlhj new_comm b hi_jZpby MPI_ALLREDUCE \uihegy_lky ih hl^_evghklb ^ey ijhp_kkh\ \oh^ysbo \ jZagu_ ]jmiiu

 

call MPI_COMM_GROUP(MPI_COMM_WORLD, group, ierr)

 

do i = 1, size/2

 

ranks(i) = i-1

 

end do

 

if (rank .lt. size/2) then

 

call MPI_GROUP_INCL(group, size/2, ranks,

&

new_group, ierr)

 

else

 

call MPI_GROUP_EXCL(group, size/2, ranks,

&

new_group, ierr)

 

end if

 

call MPI_COMM_CREATE(MPI_COMM_WORLD, new_group,

&

new_comm, ierr)

 

call MPI_ALLREDUCE(sbuf, rbuf, 1, MPI_INTEGER,

&

MPI_SUM, new_comm, ierr)

 

call MPI_GROUP_RANK(new_group, new_rank, ierr)

 

print *, 'rank= ', rank, ' newrank= ',

&

new_rank, ' rbuf= ', rbuf

53

MPI_COMM_SPLIT(COMM, COLOR, KEY, NEWCOMM, IERR) INTEGER COMM, COLOR, KEY, NEWCOMM, IERR

JZa[b_gb_ dhffmgbdZlhjZ COMM gZ g_kdhevdh gh\uo dhffmgbdZlhjh\ ih qbkem agZq_gbc iZjZf_ljZ COLOR < h^bg dhffmgbdZlhj ihiZ^Zxl ijhp_kku k h^gbf agZq_gb_f COLOR Ijhp_kku k [hevrbf agZq_gb_f iZjZf_ljZ KEY ih- emqZl [hevrbc jZg] \ gh\hc ]jmii_ ijb h^bgZdh\hf agZq_gbb iZjZf_ljZ KEY ihjy^hd gmf_jZpbb ijhp_kkh\ \u[bjZ_lky kbkl_fhc

Ijhp_kku dhlhju_ g_ ^he`gu \hclb \ gh\u_ dhffmgbdZlhju mdZau\Zxl \

dZq_kl\_ iZjZf_ljZ COLOR dhgklZglm MPI_UNDEFINED Bf \ iZjZf_lj_

NEWCOMM \_jg_lky agZq_gb_ MPI_COMM_NULL.

< ke_^mxs_f ijbf_j_ dhffmgbdZlhj MPI_COMM_WORLD jZa[b\Z_lky gZ ljb qZklb < i_j\mx \hc^ml ijhp_kku k ghf_jZfb 0, 3, 6 b l ^ \h \lhjmx 1, 4, 7 b l ^ Z \ lj_lvx 2, 5, 8 b l ^ AZ^Zgb_ \ dZq_kl\_ iZjZf_ljZ KEY i_j_f_gghc rank ]ZjZglbjm_l qlh ihjy^hd gmf_jZpbb ijhp_kkh\ \ kha^Z\Z_fuo ]jmiiZo khhl\_lkl\m_l ihjy^dm gmf_jZpbb \ bkoh^ghc ]jmii_ lh _klv ihjy^dm i_j_qbke_gby \ur_

 

call MPI_COMM_SPLIT(MPI_COMM_WORLD,

mod(rank, 3),

&

rank, new_comm,

ierr)

MPI_COMM_FREE(COMM, IERR) INTEGER COMM, IERR

M^Ze_gb_ dhffmgbdZlhjZ COMM Ihke_ \uiheg_gby ijhp_^mju i_j_f_gghc COMM ijbk\Zb\Z_lky agZq_gb_ MPI_COMM_NULL ?keb k wlbf dhffmgbdZlhjhf d fhf_glm \uah\Z ijhp_^mju m`_ \uihegy_lky dZdZy-lh hi_jZpby lh hgZ [m^_l aZ\_jr_gZ

< ke_^mxs_f ijbf_j_ kha^Z_lky h^bg gh\uc dhffmgbdZlhj comm_revs \ dh- lhjuc \oh^yl \k_ ijhp_kku ijbeh`_gby ijhgmf_jh\Zggu_ \ h[jZlghf ih- jy^d_ Dh]^Z dhffmgbdZlhj klZgh\blky g_gm`guf hg m^Zey_lky ijb ihfhsb \uah\Z ijhp_^mju MPI_COMM_FREE LZd fh`gh bkihevah\Zlv ijhp_^mjm MPI_COMM_SPLIT ^ey i_j_gmf_jZpbb ijhp_kkh\

 

program example17

 

include 'mpif.h'

 

integer ierr, rank, size

 

integer comm_revs, rank1

 

call MPI_INIT(ierr)

 

call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr)

 

call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)

 

call MPI_COMM_SPLIT(MPI_COMM_WORLD, 1, size-rank,

&

comm_revs, ierr)

 

call MPI_COMM_RANK(comm_revs, rank1, ierr)

 

print *, 'rank = ', rank,' rank1 = ', rank1

 

call MPI_COMM_FREE(comm_revs, ierr)

54

call MPI_FINALIZE(ierr) end

AZ^Zgby

DZdb_ ]jmiiu ijhp_kkh\ kms_kl\mxl ijb aZimkd_ ijbeh`_gby"

Fh]ml eb ]jmiiu ijhp_kkh\ bf_lv g_imklh_ i_j_k_q_gb_ g_ kh\iZ^Zx- s__ gb k h^ghc ba gbo iheghklvx"

< q_f hlebqb_ f_`^m ]jmiihc ijhp_kkh\ b dhffmgbdZlhjhf"

Fh]ml eb h[f_gb\Zlvky ^Zggufb ijhp_kku ijbgZ^e_`Zsb_ jZaguf dhffmgbdZlhjZf"

Fh`_l eb \ dZdhc-lh ]jmii_ g_ [ulv ijhp_kkZ k ghf_jhf 0?

Fh`_l eb \ dZdmx-eb[h ]jmiim g_ \hclb ijhp_kk k ghf_jhf 0 \

dhffmgbdZlhj_ MPI_COMM_WORLD?

Fh`_l eb lhevdh h^bg ijhp_kk \ g_dhlhjhc ]jmii_ \ua\Zlv ijhp_^mjm

MPI_GROUP_INCL?

DZd kha^Zlv gh\mx ]jmiim ba ijhp_kkh\ 3, 4 b 7 dhffmgbdZlhjZ

MPI_COMM_WORLD?

JZa[blv \k_ ijhp_kku ijbeh`_gby gZ ljb ijhba\hevguo ]jmiiu b gZi_qZlZlv jZg]b \ MPI_COMM_WORLD l_o ijhp_kkh\ qlh ihiZeb \ i_j- \u_ ^\_ ]jmiiu gh g_ ihiZeb \ lj_lvx

DZdb_ dhffmgbdZlhju kms_kl\mxl ijb aZimkd_ ijbeh`_gby"

Fh`gh eb \ ijhp_kk_ \uiheg_gby ijh]jZffu baf_gblv qbkeh ijhp_kkh\ \ dhffmgbdZlhj_ MPI_COMM_WORLD?

Fh`_l eb lhevdh h^bg ijhp_kk \ g_dhlhjhf dhffmgbdZlhj_ \ua\Zlv

ijhp_^mjm MPI_COMM_CREATE?

Fh`gh eb ijb ihfhsb ijhp_^mju MPI_COMM_SPLIT kha^Zlv jh\gh h^bg gh\uc dhffmgbdZlhj"

Fh`gh eb ijb ihfhsb ijhp_^mju MPI_COMM_SPLIT kha^Zlv klhevdh gh\uo dhffmgbdZlhjh\ kdhevdh ijhp_kkh\ \oh^bl \ [Zah\uc dhffm- gbdZlhj"

J_Zebah\Zlv jZa[b_gb_ ijhp_kkh\ gZ ^\_ ]jmiiu \ h^ghc ba dhlhjuo hkms_kl\ey_lky h[f_g ^Zggufb ih dhevpm Z \ ^jm]hc dhffmgbdZpbb ih ko_f_PDVWHU-slave.

<bjlmZevgu_ lhiheh]bb

Lhiheh]by wlh f_oZgbaf khihklZ\e_gby ijhp_kkZf g_dhlhjh]h dhffmgbdZ- lhjZ Zevl_jgZlb\ghc ko_fu Z^j_kZpbb <03,lhiheh]bb \bjlmZevgu lh _klv hgb g_ k\yaZgu k nbabq_kdhc lhiheh]b_c dhffmgbdZpbhgghc k_lb Lhiheh- ]by bkihevam_lky ijh]jZffbklhf ^ey [he__ m^h[gh]h h[hagZq_gby ijhp_kkh\

55

b lZdbf h[jZahf ijb[eb`_gby iZjZee_evghc ijh]jZffu d kljmdlmj_ fZl_- fZlbq_kdh]h Ze]hjblfZ Djhf_ lh]h lhiheh]by fh`_l bkihevah\Zlvky kbkl_fhc ^ey hilbfbaZpbb jZkij_^_e_gby ijhp_kkh\ ih nbabq_kdbf ijhp_kkhjZf bkihevam_fh]h iZjZee_evgh]h dhfivxl_jZ ijb ihfhsb baf_g_gby ihjy^dZ gmf_jZpbb ijhp_kkh\ \gmljb dhffmgbdZlhjZ

< MPI ij_^mkfhlj_gu ^\Z lbiZ lhiheh]bc

^_dZjlh\Z lhiheh]by ijyfhm]hevgZy j_r_ldZ ijhba\hevghc jZaf_jghklb

lhiheh]by ]jZnZ.

MPI_TOPO_TEST(COMM, TYPE, IERR) INTEGER COMM, TYPE, IERR

Ijhp_^mjZ hij_^_e_gby lbiZ lhiheh]bb k\yaZgghc k dhffmgbdZlhjhf COMM. <hafh`gu_ \ha\jZsZ_fu_ agZq_gby iZjZf_ljZ TYPE:

MPI_GRAPH ^ey lhiheh]bb ]jZnZ

MPI_CART ^ey ^_dZjlh\hc lhiheh]bb

MPI_UNDEFINED k dhffmgbdZlhjhf COMM g_ k\yaZgZ gbdZdZy lhiheh-

]by

>_dZjlh\Z lhiheh]by

MPI_CART_CREATE(COMM, NDIMS, DIMS, PERIODS, REORDER, COMM_CART, IERR)

INTEGER COMM, NDIMS, DIMS(*), COMM_CART, IERR LOGICAL PERIODS(*), REORDER

Kha^Zgb_ dhffmgbdZlhjZ COMM_CART h[eZ^Zxs_]h ^_dZjlh\hc lhiheh]b_c ba ijhp_kkh\ dhffmgbdZlhjZ COMM IZjZf_lj NDIMS aZ^Z_l jZaf_jghklv ihemqZ_fhc ^_dZjlh\hc j_r_ldb DIMS(I) qbkeh we_f_glh\ \ baf_j_gbb I, 1INDIMS. PERIODS eh]bq_kdbc fZkkb\ ba NDIMS we_f_glh\ hij_^_eyxsbc y\ey_lky eb j_r_ldZ i_jbh^bq_kdhc agZq_gb_ .TRUE. \^hev dZ`^h]h baf_j_gby REORDER eh]bq_kdbc iZjZf_lj hij_^_eyxsbc qlh ijb agZq_gbb .TRUE. kbkl_f_ jZaj_r_gh f_gylv ihjy^hd gmf_jZpbb ijhp_kkh\ ^ey hilbfbaZpbb jZkij_^_e_gby ijhp_kkh\ ih nbabq_kdbf ijhp_kkhjZf bkihevam_fh]h iZjZee_evgh]h dhfivxl_jZ

Ijhp_^mjZ y\ey_lky dhee_dlb\ghc Z agZqbl ^he`gZ [ulv \ua\ZgZ \k_fb ijhp_kkZfb dhffmgbdZlhjZ COMM ?keb dhebq_kl\h ijhp_kkh\ \ aZ^Z\Z_fhc lhiheh]bb COMM_CART f_gvr_ qbkeZ ijhp_kkh\ \ bkoh^ghf dhffmgbdZlhj_ KHFF lh g_dhlhjuf ijhp_kkZf fh`_l \_jgmlvky agZq_gb_ MPI_COMM_NULL Z agZqbl hgb g_ [m^ml ijbgbfZlv mqZklby \ kha^Z\Z_fhc lhiheh]bb ?keb dh-

56

ebq_kl\h ijhp_kkh\ \ aZ^Z\Z_fhc lhiheh]bb [hevr_ qbkeZ ijhp_kkh\ \ bk- oh^ghf dhffmgbdZlhj_ lh \uah\ [m^_l hrb[hqguf

< ke_^mxs_f ijbf_j_ kha^Z_lky lj_of_jgZy lhiheh]by 4×3×2 dZ`^h_ baf_- j_gb_ dhlhjhc y\ey_lky i_jbh^bq_kdbf djhf_ lh]h jZaj_rZ_lky i_j_mihjy- ^hq_gb_ ijhp_kkh\ >Zgguc njZ]f_gl ^he`_g \uihegylvky g_ f_g__ q_f gZ 24 ijhp_kkZo

 

dims(1) = 4

 

dims(2) = 3

 

dims(3) = 2

 

periods(1) = .TRUE.

 

periods(2) = .TRUE.

 

periods(3) = .TRUE.

 

call MPI_CART_CREATE(MPI_COMM_WORLD, 3, dims, periods,

&

.TRUE., comm_cart, ierr)

MPI_DIMS_CREATE(NNODES, NDIMS, DIMS, IERR) INTEGER NNODES, NDIMS, DIMS(*), IERR

Ijhp_^mjZ ihfh]Z_l hij_^_eblv jZaf_ju DIMS(I) ^ey dZ`^hc ba NDIMS jZa- f_jghkl_c ijb kha^Zgbb ^_dZjlh\hc lhiheh]bb ^ey NNODES ijhp_kkh\ Ij_^- ihqlbl_evguf kqblZ_lky kha^Zgb_ lhiheh]bb \ dhlhjhc qbkeh ijhp_kkh\ ih jZaguf jZaf_jghklyf ijbf_jgh h^gh b lh `_ Ihevah\Zl_ev fh`_l mijZ\eylv qbkehf ijhp_kkh\ \ g_dhlhjuo jZaf_jghklyo ke_^mxsbf h[jZahf AgZq_gb_ DIMS(I) jZkkqblu\Z_lky ^Zgghc ijhp_^mjhc _keb i_j_^ \uah\hf hgh jZ\gh 0 bgZq_ hklZ\ey_lky [_a baf_g_gbc HljbpZl_evgu_ agZq_gby we_f_glh\ fZkkb\Z DIMS y\eyxlky hrb[hqgufb I_j_^ \uah\hf ijhp_^mju agZq_gb_ NNODES ^he`gh [ulv djZlgh ijhba\_^_gbx g_gme_\uo agZq_gbc fZkkb\Z DIMS <uoh^gu_ agZq_gby fZkkb\Z DIMS i_j_hij_^_e_ggu_ ^Zgghc ijhp_^mjhc [m^ml mihjy^hq_gu \ ihjy^d_ m[u\Zgby Ijhp_^mjZ y\ey_lky ehdZevghc b g_ lj_[m_l f_`ijhp_kkgh]h \aZbfh^_ckl\by

< ke_^mxs_c lZ[ebp_ ijb\_^_gu q_luj_ ijbf_jZ bkihevah\Zgby ijhp_^mju MPI_DIMS_CREATE ^ey kha^Zgby lj_of_jguo lhiheh]bc < i_j\hf ijbf_j_ 6 ijhp_kkh\ h[jZamxl j_r_ldm 3×2×1 ijbq_f jZaf_ju mihjy^hq_gu \ ihjy^d_ m[u\Zgby <h \lhjhf ijbf_j_ ^_eZ_lky ihiuldZ jZkij_^_eblv 7 ijhp_kkh\ ih lj_f baf_j_gbyf _^bgkl\_gguc \hafh`guc \ZjbZgl j_r_ldZ 7×1×1 < lj_lv_f ijbf_j_ ^ey \lhjhc jZaf_jghklb bagZqZevgh aZ^Zgh agZq_gb_ 3 ^\_ hklZ\rb_ky jZaf_jghklb hij_^_eyxl j_r_ldm 2×3×1 Q_l\_jluc \uah\ hrb- [hq_g lZd dZd h[s__ qbkeh ijhp_kkh\ 7 g_ ^_eblky gZp_eh gZ aZ^Zgguc jZaf_j \h \lhjhc jZaf_jghklb 3).

57

dims i_j_^

\uah\ ijhp_^mju

dims ihke_

\uah\hf

 

\uah\Z

(0, 0, 0)

MPI_DIMS_CREATE(6, 3, dims, ierr)

(3, 2, 1)

(0, 0, 0)

MPI_DIMS_CREATE(7, 3, dims, ierr)

(7, 1, 1)

(0, 3, 0)

MPI_DIMS_CREATE(6, 3, dims, ierr)

(2, 3, 1)

(0, 3, 0)

MPI_DIMS_CREATE(7, 3, dims, ierr)

hrb[dZ

 

 

 

MPI_CART_COORDS(COMM, RANK, MAXDIMS, COORDS, IERR) INTEGER COMM, RANK, MAXDIMS, COORDS(*), IERR

Hij_^_e_gb_ ^_dZjlh\uo dhhj^bgZl ijhp_kkZ ih _]h jZg]m RANK \ dhffmgb- dZlhj_ COMM Dhhj^bgZlu \ha\jZsZxlky \ fZkkb\_ COORDS k qbkehf we_f_g- lh\ MAXDIMS Hlkq_l dhhj^bgZl ih dZ`^hfm baf_j_gbx gZqbgZ_lky k gmey

MPI_CART_RANK(COMM, COORDS, RANK, IERR) INTEGER COMM, COORDS(*), RANK, IERR

Hij_^_e_gb_ jZg]Z RANK ijhp_kkZ \ dhffmgbdZlhj_ COMM ih _]h ^_dZjlh\uf dhhj^bgZlZf COORDS >ey i_jbh^bq_kdbo j_r_lhd dhhj^bgZlu \g_ ^himklb- fuo bgl_j\Zeh\ i_j_kqblu\Zxlky ^ey g_i_jbh^bq_kdbo j_r_lhd hgb y\ey- xlky hrb[hqgufb

MPI_CART_SUB(COMM, DIMS, NEWCOMM, IERR) INTEGER COMM, NEWCOMM, IERR

LOGICAL DIMS(*)

JZks_ie_gb_ dhffmgbdZlhjZ COMM k dhlhjuf k\yaZgZ ^_dZjlh\Z lhiheh]by ijb ihfhsb ijhp_^mju MPI_CART_CREATE gZ ih^]jmiiu khhl\_lkl\mxsb_ ^_dZjlh\uf ih^j_r_ldZf f_gvr_c jZaf_jghklb Iuc we_f_gl eh]bq_kdh]h fZkkb\Z DIMS mklZgZ\eb\Z_lky jZ\guf agZq_gbx .TRUE. _keb Ih_ baf_j_gb_ ^he`gh hklZlvky \ nhjfbjm_fhc ih^j_r_ld_ k\yaZgghc k dhffmgbdZlhjhf NEWCOMM.

<havf_f lj_of_jgmx lhiheh]bx kha^Zggmx \ ij_^u^ms_f ijbf_j_ Gb`_ ihdZaZgh dZd jZks_iblv lhiheh]bx 4×3×2 gZ 3 ^\mf_jguo ih^j_r_ldb 4×2 ih 8 ijhp_kkh\ \ dZ`^hc

dims(0) = .TRUE. dims(1) = .FALSE. dims(2) = .TRUE.

call MPI_CART_SUB(comm_cart, dims, newcomm, ierr)

MPI_CARTDIM_GET(COMM, NDIMS, IERR) INTEGER COMM, NDIMS, IERR

Hij_^_e_gb_ jZaf_jghklb NDIMS ^_dZjlh\hc lhiheh]bb k\yaZgghc k dhffm- gbdZlhjhf COMM.

MPI_CART_GET(COMM, MAXDIMS, DIMS, PERIODS, COORDS, IERR) INTEGER COMM, MAXDIMS, DIMS(*), COORDS(*), IERR

58

LOGICAL PERIODS(*)

Ihemq_gb_ bgnhjfZpbb h ^_dZjlh\hc lhiheh]bb dhffmgbdZlhjZ COMM b dh- hj^bgZlZo \ g_c \ua\Z\r_]h ijhp_kkZ MAXDIMS aZ^Z_l jZaf_jghklv ^_dZjlh- \hc lhiheh]bb < iZjZf_lj_ DIMS \ha\jZsZ_lky dhebq_kl\h ijhp_kkh\ ^ey dZ`^h]h baf_j_gby \ iZjZf_lj_ PERIODS i_jbh^bqghklv ih dZ`^hfm baf_- j_gbx \ iZjZf_lj_ COORDS dhhj^bgZlu \ua\Z\r_]h ijhp_kkZ \ ^_dZjlh\hc lhiheh]bb

MPI_CART_SHIFT(COMM, DIRECTION, DISP, SOURCE, DEST, IERR) INTEGER COMM, DIRECTION, DISP, SOURCE, DEST, IERR

Ihemq_gb_ ghf_jh\ ihkueZxs_]h SOURCE b ijbgbfZxs_]h DEST ijhp_k- kh\ \ ^_dZjlh\hc lhiheh]bb dhffmgbdZlhjZ COMM ^ey hkms_kl\e_gby k^\b]Z \^hev baf_j_gby DIRECTION gZ \_ebqbgm DISP.

>ey i_jbh^bq_kdbo baf_j_gbc hkms_kl\ey_lky pbdebq_kdbc k^\b] ^ey g_i_- jbh^bq_kdbo ebg_cguc k^\b] < kemqZ_ ebg_cgh]h k^\b]Z gZ g_dhlhjuo ijhp_kkZo \ dZq_kl\_ ghf_jh\ ihkueZxs_]h beb ijbgbfZxs_]h ijhp_kkh\ fh`_l [ulv ihemq_gh agZq_gb_ MPI_PROC_NULL hagZqZxs__ \uoh^ aZ ]jZ- gbpu ^bZiZahgZ < kemqZ_ pbdebq_kdh]h k^\b]Z ihke_^gbc ijhp_kk ih ^Zgghfm baf_j_gbx hkms_kl\ey_l h[f_gu k gme_\uf ijhp_kkhf >ey n- f_jghc ^_dZjlh\hc j_r_ldb agZq_gb_ DIRECTION ^he`gh [ulv \ ij_^_eZo hl

0 ^h n-1.

AgZq_gby SOURCE b DEST fh`gh bkihevah\Zlv gZijbf_j ^ey h[f_gZ k ihfh- svx ijhp_^mju MPI_SENDRECV.

< ke_^mxs_f ijbf_j_ kha^Z_lky ^\mf_jgZy ^_dZjlh\Z j_r_ldZ i_jbh^bq_- kdZy ih h[hbf baf_j_gbyf hij_^_eyxlky dhhj^bgZlu ijhp_kkZ \ ^Zgghc j_- r_ld_ Ihlhf ijb ihfhsb ijhp_^mju MPI_CART_SHIFT \uqbkeyxlky dhhj- ^bgZlu ijhp_kkh\ k dhlhjufb gm`gh kh\_jrblv h[f_g ^Zggufb ^ey hkms_- kl\e_gby pbdebq_kdh]h k^\b]Z k rZ]hf 2 ih baf_j_gbx 1 < dhgp_ njZ]f_glZ ihemq_ggu_ agZq_gby ghf_jh\ ijhp_kkh\ bkihevamxlky ^ey h[f_gZ ^Zggufb

ijb ihfhsb ijhp_^mju MPI_SENDRECV_REPLACE.

 

periods(1) = .TRUE.

 

periods(2) = .TRUE.

 

call MPI_CART_CREATE(MPI_COMM_WORLD, 2, dims,

&

periods, .TRUE., comm, ierr)

 

call MPI_COMM_RANK(comm, rank, ierr)

 

call MPI_CART_COORDS(comm, rank, 2, coords, ierr)

 

shift = 2

dest = 1

call MPI_CART_SHIFT(comm, 0, shift, source, dest, ierr) call MPI_SENDRECV_REPLACE(a, 1, MPI_REAL, dest, 0,

& source, 0, comm, status, ierr)

59

Lhiheh]by ]jZnZ

MPI_GRAPH_CREATE(COMM, NNODES, INDEX, EDGES, REORDER, COMM_GRAPH, IERR)

INTEGER COMM, NNODES, INDEX(*), EDGES(*), COMM_GRAPH, IERR LOGICAL REORDER

Kha^Zgb_ gZ hkgh\_ dhffmgbdZlhjZ COMM gh\h]h dhffmgbdZlhjZ COMM_GRAPH k lhiheh]b_c ]jZnZ IZjZf_lj NNODES aZ^Z_l qbkeh \_jrbg ]jZnZ INDEX(I) kh^_j`bl kmffZjgh_ dhebq_kl\h khk_^_c ^ey i_j\uo I \_jrbg FZkkb\ EDGES kh^_j`bl mihjy^hq_gguc kibkhd ghf_jh\ ijhp_kkh\-khk_^_c \k_o \_jrbg IZjZf_lj REORDER ijb agZq_gbb .TRUE. hagZqZ_l qlh kbkl_f_ jZa- j_r_gh f_gylv ihjy^hd gmf_jZpbb ijhp_kkh\

Ijhp_^mjZ y\ey_lky dhee_dlb\ghc Z agZqbl ^he`gZ [ulv \ua\ZgZ \k_fb ijhp_kkZfb bkoh^gh]h dhffmgbdZlhjZ ?keb NNODES f_gvr_ qbkeZ ijhp_kkh\ dhffmgbdZlhjZ COMM lh g_dhlhjuf ijhp_kkZf \_jg_lky agZq_gb_ MPI_COMM_NULL Z agZqbl hgb g_ [m^ml ijbgbfZlv mqZklby \ kha^Z\Z_fhc lhiheh]bb ?keb NNODES [hevr_ qbkeZ ijhp_kkh\ dhffmgbdZlhjZ COMM lh \uah\ ijhp_^mju y\ey_lky hrb[hqguf

< ke_^mxs_c lZ[ebqd_ ijb\_^_g ijbf_j hibkZgby ]jZnZ q_j_a aZ^Zgb_ \k_o khk_^_c dZ`^hc \_jrbgu

Ijhp_kk

Khk_^b

0

1,

3

1

0

 

2

3

 

3

0,

2

>ey hibkZgby lZdh]h ]jZnZ gm`gh aZihegblv ke_^mxsb_ kljmdlmju ^Zgguo

INDEX=2, 3, 4, 6

EDGES=1, 3, 0, 3, 0, 2

Ihke_ wlh]h fh`gh kha^Zlv lhiheh]bx ]jZnZ gZijbf_j k ihfhsvx ke_^mxs_]h \uah\Z \uah\ [m^_l dhjj_dlguf ijb \uiheg_gbb gZ g_ f_g__ q_f gZ 4 ijhp_kkZo

call MPI_GRAPH_CREATE(MPI_COMM_WORLD, 4, INDEX, EDGES,

&

.TRUE., comm_graph, ierr)

60

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