Differences

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

Link to this comparison view

apd:laboratoare:09 [2021/01/11 13:17]
florin.mihalache [Sortarea folosind pipeline]
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 ==== +
-==== Exerciții ====+
apd/laboratoare/09.1610363830.txt.gz · Last modified: 2021/01/11 13:17 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