Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <mpi.h>
- using namespace std;
- int main(int argc, char *argv[])
- {
- int rang, brojProcesa;
- MPI::Init(argc, argv);
- // Kod neblokirajuće komunikacije (Irecv i Isend) ti treba ova tu varijabla tipa Request(pogledaj predložak)
- // Status treba i za blokirajuću i neblokirajuću komunikaciju
- MPI::Request zahtjev;
- MPI::Status status;
- // Podatak koji se šalje
- double podatak = 1.4;
- // Broj iteracija petlji
- int iter = 0;
- rang = MPI::COMM_WORLD.Get_rank();
- brojProcesa = MPI::COMM_WORLD.Get_size();
- // Prstenasta struktura radi samo ako imaš barem 3 procesa
- if (brojProcesa >= 3)
- {
- // Proces ranga 0 je proces inicijator koji vrti petlju s iteracijama
- if (rang == 0)
- {
- // Primamo podatak od zadnjeg procesa
- zahtjev = MPI::COMM_WORLD.Irecv(&podatak, 1, MPI::DOUBLE, brojProcesa - 1, MPI::ANY_TAG);
- // Šaljemo podatak sljedećem procesu (rang+7 je proizvoljan tag, stavi tu šta hoćeš)
- MPI::COMM_WORLD.Send(&podatak, 1, MPI::DOUBLE, rang + 1, rang + 7);
- // Testiramo jesmo li primili poruku od zadnjeg procesa, ako nismo, povećavamo broj iteracija
- while (!zahtjev.Test(status))
- {
- iter++;
- }
- cout << "Inicijator primio poruku od procesa ranga " << status.Get_source() << endl;
- cout << "Broj iteracija petlje: " << iter << endl;
- }
- else
- {
- // Primamo poruku od procesa manjeg ranga
- MPI::COMM_WORLD.Recv(&podatak, 1, MPI::DOUBLE, rang - 1, MPI::ANY_TAG, status);
- cout << "Proces " << rang << " je primio poruku od procesa " << status.Get_source() << endl;
- // Šaljemo poruku sljedećem procesu
- // Mora se vrtjeti ako imamo 4 procesa npr. 0->1->2->3->0
- // Stoga ovaj dio koda koji će odlučiti gdje se poruka šalje (rang == brojProcesa - 1 ? 0 : rang + 1)
- // Pa onda ako je trenutni rang 3, šalji procesu broj 0, inače šalji sljedećem procesu
- // Isto imamo proizvoljan tag na kraju (rang+7). Ako tagove mijenjaš, moraš ih promijeniti na oba mjesta
- // Moraju biti isti
- MPI::COMM_WORLD.Send(&podatak, 1, MPI::DOUBLE, (rang == brojProcesa - 1 ? 0 : rang + 1), rang + 7);
- }
- }
- MPI::Finalize();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement