/******************************************************************************/
/**
@file "MPI/C/Primer 3 - ring/ring_skeleton.c"
@brief Primer skeleta kanonickog prstena.
Originalni primer je preuzet od:@n @n
Open Systems Laboratory, Indiana University,
i preradjen za potrebe ovog kursa.
*/
/******************************************************************************/
#include
#include
/******************************************************************************/
/**
@brief Glavni program
@param argc Broj argumenata komandne linije
@param argv Argumenti komandne linije
@return Vraca @b 0 ako je sve uspesno izvrseno
*/
int main(int argc, char* argv[]) {
int num;
int rank, size, tag, next, from;
MPI_Status status;
/* MPI inicijalizacija */
MPI_Init(&argc, &argv);
/* Trazimo svoj poredak unutar MPI sveta (prvi je 0) */
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
/* Trazimo velicinu MPI sveta */
MPI_Comm_size(MPI_COMM_WORLD, &size);
/*
Izaberemo 201 kao oznaku naseg programa (mada moze i neka druga
vrednost). Izracunamo rank sledeceg procesa u prstenu.
Koristimo operator % kako bi mogli da kruzimo po rednim brojevima
poredaka u MPI svetu.
*/
tag = 201;
next = (rank + 1) % size;
from = (rank - 1 + size) % size;
/*
Ako smo glavni proces, na konzoli, ucitamo ceo broj sa standardnog ulaza
kako bi odredili koliko puta zelimo da obidjemo prsten (MPI svet)
*/
if (rank == 0) {
printf("Enter the number of times around the ring: ");
scanf("%d", &num);
printf("Process %d sending %d to %d\n", rank, num, next);
/* Posaljemo broj narednom procesu u prstenu */
}
/*
Prosledjujemo poruku kroz prsten. Izlazni mehanizam radi po sledecem
principu: poruka (pozitivni ceo broj) se prosledjuje kroz prsten.
Svaki put kada prodje cvor sa rangom 0, dekrementira se. Kada svaki
proces primi poruku koja se sastoji od broja 0, prosledjuje poruku
sledecem procesu i zavrsava se. Prosledjivanjem nule kao prve poruke,
svaki proces prima nulu i normalno se zavrsava.
Ukratko: sve dok je broj koji prosledjujemo od procesa do procesa
veci od 0, setamo ga po MPI svetu.
*/
do {
if (rank == 0 && num ==0) break;
/* Ucitamo broj */
printf("Process %d received %d\n", rank, num);
/* Ako je na redu novi obilazak smanjimo broj */
if (rank == 0) {
num--;
printf("Process 0 decremented num\n");
}
printf("Process %d sending %d to %d\n", rank, num, next);
/* Prosledimo broj sledecem procesu u prstenu */
} while (num > 0);
printf("Process %d exiting\n", rank);
/*
Poslednji proces ima jedno slanje vise - procesu 0, koji mora da primi
tu poruku, kako bi se program zavrsio
*/
if (rank == 0) {
/* Primi broj */
}
/* Zavrsi MPI*/
MPI_Finalize();
return 0;
}
/******************************************************************************/