Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
.2.
PROGRAMACIN DE SISTEMAS
DE MEMORIA COMPARTIDA
(SMP):
OPENMP
Programacin de Sistemas Paralelos
IF - EHU
ndice
1. Introduccin
Programacin de Aplicaciones
Paralelas. OpenMP.
2.
3.
4.
5.
Regiones paralelas.
Sincronizacin de los threads.
Tareas.
Otras cuestiones.
Alternativas:
heap
IR
rutinas interrup.
ficheros
cdigo
thread 1
pila
IR
thread 2
pila
IR
heap
rutinas interrup.
ficheros
10
11
OpenMP
Introduccin
12
OpenMP
Introduccin
13
OpenMP
Introduccin
14
OpenMP
Introduccin
15
OpenMP
Introduccin
El modelo de programacin
paralela que aplica
OpenMP es Fork - Join.
16
thread master
FORK
En un determinado
momento, el thread master
genera P threads que se
ejecutan en paralelo.
regin paralela
thread master
JOIN
OpenMP
Introduccin
17
OpenMP
Ejemplo
main () {
#pragma omp parallel private(tid)
{
tid = omp_get_thread_num();
printf ( thread %d en marcha \n, tid);
#pragma omp for schedule(static) reduction(+:B)
18
OpenMP
Introduccin
19
OpenMP
Introduccin
20
OpenMP
Introduccin
21
OpenMP
Introduccin
22
ndice
23
2. Regiones paralelas.
Gestin de threads y mbito de las
vbles.
Reparto de tareas.
Bucles FOR. Planificacin de las iteraciones.
Secciones paralelas.
OpenMP
Regiones paralelas
24
OpenMP
Regiones paralelas
25
OpenMP
Regiones paralelas
tid = omp_get_thread_num();
devuelve el identificador del thread.
nth = omp_get_num_threads();
devuelve el nmero de hilos generados.
Programacin de Sistemas Paralelos
IF - EHU
26
OpenMP
Regiones paralelas
27
12
main ( ) {
for (i=0; i<N; i++) A[i]=0;
barrera
A[tid] = 10 + tid;
printf (" El thread %d ha terminado \n", tid);
}
for (i=0; i<N; i++) printf (A(%d) = %d \n, i, A[i]);
}
Programacin de Sistemas Paralelos
IF - EHU
OpenMP
Regiones paralelas
28
OpenMP
Regiones paralelas
29
OpenMP
30
OpenMP
31
OpenMP
shared(X)
Se declara la variable X como compartida por
todos los threads.
Slo existe una copia, y todos los threads
acceden y modifican dicha copia.
private(Y)
Se declara la variable Y como privada en cada
thread. Se crean P copias, una por thread (sin
inicializar!).
Se destruyen al finalizar la ejecucin de los
threads.
Programacin
de Sistemas Paralelos
IF - EHU
32
OpenMP
> 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);
Programacin de Sistemas Paralelos
IF - EHU
X no est
inicializada!
X no mantiene
el nuevo valor
33
OpenMP
34
OpenMP
firstprivate( )
Las variables privadas no estn inicializadas al
comienzo (ni dejan rastro al final).
Para poder pasar un valor a estas variables
hay que declararlas firstprivate.
35
OpenMP
> Ejemplo:
X = Y = Z = 0;
36
valores dentro de
la regin
0
paralela?
X = ?
Y = 0
Z =
valores fuera de la
regin paralela?
X = 1
Y = ? (0)
Z = ? (0)
OpenMP
reduction( )
Las operaciones de reduccin son tpicas en
muchas aplicaciones paralelas. Utilizan variables a
las que acceden todos los procesos y sobre las que
se efecta alguna operacin de acumulacin en
modo atmico (RMW).
Caso tpico: la suma de los elementos de un vector.
Si se desea, el control de la operacin puede
dejarse en manos de OpenMP, declarando dichas
variables de tipo reduction.
37
OpenMP
> Ejemplo:
#pragma omp parallel private(X) reduction(+:sum)
{
X =
sum = sum + X;
La propia
clusula indica
el operador de
reduccin a
utilizar.
38
OpenMP
39
OpenMP
40
OpenMP
41
OpenMP
copyin(X)
Declarada una variable como threadprivate,
un thread no puede acceder a la copia
threadprivate de otro thread (ya que es
privada).
La clusula copyin permite copiar en cada
thread el valor de esa variable en el thread
mster al comienzo de la regin paralela.
42
OpenMP
if (expresin)
La regin paralela slo se ejecutar en
paralelo si la expresin es distinta de 0.
Dado que paralelizar cdigo implica costes
aadidos (generacin y sincronizacin de los
threads), la clusula permite decidir en
ejecucin si merece la pena la ejecucin
paralela segn el tamao de las tareas (por
ejemplo, en funcin del tamao de los
vectores a procesar).
43
OpenMP
num_threads(expresin)
Indica el nmero de hilos que hay que utillizar
en la regin paralela.
Precedencia: vble. entorno >> funcin >>
clusula
44
OpenMP
45
ndice
46
2. Regiones paralelas.
Gestin de threads y mbito de las vbles.
Reparto de tareas.
Bucles for. Planific. de las iteraciones
Secciones paralelas.
OpenMP
Reparto de tareas
47
Paralelizacin de bucles.
Los bucles son uno de los puntos de los que extraer
paralelismo de manera sencilla (paralelismo de
datos, domain decomposition, grano fino).
Obviamente, la simple replicacin de cdigo no es
suficiente. Por ejemplo,
OpenMP
Reparto de tareas
48
OpenMP
Reparto de tareas
49
OpenMP
Reparto de tareas
50
OpenMP
51
1 Directiva for
#pragma omp parallel [...]
{
mbito variables
reparto
iteraciones
sincronizacin
barrera
0..24
25..49
50..74
75..99
OpenMP
52
OpenMP
variables de induccin
reordenacin de instrucciones
alineamiento de las dependencias
intercambio de bucles, etc.
53
OpenMP
54
OpenMP
55
OpenMP
56
OpenMP
Clusulas (for)
57
OpenMP
Clusulas de mbito
lastprivate(X)
Permite salvar el valor de la variable
privada X correspondiente a la ltima
iteracin del bucle.
Programacin de Sistemas Paralelos
IF - EHU
58
OpenMP
Clusula schedule
59
OpenMP
Clusula schedule
static,k
Planificacin esttica con trozos de tamao k.
Si no se indica k, se reparten trozos de tamao
N/P. La asignacin es entrelazada (round
robin).
60
OpenMP
Clusula schedule
dynamic,k
Asignacin dinmica de trozos de tamao k.
El tamao por defecto es 1.
guided,k
Planificacin dinmica con trozos de tamao
decreciente:
Ki+1 = Ki (1 -1/P)
El tamao del primer trozo es dependiente de la
implementacin y el ltimo es el especificado (por
defecto, 1).
Programacin de Sistemas Paralelos
IF - EHU
61
OpenMP
Clusula schedule
runtime
El tipo de planificacin se define previamente a la
ejecucin en la variable de entorno OMP_SCHEDULE
(para las pruebas previas).
Por ej.: > export OMP_SCHEDULE=dynamic,3
auto
La eleccin de la planificacin la realiza el
compilador (o el runtime system).
Es dependiente de la implementacin.
3.0
62
OpenMP
Clusula schedule
RECUERDA:
esttico menos coste / mejor localidad
datos
dinmico ms coste / carga ms equilibrada
Programacin de Sistemas Paralelos
IF - EHU
63
OpenMP
Clusula collapse
collapse(n)
El compilador formar un nico bucle y lo paralelizar.
Se le debe indicar el nmero de bucles a colapsar
3.0
64
OpenMP
Clusula nowait
65
OpenMP
Clusulas
66
OpenMP
Resumen
67
private(var)
firstprivate(var)
reduction(op:var) default(shared/none)
lastprivate(var)
schedule(static/dynamic/guided/runtime/auto[tam])
collapse(n)
nowait
ndice
68
2. Regiones paralelas.
Gestin de threads y mbito de las vbles.
Reparto de tareas.
Bucles for. Planificacin de las iteraciones
Secciones paralelas.
3. Sincronizacin de los threads.
4. Tareas.
5. Otras cuestiones.
Programacin de Sistemas Paralelos
IF - EHU
OpenMP
2 Directiva sections
Permite usar paralelismo de funcin (function decomposition). Reparte secciones de cdigo independiente
a threads diferentes.
Cada seccin paralela es ejecutada por un slo
thread, y cada thread ejecuta ninguna o alguna
seccin.
Una barrera implcita sincroniza el final de las
secciones o tareas.
69
OpenMP
> Ejemplo:
#pragma omp parallel [clausulas]
{
#pragma omp sections [clausulas]
{
#pragma omp section
fun1
fun1();
#pragma omp section
fun2
fun2();
fun3
#pragma omp section
fun3();
}
}
pragma omp sections
70
OpenMP
71
OpenMP
2 Directiva single
Define un bloque bsico de cdigo, dentro de una
regin paralela, que no debe ser replicado; es
decir, que debe ser ejecutado por un nico
thread.
(por ejemplo, una operacin de entrada/salida).
No se especifica qu thread ejecutar la tarea.
72
OpenMP
(first)private, nowait
copyprivate(X)
Para pasar al resto de threads (BC) el valor
de una variable threadprivate, modificada
dentro del bloque single.
73
OpenMP
74
> Ejemplo:
#pragma omp parallel
{
... ;
parallel
single
for
... ;
single
OpenMP
Reparto de tareas
Comentarios finales
El reparto de tareas de la regin paralela debe
hacerse en base a bloques bsicos; adems,
todos los threads deben alcanzar la directiva.
Es decir:
-- si un thread llega a una directiva de reparto, deben
llegar todos los threads.
-- una directiva de reparto puede no ejecutarse, si no
llega ningn thread a ella.
-- si hay ms de una directiva de reparto, todos los
threads deben ejecutarlas en el mismo orden.
-- las directivas de reparto no se pueden anidar.
Programacin de Sistemas Paralelos
IF - EHU
75
OpenMP
76
ndice
77
2. Regiones paralelas.
Gestin de threads y mbito de las vbles.
Reparto de tareas.
Bucles for. Planificacin de las iteraciones
Secciones paralelas.
Otras cuestiones
3. Sincronizacin de los threads.
4. Tareas.
5. Otras cuestiones.
Programacin de Sistemas Paralelos
IF - EHU
OpenMP
78
OpenMP
Master
Regin paralela externa
Regin paralela anidada
Regin paralela externa
79
OpenMP
3.0
80
OpenMP
3.0
omp_get/set_max_active_levels();
> export OMP_MAX_ACTIVE_LEVELS=n
81
OpenMP
Algunas funciones ms
82
OpenMP
Algunas funciones ms
83
OpenMP
Algunas funciones ms
3.0
84
ndice
1. Introduccin. Programacin de Aplicaciones
Paralelas. OpenMP.
2. Regiones paralelas.
85
OpenMP
Sincronizacin de threads
86
OpenMP
1. Secciones Crticas
Define un trozo de cdigo que no puede ser
ejecutado por ms de un thread a la vez.
OpenMP ofrece varias alternativas para la
ejecucin en exclusin mutua de secciones
crticas. Las dos opciones principales son:
critical y atomic.
87
OpenMP
Exclusin mtua
88
Directiva critical
Define una nica seccin crtica para todo el
programa, dado que no utiliza variables de
lock.
#pragma omp parallel firstprivate(MAXL)
{
...
OJO: la seccin
crtica debe
ser lo menor
posible!
OpenMP
Exclusin mtua
Tambin pueden
definirse diferentes
secciones crticas,
controladas por la
correspondiente
variable cerrojo.
89
OpenMP
Exclusin mtua
Directiva atomic
Es una caso particular de seccin crtica, en el
que se efecta una operacin RMW atmica
sencilla (con limitaciones).
#pragma omp parallel ...
{
...
90
OpenMP
omp_init_lock(&C);
reserva memoria e inicializa un cerrojo.
omp_destroy_lock(&C);
libera memoria del cerrojo.
91
OpenMP
omp_set_lock(&C);
coge el cerrojo o espera a que est libre.
omp_unset_lock(&C);
libera el cerrojo.
omp_test_lock(&C);
testea el valor del cerrojo; devuelve T/F.
92
OpenMP
> Ejemplo
#pragma omp parallel private(nire_it)
{
omp_set_lock(&C1);
mi_it = i;
i = i + 1;
omp_unset_lock(&C1);
while (mi_it<N)
{
A[mi_it] = A[mi_it] + 1;
omp_set_lock(&C1);
mi_it = i;
i = i + 1;
omp_unset_lock(&C1);
}
}
Programacin de Sistemas Paralelos
IF - EHU
93
OpenMP
94
OpenMP
Eventos
3. Eventos
La sincronizacin entre los threads puede
hacerse esperando a que se produzca un
determinado evento.
La sincronizacin puede ser:
- global: todos los threads se sincronizan en
un punto determinado.
- punto a punto: los threads se sincronizan
uno a uno a travs de flags.
95
OpenMP
Eventos (barreras)
96
OpenMP
Eventos (barreras)
> Ejemplo
#pragma omp parallel private(tid)
{
tid = omp_get_thread_num();
A[tid] = fun(tid);
97
OpenMP
Eventos (flags)
98
...
dat = ...;
flag = 1;
...
/* consumidor */
...
while (flag==0) { };
... = dat;
...
OpenMP
Eventos (flags)
99
OpenMP
Eventos (flags)
100
/* consumidor */
...
while (flag==0)
{ #pragma omp flush(flag) };
#pragma omp flush(dat)
... = dat;
...
OpenMP
Eventos (flags)
101
/* productor */
...
dat = ...;
flag = 1;
...
/* consumidor */
...
while (flag==0) {};
... = dat;
...
OpenMP
Eventos (ordered)
4. Secciones ordenadas
#pragma omp ordered
Junto con la clusula ordered, impone el orden
secuencial original en la ejecucin de una parte
de cdigo de un for paralelo.
#pragma omp paralell for ordered
for (i=0; i<N; i++)
Equivale a un wait
{
-post construido
A[i] = ... (clculo);
mediante
#pragma omp ordered
contadores.
printf(A(%d)= %d \n, i, A[i]);
}
Programacin de Sistemas Paralelos
IF - EHU
102
OpenMP
Sincronizacin
5. Directiva master
#pragma omp master
Marca un bloque de cdigo para que sea
ejecutado solamente por el thread mster, el
0.
Es similar a la directiva single, pero sin
incluir la barrera al final y sabiendo qu
thread va a ejecutar el cdigo.
Programacin de Sistemas Paralelos
IF - EHU
103
ndice
4. Tareas.
5. Otras cuestiones.
104
OpenMP
Tareas
Directiva task
Sirve para definir tareas explcitas, y permite
gestionar
eficientemente
procedimientos
recursivos y bucles en los que el nmero de
iteraciones es indeterminado.
#pragma omp task [clasulas]
{
}
clasulas if (expresin)
untied
default (shared | none)
private (var), firstprivate (var), shared
(var)
105
OpenMP
Tareas
Directiva task
Una directiva que permite esperar a todas las
tareas hijas generadas desde la tarea actual.
#pragma omp taskwait
La directiva task permite introducir paralelismo
de una forma sencilla en ciertas situaciones en
las que era difcil hacerlo. Veamos un par de
ejemplos.
Programacin de Sistemas Paralelos
IF - EHU
106
OpenMP
Tareas
while (puntero)
{
(void) ejecutar_tarea(puntero);
puntero = puntero->sig;
}
107
OpenMP
Tareas
108
OpenMP
Tareas
109
> Ejemplo 2:
fibonacci
long fibonacci(int n)
{ // f(0)=f(1)=1, f(n) = f(n-1)
+ f(n-2)
OpenMP
Tareas
long fibonacci(int n)
{
long f1, f2, fn;
if ( n == 0 || n == 1 ) return(n);
110
OpenMP
Tareas
111
ndice
112
1. Introduccin. Programacin de
Aplicaciones Paralelas. OpenMP.
2. Regiones paralelas.
3. Sincronizacin de los threads.
4. Tareas.
5. Otras cuestiones.
Funciones para medir tiempos
Carreras y deadlocks
Funciones reentrantes
Speed-up
Programacin de Sistemas Paralelos
IF - EHU
OpenMP
Otras cuestiones
t2 = omp_get_wtime();
tiempo = t2 t1;
113
OpenMP
Otras cuestiones
114
OpenMP
Carreras
Definimos una carrera (race) como la
consecucin de resultados inesperados e
irreproducibles debido a problemas en el acceso
y sincronizacin de variables compartidas.
#pragma omp parallel sections
{
#pragma omp section
A = B + C;
#pragma omp section
B = A + C;
#pragma omp section
C = B + A;
}
!?
115
OpenMP
CONT = 0;
#pragma omp parallel sections
{ #pragma omp section
A = B + C;
#pragma omp flush (A)
CONT = 1;
#pragma omp flush (CONT)
#pragma omp section
{ while (CONT<1)
{ #pragma omp flush (CONT) }
B = A + C;
#pragma omp flush (B)
CONT = 2;
#pragma omp flush (CONT)
}
#pragma omp section
{ while (CONT<2)
{ #pragma omp flush (CONT) }
C = B + A;
}
}
Programacin de Sistemas Paralelos
IF - EHU
el contador
permite la
sincronizacin
entre las
secciones
(eventos)
las
operaciones
de flush
aseguran la
consistencia
de la
memoria.
116
OpenMP
!?
117
OpenMP
Deadlock
Si no se usan correctamente las operaciones de
sincronizacin, es posible que el programa se
bloquee (deadlock).
Por ejemplo, he aqu un par de errores tpicos
usando secciones crticas construidas mediante
cerrojos:
118
OpenMP
(regin paralela)
...
omp_set_lock(&C1);
A = A + func1();
if (A>0) omp_unset_lock(&C1);
else
{
...
}
...
...
#pragma omp section
{ omp_set_lock(&C1);
A = A + func1();
omp_set_lock(&C2);
B = B * A;
omp_unset_lock(&C2);
omp_unset_lock(&C1);
}
#pragma omp section
{ omp_set_lock(&C2);
B = B + func2();
omp_set_lock(&C1);
A = A * B;
omp_unset_lock(&C1);
omp_unset_lock(&C2);
}
...
119
OpenMP
Recomendaciones:
prestar atencin al mbito de las variables:
shared, private, etc.
utilizar con cuidado las funciones de
sincronizacin.
disponer de una versin equivalente
secuencial para comparar resultados (sern
siempre iguales?).
120
OpenMP
Otras cuestiones
121
OpenMP
Speed-up
El objetivo de programar una aplicacin en un
sistema paralelo es:
- ejecutar el problema ms rpido.
- ejecutar un problema de mayor tamao.
En ambos casos hay que tener en cuenta el
overhead aadido al paralelizar el cdigo.
122
OpenMP
Limitaciones al rendimiento
123
OpenMP
Limitaciones al rendimiento
124
...
...
...
OpenMP
Limitaciones al rendimiento
{ ... }
...
}
Programacin de Sistemas Paralelos
IF - EHU
{ ... }
125
OpenMP
126
OpenMP
127
OpenMP
128
OpenMP: referencias
TEXTOS
R. Chandra et al.
Parallel Programming in OpenMP
Morgan Kaufmann, 2001.
B. Chapman et al.
Using OpenMP
The MIT Press, 2008.
WEB
www.openmp.org
(especificacin 2.5, software)
Programacin de Sistemas Paralelos
IF - EHU
129