1. Motivaţia


Calculul rezultat direct din definiţie



Yüklə 232,21 Kb.
səhifə3/3
tarix05.09.2018
ölçüsü232,21 Kb.
#76744
1   2   3

Calculul rezultat direct din definiţie:



Fig. 5.1
Figura de mai sus arată cum se va calcula elementul (1,2) si (3,3) al matrici rezultante AB daca A este o matrice cu 4 linii si 2 coloane si B este o matrice cu 2 linii si 3 coloane. Elementele din fiecare matrice sunt grupate in direcţia săgeţilor. Fiecare pereche este înmulţită element cu element, si produsul fiecărei înmulţiri este sumat. Poziţia acestui nou element calculat corespunde liniei si coloanei ce fac parte din pereche:



Un exemplu simplist al acestei metode este adus mai jos :



  1. Metoda coeficient-vector:

Produsul matriceal poate fi efectuat si utilizând o altă metodă. Această metodă constă in sumarea vectorilor împreună după ce aceştia au fost înmulţiţi cu diferiţi coeficienţi.

Dacă A şi B sunt matrici date de:

,

atunci:


Exemplul de mai sus, insă, utilizând această metoda devine:




Liniile matrici din stânga reprezintă coeficienţii pe când matricea din dreapta e considerată o listă de vectori. Ecuaţia poate fi simplificată şi mai mult:

Termenii acestei sume sunt matricele ce au aceeaşi formă, fiecare descriind efectul unei coloane din A şi al unei linii din B ca rezultat. Coloanele lui A pot fi văzute ca un sistem de coordonate al transformării. Fie un vector x, avem:



, unde sunt coordonatele de-a lungul axei .

Termenii sunt la fel ca cu diferenţa că conţine coordonata i pentru fiecare coloana din B.

Acelaşi exemplu rescris devine:

Vectorii şi au fost transformaţi în si in paralel. Aceştia pot fi transformaţi unul câte unul utilizând aceiaşi paşi:





  1. Metoda listelor de vectori

Produsul matricial poate fi văzut şi ca un produs scalar intre vectorii coloana şi vectorii linie. Fie matricile A si B date de:



,

unde este vectorul linie al tuturor elementelor de forma , este vectorul linie al tuturor elementelor de forma etc., si este vectorul coloana al tuturor elementelor de forma , este vectorul coloana al tuturor elementelor de forma etc. Rezultatul poate fi scris ca:


Produsul matricial nu este comutativ ceea ce înseamnă că , exceptând câteva cazuri speciale. Este uşor de înţeles de ce: nu poate fi aşteptat acelaşi rezultat atunci când proporţiile vectorilor sunt diferite. Este de asemenea uşor de înţeles de ce ordinea factorilor determina rezultatul atât timp cât numărul coloanelor in matricea proporţiilor trebuie sa fie egal cu numărul liniilor în matricea vectorilor: trebuie ambele să reprezinte acelaşi număr de vectori. Deşi produsul matricial nu este comutativ, determinaţii AB şi BA sunt întotdeauna egali (data A si B sunt matrici pătrate de aceleaşi dimensiuni). Produsul matricial este comutativ când ambele matrici sunt diagonale şi de aceleaşi dimensiuni.



5.3 Algoritmii produsului matricial

Mai jos sunt prezentaţi toţi algoritmii ce pot fi utilizaţi pentru calculul produsului matricial:





  • Metoda naivă

Acest algoritm presupune utilizarea modelului matematic reprezentat mai sus pentru a calcula matricea rezultantă. Complexitatea operaţiei de produs a doua matrici poate fi naiv determinat ca fiind . Acest algoritm, deşi cel mai lent este utilizat pe larg din motivul că este simplu de implementat si prezintă un înalt grad de stabilitate numerică.




  • Algoritmul lui Strassen

A fost dedus de către Volker Strassen în 1969, numit adesea si „produs matriceal rapid”, se bazează pe o metoda ingenioasă de înmulţire al matricilor de dimensiuni care necesită doar 7 înmulţiri în loc de 8.

Aplicând acest calcul intr-un mod recursiv vom obţine un algoritm cu complexitatea .
Fie A si B doua matrici pătrate. Se doreşte calculul matricei C:

unde
Dacă matricile nu sunt de tipul , liniile şi coloanele lipsă vor fi umplute cu zerouri. În continuare matricile A, B si C vor fi partiţionate în matrici bloc de dimensiuni egale:
,,
având . Atunci:







Folosind aceste transformări noi nu am redus numărul de înmulţiri ce trebuie efectuate.

Este nevoie de 8 înmulţiri pentru a calcula ca şi in cazul algoritmului standard.

Urmează partea importantă al algoritmului. Sunt definite matrici noi:

,,,

Matricile sunt utilizate pentru a exprima matricile . Datorita definiţiei matricilor putem elimina o înmulţire şi reduce numărul acestora la 7:



, ,

,

Iterăm acest proces de divizare n ori până când sub-matricile degenerează în numere.


Practic, însă, acestui algoritm ii lipseşte stabilitatea numerica si este extrem de complicat si pentru a fi utilizat in aplicaţii.



  • Algoritmul „celui mai mic exponent cunoscut”

A fost prezentat de către Don Coppersmith şi Shmuel Winograd in 1990 are o complexitate asimptotică de . Este asemănător cu algoritmul lui Strassen: un mod ingenios de înmulţire a matrici cu mai puţin de operaţii de înmulţire. Această tehnică este la fel aplicată recursiv. La fel ca şi algoritmul lui Strassen acesta nu se aplica des: numai in cazurile in care matricile ce trebuie înmulţite sunt prea mari pentru a fi evaluate pe un calculator contemporan.

Deoarece orice algoritm utilizat pentru a calcula produsul a două matrici de dimensiuni trebuie sa înmulţească valori, este definită o asimptotă inferioara de operaţii.
5.4. Descrierea algoritmului selectat

Prezenta lucrare descrie utilizarea algoritmului „naiv” ce presupune complexitatea . Acesta decizie a fost luata din mai multe cauze lesne de înţeles:




  1. Complexitatea relativ scăzută a implementării acestuia este un factor decisiv. Acest lucru este reflectat în natura „paralelizabilă” a problemei, un factor ce permite distribuţia calculelor acesteia.

Pentru a înţelege această decizie mai bine trebuie înţeles termenul de „problemă natural paralelizabilă”. Acest termen a fost conceput pentru prima dată când a apărut nevoia distribuţiei calculelor pe mai multe unităţi de procesare. O problemă „natural paralelizabilă” este un care poate fi împărţită un sub-probleme ce pot fi evaluate complet separat pe diferite unităţi de calcul. Datele de intrare evaluate pe o unitate de calcul nu vor influenţa în nici un caz evaluarea datelor pe alte unităţi de procesare.




Fig. 5.2

Figura de mai sus denotă faptul că spaţiul datelor de intrare poate fi fracturat în mai multe seturi şi acestea evaluate independent, rezultatul fiind construit în paralel de toate unităţile de procesare.




  1. A fost aleasă metoda listelor de vectori pentru că aceasta prezintă cei mai buni parametri de paralelizare a datelor de intrare. În aşa fel, matricea A este împărţită în vectori-linie, şi matricea B în vectori-coloană:






Evaluarea fiecărui element din matricea rezultantă AB în paralel este elementul cheie în aplicarea calculului distribuit. În esenţă este utilizată această formulă de calcul:


Unde grupele , sunt evaluate in paralel pe toate unităţile de calcul. In practică acest lucru înseamnă că pentru 2 matrici: X cu 200 coloane şi 200 linii si Y cu 300 coloane si 200 linii, matricea rezultanta XY va conţine elemente ce vor fi calculate in paralel. Deci numărul total de seturi ce vor fi ditribuite este egal cu „Numărul de linii din matricea A” înmulţit cu „Numărul de coloane din matricea B”.





  1. Stabilitatea numerică al algoritmului este de asemenea un factor important ce a condus la alegerea acesteia.

Mai jos este expus codul propriu-zis ce va fi distribuit pe unităţile de calcul:



Object[] MatrixMultiply(params Object[] input)

{

Int32 sizeOfRow = (Int32)input[0];



Int32 countOfRows = (Int32)input[1];

Object[] results = new Object[countOfRows];


for (Int32 rowNumber = 0; rowNumber < countOfRows;

rowNumber++)

{

Double resultCell = 0;


for (Int32 i = 0; i < sizeOfRow; i++)

{

Double x = ((Double)input[i + 2]);



Double y = ((Double)input[

((rowNumber + 1) * sizeOfRow) + 2 + i]);


resultCell += (x * y);

}
results[rowNumber] = resultCell;

}
return results;

}


După cum se poate observa această metodă acceptă un set de intrare ce conţine următorii parametri importanţi:





  • Dimensiunea unei coloane din matricea A (este egală şi cu dimensiunea unei linii din matricea B).

  • Numărul liniilor ce trebuie înmulţite cu coloana dată. Această metodă poate înmulţi consecutiv mai multe linii cu coloana data pentru a minimiza traficul de reţea. Acest lucru însă nu se foloseşte deocamdată.

  • Coloana din matricea A.

  • Liniile din matricea B ce trebuie înmulţite scalar cu coloana din matricea A.

  • Algoritmul operează cu date de tip Double.

6. Rezultate şi testare

6.1. Analiza performanţelor

Un ultim aspect important al acestei lucrări este de a demostra capabilităţile sistemului într-un set de teste. Se va putea observa, deci, circumstanţele în care randamentul acestuia este maxim şi în ce cazuri este minim.

Se urmăreşte efectuarea unui număr de teste utilizând diferite configurări al algoritmului selectat (Produsul Matricial) şi compararea acestora într-un mod obiectiv. Trebuie de specificat că deşi timpul total de execuţie poate fi mai mare, acesta se datorează unor procese interne ce nu ar trebui calculate, din această cauza se cronometrează doar intervalul de timp de când sunt declarate primele rezultate până când este declarat sfârşitul execuţiei.



Acest set de teste vor utiliza doar LocalMachineRunner ce face parte din client. Nu se va distribui calculul pe alte calculatoare. De asemenea doar un singur miez va fi utilizat pentru evaluarea datelor. Nu este necesară echilibrarea încărcării.

- Sunt date matricile A cu 20 linii şi 40 coloane, matricea B cu 40 linii şi 30 de coloane.


Dimensiunea Cozii

Viteza medie (seturi/s)

Timpul de execuţie

1024

600

500 ms

256

600

500 ms

8

600

500 ms

- Sunt date matricile A cu 200 linii şi 400 coloane, matricea B cu 400 linii şi 300 de coloane.




Dimensiunea Cozii

Viteza medie (seturi/s)

Timpul de execuţie

1024

714

1m 27s

256

746

1m 13s

8

852

1m 6s



  • Evaluarea „doar local” pe 2 procesoare

Acest set de teste vor utiliza doar LocalMachineRunner ce face parte din client. Nu se va distribui calculul pe alte calculatoare. De asemenea doua miezuri vor fi utilizate pentru evaluarea datelor. Echilibrarea se face utilizând FairLoadBalancer.


- Sunt date matricile A cu 20 linii şi 40 coloane, matricea B cu 40 linii şi 30 de coloane.


Dimensiunea Cozii

Viteza medie (seturi/s)

Timpul de execuţie

1024

600

500 ms

256

600

500 ms

8

600

500 ms

- Sunt date matricile A cu 200 linii şi 400 coloane, matricea B cu 400 linii şi 300 de coloane.




Dimensiunea Cozii

Viteza medie (seturi/s)

Timpul de execuţie

1024

730

1m 16s

256

765

1m 12s

8

865

1m 4s

Se observă doar mici schimbări între cele moduri de testare. Acest lucru se datorează faptului că deşi algoritmul este executat pe 2 procesoare, acestea deja sunt utilizate de către alte fire de execuţie ceea ce face ca metoda evaluării locale să nu fie cea mai optimă soluţie.





  • Evaluarea „doar la distanţă” pe 2 calculatoare

Acest set de teste vor utiliza doar două calculatoare pe unităţi de execuţie Echilibrarea se face utilizând PredictiveLoadBalancer.


- Sunt date matricile A cu 20 linii şi 40 coloane, matricea B cu 40 linii şi 30 de coloane.


Dimensiunea Cozii

Viteza medie (seturi/s)

Timpul de execuţie

1024

200

1s 200ms

256

180

2s 400ms

8

120

4s

- Sunt date matricile A cu 200 linii şi 400 coloane, matricea B cu 400 linii şi 300 de coloane.




Dimensiunea Cozii

Viteza medie (seturi/s)

Timpul de execuţie

1024

210

2m 18s

256

175

2m 28s

8

130

3m 4s

În cazul distribuţiei calculelor pe mai multe calculatoare vitezele de calcul vor varia mult în dependenţă de calitatea conexiunilor, mărimea cozii şi mulţi alţi factori. Acest lucru face imposibilă o testare obiectivă al acestui mod.



6.2. Posibilitatea extinderii ulterioare

Deşi framework-ul DCalc pare destul de bine realizat pentru grupul său de probleme rezolvabile există totuşi o mulţime de puncte care pot fi ajustate şi extinse, sau chiar implementate:





  • Modulul de comunicaţii client-server poate fi extins pentru a permite utilizarea certificatelor SSL. În acest mod canalul de comunicaţie client-server poate fi securizat pe reţelele publice.



  • S-ar dori şi extinderea posibilităţilor sistemului în ce priveşte tipurile de date ce pot fi distribuite între unităţile de calcul. S-a precizat în capitolul 2 că sunt acceptate doar tipurile primitive precum numerele întregi sau cele cu virgulă mobilă. O ulterioară extensie al librăriei DCalcCore ar putea permite utilizarea oricărui tip de date serializabil.




  • Aplicaţia client ar putea fi extinsă pentru a permite o mai bună vizualizare al stării sistemului în timpul calculelor. Un număr mai mare de grafice ar putea fi plasate în interfaţa cu utilizatorul pentru a uşura analiza performanţelor întregului sistem.




  • Algoritmii în sine ar putea suferi schimbări dramatice precum posibilitatea de distribuţie al mai multor funcţii dinamice ce ar putea fi executate la diferite puncte al calculului. Această extensie ar oferi un larg avantaj pentru că ar servi drept bază implementării algoritmilor mult mai complecşi precum MapReduce ce este utilizat pe scară largă de către companiile contemporane.




  • Optimizări ai importantelor module din framework ar putea creşte performant cu mai mult de 50%. Acest pas este important pentru a reduce timpul de calcul global.

7. Bibliografie


1. Mitică Craus - Proiectarea algoritmilor, Editura Gheorghe Asachi, Iaşi, 2002


2. Mitică Craus, C. Amarandei, B. Romanescu - Algoritmi şi limbaje pentru calcul distribuit - Îndrumar de laborator
3. . Florin Leon, Mihai Horia Zaharia - Ingineria programării, Politehnium, Iaşi, 2005
4. Jeffrey Richter - Applied Microsoft .NET Framework Programming
5. M.H. Zaharia, Sisteme Paralele si distribuite, Ed. Gh. Asachi, 2003
6. http://www.w3.org/Protocols/, „HTTP - Hypertext Transfer Protocol”
7. http://msdn.microsoft.com, „MSDN”
8. http://en.wikipedia.org/



Yüklə 232,21 Kb.

Dostları ilə paylaş:
1   2   3




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin