Cláusula Depend
Anterior | Siguiente |
Las tareas se pueden sincronizar individualmente con la cláusula depend. Existen dos direcciones de sincronización:
- out: establece una dependencia para una tarea futura.
- in: establece una dependencia desde una tarea previa.
Sintaxis básica
#pragma omp parallel
{
<parallel region code>
#pragma omp single
{
#pragma omp task depend(out: var1[,var2,var3,...])
{
<task body>
}
<single region code>
#pragma omp task depend(in: var1[,var2,var3,...])
{
<loop body>
}
}
<parallel region code>
}
Ejemplo
…
#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 g = omp_get_thread_num();
printf("thread=%d in single region is creating tasks\n", g);
int p=0,q=0,r=0,s=0,t=0;
#pragma omp task depend(out: p)
{
p = omp_get_thread_num();
printf("thread=%d executed task A\n", p);
}
#pragma omp task
{
q= omp_get_thread_num();
printf("thread=%d executed task B\n", q);
}
#pragma omp task depend(out: r)
{
r= omp_get_thread_num();
printf("thread=%d executed task C\n", r);
}
#pragma omp task depend(in: p, r)
{
s = omp_get_thread_num();
printf("thread=%d executed task D\n", s);
}
#pragma omp task
{
t = omp_get_thread_num();
printf("thread=%d executed task E\n", t);
}
} // implicit barrier here
} // implicit barrier here
m = omp_get_thread_num();
printf("thread=%d in serial region\n", m);
}
¿Cómo compilar?
clang -fopenmp -I/home/user/llvm/llvm-build/projects/openmp/runtime/src/
-o depend-000 depend-000.c
¿Cómo ejecutar?
./depend-000
Salida
thread=0 in serial region
thread=0 in single region is creating tasks
thread=7 executed task A
thread=2 executed task C
thread=4 executed task B
thread=7 executed task E
thread=6 executed task D
thread=0 in serial region
Dadas las dependencias, la tarea D sólo se ejecuta después de las tareas A y C.
Preguntas
- Diseña un grafo complejo de ejecución de al menos 10 tareas y tradúcelo a código de OpenMP con dependencias.
- Verifica que las dependencias se cumplan.
Anterior | Siguiente |
Estás en el Nivel 2: Bucles paralelos y tareas concurrentes con OpenMP. ¿Deseas volver al inicio?