This is an old revision of the document!


Laboratorul 09 - Operații distribuite în MPI

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:

l = [1, 2, 3, 4, 5, 6]
op = +
rezultat = 1 + 2 + 3 + 4 + 5 + 6 = 21

Î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: slides

În concluzie, ultimul proces va avea valoarea finală.

Pseudocod:

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)]

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:

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

Aici aveți atașate slide-uri, care descriu în detaliu pașii de implementare ai operației scan: slides

Pseudocod:

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ă 

Broadcast

Operația de broadcast este o operație prin care un proces trimite o valoare tuturor proceselor din cadrul comunicatorului. Această 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: slides

Pseudocod:

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]

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: slides

Calculul unui polinom folosind pipeline

Sortarea folosind pipeline

Rank Sort

Exerciții

apd/laboratoare/09.1610363645.txt.gz · Last modified: 2021/01/11 13:14 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