/******************************************************************************/ /** @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; } /******************************************************************************/