Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Fernando Félix-Redondo
Universidad Carlos III
Departamento de Informática
Índice
Introducción: OpenMP a vista de pájaro
Sintaxis básica: Empezando con OpenMP
“Constructores” de OpenMP:
Regiones paralelas
Trabajo compartido (Worksharing)
Entorno de datos
Sincronización
Funciones en tiempo de ejecución y variables de entorno
compartida:
Es posible también usar paso de
mensajes pero …
Existen soluciones basadas
directamente en el paradigma de
memoria compartida. Ejemplo:
OpenMP
OpenMP a vista de pájaro
OpenMP es un API para OpenMP
escribir aplicaciones multi-
hilos (multithreaded)
Conjunto de directivas de
Funciones de
compilación, Directivas
de compilación
Librería en tiempo
Variables
de Entorno
de ejecución
algunas funciones de
biblioteca y
unas pocas variables de
entorno #pragma omp parallel for
Se localizan los bucles que for (int i=0; i< 10000; i++) {
consumen más tiempo
calculo_brutal( V[i] );
Se reparten entre los distintos }
hilos o threads
Hay que evitar las condiciones
de carrera entre hilos
La compartición de datos de
forma no intencionada puede
dar problemas double V[10000];
Se puede usar sincronización #pragma omp parallel for
para evitar conflictos de datos for (int i=0; i< 10000; i++) {
La sincronización es “cara” calculo_brutal( V[i] );
por lo que… }
…hay que distribuir los datos
entre los hilos con inteligencia
Índice
Introducción: OpenMP a vista de pájaro
Sintaxis básica: Empezando con OpenMP
“Constructores” de OpenMP:
Regiones paralelas
Trabajo compartido (Worksharing)
Entorno de datos
Sincronización
Funciones en tiempo de ejecución y variables de entorno
#ifdef _OPENMP
nthreads=omp_get_num_threads(); // Averiguar el número de Hilos
#endif
cout << "Somos " << nthreads << " threads" << endl;
}
// Aquí de nuevo es secuencial la ejecución
return 0;
}
Sintaxis básica: Bloques estructurados
double V[10000], Z[10000];
La mayoría de los #pragma omp parallel for
constructores OpenMP
for (int i=0; i< 10000; i++) {
se aplican sobre bloques calculo_brutal( V[i] );
estructurados Z[i]=func(i)*sqrt(V[i]
}
Bloque estructurado:
Bloque de código con un double V[10000], Z[10000];
único punto de entrada al #pragma omp parallel for
principio y un único punto for (int i=0; i< 10000; i++) {
de salida al final; la única calculo_brutal( V[i] );
if (cond(V[i]))
excepción es exit()
goto salida;
Z[i]=func(i)*sqrt(V[i]
}
Índice
Introducción: OpenMP a vista de pájaro
Sintaxis básica: Empezando con OpenMP
“Constructores” de OpenMP:
Regiones paralelas
Trabajo compartido (Worksharing)
Entorno de datos
Sincronización
Funciones en tiempo de ejecución y variables de entorno
Regiones paralelas
Entorno de datos
Sincronización
printf(“done”)
Una sola copia de
V es compartida
por todos los hilos
Los threads esperan aquí
a que todos hayan
terminado (sinc. barrera)
Regiones paralelas: Algunos detalles
Modo dinámico (por defecto):
El número de hilos puede cambiar de una región paralela
a otra
Fijarel número de hilos, solo establece el número máximo
de hilos posible – podrían obtenerse menos
Modo estático:
El número de hilos es fijo y controlado por el programador
OpenMP permite anidar regiones paralelas, pero…
El compilador puede decidir serializar la región anidada
Trabajo compartido (Worksharing)
El constructor “for” permite dividir las iteraciones
de un bucle entre diferentes hilos
} Barrera impícita
Trabajo compartido: constructor single
En ocasiones las regiones
paralelas contienen tareas
que deberían ser ejecutadas
#pragma omp parallel
por un único hilo { Barrera implícita
Un ejemplo típico lo constituye #pragma omp single
la entrada/salida dentro de { leer_datos(X); }
una región paralela que debe
calcular(X);
ejecutarse secuencialmente calcular_mas()
El constructor single también
incluye una barrera al final del #pragma omp single nowait
{ escribir_resultado(X); }
bloque (a no ser que se use
}
nowait)
int N=1000;
int a=1;
a=a+10;
}
cout << “El valor de a” << a << endl;
Entorno de datos: Por defecto…
Todas las variables usadas dentro de un
constructor paralelo son tratadas como
“compartidas”
Es el comportamiento deseado generalmente para
variables de “sólo lectura” dentro del bucle paralelo
Si son modificadas, hay que declararlas privadas o
sincronizar el acceso a las mismas
Entorno de datos: Por defecto…(II)
int i,a=1,N=1000;
Esta i, sin embargo, es
#pragma omp parallel
compartida por todos los
{
hilos. En este caso
int x[1000];
tendríamos problemas
for (i=0; i< N; i++) {
x[i]=i+10;
}
Ejemplo 2
}
Entorno de datos: reduction
La reducción de datos es un tipo de cálculo muy
frecuente
Consiste en aplicar repetidamente un operador binario (+,-,x,…)
sobre una determinada variable
El compilador y el entorno de ejecución implementan este
cálculo de la forma más eficiente posible
Se usa la cláusula: reduction (oper : lista_var)
Operadores para cláusula int N=1000;
reduction
int a=1;
+ SUMA
- RESTA
#pragma omp parallel for reduction ( + : a)
* PRODUCTO
for (i=0; i< N; i++)
a=+10;
Variables de entorno
Índice
Introducción: OpenMP a vista de pájaro
Sintaxis básica: Empezando con OpenMP
“Constructores” de OpenMP:
Regiones paralelas
Trabajo compartido (Worksharing)
Entorno de datos
Sincronización
Funciones en tiempo de ejecución y variables de entorno