Descomposició de tasques · 3.5
Privacitat de variables
Cada variable ha de ser compartida o privada. private, firstprivate i shared ho controlen, i les regles per defecte canvien entre parallel i task.
Conceptes clau
private(var)firstprivate(var)shared(var)- Regles per defecte (
parallelvstask)
En paral·lelitzar, cal decidir si les variables són compartides entre tots els threads o si cada thread té una còpia privada. Aquesta decisió és crítica per evitar data races i comportaments inesperats.
Aquestes són les clàusules que podem col·locar al costat d’una directiva #pragma omp parallel, task o taskloop, per controlar l’àmbit de cada variable:
private(var): cada thread/tasca rep una còpia privada no inicialitzada. El valor original no es conserva ni es restaura en acabar.firstprivate(var): cada thread/tasca rep una còpia privada inicialitzada amb el valor actual. El valor original no es conserva ni es restaura en acabar.shared(var): la variable és compartida entre tots els threads de l’equip. Caldrà vigilar la concurrència! És l’única manera de fer persistent una dada entre tasques sense recórrer a memòria global.
Tant amb private com amb firstprivate, el valor de la còpia local es perd en acabar la tasca.
Regles per defecte:
| Context | Àmbit de la variable | Atribut per defecte |
|---|---|---|
parallel |
Declarada fora la regió paral·lela | shared |
parallel |
Declarada dins la regió paral·lela | private |
task |
Declarada fora la tasca (dins la regió paral·lela) | firstprivate |