This shows you the differences between two versions of the page.
|
app:laboratoare:02 [2025/10/22 07:18] alexandru.bala [Dynamic scheduling] |
app:laboratoare:02 [2025/10/22 10:36] (current) alexandru.bala [Directiva Reduction] |
||
|---|---|---|---|
| Line 21: | Line 21: | ||
| ===== Static scheduling ===== | ===== Static scheduling ===== | ||
| - | În cadrul static scheduling, iterațiile unui for sunt împărțite în chunks, de dimensiune ''chunk_size'', și distribuite thread-urilor în ordine circulară. Dacă ''chunk_size'' nu este precizat, acesta va fi egal cu ''numărul_de_iterații_for / numărul_de_thread-uri'' | + | În cadrul static scheduling, iterațiile unui for sunt împărțite în chunks, de dimensiune ''chunk_size'', și distribuite thread-urilor în ordine circulară. Dacă ''chunk_size'' nu este precizat, acesta va fi egal cu ''numărul_de_iterații_for / numărul_de_thread-uri'' (pe baza teoremei împărțirii cu rest, primele ''rest'' threads-uri vor avea ''ceil'' din această valoare, iar cele rămase ''floor''). |
| Line 105: | Line 105: | ||
| După fiecare rulare, împărțirea iterațiilor către thread-uri se schimbă. | După fiecare rulare, împărțirea iterațiilor către thread-uri se schimbă. | ||
| - | Un exemplu fara niciun tip de schedule ar fi următorul: | + | Un exemplu fără niciun tip de schedule ar fi următorul: |
| - | {{:app:laboratoare:parallel_for_uneven_static2.png?600|Fara schedule}} | + | {{:app:laboratoare:parallel_for_uneven.png?600|No scheduling}} |
| - | Intr-un exemplu cu dynamic schedule se poate observa că nu există distribuție uniformă a iterațiilor către thread-uri: | + | Într-un exemplu cu dynamic schedule se poate observa că nu există distribuție uniformă a iterațiilor către thread-uri: |
| {{:app:laboratoare:parallel_for_random_dynamic.png?600|Schedule dynamic}} | {{:app:laboratoare:parallel_for_random_dynamic.png?600|Schedule dynamic}} | ||
| Line 116: | Line 116: | ||
| ===== Guided scheduling ===== | ===== Guided scheduling ===== | ||
| - | Guided scheduling se aseamănă cu dynamic schedule, în sensul că avem o împărțire pe chunks și o distribuire neuniformă a iterațiilor peste threadurile de executie. | + | Guided scheduling se aseamănă cu dynamic schedule, în sensul că avem o împărțire pe chunks și o distribuire neuniformă a iterațiilor peste threadurile de execuție. |
| - | Diferența față de dynamic schedule constă în dimensiunea chunk-urilor. Dimensiunea unui chunk este proporțională cu numărul de iterații neasignate în acel moment thread-ului împărțit la numărul de threads, la început un chunk putând avea dimensiunea ''nr_iterații / nr_threads'', ca pe parcurs să scadă dimensiunea acestuia. De exemplu la Valoarea la ''chunk_size'' (dacă nu avem, default este 1) reprezintă dimensiunea minimă pe care o poate avea un chunk (se poate ca ultimele chunk-uri să aibă o dimensiune mai mică decât dimensiunea dată unui chunk). | + | Diferența față de dynamic schedule constă în dimensiunea chunk-urilor. Dimensiunea unui chunk este proporțională cu numărul de iterații neasignate în acel moment împărțit la numărul de threads, la început un chunk putând avea dimensiunea ''ceil(nr_iterații / nr_threads)'', ca pe parcurs să scadă dimensiunea acestuia până la ''chunk_size'' (dacă nu avem, default este 1), care reprezintă dimensiunea minimă pe care o poate avea un chunk (se poate ca ultimul chunk/ultimele chunk-uri să aibă o dimensiune mai mică decât dimensiunea dată unui chunk). |
| Exemplu: | Exemplu: | ||
| Line 152: | Line 152: | ||
| { | { | ||
| #pragma omp for private(i) | #pragma omp for private(i) | ||
| - | for (i = 0; i < 16; i++) { | + | for (i = 0; i < 10; i++) { |
| c(i); | c(i); | ||
| } | } | ||
| Line 169: | Line 169: | ||
| { | { | ||
| #pragma omp for nowait private(i) | #pragma omp for nowait private(i) | ||
| - | for (i = 0; i < 16; i++) { | + | for (i = 0; i < 10; i++) { |
| c(i); | c(i); | ||
| } | } | ||
| Line 180: | Line 180: | ||
| ===== Directiva 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, în mod automat sincronizat peste mai multe thread-uri. Nu orice operație poate fi utilizată într-o operație de tip ''reduction''. |
| Tipar: ''reduction(operator_operatie:variabila_in_care_se_acumuleaza)'' | Tipar: ''reduction(operator_operatie:variabila_in_care_se_acumuleaza)'' | ||