Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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.
- 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.
- 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
- svi podaci, tako da svaka funkcija slanja odmah završava s radom.
- Koja od sljedećih tvrdnji najbolje opisuje situaciju i zašto?
- a) Oznaka poruke koju je primio proces 0 je 12.
- b) Oznaka poruke koju je primio proces 0 je 20.
- c) Oznaka poruke koju je primio proces 0 je 12 ili 20, ovisi o runtime sustavu.
- d) Uzevši u obzir dobivene informacije, niti za jednu od navedenih tvrdnji ne možemo sa sigurnošću reći da je istinita
- 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.
- 3.
- #include <iostream>
- #include <mpi.h>
- using namespace std;
- int main(int argc, char* argv[])
- {
- int rang, brojProcesa;
- MPI::Init(argc, argv);
- MPI::Request zahtjev;
- MPI::Status status;
- double podatak = 1.4;
- int iter = 0;
- rang = MPI::COMM_WORLD.Get_rank();
- brojProcesa = MPI::COMM_WORLD.Get_size();
- if(brojProcesa >= 3) {
- if(rang == 0) {
- zahtjev = MPI::COMM_WORLD.Irecv(&podatak, 1, MPI::DOUBLE, brojProcesa-1, MPI::ANY_TAG);
- MPI::COMM_WORLD.Send(&podatak, 1, MPI::DOUBLE, rang+1, rang+7);
- while(!zahtjev.Test(status)) {
- iter++;
- }
- cout << "Inicijator primio poruku od procesa ranga " << status.Get_source() << endl;
- cout << "Broj iteracija petlje: " << iter << endl;
- } else {
- 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;
- MPI::COMM_WORLD.Send(&podatak, 1, MPI::DOUBLE, (rang == brojProcesa-1 ? 0 : rang + 1), rang+7);
- }
- }
- MPI::Finalize();
- return 0;
- }
Add Comment
Please, Sign In to add comment