l aboratorio de p aralelismo if - ehu. 2. p rogramaciÓn de s istemas de m emoria c ompartida (smp):...
TRANSCRIPT
![Page 1: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/1.jpg)
Laboratorio de ParalelismoIF - EHU
. 2 .
PROGRAMACIÓN DE SISTEMAS
DE MEMORIA COMPARTIDA (SMP):
OPENMP
![Page 2: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/2.jpg)
Laboratorio de ParalelismoIF - EHU
1. IntroducciónProgramación de Aplicaciones Paralelas. OpenMP.
2. Regiones paralelas.3. Sincronización de los threads.4. Tareas.5. Otras cuestiones.
Índice
![Page 3: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/3.jpg)
Laboratorio de ParalelismoIF - EHU
Program. de Aplicaciones Paralelas 32
Los sistemas paralelos MIMD presentan dos arquitecturas diferenciadas: memoria compartida y memoria distribuida.
El modelo de memoria utilizado hace que la programación de aplicaciones paralelas para cada caso sea esencialmente diferente.
![Page 4: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/4.jpg)
Laboratorio de ParalelismoIF - EHU
Program. de Aplicaciones Paralelas 42
Alternativas:
• usar un lenguaje paralelo nuevo, o modificar la sintaxis de uno secuencial (HPF, UPC… / Occam, Fortran M…).
• usar un lenguaje secuencial junto con directivas al compilador para especificar el paralelismo.
• usar un lenguaje secuencial junto con rutinas de librería.
![Page 5: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/5.jpg)
Laboratorio de ParalelismoIF - EHU
Program. de Aplicaciones Paralelas 52
En el caso de memoria compartida, tenemos más opciones:
> trabajar con procesos (UNIX)> usar threads: Pthreads (POSIX), Java,
OpenMP…
![Page 6: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/6.jpg)
Laboratorio de ParalelismoIF - EHU
Program. de Aplicaciones Paralelas 62
heap
pila IR
proceso j
rutinas interrup.
código
ficheros
procesos concurrentes: Fork / Join gran overhead, son muy “caros”
![Page 7: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/7.jpg)
Laboratorio de ParalelismoIF - EHU
Program. de Aplicaciones Paralelas 72
heap
rutinas interrup.
código
ficheros
pila IR
thread 1
pila IR
thread 2
los threads son más “ligeros” la sincronización (variables compartidas) es
sencilla habitual en el S.O. (solaris, windows XP…)
![Page 8: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/8.jpg)
Laboratorio de ParalelismoIF - EHU
Program. de Aplicaciones Paralelas 82
Para los sistemas de memoria distribuida, el estándar actual de programación, mediante paso de mensajes, es MPI.
Para los sistemas de memoria compartida, de tipo SMP, la herramienta más extendida es OpenMP.
En ambos casos hay más opciones, y en una máquina más general utilizaremos probablemente una mezcla de ambos.
![Page 9: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/9.jpg)
Laboratorio de ParalelismoIF - EHU
Program. de Aplicaciones Paralelas 92
Qué esperamos de una “herramienta” para programar aplicaciones en máquinas de memoria distribuida (MPI):
• un mecanismo de identificación de los procesos.• una librería de funciones de comunicación
punto a punto: send, receive…• funciones de comunicación global: broadcast,,
scatter, reduce...• alguna función para sincronizar procesos.
![Page 10: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/10.jpg)
Laboratorio de ParalelismoIF - EHU
Program. de Aplicaciones Paralelas 102
Qué esperamos de una “herramienta” para programar aplicaciones en máquinas de memoria compartida:
• un mecanismo de identificación de los threads.• un método para declarar las variables como
privadas (private) o compartidas (shared).• un mecanismo para poder definir “regiones
paralelas”, bien sea a nivel de función o a nivel de iteración de bucle.
• facilidades para sincronizar los threads.
![Page 11: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/11.jpg)
Laboratorio de ParalelismoIF - EHU
Program. de Aplicaciones Paralelas 112
Qué no esperamos de una “herramienta” para programar aplicaciones paralelas:
• un analizador de dependencias entre tareas (queda en manos del programador).
![Page 12: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/12.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP
122Introducción
OpenMP es el estándar actual para programar aplicaciones paralelas en sistemas de memoria compartida tipo SMP.
Entre otras características, es portable, permite paralelismo “incremental”, y es independiente del hardware.
Participan en su desarrollo los fabricantes más importantes: HP, IBM, SUN, SG...
![Page 13: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/13.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP
132Introducció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
![Page 14: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/14.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP
142
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
![Page 15: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/15.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP
152
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 <directiva> para Fortran !$omp <directiva>
Introducción
![Page 16: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/16.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP
162Introducció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.
thread master
FORK
JOIN
región paralela
thread master
![Page 17: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/17.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP
172Introducció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).
![Page 18: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/18.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP
182Ejemplo
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)
![Page 19: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/19.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP
192
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
![Page 20: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/20.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP
202
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
![Page 21: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/21.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP
212
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
![Page 22: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/22.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP
222
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 <omp.h>): para gestionar o sincronizar los threads.
Introducción
![Page 23: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/23.jpg)
Laboratorio de ParalelismoIF - EHU
1. Introducción. Programación de Aplicaciones Paralelas. OpenMP.
2. Regiones paralelas.Gestión de threads y ámbito de las vbles.Reparto de tareas.
Bucles FOR. Planificación de las iteraciones.
Secciones paralelas.
3. Sincronización de los threads.4. Tareas.5. Otras cuestiones.
Índice
![Page 24: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/24.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 242
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 de una región paralela se define como un bloque básico.
![Page 25: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/25.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 252
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
![Page 26: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/26.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 262
¿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
![Page 27: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/27.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 272Regiones paralelas
> Un ejemplo sencillo:
...
#define N 12
int i, tid, nth, A[N];
main ( ) { for (i=0; i<N; i++) A[i]=0;
#pragma omp parallel { nth = omp_get_num_threads (); tid = omp_get_thread_num (); printf ("Thread %d de %d en marcha \n", tid, nth); 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]);}
private(tid,nth) shared(A)
barrera
Ejemplos: hola1.c, hola2.c, hola3.c
![Page 28: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/28.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 282
El thread máster tiene como contexto el conjunto de variables del programa, y existe a lo largo de toda la ejecución del programa.
Al crearse nuevos threads, cada uno incluye su propio contexto, con su propia pila, utilizada como stack frame para las rutinas invocadas por el thread.
Regiones paralelas
![Page 29: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/29.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 292
La compartición de variables es el punto clave en un sistema paralelo de memoria compartida, por lo que es necesario controlar correctamente el ámbito de cada variable.
Las variables globales son compartidas por todos los threads. Sin embargo, algunas variables deberán ser propias de cada thread, privadas.
Regiones paralelas
![Page 30: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/30.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 302
Para poder especificar adecuadamente el ámbito de validez de cada variable, se añaden una serie de cláusulas a la directiva parallel, en las que se indica el carácter de las variables que se utilizan en dicha región paralela.
R.P.: Cláusulas de ámbito
![Page 31: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/31.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 312
La región paralela tiene como extensión estática el código que comprende, y como extensión dinámica el código que ejecuta (incluidas rutinas).Las cláusulas que incluye la directiva afectan únicamente al ámbito estático de la región.
Las cláusulas principales que definen el ámbito de las variables son las siguientes:
R.P.: Cláusulas de ámbito
![Page 32: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/32.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 322
shared(X)
Se declara la variable X como compartida por todos los threads. Sólo existe una copia, y todos los threads acceden y modifican dicha copia.
Se declara la variable Y como privada en cada thread. Se crean P copias, una por thread (sin inicializar!).Se destruyen al finalizar la ejecución de los threads.
R.P.: Cláusulas de ámbito
private(Y)
![Page 33: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/33.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 332
> 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);
X no está inicializada!
X no mantiene el nuevo valor
R.P.: Cláusulas de ámbito
Ejemplo: var1.c
![Page 34: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/34.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 342
Se declaran objetos completos: no se puede declarar un elemento de un array como compartido y el resto como privado.
Por defecto, las variables son shared.
Cada thread utiliza su propia pila, por lo que las variables declaradas en la propia región paralela (o en una rutina) son privadas.
R.P.: Cláusulas de ámbito
![Page 35: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/35.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 352
firstprivate( )
Las variables privadas no están inicializadas al comienzo (ni dejan rastro al final).
Para poder pasar un valor a estas variables hay que declararlas firstprivate.
R.P.: Cláusulas de ámbito
![Page 36: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/36.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 362
> Ejemplo:
X = Y = Z = 0;
#pragma omp parallel private(Y) firstprivate(Z){
...X = Y = Z = 1;
}
...
valores dentro de la región paralela? X =Y =Z =
valores fuera de la región paralela? X = Y = Z =
? (0)? (0)
1
0
0?
R.P.: Cláusulas de ámbito
![Page 37: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/37.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 372
reduction( )Las operaciones de reducción son típicas en muchas aplicaciones paralelas. Utilizan variables a las que acceden todos los procesos y sobre las que se efectúa alguna operación de “acumulación” en modo atómico (RMW).
Caso típico: la suma de los elementos de un vector.
Si se desea, el control de la operación puede dejarse en manos de OpenMP, declarando dichas variables de tipo reduction.
R.P.: Cláusulas de ámbito
![Page 38: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/38.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 382
> Ejemplo:
OJO: no se sabe en qué orden se va a ejecutar la operación
--> debe ser conmutativa (cuidado con el redondeo).
#pragma omp parallel private(X) reduction(+:sum){
X = ……sum = sum + X;…
}
La propia cláusula indica el operador de reducción a utilizar.
R.P.: Cláusulas de ámbito
![Page 39: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/39.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 392
default (none / shared)
none: obliga a declarar explícitamente el ámbito de todas las variables. Útil para no olvidarse de declarar ninguna variable (da error al compilar).
shared: las variables sin “declarar” son shared (por defecto).
(En Fortran, también default(private): las variables sin declarar son privadas)
R.P.: Cláusulas de ámbito
Ejemplo: var2.c
![Page 40: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/40.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 402
Variables de tipo threadprivate Las cláusulas de ámbito sólo afectan a la extensión estática de la región paralela. Por tanto, una variable privada sólo lo es en la extensión estática (salvo que la pasemos como parámetro a una rutina).
Si se quiere que una variable sea privada pero en toda la extensión dinámica de la región paralela, entonces hay que declararla mediante la directiva:
#pragma omp threadprivate (X)
R.P.: Cláusulas de ámbito
![Page 41: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/41.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 412
Las variables de tipo threadprivate deben ser “estáticas” o globales (declaradas fuera, antes, del main). Hay que especificar su naturaleza justo después de su declaración.
Las variables threadprivate no desaparecen al finalizar la región paralela (mientras no se cambie el número de threads); cuando se activa otra región paralela, siguen activas con el valor que tenían al finalizar la anterior región paralela.
R.P.: Cláusulas de ámbito
![Page 42: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/42.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 422
copyin(X)Declarada una variable como threadprivate, un thread no puede acceder a la copia threadprivate de otro thread (ya que es privada).
La cláusula copyin permite copiar en cada thread el valor de esa variable en el thread máster al comienzo de la región paralela.
R.P.: Cláusulas de ámbito
Ejemplo: threadp.c
![Page 43: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/43.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 432
if (expresión)La región paralela sólo se ejecutará en paralelo si la expresión es distinta de 0.
Dado que paralelizar código implica costes añadidos (generación y sincronización de los threads), la cláusula permite decidir en ejecución si merece la pena la ejecución paralela según el tamaño de las tareas (por ejemplo, en función del tamaño de los vectores a procesar).
R.P.: Otras cláusulas
![Page 44: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/44.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 442
num_threads (expresión)
Indica el número de hilos que hay que utillizar en la región paralela.
Precedencia: vble. entorno >> función >> cláusula
R.P.: Otras cláusulas
![Page 45: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/45.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 452
Cláusulas de la región paralela
- shared, private, firstprivate(var)reduction(op:var)default(shared/none)
copyin(var)
- if (expresión)- num_threads(expresión)
R.P.: Resumen cláusulas
![Page 46: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/46.jpg)
Laboratorio de ParalelismoIF - EHU
1. Introducción. Programación de Aplicaciones Paralelas. OpenMP.
2. Regiones paralelas.Gestión de threads y ámbito de las vbles.
Reparto de tareas.
Bucles for. Planific. de las iteraciones
Secciones paralelas.
3. Sincronización de los threads.4. Tareas.5. Otras cuestiones.
Índice
![Page 47: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/47.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 472
Paralelización 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 replicación de código no es suficiente. Por ejemplo,
Reparto de tareas
#pragma omp parallel shared(A) private(i){ for (i=0; i<100; i++) A[i] = A[i] + 1;}
?
![Page 48: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/48.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 482Reparto de tareas
Tendríamos que hacer algo así:
#pragma omp parallel shared(A) private(tid,nth, ini,fin,i)
{ tid = omp_get_thread_num();nth = omp_get_num_threads();
ini = tid * 100 / nth;fin = (tid+1) * 100 / nth;
for (i=ini; i<fin; i++) A[i] = A[i] + 1;}
!
Ejemplo: repar.c
![Page 49: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/49.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 492
El reparto de trabajo entre los threads se puede hacer mediante una estrategia de tipo SPMD.
- Utilizando el identificador de los threads y mediante sentencias if.
- Definiendo una cola de tareas y efectuando un reparto dinámico de las mismas (self-scheduling, p. e.). OpenMP ofrece una alternativa “automática” al reparto de tareas “manual”, mediante el uso de directivas específicas de reparto de tareas (work sharing).
Reparto de tareas
![Page 50: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/50.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 502
Las opciones de que disponemos son:
1. Directiva for, para repartir la ejecución de las iteraciones de un bucle entre todos los threads (bloques básicos y número de iteraciones conocido).
2. Directiva sections, para definir trozos o secciones de una región paralela a repartir entre los threads.
3. Directiva single, para definir un trozo de código que sólo debe ejecutar un thread.
Reparto de tareas
![Page 51: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/51.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 512
1 Directiva for
Reparto de tareas (for)
#pragma omp parallel [...]{ …
#pragma omp for [clausulas]for (i=0; i<100; i++) A[i] = A[i] + 1;…
}
0..24
25..49
50..74
75..99
barrera
ámbito variablesreparto iteracionessincronización
![Page 52: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/52.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 522
Las directivas parallel y for pueden juntarse en
#pragma omp parallel forcuando la región paralela contiene únicamente un bucle.
En todo caso, la decisión de paralelizar un bucle debe tomarse tras el correcto análisis de las dependencias.
Reparto de tareas (for)
![Page 53: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/53.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 532
Para facilitar la paralelización de un bucle, hay que aplicar todas las optimizaciones conocidas para la “eliminación” de dependencias:
-- variables de inducción-- reordenación de instrucciones -- alineamiento de las dependencias -- intercambio de bucles, etc.
Reparto de tareas (for)
![Page 54: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/54.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 542
for (i=0; i<N; i++) Z[i] = a * X[i] + b;
El bucle puede paralelizarse sin problemas, ya que todas las iteraciones son independientes.La directiva parallel for implica la generación de P threads, que se repartirán la ejecución del bucle.
Hay una barrera de sincronización implícita al final del bucle. El máster retoma la ejecución cuando todos terminan.
El índice del bucle, i, es una variable privada (no es necesario declararla como tal).
#pragma omp parallel forfor (i=0; i<N; i++) Z[i] = a * X[i] + b;
Reparto de tareas (for)
![Page 55: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/55.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 552Reparto de tareas (for)
for (i=0; i<N; i++) for (j=0; j<M; j++) { X = B[i][j] * B[i][j]; A[i][j] = A[i][j] + X; C[i][j] = X * 2 + 1; }
Se ejecutará en paralelo el bucle externo, y los threads ejecutarán el bucle interno. Paralelismo de grano “medio”.
Las variables j y X deben declararse como privadas.
#pragma omp parallel for private (j,X)
for (i=0; i<N; i++) for (j=0; j<M; j++) { X = B[i][j] * B[i][j]; A[i][j] = A[i][j] + X; C[i][j] = X * 2 + 1; }
![Page 56: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/56.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 562Reparto de tareas (for)
for (i=0; i<N; i++) for (j=0; j<M; j++) { X = B[i][j] * B[i][j]; A[i][j] = A[i][j] + X; C[i][j] = X * 2 + 1; }
Los threads ejecutarán en paralelo el bucle interno (el externo se ejecuta en serie). Paralelismo de grano fino.
La variable X debe declararse como privada.
for (i=0; i<N; i++)#pragma omp parallel for private (X) for (j=0; j<M; j++) { X = B[i][j] * B[i][j]; A[i][j] = A[i][j] + X; C[i][j] = X * 2 + 1; }
![Page 57: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/57.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 572
Las cláusulas de la directiva for son de varios tipos:
scope (ámbito): indican el ámbito de las variables.
schedule (planificación): indican cómo repartir las iteraciones del bucle.
collapse: permite colapsar varios bucles en uno.
nowait: elimina la barrera final de sincronización.
ordered: impone orden en la ejecución de las iteraciones.
Cláusulas (for)
![Page 58: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/58.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 582
Las cláusulas de ámbito de una directiva for son (como las de una región paralela):
private, firstprivate, reduction, default
Y se añade una cláusula más:
lastprivate(X)Permite salvar el valor de la variable privada X correspondiente a la última iteración del bucle.
Cláusulas de ámbito
![Page 59: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/59.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 592Cláusula schedule
¿Cómo se reparten las iteraciones de un bucle entre los threads?
Puesto que el pragma for termina con una barrera, si la carga de los threads está mal equilibrada tendremos una pérdida (notable) de eficiencia.
La cláusula schedule permite definir diferentes estrategias de reparto, tanto estáticas como dinámicas.
![Page 60: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/60.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 602
La sintaxis de la cláusula es:
schedule(tipo [, tamaño_trozo])
Los tipos pueden ser:
static,kPlanificación estática con trozos de tamaño k. El tamaño por defecto es 1.
Cláusula schedule
![Page 61: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/61.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 612
dynamic,kAsignación dinámica de trozos de tamaño k. El tamaño por defecto es 1.
guided,kPlanificación dinámica con trozos de tamaño decreciente:
Ki+1 = Ki (1 -1/P)
El tamaño del primer trozo es dependiente de la implementación y el último es el especificado (por defecto, 1).
Cláusula schedule
![Page 62: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/62.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 622
runtimeEl tipo de planificación se define previamente a la ejecución en la variable de entorno OMP_SCHEDULE (para las pruebas previas).
Por ej.: > export OMP_SCHEDULE=“dynamic,3”
Cláusula schedule
autoLa elección de la planificación la realiza el compilador (o el runtime system). Es dependiente de la implementación.
3.0
![Page 63: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/63.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 632
RECUERDA:estático menos coste / mejor localidad
datosdinámico más coste / carga más equilibrada
Cláusula schedule
Bajo ciertas condiciones, la asignación de las iteraciones a los threads se puede mantener para diferentes bucles de la misma región paralela.
Se permite a las implementaciones añadir nuevos métodos de planificación.
3.0
Ejemplo: sched.c
![Page 64: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/64.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 642Cláusula collapse
collapse(n)El compilador formará un único bucle y lo paralelizará.Se le debe indicar el número de bucles a colapsar
3.0
#pragma omp parallel for collapse(2)
for (i=0; i<N; i++)
for (j=0; j<M; j++)for (k=0; k<L; k++){
... }
![Page 65: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/65.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 652
Por defecto, una región paralela o un for en paralelo (en general, casi todos los constructores de OpenMP) llevan implícita una barrera de sincronización final de todos los threads. El más lento marcará el tiempo final de la operación. Puede eliminarse esa barrera en el for mediante la cláusula nowait, con lo que los threads continuarán la ejecución en paralelo sin sincronizarse entre ellos.
Cláusula nowait
![Page 66: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/66.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 662
Cuando la directiva es parallel for (una región paralela que sólo tiene un bucle for), pueden usarse las cláusulas de ambos pragmas.Por ejemplo:
#pragma omp parallel for if(N>1000)for (i=0; i<N; i++) A[i]
= A[i] + 1;
Cláusulas
![Page 67: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/67.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 672
Reparto de tareas (bucles for)
#pragma omp for [clausulas] private(var) firstprivate(var)
reduction(op:var) default(shared/none)
lastprivate(var)
schedule(static/dynamic/guided/runtime/auto[tam]) collapse(n) nowait
#pragma omp parallel for [claus.]
Resumen
Ejemplo: tarea.c
![Page 68: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/68.jpg)
Laboratorio de ParalelismoIF - EHU
1. Introducción. Programación de Aplicaciones Paralelas. OpenMP.
2. Regiones paralelas.Gestión de threads y ámbito de las vbles.
Reparto de tareas.Bucles for. Planificación de las
iteraciones
Secciones paralelas.3. Sincronización de los threads.4. Tareas.5. Otras cuestiones.
Índice
![Page 69: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/69.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 692
2 Directiva sections
Rep. de tareas: funciones
Permite usar paralelismo de función (function decom-position). Reparte secciones de código independiente a threads diferentes.
Cada sección paralela es ejecutada por un sólo thread, y cada thread ejecuta ninguna o alguna sección.
Una barrera implícita sincroniza el final de las secciones o tareas.Cláusulas: private (first-, last-),
reduction, nowait
![Page 70: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/70.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 702Rep. de tareas (sections)
#pragma omp parallel [clausulas]{ #pragma omp sections [clausulas] { #pragma omp section
fun1(); #pragma omp section
fun2(); #pragma omp section
fun3(); }}
fun1
fun2
fun3
pragma omp sections
> Ejemplo:
![Page 71: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/71.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 712
Igual que en el caso del pragma for, si la región paralela sólo tiene secciones, pueden juntarse ambos pragmas en uno solo:
#pragma omp parallel sections [cláusulas]
(cláusulas suma de ambos pragmas)
Rep. de tareas (sections)
Ejemplo: sec.c
![Page 72: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/72.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 722
2 Directiva single
Define un bloque básico de código, dentro de una región paralela, que no debe ser replicado; es decir, que debe ser ejecutado por un único thread.(por ejemplo, una operación de entrada/salida).
No se especifica qué thread ejecutará la tarea.
Rep. de tareas (single)
![Page 73: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/73.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 732
La salida del bloque single lleva implícita una barrera de sincronización de todos los threads.La sintaxis es similar a las anteriores:
#pragma omp single [cláus.]
Cláusulas: (first)private, nowait
copyprivate(X)Para pasar al resto de threads (BC) el valor de una variable threadprivate, modificada dentro del bloque single.
Rep. de tareas (single)
![Page 74: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/74.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 742
#pragma omp parallel{
... ; #pragma omp single inicializar(A);
#pragma omp for for(i=0; i<N; i++) A[i] = A[i] * A[i] + 1;
... ;
#pragma omp singlecopiar(B,A);
}
single
for
single
Rep. de tareas (single)
parallel
> Ejemplo:
![Page 75: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/75.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 752
Comentarios finales
El reparto de tareas de la región paralela debe hacerse en base a bloques básicos; además, 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 ningún thread a ella. -- si hay más de una directiva de reparto, todos los
threads deben ejecutarlas en el mismo orden.-- las directivas de reparto no se pueden anidar.
Reparto de tareas
![Page 76: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/76.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 762
Las directivas de reparto pueden ir tanto en el ámbito lexicográfico (estático) de la región paralela como en el dinámico. Por ejemplo:
int X;#pragma omp threadprivate(X)...#pragma omp parallel{ X = ...
init();...
}
void init(){ #pragma omp for
for (i=0; i<N; i++) A[i] = X * i;}
Rep. de tareas “orphaned”
Si se llama a la función desde fuera de una región paralela (#threads = 1), no hay problema, simplemente no tiene ningún efecto.
Ejemplo: orf.c
![Page 77: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/77.jpg)
Laboratorio de ParalelismoIF - EHU
1. Introducción. Programación de Aplicaciones Paralelas. OpenMP.
2. Regiones paralelas.Gestión de threads y ámbito de las vbles.Reparto de tareas.
Bucles for. Planificación de las iteraciones
Secciones paralelas.
Otras cuestiones3. Sincronización de los threads.4. Tareas.5. Otras cuestiones.
Índice
![Page 78: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/78.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 782
Es posible anidar regiones paralelas, pero hay que hacerlo con “cuidado” para evitar problemas.Por defecto no es posible, hay que indicarlo explícitamente mediante:
-- una llamada a una función de libreríaomp_set_nested(TRUE);
-- una variable de entorno> export OMP_NESTED=TRUE
Una función devuelve el estado de dicha opción:
omp_get_nested(); (true o false)
Reg. paralelas anidadas
![Page 79: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/79.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 792Reg. paralelas anidadas
Master
Región paralela externa
Región paralela anidada
Región paralela externa
Se pueden anidar regiones paralelas con cualquier nivel de profundidad.
![Page 80: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/80.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 802Reg. paralelas anidadas
OpenMP 3.0 mejora el soporte al paralelismo anidado:
- La función omp_set_num_threads() puede ser invocada dentro de una región paralela para controlar el grado del siguiente nivel de paralelismo.
- Permite conocer el nivel de anidamiento mediante omp_get_level() y omp_get_active_level().
- Se puede acceder al tid del padre de nivel n omp_get_ancestor_thread_num(n)y al número de threads en dicho nivel.
3.0
![Page 81: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/81.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 812Reg. paralelas anidadas
OpenMP 3.0 mejora el soporte al paralelismo anidado:
- Permite controlar el máximo número de regiones paralelas anidadas activas mediante funciones y variables de entorno.
omp_get/set_max_active_levels();
> export OMP_MAX_ACTIVE_LEVELS=n
- Permite controlar el máximo número de threads mediante funciones y variables de entorno
omp_get_thread_limit();
> export OMP_THREAD_LIMIT=n
3.0
![Page 82: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/82.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 822
Puede usarse la cláusula if para decidir en tiempo de ejecución si paralelizar o no. Para saber si se está ejecutando en serie o en paralelo, se puede usar la función:
omp_in_parallel();
Puede obtenerse el número de procesadores disponibles mediante
omp_get_num_proc() ;
y utilizar ese parámetro para definir el número de threads.
Algunas funciones más
![Page 83: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/83.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 832
Puede hacerse que el número de threads sea dinámico, en función del número de procesadores disponibles en cada instante:
> export OMP_DYNAMIC=TRUE/FALSEomp_set_dynamic(1/0);
Para saber si el número de threads se controla dinámicamente:
omp_get_dynamic();
Algunas funciones más
![Page 84: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/84.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 842Algunas funciones más
Se han añadido algunas variables de entorno para gestionar el tamaño de la pila:
> export OMP_STACKSIZE tamaño [B|K|M|G]
y para gestionar la política de espera en la sincronización:
> export OMP_WAIT_POLICY [ACTIVE|PASSIVE]
3.0
Ejemplo: nested.c
![Page 85: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/85.jpg)
Laboratorio de ParalelismoIF - EHU
1. Introducción. Programación de Aplicaciones Paralelas. OpenMP.
2. Regiones paralelas.
3. Sincronización de los threads.
Exclusión mutua: secciones críticas.
Variables cerrojo.Eventos: barreras...
4. Tareas.5. Otras cuestiones.
Índice
![Page 86: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/86.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 862
Cuando no pueden eliminarse las dependencias de datos entre los threads, es necesario sincronizar su ejecución.
OpenMP proporciona los mecanismos de sincronización más habituales: exclusión mutua y sincronización por eventos.
Sincronización de threads
![Page 87: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/87.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 872
1. Secciones CríticasDefine un trozo de código que no puede ser ejecutado por más de un thread a la vez.
OpenMP ofrece varias alternativas para la ejecución en exclusión mutua de secciones críticas. Las dos opciones principales son: critical y atomic.
Exclusión mútua (SC)
![Page 88: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/88.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 882
Directiva critical
Define una única sección crítica para todo el programa, dado que no utiliza variables de lock.
#pragma omp parallel firstprivate(MAXL){ ... #pragma omp for for (i=0; i<N; i++) { A[i] = B[i] / C[i]; if (A[i]>MAXL) MAXL = A[i]; } #pragma omp critical { if (MAXL>MAX) MAX = MAXL; } ...}
OJO: la sección crítica debe ser lo “menor” posible!
Exclusión mútua
![Page 89: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/89.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 892
Secciones críticas “específicas” (named)
#pragma omp parallel for for (i=0; i<N; i++) { A[i] = fun(i);
if (A[i]>MAX) #pragma omp critical(M1) { if (A[i]>MAX) MAX = A[i]; }
if (A[i]<MIN) #pragma omp critical(M2) { if (A[i]<MIN) MIN = A[i]; } }
También pueden definirse diferentes secciones críticas, controladas por la correspondiente variable cerrojo.
Exclusión mútua
![Page 90: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/90.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 902
Directiva atomic
Es una caso particular de sección crítica, en el que se efectúa una operación RMW atómica sencilla (con limitaciones).
Para este tipo de operaciones, es más eficiente que definir una sección crítica.
Exclusión mútua
#pragma omp parallel ...{ ...
#pragma omp atomic X = X + 1; ...
}
![Page 91: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/91.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 912
2. Funciones con cerrojos
Un conjunto de funciones de librería permite manejar variables cerrojo y definir así secciones críticas “ad hoc”. En C, las variables cerrojo deben ser del tipo predefinido: omp_lock_t C;
omp_init_lock(&C);reserva memoria e inicializa un cerrojo.
omp_destroy_lock(&C);libera memoria del cerrojo.
Variables cerrojo (lock)
![Page 92: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/92.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 922
omp_set_lock(&C);coge el cerrojo o espera a que esté libre.
omp_unset_lock(&C);libera el cerrojo.
Permiten gran flexibilidad en el acceso en exclusión mutua. La variable de lock puede pasarse como parámetro a una rutina.
omp_test_lock(&C);testea el valor del cerrojo; devuelve T/F.
Variables cerrojo (lock)
![Page 93: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/93.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 932Variables cerrojo (lock)
> 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); } }
[Ejemplo: scri.c]
![Page 94: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/94.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 942
Un grupo similar de funciones permite el anidamiento de las secciones críticas, sin que se produzca un bloqueo por recursividad.
La sintaxis es la misma que en el grupo anterior, añadiendo _nest. Por ejemplo:
omp_set_nest_lock(var);entrada a la SC
omp_unset_nest_lock(var); salida de la SC
Variables cerrojo (lock)
![Page 95: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/95.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 952
3. EventosLa sincronización entre los threads puede hacerse esperando a que se produzca un determinado evento.
La sincronización puede ser:- global: todos los threads se sincronizan en
un punto determinado.- punto a punto: los threads se sincronizan
uno a uno a través de flags.
Eventos
![Page 96: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/96.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 962
Sincronización global: barreras
#pragma omp barrier
Típica barrera de sincronización global para todos los threads de una región paralela.
Recordad que muchos constructores paralelos llevan implícita una barrera final.
Eventos (barreras)
![Page 97: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/97.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 972Eventos (barreras)
#pragma omp parallel private(tid) { tid = omp_get_thread_num(); A[tid] = fun(tid);
#pragma omp for for (i=0; i<N; i++) B[i] = fun(A,i);
#pragma omp for for (i=0; i<N; i++) C[i] = fun(A,B,i);
D[tid] = fun(tid); }
#pragma omp barrier
nowait
> Ejemplo
![Page 98: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/98.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 982
/* productor */
...dat = ...;flag = 1;
...
Sincronización punto a punto
La sincronización entre procesos puede hacerse mediante flags (memoria común), siguiendo un modelo de tipo productor / consumidor.
/* consumidor */
...while (flag==0) { };
... = dat;...
Eventos (flags)
![Page 99: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/99.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 992
Sin embargo, sabemos que el código anterior puede no funcionar correctamente en un sistema paralelo, dependiendo del modelo de consistencia de la máquina.
Tal vez sea necesario desactivar las optimizaciones del compilador antes del acceso a las variables de sincronización.
Eventos (flags)
![Page 100: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/100.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 1002
Para asegurar que el modelo de consistencia aplicado es el secuencial, OpenMP ofrece como alternativa la directiva:
#pragma omp flush(X)que marca puntos de consistencia en la visión de la memoria (fence).
/* productor */...dat = ...;
#pragma omp flush(dat)flag = 1;
#pragma omp flush(flag) ...
/* consumidor */...while (flag==0)
{ #pragma omp flush(flag) }; #pragma omp flush(dat) ... = dat;
...
Eventos (flags)
![Page 101: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/101.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 1012
El modelo de consistencia de OpenMP implica tener que realizar una operación de flush tras escribir y antes de leer cualquier variable compartida.
volatile int dat, flag;...
/* productor */...dat = ...;flag = 1; ...
volatile int dat, flag;...
/* consumidor */...while (flag==0) {};
... = dat;...
En C se puede conseguir esto declarando las variables de tipo volatile.
Eventos (flags)
![Page 102: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/102.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 1022
4. Secciones “ordenadas”
#pragma omp ordered
Junto con la cláusula ordered, impone el orden secuencial original en la ejecución de una parte de código de un for paralelo.
#pragma omp paralell for orderedfor (i=0; i<N; i++){ A[i] = ... (cálculo); #pragma omp ordered printf(“A(%d)= %d \n”, i, A[i]);}
Equivale a un wait -post construido mediante contadores.
Eventos (ordered)
![Page 103: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/103.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 1032
5. Directiva master
#pragma omp master
Marca un bloque de código para que sea ejecutado solamente por el thread máster, el 0.
Es similar a la directiva single, pero sin incluir la barrera al final y sabiendo qué thread va a ejecutar el código.
Sincronización
Ejemplo: sincro1.c
![Page 104: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/104.jpg)
Laboratorio de ParalelismoIF - EHU
1. Introducción. Programación de Aplicaciones Paralelas. OpenMP.
2. Regiones paralelas.3. Sincronización de los threads.
4. Tareas.5. Otras cuestiones.
Índice
3.0
![Page 105: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/105.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 1052
Directiva task
Sirve para definir tareas explícitas, y permite gestionar eficientemente procedimientos recursivos y bucles en los que el número de iteraciones es indeterminado.
#pragma omp task [claúsulas] { }
Tareas
claúsulas if (expresión)untieddefault (shared | none)private (var), firstprivate (var), shared
(var)
![Page 106: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/106.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 1062
Una directiva que permite esperar a todas las tareas hijas generadas desde la tarea actual.
#pragma omp taskwait
Tareas
Directiva task
La directiva task permite introducir paralelismo de una forma sencilla en ciertas situaciones en las que era difícil hacerlo. Veamos un par de ejemplos.
![Page 107: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/107.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 1072
> Ejemplo 1: lista ligada
…while (puntero){
(void) ejecutar_tarea(puntero);puntero = puntero->sig;
}…
Sin la directiva task, habría que contar el número de iteraciones previamente para transformar el while en un for.
Tareas
![Page 108: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/108.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 1082
puntero = cabecera;#pragma omp parallel{
#pragma omp single nowait{
while(puntero) {#pragma omp task firstprivate(puntero){
(void) ejecutar_tarea(puntero);}puntero = puntero->sig ;
}}}
Tareas
> Ejemplo 1: lista ligada - openmp
![Page 109: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/109.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 1092
long fibonacci(int n){ // f(0)=f(1)=1, f(n) = f(n-1) + f(n-2)
long f1, f2, fn;
if ( n == 0 || n == 1 ) return(n);
f1 = fibonacci(n-1); f2 = fibonacci(n-2);
fn = f1 + f2;
return(fn);}
Tareas
> Ejemplo 2: fibonacci
![Page 110: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/110.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 1102
long fibonacci(int n){
long f1, f2, fn;
if ( n == 0 || n == 1 ) return(n);
#pragma omp task shared(f1){f1 = fibonacci(n-1);}
#pragma omp task shared(f2){f2 = fibonacci(n-2);}
#pragma omp taskwait
fn = f1 + f2;return(fn);}
Tareas
> Ejemplo 2: fibonacci - openmp
![Page 111: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/111.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 1112
#pragma omp parallel shared(nth){ #pragma omp single nowait
{result = fibonacci(n);
} }
Posibilidad de aplicar recursividad paralela a partir de un tamaño mínimo de cálculo?
Tareas
> Ejemplo 2: fibonacci - openmp
Ejemplo: fibo.c
![Page 112: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/112.jpg)
Laboratorio de ParalelismoIF - EHU
1. Introducción. Programación de Aplicaciones Paralelas. OpenMP.
2. Regiones paralelas.3. Sincronización de los threads.4. Tareas.
5. Otras cuestiones.Funciones para medir tiemposCarreras y deadlocksFunciones reentrantesSpeed-up
Índice
![Page 113: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/113.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 1132
Un par de funciones para “medir tiempos”
omp_get_wtime();
t1 = omp_get_wtime();…t2 = omp_get_wtime();tiempo = t2 – t1;
omp_get_wtick(); precisión del reloj
Otras cuestiones
![Page 114: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/114.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 1142
Programar aplicaciones SMP resulta “más sencillo” que repartir datos por diferentes procesadores y comunicarse por paso de mensajes.
Pero el uso de variables compartidas por varios threads puede llevar a errores no previstos si no se analiza detenidamente su comportamiento.
Algunos errores típicos pueden producir carreras (races) en los resultados o dejar bloqueada la ejecución (deadlock).
Otras cuestiones
![Page 115: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/115.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 1152
CarrerasDefinimos una carrera (race) como la consecución de resultados inesperados e irreproducibles debido a problemas en el acceso y sincronización de variables compartidas.#pragma omp parallel sections
{ #pragma omp section
A = B + C;
#pragma omp sectionB = A + C;
#pragma omp sectionC = B + A;
}
!?
Otras cuestiones: carreras
![Page 116: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/116.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 1162
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;
}}
el contador permite la sincronización entre las secciones (eventos)
las operaciones de flush aseguran la consistencia de la memoria.
Otras cuestiones: carreras
![Page 117: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/117.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 1172
#pragma omp parallel private(tid, X){tid = omp_get_thread_num();
#pragma omp for reduction(+:total) nowaitfor (i=0; i<N; i++){
x = fun(i);total = total + x;
}Y[tid] = fun2(tid, total);
}
!?
Otras cuestiones: carreras
![Page 118: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/118.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 1182
DeadlockSi no se usan correctamente las operaciones de sincronización, es posible que el programa se bloquee (deadlock).Por ejemplo, he aquí un par de errores típicos usando secciones críticas construidas mediante cerrojos:
Otras cuestiones: deadlock
![Page 119: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/119.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 1192
(región paralela)
... omp_set_lock(&C1); A = A + func1(); if (A>0) omp_unset_lock(&C1); else { ... }
...
(región paralela con secciones)
... #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); } ...
Otras cuestiones: deadlock
![Page 120: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/120.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 1202
Recomendaciones:
prestar atención al ámbito de las variables: shared, private, etc.
utilizar con cuidado las funciones de sincronización.
disponer de una versión equivalente secuencial para comparar resultados (serán siempre iguales?).
Otras cuestiones: deadlock
![Page 121: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/121.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 1212
Llamadas en paralelo a funciones de librería¿habrá problemas con la activación simultánea de más de una instancia de dichas funciones?
Una librería es thread-safe (re-entrante) si lo anterior no es un problema. Si no es así, habría que utilizar una secuencia tipo:
LOCK / CALL / UNLOCK
Otras cuestiones
![Page 122: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/122.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 1222
Speed-upEl objetivo de programar una aplicación en un sistema paralelo es:
- ejecutar el problema más rápido.- ejecutar un problema de mayor
tamaño.
En ambos casos hay que tener en cuenta el overhead añadido al paralelizar el código.
Otras cuestiones: speed-up
![Page 123: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/123.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 1232
Escribir programas paralelos OpenMP es fácil... y también lo es escribir programas de bajo rendimiento.
Principales fuentes de pérdida de eficiencia
el algoritmo en ejecución: Amdahl // desequilibrio de carga sincronización: grano muy fino comunicación: acceso a variables shared, cache (fallos, falsa compartición...)
Limitaciones al rendimiento
![Page 124: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/124.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 1242
Ejemplos de mejora de la eficiencia:
#pragma omp parallel forfor (i=0;i<N;i++) { ... }
XMED = xnorm / sum;
#pragma omp parallel forfor (i=0;i<M;i++) { ... }
#pragma omp parallel{ #pragma omp for for (i=0;i<N;i++) { ... }
#pragma omp single XMED = xnorm / sum;
#pragma omp for for (i=0;i<M;i++) { ... }}
#pragma omp parallel private (XMED){ #pragma omp for nowait for (i=0;i<N;i++) { ... }
XMED = xnorm / sum;
#pragma omp for for (i=0;i<M;i++) { ... }}
una sola sección paralela cálculo repetido
Limitaciones al rendimiento
![Page 125: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/125.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 1252
Por ello, interesa minimizar costes de creación y terminación de threads, sincronización, etc.
Hay que considerar también los problemas de localidad de los datos.
Diferentes aspectos:
Otras cuestiones: speed-up
![Page 126: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/126.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 1262
La máquina: SMP o DSMLa localidad de los datos es un factor determinante en una máquina DSM.También es importante en el caso SMP, para mejorar la tasa de acierto de la cache.
La compartición falsa de datosAquí puede resultar importante el tipo de scheduling que se efectúe, para evitar continuas anulaciones de bloques de cache.
Otras cuestiones: speed-up
![Page 127: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/127.jpg)
Laboratorio de ParalelismoIF - EHU
OpenMP 1272
En resumen, es necesario un cuidadoso análisis del reparto y uso de los datos, el tamaño de grano, la sincronización de los threads, el uso de memoria, etc., para minimizar overheads (p.e., el uso de barreras implícitas) y conseguir el máximo rendimiento de un sistema paralelo.
Existen herramientas que ayudan en estas tareas: KAI, PORLAND...
Otras cuestiones: speed-up
![Page 128: L aboratorio de P aralelismo IF - EHU. 2. P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP](https://reader038.vdocuments.site/reader038/viewer/2022102815/55354102550346bb0f8b466d/html5/thumbnails/128.jpg)
Laboratorio de ParalelismoIF - EHU
TEXTOS
• R. Chandra et al.Parallel Programming in OpenMPMorgan Kaufmann, 2001.
• B. Chapman et al.Using OpenMPThe MIT Press, 2008.
WEB
• www.openmp.org (especificación, software…)
OpenMP: referencias