08.03.2015 Views

Ceo rad - PDF (1.3 MB)

Ceo rad - PDF (1.3 MB)

Ceo rad - PDF (1.3 MB)

SHOW MORE
SHOW LESS

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.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!