Advertisement
filip710

lv2

Jan 23rd, 2020
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.23 KB | None | 0 0
  1. #include <iostream>
  2. #include <mpi.h>
  3. using namespace std;
  4. int main(int argc, char *argv[])
  5. {
  6.   int rang, brojProcesa;
  7.   MPI::Init(argc, argv);
  8.  
  9.   // Kod neblokirajuće komunikacije (Irecv i Isend) ti treba ova tu varijabla tipa Request(pogledaj predložak)
  10.   // Status treba i za blokirajuću i neblokirajuću komunikaciju
  11.   MPI::Request zahtjev;
  12.   MPI::Status status;
  13.   // Podatak koji se šalje
  14.   double podatak = 1.4;
  15.   // Broj iteracija petlji
  16.   int iter = 0;
  17.  
  18.   rang = MPI::COMM_WORLD.Get_rank();
  19.   brojProcesa = MPI::COMM_WORLD.Get_size();
  20.  
  21.   // Prstenasta struktura radi samo ako imaš barem 3 procesa
  22.   if (brojProcesa >= 3)
  23.   {
  24.     // Proces ranga 0 je proces inicijator koji vrti petlju s iteracijama
  25.     if (rang == 0)
  26.     {
  27.       // Primamo podatak od zadnjeg procesa
  28.       zahtjev = MPI::COMM_WORLD.Irecv(&podatak, 1, MPI::DOUBLE, brojProcesa - 1, MPI::ANY_TAG);
  29.       // Šaljemo podatak sljedećem procesu (rang+7 je proizvoljan tag, stavi tu šta hoćeš)
  30.       MPI::COMM_WORLD.Send(&podatak, 1, MPI::DOUBLE, rang + 1, rang + 7);
  31.       // Testiramo jesmo li primili poruku od zadnjeg procesa, ako nismo, povećavamo broj iteracija
  32.       while (!zahtjev.Test(status))
  33.       {
  34.         iter++;
  35.       }
  36.       cout << "Inicijator primio poruku od procesa ranga " << status.Get_source() << endl;
  37.       cout << "Broj iteracija petlje: " << iter << endl;
  38.     }
  39.     else
  40.     {
  41.       // Primamo poruku od procesa manjeg ranga
  42.       MPI::COMM_WORLD.Recv(&podatak, 1, MPI::DOUBLE, rang - 1, MPI::ANY_TAG, status);
  43.       cout << "Proces " << rang << " je primio poruku od procesa " << status.Get_source() << endl;
  44.  
  45.       // Šaljemo poruku sljedećem procesu
  46.       // Mora se vrtjeti ako imamo 4 procesa npr. 0->1->2->3->0
  47.       // Stoga ovaj dio koda koji će odlučiti gdje se poruka šalje (rang == brojProcesa - 1 ? 0 : rang + 1)
  48.       // Pa onda ako je trenutni rang 3, šalji procesu broj 0, inače šalji sljedećem procesu
  49.       // Isto imamo proizvoljan tag na kraju (rang+7). Ako tagove mijenjaš, moraš ih promijeniti na oba mjesta
  50.       // Moraju biti isti
  51.       MPI::COMM_WORLD.Send(&podatak, 1, MPI::DOUBLE, (rang == brojProcesa - 1 ? 0 : rang + 1), rang + 7);
  52.     }
  53.   }
  54.  
  55.   MPI::Finalize();
  56.   return 0;
  57. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement