Introducción
? No se trata de un nuevo lenguaje de programación, sino de un API (application programming interface) formado por:
? directivas para el compilador
? unas pocas funciones de biblioteca
? algunas variables de entorno
? El uso de directivas facilita la portabilidad y la “paralelización incremental”.
En entornos que no usan OpenMP, las directivas son tratadas como simples comentarios e ignoradas.
Introducción
? Los lenguajes base con los que trabaja OpenMP son Fortran y C/C++.
? Las directivas de OpenMP se especifican de la siguiente manera:
para C: #pragma omp
para Fortran !$omp
Introducción
Introducción
? El modelo de programación paralela que aplica OpenMP es Fork – Join.
En un determinado momento, el thread master genera P threads que se ejecutan en paralelo.
(Gp:) thread master
FORK
JOIN
(Gp:) región paralela
(Gp:) thread master
Introducción
? Todos los threads ejecutan la misma copia del código (SPMD). A cada thread se le asigna un identificador (tid).
? Para diferenciar las tareas ejecutadas por cada thread:
? if (tid == 0) then … else …
? constructores específicos de reparto de tareas (work sharing).
Ejemplo
main () {
for (i=0; i<1000; i++)
{ A[i] = A[i] + 1;
B = B + A[i];
}
printf(“ B = %d n”, B);
}
#pragma omp parallel private(tid)
{
}
tid = omp_get_thread_num();
printf (“ thread %d en marcha n”, tid);
#pragma omp for schedule(static) reduction(+:B)
if (tid==0)
Aspectos básicos a tratar en la paralelización de código:
1 Partiendo de un programa serie, hay que especificar qué partes del código pueden ejecutarse en paralelo (análisis de dependencias)
? estructuras de control paralelo
? reparto de tareas
Introducción
Aspectos básicos a tratar en la paralelización de código:
2 Incluir la comunicación adecuada entre los diferentes threads que van a ejecutarse en paralelo. En este caso, a través de variables compartidas en el espacio común de memoria.
? ámbito de las variables
Introducción
Aspectos básicos a tratar en la paralelización de código:
3 Sincronizar convenientemente la ejecución de los hilos. Las funciones principales de sincronización son las habituales: exclusión mutua y sincronización por eventos (por ejemplo, global mediante barreras).
Introducción
? En resumen, partiendo de un programa serie, para obtener un programa paralelo OpenMP hay que añadir:
? directivas que especifican una región paralela (código replicado), reparto de tareas (específicas para cada thread), o sincronización entre threads.
? funciones de biblioteca (include ): para gestionar o sincronizar los threads.
Introducción
? Una región paralela define un trozo de código que va a ser replicado y ejecutado en paralelo por varios threads.
Regiones paralelas
La directiva correspondiente es (C):
#pragma omp parallel [cláusulas]
{
código
}
El trozo de código que se define en una región paralela debe ser un bloque básico.
? El número de threads que se generan para ejecutar una región paralela se controla:
a. estáticamente, mediante una variable de entorno: > export OMP_NUM_THREADS=4
b. en ejecución, mediante una función de librería: omp_set_num_threads(4);
c. en ejecución, mediante una cláusula del “pragma parallel”: num_threads(4)
Regiones paralelas
? ¿Quién soy yo? ¿Cuántos somos?
Cada proceso paralelo se identifica por un número de thread. El 0 es el thread máster.
Dos funciones de librería:
nth = omp_get_num_threads();
devuelve el número de hilos generados.
tid = omp_get_thread_num();
devuelve el identificador del thread.
Regiones paralelas
Regiones paralelas
> Un ejemplo sencillo:
…
#define N 12
int i, tid, nth, A[N];
main ( ) {
for (i=0; i Ejemplo:
X = 2;
Y = 1;
#pragma omp parallel
shared(Y) private(X,Z)
{ Z = X * X + 3;
X = Y * 3 + Z;
}
printf(“X = %d n”, X);
(Gp:) X no está
inicializada!
(Gp:) X no mantiene
el nuevo valor
R.P.: Cláusulas de ámbito
Página anterior | Volver al principio del trabajo | Página siguiente |