Documente Academic
Documente Profesional
Documente Cultură
Pentru fiecare din algoritmii din aceast lucrare este prezentat varianta secvenial i se dau
indicaii de paralelizare. Se cere s se implementeze algoritmii respectivi folosind bibliotecile Pthread,
OpenMP i MPI, s se testeze execuia corect secvenial i paralel i s se reprezinte graficele de
performane TP(p), S(p), E(p) (n execuia pe HPC). Parametrul p depinde de modul de programare:
pentru programare prin memorie partajat (Pthread i OpenMP) p = (1, 2, 4, 8, 12, 16); pentru sisteme
cu transfer de mesaje (MPI), p = (1, 2, 4, 8, 16, 32, 64); parametrul n se alege n funcie de algoritm.
5.2.
5.3.
Fie vectorii a[n] i b[n]; produsul lor scalar este suma produselor elementelor corespondente (ca
indice) ale vectorilor. Algoritmul secvenial:
sum = 0;
for (i = 0; i < n; i++)
sum += a[i]*b[i];
5.4.
Algoritmul conine o bucl simpl cu dependene ntre iteraii, deoarece fiecare iteraie citete i
poate s scrie n variabila partajat max.
Timpul de execuie secvenial este TS = n = O(n)
Paralelizarea se face la fel ca la reducerea paralel: bucla cu n iteraii de comparare a
elementelor vectorului a[n] este descompus (distribuit) unui numr de p thread-uri ale unei regiuni
paralele; fiecare thread memoreaz valoarea maxim local (din propria partiie) n variabila local pmax
i poziia ei n variabila pr.
Valoarea maxim global se obine n variabila partajat max prin compararea valorilor
variabilelor locale pmax folosind excluderea mutual.
Se va obine un algoritm paralel adaptiv, asemntor ca performane cu algoritmul de reducere
paralel. Se testeaz pentru n = (4096, 32768, 262144, 16777216).
5.5.
Suprafaa din planul Oxy ntre limitele de integrare (x1, x2, y1, y2) se mparte ntr-un numr de
n x n dreptunghiuri elementare, iar volumul de calculat se obine prin nsumarea volumelor tuturor
paralelipipedelor dreptunghice care au baza unul dintre dreptunghiurile elementare i nlimea egal
cu valoarea funciei f(x,y) n centrul dreptunghiului.
Algoritmul secvential de calcul pentru functia dat z = x3 + y 3 3x 3 y , n intervalul x1, x2,
y1, y2, folosind n x n diviziuni ale volumului de calculat, este urmtorul:
dx = (x2 x1)/n;
dy = (y2 y1)/n;
double functie(double x, double y){
return x*x*x+y*y*y-3*x-3*y;
}
vol = 0;
for (i = 0; i < n; i++) {
x = x1 + dx * (i + 0.5);
for (j = 0; j < n; j++){
y = y1 + dy * (j + 0.5);
vol += functie(x, y);
}
}
vol = vol*dx*dy;
Reprezentarea grafic a funciei date (realizat n limbajul R, aa cum este descris n lucrarea
dedicat limbajului R) este urmtoarea:
Rezultatele obinute prin integrare numeric se pot verifica cu valoarea obinut analitic [3].
1,2][1,2]
x 3 + y 3 3 x 3 y = 4.5
Executnd programul pentru diferite valori ale lui n, se observ c rezultatele obinute prin
integrare numeric sunt cu att mai apropiate de rezultatul analitic cu ct numrul de intervale de
integrare este mai mare:
3
16
64
128
512
4096
vol
-4.579102
-4.504944
-4.501236
-4.500077
-4.500001
x1 = -1;
x2 = 2;
ya = -1;
yb = 2;
dx, dy;
// n x n : numar de intervale
// numar thread-uri
// Numar repetari executie
// limite de integrare
// intervalele de calcul
// n divizibil cu p
last = first + s;
}
for(i = first; i < last; i++) {
x = x1 + dx * (i + 0.5);
for (j = 0; j < n; j++) {
y = ya + dy * (j + 0.5);
pvol += func(x, y);
}
}
pvol = pvol*dx*dy;
pthread_mutex_lock(&mutex);
vol += pvol;
pthread_mutex_unlock(&mutex);
return 0;
}
int main(int argc, char *argv[]) {
// Citire si verificare parametri linie de comanda ...
dx = (x2 - x1)/n;
dy = (yb - ya)/n;
// Alocarea datelor
int *params = (int*)malloc(sizeof(int)*p);
pthread_t ids = (pthread_t*)malloc(sizeof(pthread_t)*p);
// Initializare mutex
pthread_mutex_init(&mutex,0);
// Creare thread-uri si asteptare terminarii lor ...
return 0;
}
4 dx
1+ x2
Intervalul [0, 1] este mprit ntr-un numr de n subintervale de lime 1/n. Pentru fiecare
subinterval, algoritmul calculeaz aria dreptunghiului a crui nlime este astfel aleas nct curba
4/(1+x2) s intersecteze latura de sus a dreptunghiului n punctul de mijloc.
Aria dreptunghiului din pozitia i a intervalului [0, 1] are mijlocul bazei x = (i + 0.5) / n. Baza
(latimea) egala dreptunghiului este egala cu 1/n si inaltimea este y(x) = 4 / (1 + x*x).
Suma ariilor acestor dreptunghiuri aproximeaz aria mrginit de curb. Cu ct n este mai mare,
cu att aproximaia este mai bun, deoarece diferena dintre suma ariilor dreptunghiurilor i aria
mrginit de curb este mai mic. Algoritmul de calcul, n limbajul C, este urmatorul:
#define n .
// numar de subintervale
sum = 0.0;
for (i = 0; i < n; i++) {
x = (i + 0.5)/n;
sum += 4/(1 + x*x);
}
sum /= n;
Dezvoltai versiunile Pthread, OpenMP i MPI ale acestui algoritm. Executai algoritmul,
verificai rezultatul (ct de bun este aproxumarea lui n funcie de numrul de intervale de integrat
n). Executai algoritmul pe HPC, msurai i reprezentai performanele acestuia pentru n = (4096,
32768, 262144, 16777216).
Bibliografie
Toate referinele de la lucrrile precedente