This shows you the differences between two versions of the page.
|
app:laboratoare:03 [2022/10/25 00:43] emil.slusanschi [Resurse] |
app:laboratoare:03 [2025/10/29 03:40] (current) alexandru.bala [Single] |
||
|---|---|---|---|
| Line 57: | Line 57: | ||
| ===== Single ===== | ===== Single ===== | ||
| - | Dacă dorim ca o secvență de cod (dintr-o bucată de cod paralelizat) să fie executat doar de un singur thread, folosim directiva ''SINGLE''. Aceasta este folosită, de regulă, în operații I/O. | + | Dacă dorim ca o secvență de cod (dintr-o bucată de cod paralelizat) să fie executată doar de un singur thread, folosim directiva ''SINGLE''. Aceasta este folosită, de regulă, în operații I/O. |
| Exemplu: | Exemplu: | ||
| Line 106: | Line 106: | ||
| ==== Barieră ==== | ==== Barieră ==== | ||
| - | Un alt element de sincronizare reprezintă bariera, care asigură faptul că niciun thread gestionat de barieră nu trece mai departe de aceasta decât atunci cand toate thread-urile gestionate de barieră au ajuns la punctul unde se află bariera. | + | Un alt element de sincronizare îl reprezintă bariera, care asigură faptul că niciun thread gestionat de barieră nu trece mai departe de aceasta decât atunci cand toate thread-urile gestionate de barieră au ajuns la punctul unde se află bariera. |
| În OpenMP, pentru barieră avem directiva ''#pragma omp barrier'', echivalent cu ''pthread_barrier_t'' din pthreads. | În OpenMP, pentru barieră avem directiva ''#pragma omp barrier'', echivalent cu ''pthread_barrier_t'' din pthreads. | ||
| Line 132: | Line 132: | ||
| Tipar: ''reduction(operator_operatie:variabila_in_care_se_acumuleaza)'' | Tipar: ''reduction(operator_operatie:variabila_in_care_se_acumuleaza)'' | ||
| - | Exemplu de reduction: ''reduction(+:sum)'', unde se însumează elementele unui array în variabila sum | + | Exemplu de reduction: ''reduction(+:sum)'', unde se însumează indecșii unui loop în variabila sum |
| Exemplu de folosire de reduction: | Exemplu de folosire de reduction: | ||
| Line 167: | Line 167: | ||
| ==== Ordered ==== | ==== Ordered ==== | ||
| - | Directiva ''ORDERED'' este folosit în for-uri cu scopul de a distribui în ordine iterațiile către thread-uri. | + | Directiva ''ORDERED'' este folosită în for-uri cu scopul de a distribui în ordine iterațiile către thread-uri. |
| Exemplu: | Exemplu: | ||
| Line 202: | Line 202: | ||
| * ''COPYIN'' - asignarea unei variabile ''THREADPRIVATE'' este vizibilă tuturor thread-urilor | * ''COPYIN'' - asignarea unei variabile ''THREADPRIVATE'' este vizibilă tuturor thread-urilor | ||
| - | ===== Tasks (opțional) ===== | + | ===== Tasks ===== |
| 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. | ||
| 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> | ||
| - | * **(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''). | + | * 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]] | ||
| + | - [[https://stackoverflow.com/questions/18022133/difference-between-openmp-threadprivate-and-private |Difference between OpenMP threadprivate and private]] | ||
| + | - [[https://learn.microsoft.com/en-us/cpp/parallel/openmp/reference/openmp-clauses?view=msvc-170 | OpenMP Clauses]] | ||