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

mpibook_Antonov

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

< ke_^mxs_f ijbf_j_ ijhp_kk 0 hij_^_ey_l fZkkb\ sbuf ihke_ q_]h jZkku- eZ_l _]h ih h^ghfm klhe[pm \k_f aZims_gguf ijhp_kkZf ijbeh`_gby J_- amevlZl gZ dZ`^hf ijhp_kk_ jZkiheZ]Z_lky \ fZkkb\_ rbuf.

 

real sbuf(size, size), rbuf(size)

 

if(rank .eq. 0) then

 

do 1 i = 1, size

 

do 1 j = 1, size

1

sbuf(i, j)=...

 

end if

 

if (numtasks .eq. size) then

 

call MPI_SCATTER(sbuf, size, MPI_REAL,

&

rbuf, size, MPI_REAL,

&

0, MPI_COMM_WORLD, ierr)

 

end if

MPI_SCATTERV(SBUF, SCOUNTS, DISPLS, STYPE, RBUF, RCOUNT, RTYPE, ROOT, COMM, IERR)

<type> SBUF(*), RBUF(*)

INTEGER SCOUNTS(*), DISPLS(*), STYPE, RCOUNT, RTYPE, ROOT, COMM, IERR

JZkkuedZ jZaebqgh]h dhebq_kl\Z ^Zgguo ba fZkkb\Z SBUF GZqZeh ihjpbc jZkkueZ_fuo ^Zgguo aZ^Z_l fZkkb\ DISPLS.

SCOUNTS p_ehqbke_gguc fZkkb\ kh^_j`Zsbc dhebq_kl\h we_f_glh\ i_j_- ^Z\Z_fuo dZ`^hfm ijhp_kkm bg^_dk jZ\_g jZg]m Z^j_kZlZ ^ebgZ jZ\gZ qbkem ijhp_kkh\ \ dhffmgbdZlhj_ COMM).

DISPLS p_ehqbke_gguc fZkkb\ kh^_j`Zsbc kf_s_gby hlghkbl_evgh gZ- qZeZ fZkkb\Z SBUF bg^_dk jZ\_g jZg]m Z^j_kZlZ ^ebgZ jZ\gZ qbkem ijhp_k- kh\ \ dhffmgbdZlhj_ COMM).

>Zggu_ ihkueZ_fu_ ijhp_kkhf ROOT ijhp_kkm J-1 jZaf_s_gu \ J-hf [ehd_ [mn_jZ SBUF dhlhjuc gZqbgZ_lky kh kf_s_gb_f \ DISPLS(J) we_f_glh\ lbiZ STYPE k gZqZeZ [mn_jZ SBUF.

41

MPI_ALLGATHER(SBUF, SCOUNT, STYPE, RBUF, RCOUNT, RTYPE, COMM, IERR)

<type> SBUF(*), RBUF(*)

INTEGER SCOUNT, STYPE, RCOUNT, RTYPE, COMM, IERR

K[hjdZ ^Zgguo ba fZkkb\h\ SBUF kh \k_o ijhp_kkh\ dhffmgbdZlhjZ COMM \ [mn_j_ RBUF dZ`^h]h ijhp_kkZ >Zggu_ khojZgyxlky \ ihjy^d_ \hajZklZgby ghf_jh\ ijhp_kkh\ ;ehd ^Zgguo ihkeZgguc ijhp_kkhf J-1 jZaf_sZ_lky \ J-hf [ehd_ [mn_jZ RBUF ijbgbfZxs_]h ijhp_kkZ Hi_jZpbx fh`gh jZkkfZl- jb\Zlv dZd MPI_GATHER ijb dhlhjhc j_amevlZl ihemqZ_lky gZ \k_o ijhp_kkZo dhffmgbdZlhjZ COMM.

Ke_^mxsZy ko_fZ beexkljbjm_l ^_ckl\b_ ijhp_^mju MPI_ALLGATHER.

MPI_ALLGATHERV(SBUF, SCOUNT, STYPE, RBUF, RCOUNTS, DISPLS, RTYPE, COMM, IERR)

<type> SBUF(*), RBUF(*)

INTEGER SCOUNT, STYPE, RCOUNTS(*), DISPLS(*), RTYPE, COMM, IERR

K[hjdZ gZ \k_o ijhp_kkZo dhffmgbdZlhjZ COMM jZaebqgh]h dhebq_kl\Z ^Zg- guo ba fZkkb\h\ SBUF Ihjy^hd jZkiheh`_gby ^Zgguo \ fZkkb\_ RBUF aZ^Z_l fZkkb\ DISPLS.

MPI_ALLTOALL(SBUF, SCOUNT, STYPE, RBUF, RCOUNT, RTYPE, COMM, IERR)

<type> SBUF(*), RBUF(*)

INTEGER SCOUNT, STYPE, RCOUNT, RTYPE, COMM, IERR

JZkkuedZ dZ`^uf ijhp_kkhf dhffmgbdZlhjZ COMM jZaebqguo ihjpbc ^Zgguo \k_f ^jm]bf ijhp_kkZf J-c [ehd ^Zgguo [mn_jZ SBUF (I-1)-]h ijhp_kkZ ih- iZ^Z_l \ I-c [ehd ^Zgguo [mn_jZ RBUF (J-1)-]h ijhp_kkZ

Ke_^mxsZy ko_fZ beexkljbjm_l ^_ckl\b_ ijhp_^mju MPI_ALLTOALL.

42

MPI_ALLTOALLV(SBUF, SCOUNTS, SDISPLS, STYPE, RBUF, RCOUNTS, RDISPLS, RTYPE, COMM, IERR)

<type> SBUF(*), RBUF(*)

INTEGER SCOUNTS(*), SDISPLS(*), STYPE, RCOUNTS(*), RDISPLS(*), RTYPE, COMM, IERR

JZkkuedZ kh \k_o ijhp_kkh\ dhffmgbdZlhjZ COMM jZaebqgh]h dhebq_kl\Z ^Zgguo \k_f ijhp_kkZf ^Zggh]h dhffmgbdZlhjZ JZaf_s_gb_ ^Zgguo \ [m- n_j_ SBUF hlkueZxs_]h ijhp_kkZ hij_^_ey_lky fZkkb\hf SDISPLS Z jZaf_- s_gb_ ^Zgguo \ [mn_j_ RBUF ijbgbfZxs_]h ijhp_kkZ hij_^_ey_lky fZkkb-

\hf RDISPLS.

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- \mxsbfb we_f_glZfb fZkkb\h\ SBUF J_amevlZl \uiheg_gby hi_jZpbb OP gZ^ I-fb we_f_glZfb fZkkb\h\ SBUF \k_o ijhp_kkh\ dhffmgbdZlhjZ COMM ihemqZ- _lky \ I-hf we_f_gl_ fZkkb\Z RBUF ijhp_kkZ ROOT.

< MPI ij_^mkfhlj_g jy^ ij_^hij_^_e_gguo ]eh[Zevguo hi_jZpbc hgb aZ^Z- xlky ke_^mxsbfb dhgklZglZfb

MPI_MAX, MPI_MIN hij_^_e_gb_ fZdkbfZevgh]h b fbgbfZevgh]h

agZq_gby

MPI_MINLOC, MPI_MAXLOChij_^_e_gb_ fZdkbfZevgh]h b fbgbfZev-

gh]h agZq_gby b bo f_klhiheh`_gby

MPI_SUM, MPI_PROD \uqbke_gb_ ]eh[Zevghc kmffu b ]eh[Zevgh]h

ijhba\_^_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´

 

43

Djhf_ lh]h ijh]jZffbkl fh`_l aZ^Zlv k\hx nmgdpbx ^ey \uiheg_gby ]eh- [Zevghc hi_jZpbb ijb ihfhsb ijhp_^mju MPI_OP_CREATE.

< ke_^mxs_f ijbf_j_ hi_jZpby ]eh[Zevgh]h kmffbjh\Zgby fh^_ebjm_lky ijb ihfhsb ko_fu k^\Zb\Zgby k bkihevah\Zgb_f i_j_kuehd ^Zgguo lbiZ lhqdZ-lhqdZ Wnn_dlb\ghklv lZdh]h fh^_ebjh\Zgby kjZ\gb\Z_lky k bkihevah- \Zgb_f dhee_dlb\ghc hi_jZpbb MPI_REDUCE.

 

program example14

 

include 'mpif.h'

 

integer ierr, rank, i, size, n, nproc

 

parameter (n = 1 000 000)

 

double precision time_start, time_finish

 

double 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 = size

 

do i = 1, n

 

a(i) = 1.d0/size

 

end do

 

call MPI_BARRIER(MPI_COMM_WORLD, ierr)

 

time_start = MPI_WTIME(ierr)

 

do i = 1, n

 

c(i) = a(i)

 

end do

 

do while (nproc .gt. 1)

 

if(rank .lt. nproc/2) then

 

call MPI_RECV(b, n, MPI_DOUBLE_PRECISION,

&

nproc-rank-1, 1, MPI_COMM_WORLD,

&

status, ierr)

 

do i = 1, n

 

c(i) = c(i) + b(i)

 

end do

 

else if(rank .lt. nproc) then

 

call MPI_SEND(c, n, MPI_DOUBLE_PRECISION,

&

nproc-rank-1, 1, MPI_COMM_WORLD, ierr)

 

end if

 

nproc = nproc/2

 

end do

 

do i = 1, n

 

b(i) = c(i)

 

end do

 

time_finish = MPI_WTIME(ierr)-time_start

 

if(rank .eq. 0) print *, 'model b(1)=', b(1)

 

print *, 'rank=', rank, ' model time =', time_finish

 

do i = 1, n

 

a(i) = 1.d0/size

 

end do

 

call MPI_BARRIER(MPI_COMM_WORLD, ierr)

44

 

time_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_start

 

if(rank .eq. 0) print *, 'reduce b(1)=', b(1)

 

print *, 'rank=', rank, ' reduce time =', time_finish

 

call MPI_FINALIZE(ierr)

 

end

MPI_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 \ lhf qlh j_amevlZl ihemqZ_lky \ fZkkb\_ RBUF dZ`^h]h ijhp_kkZ

< ke_^mxs_f ijbf_j_ dZ`^uc ijhp_kk \uqbkey_l ihkljhqgu_ kmffu we_- f_glh\ ehdZevgh]h fZkkb\Z a ihke_ q_]h ihemq_ggu_ kmffu kh \k_o ijhp_k- kh\ kdeZ^u\Zxlky ijb ihfhsb ijhp_^mju MPI_ALLREDUCE b j_amevlZl ihem- qZ_lky \ fZkkb\_ r gZ \k_o ijhp_kkZo ijbeh`_gby

do i = 1,

n

s(i) =

0.0

end do

 

do i = 1,

n

do j =

1, m

s(i) = s(i)+a(i, j)

 

end do

 

end do

 

call 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[Zevguo hi_jZpbc OP gZ^ khhl- \_lkl\mxsbfb we_f_glZfb fZkkb\h\ SBUF NmgdpbhgZevgh wlh wd\b\Ze_glgh lhfm qlh kgZqZeZ \uihegyxlky ]eh[Zevgu_ hi_jZpbb aZl_f j_amevlZl jZk- kueZ_lky ih ijhp_kkZf I-uc ijhp_kk ihemqZ_l (I+1)-mx ihjpbx j_amevlZ- lh\ ba RCOUNTS(I+1) we_f_glh\ b ihf_sZ_l \ fZkkb\ RBUF FZkkb\ RCOUNTS ^he`_g [ulv h^bgZdh\uf gZ \k_o ijhp_kkZo dhffmgbdZlhjZ COMM.

45

MPI_SCAN(SBUF, RBUF, COUNT, DATATYPE, OP, COMM, IERR) <type> SBUF(*), RBUF(*)

INTEGER COUNT, DATATYPE, OP, COMM, IERR

<uiheg_gb_ COUNT g_aZ\bkbfuo qZklbqguo ]eh[Zevguo hi_jZpbc OP gZ^ kh- hl\_lkl\mxsbfb we_f_glZfb fZkkb\h\ SBUF. I-uc ijhp_kk \uihegy_l COUNT ]eh[Zevguo hi_jZpbc gZ^ khhl\_lkl\mxsbfb we_f_glZfb fZkkb\Z SBUF ijh- p_kkh\ k ghf_jZfb hl 0 ^h I \dexqbl_evgh b ihf_sZ_l ihemq_gguc j_amev- lZl \ fZkkb\ RBUF Iheguc j_amevlZl ]eh[Zevghc hi_jZpbb ihemqZ_lky \ fZk- kb\_ RBUF ihke_^g_]h ijhp_kkZ

MPI_OP_CREATE(FUNC, COMMUTE, OP, IERR) EXTERNAL FUNC

LOGICAL COMMUTE

INTEGER OP, IERR

Kha^Zgb_ ihevah\Zl_evkdhc ]eh[Zevghc hi_jZpbb OP dhlhjZy [m^_l \uqbk- eylvky nmgdpb_c FUNC Kha^Z\Z_fZy hi_jZpby ^he`gZ [ulv ZkkhpbZlb\ghc Z _keb iZjZf_lj COMMUTE jZ\_g .TRUE. lh hgZ ^he`gZ [ulv lZd`_ b dhffmlZ- lb\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\ gZqbgZy k ijhp_kkZ k ghf_jhf 0.

FUNCTION FUNC(INVEC(*), INOUTVEC(*), LEN, TYPE) <type> INVEC(LEN), INOUTVEC(LEN)

INTEGER LEN, TYPE

LZdbf h[jZahf aZ^Z_lky bgl_jn_ck ihevah\Zl_evkdhc nmgdpbb ^ey kha^Zgby ]eh[Zevghc hi_jZpbb I_j\uc Zj]mf_gl hi_jZpbb [_j_lky ba iZjZf_ljZ INVEC \lhjhc Zj]mf_gl ba iZjZf_ljZ INOUTVEC Z j_amevlZl \ha\jZsZ_lky \ iZjZf_lj_ INOUTVEC IZjZf_lj LEN aZ^Z_l dhebq_kl\h we_f_glh\ \oh^gh]h b \uoh^gh]h fZkkb\h\ Z iZjZf_lj TYPE lbi \oh^guo b \uoh^guo ^Zgguo < ihevah\Zl_evkdhc nmgdpbb g_ ^he`gu ijhba\h^blvky gbdZdb_ h[f_gu ^Zggufb k bkihevah\Zgb_f \uah\h\ ijhp_^mj MPI.

MPI_OP_FREE(OP, IERR) INTEGER OP, IERR

Mgbqlh`_gb_ ihevah\Zl_evkdhc ]eh[Zevghc hi_jZpbb Ih \uiheg_gbb ijh- p_^mju i_j_f_gghc OP ijbk\Zb\Z_lky agZq_gb_ MPI_OP_NULL.

Ke_^mxsbc ijbf_j ^_fhgkljbjm_l aZ^Zgb_ ihevah\Zl_evkdhc nmgdpbb ^ey bkihevah\Zgby \ dZq_kl\_ ]eh[Zevghc hi_jZpbb AZ^Z_lky nmgdpby smod5, \uqbkeyxsZy ihwe_f_glgmx kmffm ih fh^mex 5 \_dlhjh\ p_ehqbke_gguo Zj]mf_glh\ >ZggZy nmgdpby h[ty\ey_lky \ dZq_kl\_ ]eh[Zevghc hi_jZpbb op \ \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_^mju

MPI_OP_FREE.

program example15

46

 

include 'mpif.h'

 

integer ierr, rank, i, n

 

parameter (n = 1 000)

 

integer a(n), b(n)

 

integer op

 

external smod5

 

call MPI_INIT(ierr)

 

call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)

 

do i = 1, n

 

a(i) = i + rank

 

end do

 

print *, '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. 0) print *, ' b(1) =', b(1)

 

call MPI_FINALIZE(ierr)

 

end

 

integer function smod5(in, inout, l, type)

 

integer l, type

 

integer in(l), inout(l), i

 

do i = 1, l

 

inout(i) = mod(in(i)+inout(i), 5)

 

end do

 

return

 

end

AZ^Zgby

Q_f dhee_dlb\gu_ hi_jZpbb hlebqZxlky hl \aZbfh^_ckl\bc lbiZ lhqdZ-lhqdZ"

<_jgh eb qlh \ dhee_dlb\guo \aZbfh^_ckl\byo mqZkl\mxl \k_ ijh- p_kku ijbeh`_gby?

Fh]ml eb \hagbdZlv dhgnebdlu f_`^m h[uqgufb khh[s_gbyfb ihku- eZ_fufb ijhp_kkZfb ^jm] ^jm]m b khh[s_gbyfb dhee_dlb\guo hi_jZ- pbc"?keb ^Z dZd hgb jZaj_rZxlky"

Fh`gh eb ijb ihfhsb ijhp_^mju MPI_RECV ijbgylv khh[s_gb_ ih- keZggh_ ijhp_^mjhc MPI_BCAST?

Kfh^_ebjh\Zlv [Zjv_jgmx kbgojhgbaZpbx ijb ihfhsb i_j_kuehd lhqdZ-lhqdZ b kjZ\gblv wnn_dlb\ghklv lZdhc j_ZebaZpbb b klZg^Zjlghc

ijhp_^mju MPI_BARRIER.

< q_f jZaebqb_ \ nmgdpbhgZevghklb ijhp_^mj MPI_BCAST b

MPI_SCATTER?

Kfh^_ebjh\Zlv ]eh[Zevgh_ kmffbjh\Zgb_ f_lh^hf k^\Zb\Zgby b kjZ\- gblv wnn_dlb\ghklv lZdhc j_ZebaZpbb k bkihevah\Zgb_f klZg^Zjlghc

ijhp_^mju MPI_REDUCE.

47

Kfh^_ebjh\Zlv ijhp_^mjm MPI_ALLREDUCE ijb ihfhsb ijhp_^mj

MPI_REDUCE b MPI_BCAST.

GZibrbl_ k\hc \ZjbZgl ijhp_^mju MPI_GATHER bkihevamy nmgdpbb ih- kuedb khh[s_gbc lbiZ lhqdZ-lhqdZ

Ih^mfZcl_ dZd hj]Zgbah\Zlv dhee_dlb\guc Zkbgojhgguc h[f_g ^Zg- gufb ZgZeh]bqguc nmgdpbb Z MPI_REDUCE [ MPI_ALLTOALL.

Bkke_^h\Zlv fZkrlZ[bjm_fhklv aZ\bkbfhklv \j_f_gb \uiheg_gby hl qbkeZ ijhp_kkh\ jZaebqguo dhee_dlb\guo hi_jZpbc gZ dhgdj_lghc kbkl_f_

=jmiiu b dhffmgbdZlhju

< MPI kms_kl\mxl rbjhdb_ \hafh`ghklb ^ey hi_jZpbc gZ^ ]jmiiZfb ijh- p_kkh\ b dhffmgbdZlhjZfb Wlh [u\Z_l g_h[oh^bfh \h-i_j\uo qlh[u ^Zlv \hafh`ghklv g_dhlhjhc ]jmii_ ijhp_kkh\ jZ[hlZlv gZ^ k\h_c g_aZ\bkbfhc ih^aZ^Zq_c <h-\lhjuo _keb hkh[_gghklv Ze]hjblfZ lZdh\Z qlh lhevdh qZklv ijhp_kkh\ ^he`gZ h[f_gb\Zlvky ^Zggufb [u\Z_l m^h[gh aZ\_klb ^ey bo \aZbfh^_ckl\by hl^_evguc dhffmgbdZlhj <-lj_lvbo ijb kha^Zgbb [b[ebhl_d ih^ijh]jZff gm`gh ]ZjZglbjh\Zlv qlh i_j_kuedb ^Zgguo \ [b[ebhl_qguo fh^meyo g_ i_j_k_dmlky k i_j_kuedZfb \ hkgh\ghc ijh]jZff_ J_r_gb_ wlbo aZ^Zq fh`gh h[_ki_qblv \ iheghf h[t_f_ lhevdh ijb ihfhsb kha^Zgby gh\h]h g_aZ\bkbfh]h dhffmgbdZlhjZ

Hi_jZpbb k ]jmiiZfb ijhp_kkh\

=jmiiZ wlh mihjy^hq_ggh_ fgh`_kl\h ijhp_kkh\ DZ`^hfm ijhp_kkm \

]jmii_ khihklZ\e_gh p_eh_ qbkeh jZg] beb ghf_j. MPI_GROUP_EMPTY

imklZy ]jmiiZ g_ kh^_j`ZsZy gb h^gh]h ijhp_kkZ MPI_GROUP_NULL

agZq_gb_ bkihevam_fh_ ^ey hrb[hqghc ]jmiiu

 

Gh\u_ ]jmiiu fh`gh kha^Z\Zlv dZd gZ hkgh\_ m`_ kms_kl\mxsbo ]jmii lZd b gZ hkgh\_ dhffmgbdZlhjh\ gh \ hi_jZpbyo h[f_gZ fh]ml bkihevah\Zlvky lhevdh dhffmgbdZlhju ;Zah\Zy ]jmiiZ ba dhlhjhc kha^Zxlky \k_ hklZevgu_ ]jmiiu ijhp_kkh\ k\yaZgZ k dhffmgbdZlhjhf MPI_COMM_WORLD \ g__ \oh^yl \k_ ijhp_kku ijbeh`_gby Hi_jZpbb gZ^ ]jmiiZfb ijhp_kkh\ y\eyxlky eh- dZevgufb \ gbo \h\e_dZ_lky lhevdh \ua\Z\rbc ijhp_^mjm ijhp_kk Z \uihe- g_gb_ g_ lj_[m_l f_`ijhp_kkgh]h h[f_gZ ^Zggufb Ex[hc ijhp_kk fh`_l ijhba\h^blv hi_jZpbb gZ^ ex[ufb ]jmiiZfb \ lhf qbke_ gZ^ lZdbfb dhlhju_ g_ kh^_j`Zl ^Zgguc ijhp_kk Ijb hi_jZpbyo gZ^ ]jmiiZfb fh`_l ihemqblvky imklZy ]jmiiZ MPI_GROUP_EMPTY.

48

MPI_COMM_GROUP(COMM, GROUP, IERR) INTEGER COMM, GROUP, IERR

Ihemq_gb_ ]jmiiu GROUP khhl\_lkl\mxs_c dhffmgbdZlhjm COMM < yaud_ Kb iZjZf_lj GROUP bf__l ij_^hij_^_e_gguc lbi MPI_Group Ihkdhevdm ba- gZqZevgh kms_kl\m_l _^bgkl\_gguc g_ljb\bZevguc dhffmgbdZlhj MPI_COMM_WORLD kgZqZeZ gm`gh ihemqblv khhl\_lkl\mxsmx _fm ]jmiim ijhp_kkh\ Wlh fh`gh k^_eZlv ijb ihfhsb ke_^mxs_]h \uah\Z

call MPI_COMM_GROUP(MPI_COMM_WORLD, group, ierr)

MPI_GROUP_INCL(GROUP, N, RANKS, NEWGROUP, IERR) INTEGER GROUP, N, RANKS(*), NEWGROUP, IERR

Kha^Zgb_ ]jmiiu NEWGROUP ba N ijhp_kkh\ ij_`g_c ]jmiiu GROUP k jZg]Zfb RANKS(1),…,RANKS(N) ijbq_f jZg]m RANKS(I) \ klZjhc ]jmii_ khhl\_lkl- \m_l jZg] I-1 \ gh\hc ]jmii_ Ijb N=0 kha^Z_lky imklZy ]jmiiZ MPI_GROUP_EMPTY <hafh`gh bkihevah\Zgb_ wlhc ijhp_^mju ^ey aZ^Zgby gh- \h]h ihjy^dZ ijhp_kkh\ \ ]jmii_

MPI_GROUP_EXCL(GROUP, N, RANKS, NEWGROUP, IERR) INTEGER GROUP, N, RANKS(*), NEWGROUP, IERR

Kha^Zgb_ ]jmiiu NEWGROUP ba ijhp_kkh\ ]jmiiu GROUP bkdexqZy ijhp_kku k jZg]Zfb RANKS(1),…,RANKS(N) ijbq_f ihjy^hd hklZ\rboky ijhp_kkh\ \ gh\hc ]jmii_ khhl\_lkl\m_l ihjy^dm ijhp_kkh\ \ klZjhc ]jmii_ Ijb N=0 kha^Z_lky ]jmiiZ b^_glbqgZy klZjhc ]jmii_

< ke_^mxs_f ijbf_j_ kha^Z_lky ^\_ g_i_j_k_dZxsboky ]jmiiu ijhp_kkh\ group1 b group2 gZ hkgh\_ ijhp_kkh\ ]jmiiu group < dZ`^mx ba kha^Z\Z_- fuo ]jmii \hc^_l ijbf_jgh iheh\bgZ ijhp_kkh\ ij_`g_c ]jmiiu ijb g_- q_lghf qbke_ ijhp_kkh\ \ ]jmiim group2 \hc^_l gZ h^bg ijhp_kk [hevr_

Ihjy^hd gmf_jZpbb ijhp_kkh\ \h \gh\v kha^Z\Z_fuo ]jmiiZo khojZgblky

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)

Ke_^mxsb_ ljb ijhp_^mju hij_^_eyxl hi_jZpbb gZ^ ]jmiiZfb ijhp_kkh\ dZd gZ^ fgh`_kl\Zfb Ba-aZ hkh[_gghkl_c gmf_jZpbb ijhp_kkh\ gb h[t_^b- g_gb_ gb i_j_k_q_gb_ ]jmii g_ dhffmlZlb\gu gh ZkkhpbZlb\gu

MPI_GROUP_INTERSECTION(GROUP1, GROUP2, NEWGROUP, IERR) INTEGER GROUP1, GROUP2, NEWGROUP, IERR

Kha^Zgb_ ]jmiiu NEWGROUP ba i_j_k_q_gby ]jmii GROUP1 b GROUP2 Ihem- q_ggZy ]jmiiZ kh^_j`bl \k_ ijhp_kku ]jmiiu GROUP1 \oh^ysb_ lZd`_ \ ]jmiim GROUP2 b mihjy^hq_ggu_ dZd \ i_j\hc ]jmii_

49

MPI_GROUP_UNION(GROUP1, GROUP2, NEWGROUP, IERR) INTEGER GROUP1, GROUP2, NEWGROUP, IERR

Kha^Zgb_ ]jmiiu NEWGROUP ba h[t_^bg_gby ]jmii GROUP1 b GROUP2 Ihem- q_ggZy ]jmiiZ kh^_j`bl \k_ ijhp_kku ]jmiiu GROUP1 \ ij_`g_f ihjy^d_ aZ dhlhjufb ke_^mxl ijhp_kku ]jmiiu GROUP2 g_ \hr_^rb_ \ ]jmiim GROUP1, lZd`_ \ ij_`g_f ihjy^d_

MPI_GROUP_DIFFERENCE(GROUP1, GROUP2, NEWGROUP, IERR) INTEGER GROUP1, GROUP2, NEWGROUP, IERR

Kha^Zgb_ ]jmiiu NEWGROUP ba jZaghklb ]jmii GROUP1 b GROUP2 Ihemq_ggZy ]jmiiZ kh^_j`bl \k_ we_f_glu ]jmiiu GROUP1 g_ \oh^ysb_ \ ]jmiim GROUP2 b mihjy^hq_ggu_ dZd \ i_j\hc ]jmii_

GZijbf_j imklv \ ]jmiim gr1 \oh^yl ijhp_kku 0, 1, 2, 4, 5 Z \ ]jmiim gr2 - ijhp_kku 0, 2, 3 gmf_jZpby ijhp_kkh\ aZ^ZgZ \ ]jmii_ khhl\_lkl\mxs_c dhffmgbdZlhjm MPI_COMM_WORLD Lh]^Z ihke_ \uah\h\

call MPI_GROUP_INTERSECTION(gr1, gr2, newgr1, ierr) call MPI_GROUP_UNION(gr1, gr2, newgr2, ierr)

call MPI_GROUP_DIFFERENCE(gr1, gr2, newgr3, ierr)

\ ]jmiim newgr1 \oh^yl ijhp_kku 0, 2; \ ]jmiim newgr2 \oh^yl ijhp_kku 0, 1, 2, 4, 5, 3; \ ]jmiim newgr3 \oh^yl ijhp_kku 1, 4, 5.

Ihjy^hd gmf_jZpbb ijhp_kkh\ \ ihemq_gguo ]jmiiZo khhl\_lkl\m_l ihjy^dm

bo i_j_qbke_gby

MPI_GROUP_SIZE(GROUP, SIZE, IERR)

INTEGER GROUP, SIZE, IERR

Hij_^_e_gb_ dhebq_kl\Z SIZE ijhp_kkh\ \ ]jmii_ GROUP.

MPI_GROUP_RANK(GROUP, RANK, IERR) INTEGER GROUP, RANK, IERR

Hij_^_e_gb_ ghf_jZ ijhp_kkZ RANK \ ]jmii_ GROUP ?keb \ua\Z\rbc ijhp_kk g_ \oh^bl \ ]jmiim GROUP lh \ha\jZsZ_lky agZq_gb_ MPI_UNDEFINED.

MPI_GROUP_TRANSLATE_RANKS(GROUP1, N, RANKS1, GROUP2, RANKS2, IERR)

INTEGER GROUP1, N, RANKS1(*), GROUP2, RANKS2(*), IERR

< fZkkb\_ RANKS2 \ha\jZsZxlky jZg]b \ ]jmii_ GROUP2 ijhp_kkh\ k jZg]Zfb RANKS1 \ ]jmii_ GROUP1 IZjZf_lj N aZ^Z_l qbkeh ijhp_kkh\ ^ey dhlhjuo gm`gh hij_^_eblv jZg]b

MPI_GROUP_COMPARE(GROUP1, GROUP2, RESULT, IERR)

INTEGER GROUP1, GROUP2, RESULT, IERR

50

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