Anterior Siguiente

Esta directiva se usa para lograr sincronizar todas las tareas desplegadas en el ámbito donde aparece la directiva. Las sub-tareas no se sincronizan.

Sintaxis básica

#pragma omp parallel
{
    <parallel region code>
    
    #pragma omp single
    {
        #pragma omp task
        {
            <task code>
        }

        #pragma omp task
        {
            <task code>
        }

        #pragma omp taskwait // explicit barrier here

        #pragma omp task
        {
            <task code>
        }
    } // implicit barrier here

    <parallel region code>
} // implicit barrier here

Ejemplo

El siguiente código va a crear tareas de manera secuencial:

#include <stdio.h>
#include <omp.h>

int main(){
    int m = omp_get_thread_num();
    printf("thread=%d in serial region\n", m);
    
    #pragma omp parallel 
    {
        #pragma omp single
        {
            int s = omp_get_thread_num();
            printf("thread=%d in single region is creating tasks\n", s);

            #pragma omp task
            {
                int t = omp_get_thread_num();
                printf("thread=%d executed task A\n", t);
            }

            #pragma omp task
            {
                int t = omp_get_thread_num();
                printf("thread=%d executed task B\n", t);
            }

            #pragma omp taskwait // explicit barrier here

            #pragma omp task
            {
                int t = omp_get_thread_num();
                printf("thread=%d executed task C\n", t);
            }
        } // implicit barrier here
    } // implicit barrier here
    
    m = omp_get_thread_num();
    printf("thread=%d in serial region\n", m);
}

Descarga el código aquí.

¿Cómo compilar?

clang -fopenmp -I/home/user/llvm/llvm-build/projects/openmp/runtime/src/ 
     -o taskwait-000 taskwait-000.c

¿Cómo ejecutar?

./taskwait-000

Salida

thread=0 in serial region
thread=0 in single region is creating tasks
thread=0 executed task B
thread=2 executed task A
thread=1 executed task C
thread=0 in serial region

Gracias a la barrera de taskwait, la tarea C siempre se va a ejecutar después de A y B.

Preguntas

  • Modifica el programa utilizando secciones en lugar de tareas y barrier en lugar de taskwait.
  • Agrega una sub-tarea a las tareas A y B.
  • ¿Las sub-tareas se sincronizaron con taskwait?
Anterior Siguiente
Estás en el Nivel 2: Bucles paralelos y tareas concurrentes con OpenMP. ¿Deseas volver al inicio?