Salta al contingut

    ↑ ↓ per moure't↵ per obrir

    Descomposició de tasques · 3.3

    Instruccions bàsiques d'OpenMP

    Les directives que faràs servir sempre: parallel, single, task i taskloop per crear tasques, i taskwait i taskgroup per esperar-les.

    Conceptes clau

    • parallel i single
    • task i taskloop
    • grainsize(m) i num_tasks(m)
    • taskwait vs taskgroup

    Creació de tasques:

    • #pragma omp parallel [num_threads(N)]: crea tasques implícites (una per thread). Inclou una barrera implícita al final. Opcionalment podem usar num_threads(N) per especificar el nombre de threads.
    • #pragma omp single: només un thread executa el bloc; la resta esperen tasques a la pool. Inclou una barrera implícita al final (eliminable amb nowait).
    • #pragma omp task: crea una tasca explícita que s’afegeix a la pool i s’executarà quan un thread estigui disponible. Opcionalment podem usar depend(in/out: var) per establir dependències entre tasques.
    • #pragma omp taskloop: crea tasques explícites a partir de les iteracions d’un for comptable. Inclou un taskgroup implícit al final. Es pot controlar la granularitat amb:
      • grainsize(m): entre mm i 2m2m iteracions per tasca.
      • num_tasks(m): aproximadament mm tasques creades.

    Barreres de tasques:

    • #pragma omp taskwait: suspèn la tasca actual fins que totes les seves tasques filles directes hagin acabat. No espera descendents de nivells més profunds.
    • #pragma omp taskgroup: suspèn la tasca actual al final del bloc, esperant totes les tasques filles i tots els seus descendents.