//MUPS - Oktobar 2008 - zadatak 9 //trazenje najjeftinijeg voca na pijaci #include "mpi.h" #include using namespace std; enum proc {MASTER, SLAVE}; int main (int argc, char* argv[]) { //init MPI::Init(argc,argv); //dovtanje ranga i velicine komunikatora int rank = MPI::COMM_WORLD.Get_rank(); int size = MPI::COMM_WORLD.Get_size(); //ispisi poruke cout << "Hello MPI world!" << endl; cout << "Moj rang je: " << rank << endl; cout << "Ukupan broj procesa u ovom komunikatoru je: " << size << endl; //ovim splitom se zadrzava poredak rangova u novoformiranim grupama u odnosu na pocetne MPI::Intracomm new_comm = MPI::COMM_WORLD.Split(rank%3,0); //dohvatanje podataka za novu grupu int comm_size = new_comm.Get_size(); int new_rank = new_comm.Get_rank(); cout << "Rang u novom komunikatoru je: " << new_rank << endl; cout << "Ukupan broj procesa u novom komunikatoru je: " << comm_size << endl; //ako si master primi sljive, jabuke i ostalo sto treba, podeli posao, radi i vrati rezultat if (new_rank == MASTER) { int n; double* voce; //glavni master - jos i da procita sta treba if (rank == MASTER) { double* breskve; double* tresnje; double* dinje; cout << "Unesite broj tezgi: "; cin >> n; //posalji svima broj tezgi MPI::COMM_WORLD.Bcast(&n,1,MPI::INT,MASTER); breskve = new double[n]; tresnje = new double[n]; dinje = new double[n]; cout << "Unesite cene voca na tezgama: " << endl; for(int i=0;i> tezge[i].breskva; cin >> breskve[i]; cout << "Tresnje: "; //cin >> tezge[i].tresnja; cin >> tresnje[i]; cout << "Dinje: "; //cin >> tezge[i].dinja; cin >> dinje[i]; } //breskve ostaju meni voce = breskve; //tresnje saljem sledecem malom masteru MPI::COMM_WORLD.Send(tresnje,n,MPI::DOUBLE,1,0); //dinje poslednje malom masteru MPI::COMM_WORLD.Send(dinje,n,MPI::DOUBLE,2,0); delete [] tresnje; delete [] dinje; } //ovo su "mali" masteri, rangovi 1 i 2 else { //primi broj tezgi MPI::COMM_WORLD.Bcast(&n,1,MPI::INT,MASTER); voce = new double[n]; //primi svoje voce - svako zna koje je njegovo MPI::COMM_WORLD.Recv(voce,n,MPI::DOUBLE,MASTER,0); } //posalji voce svojim radnicima new_comm.Bcast(voce,n,MPI::DOUBLE,MASTER); //odredjivanje dela niza za obradi int chunk = n/comm_size; if (comm_size*chunk != n) chunk++; int my_start = new_rank*chunk; int my_end = (new_rank+1)