You are on page 1of 26

1

Structure of a MPI program



#include<mpi.h>
void main(int argc, char *argv[]) {
int rank,size
!"#$#nit(%argc, %argv)
!"#$&omm$rank(!"#$&'!!$(')*+,%rank)
!"#$&omm$size(!"#$&'!!$(')*+,%size)
,* ... & code ...*,
!"#$-inalize()
.
1. Parallel program to print Hello World using MPI.
#include <stdio.h>
#include <mpi.h>
int main (int argc, char **argv) {
int n"roc#d, n"roc/o
int n/ame*en
char sz!achine/ame[!"#$!01$")'&233')$/0!2]
!"#$#nit (%argc, %argv) ,, 3tart up !"#
!"#$&omm$size (!"#$&'!!$(')*+,%n"roc/o) ,, -ind out num4er o5 processes
!"#$&omm$rank (!"#$&'!!$(')*+, %n"roc#d) ,, -ind out process rank
2
!"#$6et$processor$name (sz!achine/ame, %n/ame*en) ,, 6et machine name
print5 (78ello (orld 5rom process 9d on 9s:r:n7, n"roc#d, sz!achine/ame)
i5 (n"roc#d ;; <)
print5 (7/um4er o5 "rocesses= 9d:r:n7, n"roc/o)
!"#$-inalize () ,, 3hut do>n !"#
return <.
[<?msc<<@AscseBhn C]Dmpicc hello.c
[<?msc<<@AscseBhn C]D mpirun Br ssh Bn EF .,a.out
(0)/#/6= Gna4le to read mpd.hosts or list o5 hosts isnHt provided. !"# Io4 >ill 4e run on the
current machine onlJ.
8ello (orld 5rom process KL on scseBhn
8ello (orld 5rom process FE on scseBhn
8ello (orld 5rom process L< on scseBhn
8ello (orld 5rom process F< on scseBhn
8ello (orld 5rom process MM on scseBhn
8ello (orld 5rom process ME on scseBhn
8ello (orld 5rom process EK on scseBhn
8ello (orld 5rom process @N on scseBhn
8ello (orld 5rom process MF on scseBhn
8ello (orld 5rom process LK on scseBhn
8ello (orld 5rom process F@ on scseBhn
8ello (orld 5rom process LO on scseBhn
3
8ello (orld 5rom process MK on scseBhn
8ello (orld 5rom process NK on scseBhn
8ello (orld 5rom process E on scseBhn
8ello (orld 5rom process M@ on scseBhn
8ello (orld 5rom process K< on scseBhn
8ello (orld 5rom process KE on scseBhn
8ello (orld 5rom process MO on scseBhn
8ello (orld 5rom process @L on scseBhn
8ello (orld 5rom process KF on scseBhn
8ello (orld 5rom process KK on scseBhn
8ello (orld 5rom process @< on scseBhn
8ello (orld 5rom process NM on scseBhn
8ello (orld 5rom process @O on scseBhn
8ello (orld 5rom process N? on scseBhn
8ello (orld 5rom process KN on scseBhn
8ello (orld 5rom process NF on scseBhn
8ello (orld 5rom process @M on scseBhn
8ello (orld 5rom process N on scseBhn
8ello (orld 5rom process K on scseBhn
8ello (orld 5rom process KO on scseBhn
8ello (orld 5rom process FO on scseBhn
8ello (orld 5rom process ? on scseBhn
4
8ello (orld 5rom process NE on scseBhn
8ello (orld 5rom process E< on scseBhn
8ello (orld 5rom process < on scseBhn
/um4er o5 "rocesses= EF
8ello (orld 5rom process LM on scseBhn
8ello (orld 5rom process @@ on scseBhn
8ello (orld 5rom process N@ on scseBhn
8ello (orld 5rom process LF on scseBhn
8ello (orld 5rom process NO on scseBhn
8ello (orld 5rom process NL on scseBhn
8ello (orld 5rom process M? on scseBhn
8ello (orld 5rom process LN on scseBhn
8ello (orld 5rom process M on scseBhn
8ello (orld 5rom process K? on scseBhn
8ello (orld 5rom process KM on scseBhn
8ello (orld 5rom process NN on scseBhn
8ello (orld 5rom process K@ on scseBhn
8ello (orld 5rom process ML on scseBhn
8ello (orld 5rom process LE on scseBhn
8ello (orld 5rom process F on scseBhn
8ello (orld 5rom process FK on scseBhn
8ello (orld 5rom process @ on scseBhn
5
8ello (orld 5rom process L? on scseBhn
8ello (orld 5rom process L on scseBhn
8ello (orld 5rom process @K on scseBhn
8ello (orld 5rom process @F on scseBhn
8ello (orld 5rom process @E on scseBhn
8ello (orld 5rom process FN on scseBhn
8ello (orld 5rom process @? on scseBhn
8ello (orld 5rom process LL on scseBhn
8ello (orld 5rom process FF on scseBhn
8ello (orld 5rom process MN on scseBhn
8ello (orld 5rom process FL on scseBhn
8ello (orld 5rom process FM on scseBhn
8ello (orld 5rom process L@ on scseBhn
8ello (orld 5rom process N< on scseBhn
8ello (orld 5rom process O on scseBhn
8ello (orld 5rom process F? on scseBhn
8ello (orld 5rom process M< on scseBhn
6
2. Program to calculate biggest and smallest among three numbers in two
different processes in parallel
#include<stdio.h>
#include<mpi.h>
int main(int argc,char **argv)
{
int a;K,4;O,c;L
int p
int id
!"#$#nit(%argc,%argv)
!"#$&omm$size(!"#$&'!!$(')*+,%p)
!"#$&omm$rank(!"#$&'!!$(')*+,%id)
i5(id;;<){
i5(a>4 %% a>c)
print5(7*argest among 9d 9d 9d is ;9d :n 7,a,4,c,a)
i5(4>c %% 4>a)
print5(79d is largest among 9d 9d 9d:n7,4,a,4,c)
i5(c>a %% c>4 )
print5(79d is largest:n7,c).
i5(id;;K){
i5(a<4 %% a<c)
7
print5(73mallest num4er; 9d:n7,a)
i5(4<a %% 4<c)
print5(73mallest num4er; 9d:n7,4)
i5(c<a %% c<4)
print5(73mallest num4er;9d:n7,c) .
print5(7"rocess 9d has 5inished task:n7,id)
!"#$-inalize()
55lush(stdout)
return <
.
[<?msc<<@AscseBhn C]D mpicc 4ig.c
[<?msc<<@AscseBhn C]D mpirun Br ssh Bn F .,a.out
(0)/#/6= Gna4le to read mpd.hosts or list o5 hosts isnHt provided. !"# Io4 >ill 4e run on the
current machine onlJ.
O is largest among K O L
"rocess < has 5inished task
3mallest num4er; K
"rocess K has 5inished task
8
.Sum of ! natural numbers with elapsed time and pri"ate and public data
can be anal#$ed here
#include<stdio.h>
#include<mpi.h>
int main(int argc,char **argv)
{
int i
int p,pF
int id
int glo4al$sum
int sum
dou4le start$time,5inish$time
!"#$#nit(%argc,%argv)
!"#$Parrier(!"#$&'!!$(')*+)
start$time;!"#$(time()
!"#$&omm$size(!"#$&'!!$(')*+,%p)
!"#$&omm$rank(!"#$&'!!$(')*+,%id)
pF;pBK
i5(idQ;<) { sum;<
5or(i;idi<;K<<iR;pF) sumR;i
.
9
else{sum;<.
print5(7process 9d is done sum ; 9d :n7,id,sum)
!"#$)educe(%sum,%glo4al$sum,K,!"#$#/S,!"#$3G!,<,!"#$&'!!$(')*+)
5inish$time;!"#$(time()
!"#$-inalize()
55lush(stdout)
i5(id;;<){
print5(7She total sum ; 9d:n7,glo4al$sum)
print5(7Sime elapsed; 9.KN5:n7,5inish$timeBstart$time)
.
return <
.
****Shis programme can 4e modi5ied to 5ind the sum o5 the sTuare o5 natural num4ers.
[<?msc<<@AscseBhn C]D mpicc sum.c
[<?msc<<@AscseBhn C]D mpirun Br ssh Bn EF .,a.out
(0)/#/6= Gna4le to read mpd.hosts or list o5 hosts isnHt provided. !"# Io4 >ill 4e run on the
current machine onlJ.
process K is done sum ; EL
process L is done sum ; EE
process E is done sum ; O@
process M is done sum ; E?
10
process < is done sum ; <
process F is done sum ; E@
process @ is done sum ; OK
process KK is done sum ; ?L
process FN is done sum ; KFL
process K@ is done sum ; K<K
process LF is done sum ; LF
process KN is done sum ; K<L
process NM is done sum ; NM
process FM is done sum ; KK?
process F? is done sum ; KF?
process FO is done sum ; KFE
process KL is done sum ; ?E
process NK is done sum ; NK
process KM is done sum ; ??
process N< is done sum ; N<
process F< is done sum ; KKK
process MK is done sum ; MK
process M< is done sum ; M<
process KE is done sum ; K<@
process LN is done sum ; LN
process LK is done sum ; LK
11
process MO is done sum ; MO
process @F is done sum ; @F
process KF is done sum ; ?@
process F@ is done sum ; KFK
process FL is done sum ; KKE
process ME is done sum ; ME
process M? is done sum ; M?
process N is done sum ; OL
process @N is done sum ; @N
process L< is done sum ; L<
process NF is done sum ; NF
process FE is done sum ; KF@
process ML is done sum ; ML
process K< is done sum ; ?K
process ? is done sum ; O?
process L? is done sum ; L?
process FK is done sum ; KKL
process L@ is done sum ; L@
process @O is done sum ; @O
process @? is done sum ; @?
process LE is done sum ; LE
process MF is done sum ; MF
12
process NO is done sum ; NO
process NL is done sum ; NL
process KO is done sum ; K<E
process EK is done sum ; EK
process MN is done sum ; MN
process MM is done sum ; MM
process @K is done sum ; @K
process LM is done sum ; LM
process O is done sum ; OE
process K? is done sum ; K<?
process NN is done sum ; NN
process @< is done sum ; @<
process @@ is done sum ; @@
process NE is done sum ; NE
process M@ is done sum ; M@
process @E is done sum ; @E
process @L is done sum ; @L
process LO is done sum ; LO
process FF is done sum ; KK@
process LL is done sum ; LL
process N? is done sum ; N?
process N@ is done sum ; N@
13
process @M is done sum ; @M
process E< is done sum ; E<
She total sum ; @<@<
Sime elapsed; <.<<N@FFKEONM??<FL
%. Sum of odd and e"en numbers.
#include<stdio.h>
#include<mpi.h>
int main(int argc,char **argv)
{
int i
int p,pF
int id
int glo4al$sum$odd,glo4al$sum$even
int odd$sum,even$sum
dou4le start$time,5inish$time
!"#$#nit(%argc,%argv)
!"#$Parrier(!"#$&'!!$(')*+)
start$time;!"#$(time()
!"#$&omm$size(!"#$&'!!$(')*+,%p)
!"#$&omm$rank(!"#$&'!!$(')*+,%id)
14
pF;pBK
i5(idQ;<){
odd$sum;<
even$sum;<
5or(i;idi<;K<<iR;pF){
i5(i9FQ;<)
odd$sumR;i
else
even$sumR;i
.
.
else{odd$sum;<even$sum;<.
print5(7process 9d is done odd sum ; 9d and even sum; 9d :n7,id,odd$sum,even$sum)
!"#$)educe(%odd$sum,%glo4al$sum$odd,K,!"#$#/S,!"#$3G!,<,!"#$&'!!$(')*+)
!"#$)educe(%even$sum,%glo4al$sum$even,K,!"#$#/S,!"#$3G!,<,!"#$&'!!$(')*+
)
5inish$time;!"#$(time()
!"#$-inalize()
55lush(stdout)
i5(id;;<){
print5(7She total sum o5 odd num4ers ; 9d:n7,glo4al$sum$odd)
print5(7She total sum o5 even num4ers ; 9d:n7,glo4al$sum$even)
print5(7Sime elapsed; 9.KN5:n7,5inish$timeBstart$time)
15
.
return <.
[<?msc<<@AscseBhn C]D mpicc oddeven.c
[<?msc<<@AscseBhn C]D mpirun Br ssh Bn EF .,a.out
(0)/#/6= Gna4le to read mpd.hosts or list o5 hosts isnHt provided. !"# Io4 >ill 4e run on the
current machine onlJ.
process KO is done odd sum ; O? and even sum; KO
process LO is done odd sum ; < and even sum; LO
process O is done odd sum ; E? and even sum; O
process F< is done odd sum ; ?K and even sum; F<
process FF is done odd sum ; ?L and even sum; FF
process KL is done odd sum ; KL and even sum; OM
process @N is done odd sum ; < and even sum; @N
process L< is done odd sum ; < and even sum; L<
process @M is done odd sum ; < and even sum; @M
process MF is done odd sum ; < and even sum; MF
process MM is done odd sum ; < and even sum; MM
process MN is done odd sum ; < and even sum; MN
process LN is done odd sum ; < and even sum; LN
process KN is done odd sum ; OE and even sum; KN
process LM is done odd sum ; < and even sum; LM
process E< is done odd sum ; < and even sum; E<
16
process LF is done odd sum ; < and even sum; LF
process NM is done odd sum ; < and even sum; NM
process NF is done odd sum ; < and even sum; NF
process @O is done odd sum ; < and even sum; @O
process M is done odd sum ; E@ and even sum; M
process @ is done odd sum ; @ and even sum; EN
process @< is done odd sum ; < and even sum; @<
process MO is done odd sum ; < and even sum; MO
process @F is done odd sum ; < and even sum; @F
process @L is done odd sum ; @L and even sum; <
process FN is done odd sum ; ?E and even sum; FN
process KF is done odd sum ; OL and even sum; KF
process K is done odd sum ; K and even sum; EF
process NN is done odd sum ; < and even sum; NN
process FM is done odd sum ; ?@ and even sum; FM
process < is done odd sum ; < and even sum; <
process FO is done odd sum ; ?? and even sum; FO
process M? is done odd sum ; M? and even sum; <
process N< is done odd sum ; < and even sum; N<
process M< is done odd sum ; < and even sum; M<
process L is done odd sum ; L and even sum; EM
process KE is done odd sum ; KE and even sum; OO
17
process MK is done odd sum ; MK and even sum; <
process N@ is done odd sum ; N@ and even sum; <
process NO is done odd sum ; < and even sum; NO
process ? is done odd sum ; ? and even sum; O<
process @@ is done odd sum ; @@ and even sum; <
process FL is done odd sum ; FL and even sum; ?M
process @K is done odd sum ; @K and even sum; <
process @E is done odd sum ; @E and even sum; <
process ME is done odd sum ; ME and even sum; <
process F@ is done odd sum ; F@ and even sum; ?N
process K@ is done odd sum ; K@ and even sum; ON
process LL is done odd sum ; LL and even sum; <
process EK is done odd sum ; EK and even sum; <
process K? is done odd sum ; K? and even sum; ?<
process L? is done odd sum ; L? and even sum; <
process KM is done odd sum ; O@ and even sum; KM
process F is done odd sum ; EL and even sum; F
process FK is done odd sum ; FK and even sum; ?F
process K< is done odd sum ; OK and even sum; K<
process KK is done odd sum ; KK and even sum; OF
process N? is done odd sum ; N? and even sum; <
process NL is done odd sum ; NL and even sum; <
18
process LE is done odd sum ; LE and even sum; <
process M@ is done odd sum ; M@ and even sum; <
process ML is done odd sum ; ML and even sum; <
process NK is done odd sum ; NK and even sum; <
process @? is done odd sum ; @? and even sum; <
process FE is done odd sum ; FE and even sum; ?O
process L@ is done odd sum ; L@ and even sum; <
process F? is done odd sum ; F? and even sum; K<<
process E is done odd sum ; E and even sum; EO
process LK is done odd sum ; LK and even sum; <
process NE is done odd sum ; NE and even sum; <
process N is done odd sum ; EE and even sum; N
She total sum o5 odd num4ers ; F@<<
She total sum o5 even num4ers ; F@@<
Sime elapsed; <.<<@ML@?MLN<L@K@N
&. 'ind sum( a"erage( biggest and smallest among arra# elements.
#include<stdio.h>
#include<mpi.h>
int main(int argc,char **argv)
{
19
int a[K<<];{@,M,F,L,N,?,O,E,KM,M,@,F,M,FK.
int p
int id
int sum
int i,4ig,small
!"#$#nit(%argc,%argv)
!"#$&omm$size(!"#$&'!!$(')*+,%p)
!"#$&omm$rank(!"#$&'!!$(')*+,%id)
i5(id;;<){
4ig;a[<]
5or(i;<i<KMiRR)
{
i5(a[i]>4ig)
4ig;a[i]
.
print5(7She 4iggest num4er is; 9d:n7,4ig)
.
i5(id;;K){
small;a[<]
5or(i;<i<KMiRR)
{
i5(a[i]<small)
20
small;a[i]
.
print5(7:n She smallest num4er is; 9d:n7,small)
.
i5(id;;F){
sum;<
5or(i;<i<KMiRR)
sumR;i
print5(7:n She sum o5 the elements is; 9d:n7,sum)
print5(7:n She avg ; 957,sum,KM.<<)
.
print5(7"rocess 9d has 5inished task:n7,id)
!"#$-inalize()
55lush(stdout)
return <
.
[<?msc<<@AscseBhn C]D mpicc arr.c
[<?msc<<@AscseBhn C]D mpirun Br ssh Bn L .,a.out
(0)/#/6= Gna4le to read mpd.hosts or list o5 hosts isnHt provided. !"# Io4 >ill 4e run on the
current machine onlJ.
She 4iggest num4er is; FK
"rocess < has 5inished task
21
She smallest num4er is; F
She sum o5 the elements is; ?K
She avg ; N.@<<<<<"rocess F has 5inished task
"rocess K has 5inished task
). *ifferent loop+ chun,s
&Jclic alocation=
-or(i;idi<niR;p) ,,#d is process id % p is total num4er o5 processes
3aJ n;F< p;@
{+o operarion >ith the loop.
#terations assigned
"rocess < = <,@,K<,K@,F<
"rocess K= K,N,KK,KN
"rocess F= F,E,KF,KE
"rocess L= L,O,KL,KO
"rocess M= M,?,KM,K?
#5("#+;<)
22
{
-or(i;<i<K<iRR)
,,+o operation
.
#5("#+;K)
{
-or(i;KKi<F<iRR)
,,
.
U.. 3o on till maVimum num4er reaches.. Put this is not an e55ective method
-. .ommunication between to processes.
#include<mpi.h>
void main(int argc, char *argv[])
{
Wint rank, i, count
dou4le data[K<<],value[F<<]
!"#$3tatus status
!"#$#nit(%argc,%argv)
!"#$&omm$rank(!"#$&'!!$(')*+,%rank)
i5(rank;;K) {
5or(i;<i<K<<RRi) data[i];i
!"#$3end(data,K<<,!"#$+'GP*2,<,@@,!"#$&'!!$(')*+)
. else {
!"#$)ecv(value,F<<,!"#$+'GP*2,!"#$0/X$3'G)&2,@@,!"#$&'!!$(')
*+,%status)
23
print5(7"=9d 6ot data 5rom processor 9d :n7,rank, status.!"#$3'G)&2)
!"#$6et$count(%status,!"#$+'GP*2,%count)
print5(7"=9d 6ot 9d elements :n7,rank,count)
print5(7"=9d value[@];9l5:n7,rank,value[@])
.
!"#$-inalize()
.
BBBBBBBBBBBBBBBBBBBBBBBBBBBB
"= < 6ot data 5rom processor K
"= < 6ot K<< elements
"= < value[@];@.<<<<<<
/. .omputation of Pi
#include 7mpi.h7
#include <math.h>
int main(int argc, char *argv[])
{
int done ; <, n, mJid, numprocs, i, rc
dou4le "#F@+S ; L.KMK@?FN@L@O?E?LFLOMNFNML
dou4le mJpi, pi, h, sum, V, a
!"#$#nit(%argc,%argv)
!"#$&omm$size(!"#$&'!!$(')*+,%numprocs)
!"#$&omm$rank(!"#$&'!!$(')*+,%mJid)
>hile (Qdone) {
i5 (mJid ;; <) {
print5(72nter the num4er o5 intervals= (< Tuits) 7)
scan5(79d7,%n)
.
!"#$Pcast(%n, K, !"#$#/S, <, !"#$&'!!$(')*+)
i5 (n ;; <) 4reak
h ; K.< , (dou4le) n
sum ; <.<
5or (i ; mJid R K i <; n i R; numprocs) {
V ; h * ((dou4le)i B <.@)
sum R; M.< , (K.< R V*V)
.
mJpi ; h * sum
!"#$)educe(%mJpi, %pi, K, !"#$+'GP*2, !"#$3G!, <,
!"#$&'!!$(')*+)
i5 (mJid ;; <)
print5(7pi is approVimatelJ 9.KN5, 2rror is 9.KN5:n7,
pi, 5a4s(pi B "#F@+S))
24
.
!"#$-inalize()
return <
.
0. Program to demonstrate MPI deri"ed data t#pes.
#include<mpi.h>
void main(int argc, char *argv[]) {
int rank
!"#$status status
struct{
int V
int J
int z
.point
!"#$+atatJpe ptJpe

!"#$#nit(%argc,%argv)
!"#$&omm$rank(!"#$&'!!$(')*+,%rank)
!"#$SJpe$contiguous(L,!"#$#/S,%ptJpe)
!"#$SJpe$commit(%ptJpe)
i5(rank;;L){
point.V;K@ point.J;FL point.z;N
!"#$3end(%point,K,ptJpe,K,@F,!"#$&'!!$(')*+)
. else i5(rank;;K) {
!"#$)ecv(%point,K,ptJpe,L,@F,!"#$&'!!$(')*+,%status)
print5(7"=9d received coords are (9d,9d,9d) :n7,rank,point.V,point.J,point.z)
.
!"#$-inalize()
.
BBBBBBBBBBBBBBBBBBBBBBBBBBBB
"=K received coords are (K@,FL,N)
25
11. 2ector data t#pe e3ample.
Gser completelJ speci5ies memorJ locations de5ining the 7vector7
&= int !"#$SJpe$vector (int count, int 4locklength, int stride,
!"#$+atatJpe oldtJpe, !"#$+atatJpe *ne>tJpe)
2ector *atat#pe 43ample
count ; F
stride ; @
4locklength ; L
#include<mpi.h>
void main(int argc, char *argv[]) {
int rank,i,I
!"#$status status
dou4le V[M][O]
!"#$+atatJpe coltJpe
!"#$#nit(%argc, %argv)
!"#$&omm$rank(!"#$&'!!$(')*+,%rank)
!"#$SJpe$vector(M,K,O,!"#$+'GP*2,%coltJpe)
!"#$SJpe$commit(%coltJpe)
i5(rank;;L){
5or(i;<i<MRRi)
5or(I;<I<ORRI) V[i][I];po>(K<.<,iRK)RI
26
!"#$3end(%V[<][E],K,coltJpe,,K,@F,!"#$&'!!$(')*+)
. else i5(rank;;K) {
!"#$)ecv(%V[<][F],K,coltJpe,,L,@F,!"#$&'!!$(')*+,%status)
5or(i;<i<MRRi)print5(7"=9d mJ V[9d][F];9K5:n7,rank,i,V[i][F])
.
!"#$-inalize()
.
BBBBBBBBBBBBBBBBBBBBBBBBBBBB
"=K mJ V[<][F];KE.<<<<<<
"=K mJ V[K][F];K<E.<<<<<<
"=K mJ V[F][F];K<<E.<<<<<<
"=K mJ V[L][F];K<<<E.<<<<<<

You might also like