This shows you the differences between two versions of the page.
app:laboratoare:03 [2022/10/23 14:46] florin.mihalache |
app:laboratoare:03 [2022/10/26 16:26] (current) emil.slusanschi [Resurse] |
||
---|---|---|---|
Line 203: | Line 203: | ||
===== Tasks (opțional) ===== | ===== Tasks (opțional) ===== | ||
- | Task-urile în OpenMP reprezintă un concept prin care putem să avem thread pools pentru paralelizarea de soluții ale căror dimensiune nu o știm (echivalent cu ExecutorService din Java). Un task este executat la un moment dat de către un thread din thread pool. | + | Task-urile în OpenMP reprezintă un concept prin care putem să avem thread pools pentru paralelizarea de soluții ale căror dimensiune nu o știm (echivalent cu ''ExecutorService'' din Java). Un task este executat la un moment dat de către un thread din thread pool. |
- | Pentru crearea unui task se folosește directiva TASK: | + | Pentru crearea unui task se folosește directiva ''TASK'': |
<code c> | <code c> | ||
#pragma omp task [clause1 [[,] clause2, ...]] | #pragma omp task [clause1 [[,] clause2, ...]] | ||
</code> | </code> | ||
- | Pentru sincronizarea task-urilor (în sensul să așteptăm toate rezultatele task-urilor, în stilul barierei), se folosește directiva TASKWAIT (exemplu de folosire în exemplul Fibonacci de mai jos). | + | Pentru sincronizarea task-urilor (în sensul să așteptăm toate rezultatele task-urilor, în stilul barierei), se folosește directiva ''TASKWAIT'' (exemplu de folosire în exemplul Fibonacci de mai jos). |
În privința variabilelor dintr-un task, aici avem trei variante de variabile: | În privința variabilelor dintr-un task, aici avem trei variante de variabile: | ||
- | * shared - toate task-urile au acces la aceeași adresă a unei variabile, o modificare asupra variabilei din partea unui task va fi vizibilă către toate task-urile (uneori putem avea potențial de erori în acest caz). | + | * ''shared'' - toate task-urile au acces la aceeași adresă a unei variabile, o modificare asupra variabilei din partea unui task va fi vizibilă către toate task-urile (uneori putem avea potențial de erori în acest caz). |
- | * firstprivate - fiecare task va avea o copie a unei variabile inițializate cu o valoare înainte de crearea task-ului respectiv. | + | * ''firstprivate'' - fiecare task va avea o copie a unei variabile inițializate cu o valoare înainte de crearea task-ului respectiv. |
- | * private - aici putem să avem variabile care nu sunt inițializate înainte de crearea task-ului și care să fie inițializate în cadrul task-ului. | + | * ''private'' - aici putem să avem variabile care nu sunt inițializate înainte de crearea task-ului și care să fie inițializate în cadrul task-ului. |
<code c> | <code c> | ||
Line 277: | Line 277: | ||
===== Exerciții ===== | ===== Exerciții ===== | ||
- | 1) Paralelizați fișierul ''main.c'' din [[https://github.com/cs-pub-ro/app-labs/tree/master/lab3/skel | schelet]], unde se citește un fișier, unde pe prima linie se află numărul de elemente pentru un array și pe următoarea linie se află array-ul respectiv, se face suma numerelor (aici faceți în trei moduri, separat, cu ''reduction'', cu ''atomic'' și cu ''critical'', unde veți măsura timpii de execuție - hint, folosiți directiva master ca un singur thread să facă măsurătorile), iar la final, cu ajutorul ''sections'', scrieți timpii de execuție în trei fișiere (este deja implementată funcția de scriere în fișier). | + | * Paralelizați fișierul ''main.c'' din [[https://github.com/cs-pub-ro/app-labs/tree/master/lab3/skel | schelet]], unde se citește un fișier, unde pe prima linie se află numărul de elemente pentru un array și pe următoarea linie se află array-ul respectiv, se face suma numerelor (aici faceți în trei moduri, separat, cu ''reduction'', cu ''atomic'' și cu ''critical'', unde veți măsura timpii de execuție - hint, folosiți directiva master ca un singur thread să facă măsurătorile), iar la final, cu ajutorul ''sections'', scrieți timpii de execuție în trei fișiere (este deja implementată funcția de scriere în fișier). |
<note tip>O să aveți nevoie de barieră la citire și înainte de scrierea în fișiere.</note> | <note tip>O să aveți nevoie de barieră la citire și înainte de scrierea în fișiere.</note> | ||
Line 283: | Line 283: | ||
<note>De probă, încercați să puneți ORDERED la for-urile paralelizate, pentru a vedea cum este afectată performanța.</note> | <note>De probă, încercați să puneți ORDERED la for-urile paralelizate, pentru a vedea cum este afectată performanța.</note> | ||
- | 2) **(opțional)** Paralelizați folosind task-uri codul din [[https://github.com/cs-pub-ro/app-labs/blob/master/lab3/skel/tree.c | tree.c]] (folosiți task-uri în funcțiile ''preorder'' și ''height'' - la ultima trebuie să folosiți ''taskwait''). | + | * **(opțional)** Paralelizați folosind task-uri codul din [[https://github.com/cs-pub-ro/app-labs/blob/master/lab3/skel/tree.c | tree.c]] (folosiți task-uri în funcțiile ''preorder'' și ''height'' - la ultima trebuie să folosiți ''taskwait''). |
===== Resurse ===== | ===== Resurse ===== | ||
- | [[https://icl.cs.utk.edu/classes/cosc462/2017/ | Cursuri de OpenMP, MPI, CUDA - COSC462]] | + | |
+ | [[https://stackoverflow.com/questions/18669296/c-openmp-parallel-for-loop-alternatives-to-stdvector | User-defined OpenMP Reduction]] |