? 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 |