/******************************************************************************/ /** @file "MPI/C/Primer 2 - threads/mpithreads_mpi.c" @brief Primer MPI programa za izracunavanje skalarnog proizvoda vektora. Ovaj program ilustruje upotrebu MPI-a u izracunavanju skalarnog proizvoda vektora. Sekvencijalnu verziju i verziju koja koristi POSIX niti mozete naci u sledecim primerima:@n @n Pthreads/C/Primer 4 - mutex/dot_product_simple.c @n Pthreads/C/Primer 4 - mutex/dot_product_threaded_mutex.c @n @n Svu MPI komunikaciju unutar jednog cvora odradjuje glavna nit programa na svakom od cvorova - ostale niti unutar tog cvora ne moraju biti svesne toga. Izabrana je upotreba SPMD modela sa replikacijom glavnih podataka na svim cvorovima. Za vece setove podataka savet je implementacija verzije koja je stedljivija u pogledu memorije.@n @n Autor ovog primera je Vijay Sonnad, IBM. Kod poslednje revizije, koju je izvrsio Blaise Barney, je preuzet iz Pthreads tutorijala sa adrese http://www.llnl.gov/computing/tutorials/pthreads/ i prilagodjen potrebama ovog kursa. */ /******************************************************************************/ #include #include #include /******************************************************************************/ /** @struct DOT_DATA @brief Ulazni podaci za obradu i razultat izvrsavanja Sledeca struktura sadrzi neophodne informacije koje dozvoljavaju funkciji dot_prod da pristupi njenim ulaznim podacima i da sacuva rezultate kako bi im se moglo kasnije pristupiti. Struktura je ostala nepromenjena u odnosu na sekvencijalnu verziju i Pthread verziju */ typedef struct { /** @property a @brief Adresa pocetka prvog niza */ double* a; /** @property b @brief Adresa pocetka drugog niza */ double* b; /** @property sum @brief Rezultat obrade (sumiranja) */ double sum; /** @property vec_len @brief Duzina nizova nad kojima se vrsi obrada */ int vec_len; } DOT_DATA; /******************************************************************************/ /** @def VEC_LEN @brief Duzina svakog vektora */ #define VEC_LEN 100 /** @var DOT_DATA dot_str @brief Globalno dostupne informacije neophodne dot_prod funkciji */ DOT_DATA dot_str; /******************************************************************************/ /** @brief Funkcija koja racuna skalarni proizvod @return Vraca genericki pokazivac na ? Funkcija dot_prod je veoma slicna onoj u sekvencijalnoj verziji ovog programa, osim sto sada svaki cvor radi na razlicitom delu podataka. Kao i ranije, sav pristup ulaznim fajlovima se vrsi preko strukture DOT_DATA i svi rezultati se upisuju nazad u istu strukturu. */ void* dot_prod(){ /* Zgodno je definisati i koristiti lokalne promenljive */ int i, start, end, myid, len; double mysum, *x, *y; /* Uzimamo rank ovog cvora */ MPI_Comm_rank (MPI_COMM_WORLD, &myid); len = dot_str.vec_len; start = myid * len; end = start + len; x = dot_str.a; y = dot_str.b; /* Izracunavamo skalarni proizvod i dodeljujemo rezultat odgovarajucem polju u strukturi */ mysum = 0; for (i=start; i