Salta al contingut

    ↑ ↓ per moure't↵ per obrir

    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 (parallel vs task)

    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