This shows you the differences between two versions of the page.
apd:laboratoare:09 [2021/01/11 13:11] florin.mihalache [Scan] |
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 ==== | + | |
- | ==== Pipeline ==== | + | |
- | ==== Calculul unui polinom folosind pipeline ==== | + | |
- | ==== Sortarea folosind pipeline ==== | + | |
- | ==== Rank Sort ==== | + | |
- | ==== Exerciții ==== | + |