filip710

rrs_lv2

Sep 10th, 2020 (edited)
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.82 KB | None | 0 0
  1. 1. Za slanje 5.000 8 - bajtnih realnih brojeva upotrijebljen je MPI::Comm.Isend(). U vrijeme kada je pozvana funkcija MPI::Comm.Isend() MPI ima 35 kB slobodnog prostora u međuspremniku procesa pošiljatelja. Opišite što će se dogoditi s poslanom porukom (gdje će se nalaziti podaci, te da li će doći do blokiranja) i zašto.
  2.  
  3. Poslana poruka će doći u buffer, a do blokiranja neće doći ni u slučaju da nema nijednog procesa koji prima podatke iz buffera jer koristimo neblokirajuću funkciju, te će podaci samo ostati u bufferu.
  4.  
  5.  
  6. 2. Pretpostavite da je jedini komunikator u ovom zadatku MPI::COMM_WORLD. Nakon poziva funkcije MPI::Init() proces 1 odmah šalje dvije poruke procesu 0. Prva poruka ima oznaku 12, druga ima oznaku 20. Nakon poziva funkcije MPI::Init() i provjere da li postoje najmanje 2 procesa u komunikatoru MPI::COMM_WORLD, proces 0 poziva funkciju MPI::Recv() s argumentom izvora postavljen om na 1 i argumentom oznake postavljenom na MPI::ANY_TAG. Međuspremnik je dovoljno velik da u njega stanu
  7. svi podaci, tako da svaka funkcija slanja odmah završava s radom.
  8. Koja od sljedećih tvrdnji najbolje opisuje situaciju i zašto?
  9. a) Oznaka poruke koju je primio proces 0 je 12.
  10. b) Oznaka poruke koju je primio proces 0 je 20.
  11. c) Oznaka poruke koju je primio proces 0 je 12 ili 20, ovisi o runtime sustavu.
  12. d) Uzevši u obzir dobivene informacije, niti za jednu od navedenih tvrdnji ne možemo sa sigurnošću reći da je istinita
  13.  
  14. Ako se koristi blokirajuća Send funkcija, tada će proces 0 primiti poruku s oznakom 12. U slučaju da koristimo neblokirajuću Send funkciju, tada oznaka poruke ovisi o runtime sustavu.
  15.  
  16.  
  17.  
  18. 3.
  19. #include <iostream>
  20. #include <mpi.h>
  21. using namespace std;
  22. int main(int argc, char* argv[])
  23. {
  24. int rang, brojProcesa;
  25. MPI::Init(argc, argv);
  26. MPI::Request zahtjev;
  27. MPI::Status status;
  28. double podatak = 1.4;
  29. int iter = 0;
  30.  
  31. rang = MPI::COMM_WORLD.Get_rank();
  32. brojProcesa = MPI::COMM_WORLD.Get_size();
  33.  
  34. if(brojProcesa >= 3) {
  35. if(rang == 0) {
  36. zahtjev = MPI::COMM_WORLD.Irecv(&podatak, 1, MPI::DOUBLE, brojProcesa-1, MPI::ANY_TAG);
  37. MPI::COMM_WORLD.Send(&podatak, 1, MPI::DOUBLE, rang+1, rang+7);
  38. while(!zahtjev.Test(status)) {
  39. iter++;
  40. }
  41. cout << "Inicijator primio poruku od procesa ranga " << status.Get_source() << endl;
  42. cout << "Broj iteracija petlje: " << iter << endl;
  43. } else {
  44. MPI::COMM_WORLD.Recv(&podatak, 1, MPI::DOUBLE, rang-1, MPI::ANY_TAG, status);
  45. cout << "Proces " << rang << " je primio poruku od procesa " << status.Get_source() << endl;
  46. MPI::COMM_WORLD.Send(&podatak, 1, MPI::DOUBLE, (rang == brojProcesa-1 ? 0 : rang + 1), rang+7);
  47. }
  48. }
  49.  
  50. MPI::Finalize();
  51. return 0;
  52. }
Add Comment
Please, Sign In to add comment