This shows you the differences between two versions of the page.
app:laboratoare:02 [2022/10/18 12:57] emil.slusanschi [Resurse] |
app:laboratoare:02 [2022/10/19 14:58] (current) emil.slusanschi [Clauza nowait] |
||
---|---|---|---|
Line 4: | Line 4: | ||
În OpenMP, când o structură de tip ''for'' este paralelizată fiecărui thread îi revine un număr egal de iterații din cadrul acelui for (aceasta este configuratia default). Uneori, se întâmplă ca iterațiile să fie echilibrate între ele în ceea ce privește workload-ul, alteori nu. Când workload-ul nu este echilibrat între thread-uri, pot apărea probleme în ceea ce privește performanțele programului - prin debalansarea incarcarii (load imbalance). | În OpenMP, când o structură de tip ''for'' este paralelizată fiecărui thread îi revine un număr egal de iterații din cadrul acelui for (aceasta este configuratia default). Uneori, se întâmplă ca iterațiile să fie echilibrate între ele în ceea ce privește workload-ul, alteori nu. Când workload-ul nu este echilibrat între thread-uri, pot apărea probleme în ceea ce privește performanțele programului - prin debalansarea incarcarii (load imbalance). | ||
- | Pentru a preveni situații când thread-urile au volume diferite de workload, există conceptul de scheduling în OpenMP. Pentru scheduling se folosește directiva ''schedule(tip_de_schedule, chunk_size)'', unde tipul de schedule poate fi: static, dynamic, guided, auto. Specificarea dimensiunii unui chunk este opționala. In cazul în care aceasta nu este specificată, acesta are o valoare default (in functie de tipul de schedule ales). | + | Pentru a preveni situații când thread-urile au volume diferite de workload, există conceptul de scheduling în OpenMP. Pentru scheduling se folosește directiva ''schedule(tip_de_schedule, chunk_size)'', unde tipul de schedule poate fi: static, dynamic, guided, auto. Specificarea dimensiunii unui chunk este opționala. In cazul în care aceasta nu este specificată, acesta are o valoare default (in functie de tipul de schedule ales). |
Exemplu de scheduling: | Exemplu de scheduling: | ||
Line 13: | Line 13: | ||
} | } | ||
</code> | </code> | ||
+ | |||
+ | Un exemplu grafic pentru cele trei tipuri de scheduling "clasic" poate fi vazut aici: | ||
+ | |||
+ | {{:app:laboratoare:openmp_scheduling.png?600|OpenMP Scheduling - RvdP@Sun}} | ||
+ | |||
+ | In cele ce urmeaza, vom lua pe rand cele trei tipuri de scheduling si le vom analiza individual. | ||
===== Static scheduling ===== | ===== Static scheduling ===== | ||
Line 138: | Line 144: | ||
</code> | </code> | ||
- | ===== nowait ===== | + | ===== Clauza nowait ===== |
Atunci când paralelizăm un for, există o barieră după fiecare for paralelizat, unde se așteaptă ca toate thread-urile din for-ul paralelizat să ajungă în același punct în același timp, ca apoi să-și continue execuția. | Atunci când paralelizăm un for, există o barieră după fiecare for paralelizat, unde se așteaptă ca toate thread-urile din for-ul paralelizat să ajungă în același punct în același timp, ca apoi să-și continue execuția. | ||
Line 145: | Line 151: | ||
#pragma omp parallel | #pragma omp parallel | ||
{ | { | ||
- | #pragma omp for nowait private(i) | + | #pragma omp for private(i) |
for (i = 0; i < 16; i++) { | for (i = 0; i < 16; i++) { | ||
c(i); | c(i); | ||
Line 173: | Line 179: | ||
{{:app:laboratoare:parallel_for_nowait.png?600|Rulare utilizand nowait}} | {{:app:laboratoare:parallel_for_nowait.png?600|Rulare utilizand nowait}} | ||
- | ===== Reduction ===== | + | ===== Directiva Reduction ===== |
''reduction'' este o directivă folosită pentru operații de tip reduce / fold pe arrays / colecții sau simple însumări / înmulțiri în cadrul unui loop. Mai precis, elementele dintr-un array sau indecșii unui loop sunt "acumulați" într-o singură variabilă, cu ajutorul unei operații, al cărui semn este precizat, in mod automat sincronizat peste mai multe threaduri. Nu orice operatie poate fi utilizata intr-o operatie de tip ''reduction''. | ''reduction'' este o directivă folosită pentru operații de tip reduce / fold pe arrays / colecții sau simple însumări / înmulțiri în cadrul unui loop. Mai precis, elementele dintr-un array sau indecșii unui loop sunt "acumulați" într-o singură variabilă, cu ajutorul unei operații, al cărui semn este precizat, in mod automat sincronizat peste mai multe threaduri. Nu orice operatie poate fi utilizata intr-o operatie de tip ''reduction''. | ||
Line 199: | Line 205: | ||
===== Resurse ===== | ===== Resurse ===== | ||
- | * Laboratorul a fost construit de catre Florin Mihalache si revizuit de catre Emil Slusanschi | ||
* {{:app:laboratoare:demo.zip|Demo laborator 2}} | * {{:app:laboratoare:demo.zip|Demo laborator 2}} | ||
* {{:app:laboratoare:skel.zip|Schelet laborator 2}} | * {{:app:laboratoare:skel.zip|Schelet laborator 2}} | ||
Line 206: | Line 211: | ||
* http://jakascorner.com/blog/ | * http://jakascorner.com/blog/ | ||
* https://ppc.cs.aalto.fi/ | * https://ppc.cs.aalto.fi/ | ||
- | * [Dynamic scheduling vs. Guided scheduling](https://stackoverflow.com/questions/42970700/openmp-dynamic-vs-guided-scheduling) | + | * Dynamic vs. Guided Scheduling: https://stackoverflow.com/questions/42970700/openmp-dynamic-vs-guided-scheduling |
+ | * Laboratorul a fost construit de catre Florin Mihalache pe https://github.com/florinrm/app-laborator/ si portat/revizuit de catre Emil Slusanschi pe https://ocw.cs.pub.ro | ||