/******************************************************************************/
/**
@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