Differences

This shows you the differences between two versions of the page.

Link to this comparison view

apd:laboratoare:09 [2021/01/11 13:23]
florin.mihalache [Exerciții]
apd:laboratoare:09 [2023/10/08 16:33] (current)
dorinel.filip
Line 1: Line 1:
-===== Laboratorul 09 - Operații distribuite în MPI ===== +===== Laboratorul 9 - Operații ​și prelucrări ​distribuite în MPI ===== 
- +Documentația de laborator s-a mutat la [[https://mobylab.docs.crescdi.pub.ro/docs/​parallelAndDistributed/​introduction|această adresă]].
-==== Reduce ==== +
-Operația de reduce (cunoscută în limbajele funcționale ​Haskell, Racket - drept fold) reprezintă un tip de operație prin care elementele unei colecții sunt restrânse / acumulate într-un singur rezultat, printr-o singură operație aplicată între elementele unei colecții (+, *, min, max etc.) +
- +
-Exemplu: +
-<​code>​ +
-l = [1, 2, 3, 4, 5, 6] +
-op = + +
-rezultat = 1 + 2 + 3 + 4 + 5 + 6 = 21 +
-</​code>​ +
- +
-În MPI, operația reduce este implementată în funcția MPI_Reduce, însă în cadrul laboratorului vom discuta cum poate fi implementată,​ de mână, această operație în MPI. +
- +
-Aici aveți atașate slide-uri, care descriu în detaliu pașii de implementare ai operației reduce: {{:​apd:​laboratoare:​reduce.pdf|slides}} +
- +
-În concluzie, ultimul proces va avea valoarea finală. +
- +
-Pseudocod:​ +
-<​code>​ +
-for (pas = 2; pas <= nr_procese; pas *= 2) +
- if (rank % pas == 0) +
- primește ​la procesul cu rank-ul ​[rank + (pas / 2)] +
- adună +
-        else if (rank % (pas / 2) == 0) +
-                trimite la procesul cu rank-ul ​[rank - (pas 2)] +
-</code> +
-==== Scan ==== +
-Operația de scan este similară operației de reduce (acumularea elementelor unei colecții într-un singur rezultat)Diferența față de reduce este că primul proces din comunicator deține rezultatul final, practic scan reprezintă inversul lui reduce. +
- +
-Exemplu: +
-<​code>​ +
-l = [1, 2, 3, 4, 5, 6] +
-op = + +
-rezultat = 1 + 2 + 3 + 4 + 5 + 6 = 21 +
- +
-Pași: +
-[1, 2, 3, 4, 5, 6] +
-[1, 3, 3, 4, 5, 6] +
-[1, 3, 6, 4, 5, 6] +
-[1, 3, 6, 10, 5, 6] +
-[1, 3, 6, 10, 15, 6] +
-[1, 3, 6, 10, 15, 21] -> rezultatul este 21 +
-</​code>​ +
- +
-Aici aveți atașate slide-uri, care descriu în detaliu pașii de implementare ai operației scan: {{:​apd:​laboratoare:​scan.pdf|slides}} +
- +
-Pseudocod:​ +
-<​code>​ +
-for (pas = 1; pas < nr_procese; pas *= 2) +
- if (rank + pas < nr_procese) +
- trimite la procesul cu rank-ul [rank + pas] +
-        else if (rank - pas > 0) +
-                primește de la procesul cu rank-ul [rank - pas] +
-                adună  +
-</​code>​ +
-==== Broadcast ==== +
-Operația de broadcast este o operație prin care un proces trimite o valoare tuturor proceselor din cadrul comunicatoruluiAceastă operație este reprezentată,​ în MPI, de MPI_Bcast (remember laboratorul 8). +
- +
-Aici aveți atașate slide-uri, care descriu în detaliu pașii de implementare ai operației broadcast: {{:​apd:​laboratoare:​broadcast.pdf|slides}} +
- +
-Pseudocod:​ +
-<​code>​ +
-for (pas = 1; pas < nr_procese; pas *= 2) +
- if (rank < pas and rank + pas < nr_procese) +
- trimite la procesul cu rank-ul [rank + pas] +
-        else if (rank >= pas and rank < pas * 2) +
-                primește de la procesul cu rank-ul [rank - pas] +
-</code> +
-==== Pipeline ==== +
-În domeniul de computer science, un pipeline reprezintă un concept folosit în proiectarea procesoarelor și al echipamentelor hardware prin care se crește numărul de instrucțiuni ce sunt executate într-o unitate de timp. +
- +
-Acest concept poate fi extins în MPI, unde un proces produce rezultate intermediare,​ care sunt transmise către procesul următor, care procesează și prelucrează rezultatele primite, pe care le trimite mai departe, către procesul următor, totul repetându-se până la ultimul proces. +
- +
-Slides cu explicații și exemple: {{:​apd:​laboratoare:​pipeline.pdf|slides}} +
- +
-==== Calculul unui polinom folosind pipeline ==== +
-Un polinom, în matematică, reprezintă o ecuație de tipul: f(x) = x^2 + 2 * x + 1, unde x reprezintă variabila din ecuație. +
- +
-În MPI, putem calcula un polinom folosind tehnica pipeline în felul următor: numărul de coeficienți va fi egal cu numărul de procese (care este egal cu numărul de pași din procesul de pipeline). În cazul exemplului de mai sus, o să avem 3 procese, fiecare proces corespunzând cu câte un coeficient din ecuație.  +
- +
-Aici aveți atașate slide-uri, care ilustrează pas cu pas: {{:​apd:​laboratoare:​polynom_pipeline.pdf|slides}} +
- +
-==== Sortarea folosind pipeline ==== +
-Dându-se un vector cu n elemente în ordine aleatoare, dorim să-l sortăm prin metoda pipeline, folosind MPI. Pentru aceasta, vom folosi o rețea cu n + 1 noduri (1 master și n workeri). +
- +
-Punctul final este momentul în care fiecare proces worker deține stocat unul din numerele din vectorul inițial, iar ''​rank[i]->​saved_value''​ < ''​rank[i + 1]->​saved_value''​ pentru orice i din [1, n). +
- +
-Fiecare worker este inițializat la început cu o valoare (-1 sau depinde de restricții),​ va primi (n - rank) numere de la rank-ul anterior și va trimite mai departe rank-ului următor (n - rank - 1) numere. +
- +
-Atunci când primește un număr, worker-ul îl va compara cu valoarea stocată: +
-  * dacă nr < saved_value,​ atunci salvăm noua valoare și o trimitem pe cea veche procesului următor +
-  * dacă nr >= saved_value,​ atunci o trimitem direct procesului următor +
- +
-La final, fiecare worker va trimite către master valoarea lui, iar master-ul va construi vectorul rezultat. Urmăriți slide-urile pas cu pas: {{:​apd:​laboratoare:​pipeline_sort.pdf|slides}} +
-==== Rank Sort ==== +
-Rank Sort este un algoritm de sortare a unui vector folosindu-se de rangul fiecărui element din vector. Rangul unui element presupune câte numere sunt mai mici decât el în vector. +
- +
-Pași: +
- +
-  - Se calculează rangul fiecărui element: pentru fiecare element din vector v[i], unde 0 <= i < N (N - dimensiunea vectorului),​ se numără câte elemente din vector v[j], j != i sunt mai mici: v[j] < v[i], 0 <= i, j < N, i != j. +
-  - Elementul de pe poziția “i” va fi pe poziția “rang” în noul vector sortat: q[rank] = v[i]. +
- +
-Algoritmul “Parallel rank sort” are ca scop paralelizarea pasului 1. Rangul fiecărui element poate fi căutat în paralel, adică fiecare proces sau fir de execuție va realiza căutarea rangurilor pentru elementele din intervalul său: [start, end). +
- +
-Complexitatea temporală a algoritmului este O(n^2), ceea ce face complexitatea în cazul paralelizării pasului 1 a lui să devină O(n^2 / p), p - numărul de procesoare / fire de execuție. +
- +
-==== Exerciții ==== +
-{{:​apd:​laboratoare:​lab9-skel.zip|Schelet laborator}} +
- +
-  - **(2p)** Implementați operația de reduction, unde fiecare proces are o valoare proprie, prin care avem o colecție de valori (a nu se folosi MPI_Reduction) +
-  - **(2p)** Implementați operația de scan, unde fiecare proces are o valoare proprie, prin care avem o colecție de valori (a nu se folosi MPI_Scan) +
-  - **(2p)** Implementați operația de calcul polinomial folosind pipeline, pentru f(5), unde f(x) reprezintă ecuația polinomială (construită prin citirea din fișier existentă în scheletul de cod, unde aveți hint-uri legate de implementare). Pentru testare, există două fișiere de test pentru input (a1.txt și a2.txt) și puteți să vă folosiți de oricare dintre ele, cu precizia că numărul de procese trebuie să fie același cu numărul de coeficienți. Pentru ușurință în testare, puteți folosi regulile run1 și run2 din Makefile. +
-  - **(2p)** Implementați sortarea prin pipeline, folosind scheletul de laborator și explicațiile din laborator și slide-uri +
-  - **(2p)** Să se sorteze un vector folosindu-se algoritmul “Rank sort”. Procesul “master” va genera vectorul și îl va popula cu elemente. Va trimite tot vectorul celorlalte procese. Fiecare proces este responsabil pentru calcularea pozițiilor unei anumite părți din vector. La final toate procesele trimit procesului “master” noile poziții calculate. Procesul “master” va aranja elementele conform noilor poziții primite. +
-  - **(2p)** Implementați operația de broadcast, prin care procesul 0 trimite o valoare tuturor proceselor (a nu se folosi MPI_Bcast) +
apd/laboratoare/09.1610364191.txt.gz · Last modified: 2021/01/11 13:23 by florin.mihalache
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0