Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
174 Paralelizacija GA za rešavanje nekih NP-kompletnih problema<br />
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯<br />
nizu old_types[i] je dat u nizu blocklens[i], a smešta se na poziciju inds[i]. Na<br />
kraju se sve smešta u tip new_type.<br />
Primer D.1. Neka je tip type1 = {(double,0), (char,8)} sa extent = 16. Ako su T =<br />
(MPI_FLOAT, type1, MPI_CHAR), B = (2,1,3) i D = (0, 16, 26), tada poziv<br />
MPI_Type_struct(3,B,D,T,new_type) vraća vrednost:<br />
{(float,0), (float,4), (double,16), (char,24), (char,26), (char,27), char,28)}.<br />
Ponekad je potrebno pakovati podatke ako nisu zadati u uzastopnim<br />
memorijskim lokacijama. Funkcija MPI_Pack(inbuf, incount, datatype, outbuf,<br />
outsize, position, comm) pakuje poruku u baferu za slanje inbuf, tipa datatype<br />
čija je dužina incount, u bafer outbuf, dužine outsize izražene u bajtovima.<br />
Promenljiva position na početku predstavlja lokaciju na koju se u izlaznom<br />
baferu smešta pakovana poruka, a na kraju se vraća prva slobodna lokacija.<br />
Parametar comm predstavlja komunikator u kome će se slati data poruka.<br />
Funkcija vraća vrednosti preko outbuf i position.<br />
MPI_Unpack(inbuf, insize, position, outbuf, outcount, datatype, comm)<br />
raspakuje poruku inbuf tipa datatype veličine insize bajtova u bafer outbuf<br />
veličine outcount. Ulazna vrednost position je početak pakovane poruke, a<br />
izlazna je prva slobodna pozicija iza pakovane poruke.<br />
MPI_Pack_size(incount, datatype, comm, size) vraća promenljivom size<br />
dužinu pakovane poruke, odnosno povećanje promenljive position koje bi<br />
nastalo primenom funkcije MPI_Pack().<br />
MPI_Type_indexed(count, blocklens, inds, old_type, new_type) kopira stari<br />
tip old_type u niz od count blokova, gde je svaki blok višestruka kopija starog<br />
tipa. MPI_Type_hindexed() <strong>rad</strong>i isto samo su dužine blokova blocklens zadate u<br />
bajtovima.<br />
D.2.3 Pojedinačne komunikacije<br />
Funkcija MPI_Send(buffer, count, datatype, dest, tag, comm) vrši blokirajuće<br />
slanje poruke na standardan način. Poruka se uzima sa memorijske lokacije<br />
buffer, i sadrži count delova tipa datatype. Poruka sa datim tagom se šalje<br />
procesu sa rangom dest u tekućoj grupi koja je zadata komunikatorom comm.<br />
Odgovarajuće funkcije za baferisano, sinhrono i slanje po zahtevu su<br />
MPI_Bsend(), MPI_Ssend() i MPI_Rsend(). Dodavanjem prefiksa I zadaju se<br />
odgovarajuće varijante neblokirajućeg slanja poruka (MPI_Isend(),<br />
MPI_Issend() i MPI_Irsend()), sa dodatnim parametrom prequest koji sadrži<br />
pokazivač na strukturu za praćenje toka date komunikacije.<br />
Standardni način prijema poruke od procesa source se vrši funkcijom<br />
MPI_Recv(buffer, count, datatype, source, tag, comm, status), i to samo u<br />
slučaju ako parametri comm i tag odgovaraju poslatoj poruci. Ona se smešta u<br />
memoriju na lokaciju buffer, i sastoji se od count podataka tipa datatype. Status<br />
date komunikacije se može videti preko parametra status. Ostali načini prijema<br />
poruke se ostvaruju funkcijama sa istim prefiksima, ako i kod slanja poruke.<br />
Ukoliko ne znamo tačno od kog procesa možemo očekivati prijem poruke i sa<br />
kakvim tagom, na mesta odgovarajućih parametara možemo zadati vrednosti<br />
MPI_ANY_SOURCE ili MPI_ANY_TAG. Na taj način se ne vrši selekcija poruka<br />
po datom parametru, pa će dati proces primiti poruku od svakog procesa u datoj<br />
grupi ili poruku sa proizvoljnim tagom.