Sunteți pe pagina 1din 8

Documentatie

Implementati in C++:
a) Adunarea a doua matrici de dimensiuni (n x m)
b)Inmultirea a doua matrici de diumensiune (n x k), respectiv (k x
m) folosind multithreading.
-Numarul de threduri p trebuie sa fie un parametru care poate fi
citit(modificat) inainte de inceperea executiei.
Datele de intrare corespunzatoare elementelor matricilor se vor
citi din fisier(care au fost create anterior folosind generare
aleatoare de numere)
Programul va afisa la sfarsit timpul global/ total T de executie
corespunzator operatiei de adunare(respectiv operatiei de
inmultire).
Testarea va include :
-variante orientate pe testarea corectitudinii(dimensiuni relativ
mici; de exemplu <10x10)
-variante orientate pe masurarea performantei(dimensiuni relativ
mari; de exemplu>1000x1000);

a)Diagrama de clase (adunare)

Clasa MatrixThread are o metoda, run() , care parcurge liniile


pe rand si desparte coloanele de la init la fin si face adunarea. Init
este un numar care reprezinta pozitia de unde incep sa despart
matricea, iar fin reprezinta pozitia pana unde despart matricea.
Clasa Main are 6 atribute: n - numarul de linii, m - numarul de
coloane, p-numarul de threduri, m1 - prima matrice generata in
fisier , m2 - a doua matrice generata in fisier si m3 - unde se va
afla rezultatul adunarii 2. Fiecare din cele 3 matrici are ca
dimensiuni nxm.
Aceasta clasa are urmatoarele metode: writeFile(),
readMatrix(), type().
Metoda writeFile() genereaza numere aleatorii pentru matrici.
Daca fisierul nu exista, atunci este creat, altfel nu.
Metoda readMatrix() citeste din fisier continutul celor 2 matrici cu
n linii si m coloane.
Metoda type() afiseaza pe ecran m3, rezultatul adunarii celor 2
matrici din fisier.

Metoda add() calculez catul si restul impartirii numarului de


coloane la numarul de threduri dat de utilizator. Apoi, folosesc 2
variabile init si fin pentru a alege de la cat la cat impart matricea
pe coloane. Acestea se calculeaza in functie de cat si daca exista
rest. Daca restul este diferit de zero, fin se mareste cu 1 + catul
cu fiecare iteratie a unui for pe numarul de threduri, iar din rest se
scade 1, impartindu-se astfel restul intr-un mod echilibrat intre
threduri. In caz contrar, fin creste tot timpul cu valoarea catului,
iar init devine valoarea anterioara a lui fin.
Metoda main() citeste de la tastatura numarul de threaduri,
genereaza in fisier continutul matricilor, le citeste si apoi afiseaza
rezultatul adunarii pe ecran.

Diferenta dintre programul in Java si programul in C++


consta in faptul ca in C++ metodele add si main nu apartin
niciunei clase.

b) Diagrama de clase(inmultire)

Clasa MatrixThread are o metoda, run() , care parcurge liniile


pe rand si desparte coloanele de la init la fin. In val retin suma
inmultirilor. . Init este un numar care reprezinta pozitia de unde
incep sa despart matricea, iar fin reprezinta pozitia pana unde
despart matricea.
Clasa Main are 7 atribute: n - numarul de linii, m - numarul de
coloane, p-numarul de threduri, k- numarul de coloane al primel
matrici si numarul de linii ale celei de a doua matrici, m1 - prima
matrice generata in fisier , m2 - a doua matrice generata in fisier
si m3 - unde se va afla rezultatul inmultirii celor 2 si are
dimensiunile nxm.
Aceasta
clasa
are
urmatoarele
metode:
readMatrix(), type() si typeOneMatrix().

writeFile(),

Metoda writeFile() genereaza numere aleatorii pentru matrici.


Daca fisierul nu exista, atunci este creat, altfel nu.

Metoda readMatrix() citeste din fisier continutul celor 2 matrici cu


n linii si m coloane.
Metoda type() afiseaza pe ecran m3, rezultatul inmultirii celor 2
mtrici din fisier.
Metoda typeOneMatrix() afiseaza pe ecran o matrice.

Metodele add() si main() nu apartin niciunei clase, spre


deosebire de java, unde erau in clasa Main.

In metoda add() calculez catul si restul impartirii numarului de


coloane la numarul de threduri dat de utilizator. Apoi, folosesc 2
variabile init si fin pentru a alege de la cat la cat impart matricea
pe coloane. Acestea se calculeaza in functie de cat si daca exista
rest. Daca restul este diferit de zero, fin se mareste cu 1 + catul
cu fiecare iteratie a unui for pe numarul de threduri, iar din rest se
scade 1, impartindu-se astfel restul intr-un mod echilibrat intre
threduri. In caz contrar, fin creste tot timpul cu valoarea catului,
iar init devine valoarea anterioara a lui fin.
Metoda main() citeste de la tastatura numarul de threaduri,
genereaza in fisier continutul matricilor, le citeste si apoi afiseaza
rezultatul inmultirii pe ecran.

Alte diferente:
In c++ metoda add() trebuie obligatoriu sa fie statica. Din
acest motiv, ea nu este in nicio clasa. De asemenea, in c+
+ cand vrei sa dai o matrice ca parametru, nu merge ca in
java a[][], ci te obliga sa dai a doua dimensiune. Din acest
motiv, avem o metoda in plus, typeOneMatrix().

Testare:
Adunare: n = 3, m = 4. Citesc de la tastatura p = 3.
Matricile generate in fisier sunt:
6 21 13 20
28 29 28 16
28 29 23 1
SI
18 7 5 29
26 0 10 4
18 24 18 26

Matricea rezultat este:


24 28 18 49
54 29 38 20
46 53 41 27

Timpul de executie este 6340 milisecunde.


Pentru o matrice cu 300 linii si 400 coloane si 3 threduri, timpul
de executie este: 9230 milisecunde.

Pentru o matrice cu 1000 linii si 1000 coloane si 4 threduri, timpul


de executie este: 20406 milisecunde.

Inmultire: n = 3, m = 4, k = 5. Citesc de la tastatura p = 2.


Matricile generate in fisier:
27 21 12 12 2
3 16 9 6
5 17 23 7 11
Si
28
11
20
17
15

21 24
21 22
10 16
0 1 8
19 26

16
6
29
17

Matricea rezultat este:


1461 1166 1366 1036
680 400 559 704
1071 901 1155 1092

Timpul de executie este 6982 milisecunde.

Pentru o matrice cu n = 300, m = 400 si k = 500, citesc un p = 3


de la tastatura. Timpul de executie este 9354 milisecunde.

Pentru o matrice cu n = 1000, m = 1100 si k = 1200, citesc un p


=10 de la tastatura. Timpul de executie este 40310 milisecunde.
Se poate observa ca timpul de executie in C++ este mult
mai mare decat in java.

S-ar putea să vă placă și