SlideShare una empresa de Scribd logo
Introducción a la programación HPC (17-20 Junio 08)
Introducción al
OpenMP
Alejandro J. Soriano Martínez
Josep Vidal Canet
Introducción a la programación HPC (17-20 Junio 08)
Índice
Índice:
1) Introducción
2) Directivas de compilación
1) Formato para C y Fortran
2) Regiones paralelas: cláusulas
3) Construcciones paralelas: cláusulas
3) Librería de funciones en tiempo de ejecución
4) Variables de entorno
Introducción a la programación HPC (17-20 Junio 08)
INTRODUCCIÓN
OpenMP
Introducción a la programación HPC (17-20 Junio 08)
Introducción
• Sistemas de memoria distribuida:
Memoria
Procesador
Memoria
Procesador
Memoria
Procesador
Memoria
Procesador
INTERCONEXIÓN
Introducción a la programación HPC (17-20 Junio 08)
Introducción
• Sistemas de memoria compartida:
Memoria
Procesador Procesador Procesador Procesador
Introducción a la programación HPC (17-20 Junio 08)
Introducción
OpenMP (Open specifications for Multi Processing) es
una API (Application Programming Interface –
Interfaz de Programación de Aplicaciones) para la
paralelización de programas en plataformas de
memoria compartida.
Tiene implementaciones en C/C++ y FORTRAN (77, 90
y 95) y está disponible en la gran mayoría de
compiladores.
OpenMP Arquitecture Review Board: se encarga de
crear y revisar las especificaciones de OpenMP
(http://openmp.org/wp/)
Introducción a la programación HPC (17-20 Junio 08)
Introducción
http://openmp.org/wp/openmp-compilers
Introducción a la programación HPC (17-20 Junio 08)
Introducción
• Es un conjunto de especificaciones, como puede
serlo MPI (Message Passing Interface),
implementado por:
– Directivas de compilación
– Una librería de funciones en tiempo de ejecución
– Variables de entorno
• ¿Qué se puede paralelizar en OpenMP?
– Bucles (for en C, do en fortran) : paralelismo de
“grano fino”. El programa reparte la carga usando el
índice del bucle.
– Regiones paralelas : paralelismo de “grano grueso”.
El usuario reparte la carga en bloques de trabajo.
Introducción a la programación HPC (17-20 Junio 08)
Introducción
Modelo de ejecución: fork-join (imagen wikipedia)
Introducción a la programación HPC (17-20 Junio 08)
DIRECTIVAS DE
COMPILACIÓN
OpenMP
Introducción a la programación HPC (17-20 Junio 08)
Directivas de compilación
La mayoría de las construcciones en OpenMP son
directivas de compilación o pragmas:
Las directivas son tomadas por comentarios por
aquellos compiladores que no están preparados
para interpretarlas.
Lenguaje Centinela Directiva [Cláusulas]
C/C++ #pragma omp
Justo después del
centinela y antes de
las opciones
Opciones aplicables
a la directiva
Fortran
!$OMP
C$OMP
*$OMP
Justo después del
centinela y antes de
las opciones
Opciones aplicables
a la directiva
Introducción a la programación HPC (17-20 Junio 08)
int main() {
double a[1000],b[1000],c[1000];
int i;
for (i = 0; i< 1000; i++){
a[i] = b[i] + c[i];
}
}
Program Ejemplo1
Implicit none
real(8) :: a(1000),b(1000),c(1000)
integer :: i
do i=0,1000
a(i) = b(i) + c(i)
end do
end
Directivas de compilación
int main() {
double a[1000],b[1000],c[1000];
int i;
#pragma omp for
for (i = 0; i< 1000; i++){
a[i] = b[i] + c[i];
}
}
Program Ejemplo1
Implicit none
real(8) :: a(1000),b(1000),c(1000)
integer :: i
!$OMP PARALLEL DO
do i=0,1000
a(i) = b(i) + c(i)
end do
!$OMP END PARALLEL DO
end
Introducción a la programación HPC (17-20 Junio 08)
Directivas de compilación
Compilando con OpenMP: basta con indicarle al
compilador que interprete las directivas. Si no se
hace, el compilador creerá que son comentarios e
ignorará las líneas. En los compiladores de Intel
instalados en Cesar y Multivac la opción es “-
openmp”.
ifort ejem1.F90 -o ejem1.exe Genera el ejecutable
secuencial
ifort ejem1.F90 -o ejem1.exe –openmp (-fpp) Genera el
ejecutable
paralelo
Lo mismo con C/C++: icc … -openmp
¡CONTINUAMOS EN FORTRAN!
Introducción a la programación HPC (17-20 Junio 08)
Directivas de compilación
1) Regiones paralelas:
!$OMP PARALLEL cláusula1 cláusula2...
Código paralelo
!$OMP END PARALLEL
Región serie
Región paralela
Thread 0
Thread 0 Thread 1
Thread
Np
Normas básicas:
1)Debe aparecer en la misma
rutina del programa
2)No se puede saltar dentro o
fuera de la región paralela
(GOTO)
3)Está permitido ANIDAR
regiones paralelas
Introducción a la programación HPC (17-20 Junio 08)
Directivas de compilación
• Ejem2: usa Ejecuta.sh para ver:
!$OMP PARALLEL
write(*,*) “Hello World”
!$OMP END PARALLEL
Cláusulas:
– PRIVATE (lista)
– SHARED (lista)
– DEFAULT ( PRIVATE | SHARED | NONE )
– FIRSTPRIVATE (lista)
– REDUCTION (operador : lista)
– COPYIN (lista)
– IF ( expresión lógica )
– NUM_THREADS ( entero )
Introducción a la programación HPC (17-20 Junio 08)
Directivas de compilación
PRIVATE:
!$OMP PARALLEL
PRIVATE(a,b)
SHARED:
!$OMP PARALLEL
SHARED(c,d)
Región serie
Región paralela
Thread 0
Thread 0 Thread 1 Thread Np
Memoria
Compartida
Memoria
Compartida
a b
a b
a b a b
Región serie
Región paralela
Thread 0
Thread 0 Thread 1 Thread Np
Memoria
Compartida
Memoria
Compartida
c d
c d
Introducción a la programación HPC (17-20 Junio 08)
Directivas de compilación
DEFAULT (PRIVATE|SHARED|NONE):
!$OMP PARALLEL DEFAULT(PRIVATE) SHARED(a)
Para declarar muchas variables de golpe. “None” implica
declararlas todas.
Región serie
Región paralela
Thread 0
Thread 0 Thread 1 Thread Np
Memoria
Compartida
Memoria
Compartida
b = 1
a = 2
b = 1
a = ?
b = 1
a = ?
b = 1
a = ?
FIRSTPRIVATE(list):
!$OMP PARALLEL PRIVATE(a) FIRSTPRIVATE(b)
Introducción a la programación HPC (17-20 Junio 08)
Directivas de compilación
REDUCTION (operador : lista):
Muchas veces hay variables en memoria compartida que sólo
deben ser actualizadas por un único hilo cada vez. Hay dos
opciones:
– Pongo barreras en el momento de actualizar la variable (lo
veremos): esto afecta al rendimiento.
– Creo una copia privada de la variable y la inicializo. Dejo que cada
hilo actualice su copia privada de la variable y al sincronizar los
hilos actualizo el valor de la variable con los diferentes parciales.
Operador Inicialización
+ 0
* 1
- 0
.AND. .TRUE.
.OR. .FALSE.
.EQV. .TRUE.
.NEQV. .FALSE.
Introducción a la programación HPC (17-20 Junio 08)
Directivas de compilación
IF (EXPRESIÓN LÓGICA):
!$OMP PARALLEL IF (N > 1000)
Ejeción condicional: la región sólo se ejecuta en paralelo si se
cumple la condición expuesta en el IF.
NUM_THREADS ( entero ):
!$OMP PARALLEL IF (N > 1000)
Fija el número de hilos que ejecutarán la región paralela.
Prevalece sobre el valor fijado en las variables de entorno.
Introducción a la programación HPC (17-20 Junio 08)
Directivas de compilación
2) Bucles DO:
!$OMP DO cláusula1 cláusula2...
Código paralelo
!$OMP END DO cláusula de finalización
Región serie
Región paralela
Thread 0
Thread 0 Thread 1 Thread 3
i=1, 100 i=101, 200 i=201, 300
Introducción a la programación HPC (17-20 Junio 08)
Directivas de compilación
Cláusulas:
– PRIVATE (lista)
– FIRSTPRIVATE (lista)
– LASTPRIVATE(lista)
– REDUCTION (operador : lista)
– SCHEDULE (tipo, chunk)
– ORDERER
Adicionalmente: una cláusula de terminación
– NOWAIT : existe una sincronización implícita cuando finaliza el
entorno paralelo. Esta directiva anula dicha sincronización, por lo
que debe tenerse cuidado al usar determinadas variables.
Introducción a la programación HPC (17-20 Junio 08)
Directivas de compilación
LASTPRIVATE (lista):
!$OMP DO LASTPRIVATE(I)
El estado final de las variables privadas de cada hilo
generalmente queda indeterminado al finalizar la región
paralela. Esta opción hace que tenga el valor que hubiera
tenido si se hubiera ejecutado en serie. Ej: índice del bucle do.
ORDERED:
Una determinada parte de un bucle puede necesitar ejecutarse de
forma ordenada. Esta directiva lo hace posible al hacerlo
secuencial
!$OMP DO ORDERED
do i = 1, 1000
!$OMP ORDERED
A(i) = 2 * A (i -1)
!$OMP END ORDERED
end do
!$OMP END DO
Introducción a la programación HPC (17-20 Junio 08)
Directivas de compilación
Ejemplo:
do i = 1, 10
do j = 1, 10
!$OMP DO
do k = 1, 10
A(i,j,k) = i * j * k
end do
!$OMP END DO
end do
end do
Cada hilo ejecuta un k/N del último
bucle, pero reparte el trabajo i*j
veces.
!$OMP DO
do i = 1, 10
do j = 1, 10
do k = 1, 10
A(i,j,k) = i * j * k
end do
end do
end do
!$OMP END DO
Cada hilo ejecuta j*k elementos de
los dos últimos bucles, pero reparte
el trabajo 1 vez sólo.
Introducción a la programación HPC (17-20 Junio 08)
Directivas de compilación
3) Secciones paralelas:
!$OMP SECTIONS cláusula1 cláusula2...
!$OMP SECTION
Código sección 1
!$OMP SECTION
Código sección N
!$OMP END DO cláusula de finalización
Región serie
Región paralela
Thread 0
Thread 0 Thread 1 Thread 3
Sección 1 Sección 2 Sección 3
• Pueden ponerse cualquier número de secciones. Si supera el número
de hilos, cada hilo ejecutará más de una sección de forma secuencial.
• La carga computaciona de cada hilo NO tiene por qué ser simétrica.
• Todas las directivas !$OMP SECTION deben estar en la misma
subroutina.
• Cláusulas: PRIVATE, FIRSTPRIVATE, LASTPRIVATE, REDUCTION
Introducción a la programación HPC (17-20 Junio 08)
Directivas de compilación
3) Secciones secuenciales:
!$OMP SINGLE cláusula1 cláusula2...
Código secuencial
!$OMP END SINGLE cláusula de finalización
Sólo ejecuta un hilo, el resto esperan a que termine ese hilo, a
menos que cerremos con un NOWAIT.
No puede ejecutarse dentro de un bucle DO, ya que la carga de
trabajo se ha repartido ya ANTES de llegar a la sentencia
SINGLE.
Introducción a la programación HPC (17-20 Junio 08)
Directivas de compilación
Sincronización de hilos:
!$OMP MASTER / !$OMP END MASTER : sólo el hilo 0 (el master)
ejecuta el código. El resto NO esperan. [SINGLE con NOWAIT]
!$OMP CRITIAL / !$OMP END CRITICAL : asegura que sólo un hilo
ejecuta una acción en concreto (escribir fichero, leer de
teclado). El resto espera a que el anterior termine para poder
ejecutar ese fragmento de código.
!$OMP BARRIER : debe existir para todos los hilos o para
ninguno. Todos esperan hasta que llegan a ese punto. Si sólo 1
tiene la barrera, se produce un deadlock.
!$OMP ATOMIC : asegura que sólo 1 hilo actualiza una variable
compartida. Por ejemplo (a = a +1). [Critical]
Introducción a la programación HPC (17-20 Junio 08)
Directivas de compilación
• Ejemplo: cálculo del número pi
Integración numérica por el método de los trapecios.
– Convertir el código secuencial a paralelo
– Cuidado con las condiciones de carrera
• Ejemplo : multiplicación de matrices
– Ejecuta el código en secuencial y mide el tiempo
– Convierte el código a paralelo y mide el tiempo
Introducción a la programación HPC (17-20 Junio 08)
LIBRERÍA DE FUNCIONES
(RUN-TIME)
OpenMP
Introducción a la programación HPC (17-20 Junio 08)
Librería de Funciones
Librería de funciones accesibles en tiempo de ejecución
que sirven para controlar y hacer consultas desde el
interior del programa al entorno de ejecución paralelo. Se
llama “omp_lib” y debe ser llamada en el programa (use
omp_lib).
OMP_set_num_threads(número) : fija el número de threads que
serán usados por las regiones paralelas en el código. (call
OMP_set…)
OMP_get_num_threads : obtiene el número de threads que están
ejecutándose en la región paralela desde la que es llamada.
OMP_get_thread_num : obtiene el identificador del thread actual
dentro de la región paralela.
OMP_get_num_procs : devuelve el número de procesadores
disponible para el programa.
OMP_set_dynamic : activa (.TRUE.) o desactiva (.FALSE.) el
Introducción a la programación HPC (17-20 Junio 08)
Librería de Funciones
OMP_get_dynamic : obtiene el estado del mecanismo de ajuste
dinámico de threads (.TRUE. o .FALSE.)
OMP_set_nested : activa o desactiva el anidado de regiones
paralelas.
OMP_get_nested : obtiene el estado del mecanismo anterior.
Bloqueos:
OMP_init_lock(variable) : inicializa una variable que será asociada
con un bloqueo.
OMP_set_lock(variable) : cuando un thread llama a esta
subroutine, adquiere la posesión del bloqueo si está libre. Si no
lo está, espera a que lo esté
OMP_unset_lock(variable) : libera la propiedad de un bloqueo.
OMP_destry_lock(variable): desinicializa la variable asociada con
el bloqueo.
Introducción a la programación HPC (17-20 Junio 08)
Librería de Funciones
program Main
use omp_lib
implicit none
integer(kind = OMP_lock_kind) :: lck
integer(kind = OMP_integer_kind) :: ID
call OMP_init_lock(lck)
!$OMP PARALLEL SHARED(LCK) PRIVATE(ID)
ID = OMP_get_thread_num()
call OMP_set_lock(lck)
write(*,*) "My thread is ", ID
call OMP_unset_lock(lck)
!$OMP END PARALLEL
call OMP_destroy_lock(lck)
end program Main
El primer hilo que llegue a tomar
el control del bloqueo, escribirá
por pantalla, el resto quedarán a
la espera hasta que sea liberado.
Antes de poder usar el bloqueo,
hay que inicializarlo.
Una vez no es necesario el
bloqueo, se elimina.
Hay que llamar a la librería para
poder usarla (compilador).
Introducción a la programación HPC (17-20 Junio 08)
VARIABLES DE ENTORNO
OpenMP
Introducción a la programación HPC (17-20 Junio 08)
Variables de entorno
Se puede controlar algunos aspectos de la ejecución
de programas OpenMP asignando valores a
determinadas variables de entorno. Algunas de
estas variables pueden ser fijadas con llamadas a la
librería de funciones.
Ej: Usando bash:
export OMP_NUM_THREADS=Número : Fija el valor de
una variable de entorno.
echo $OMP_NUM_THREADS : Muestra el valor de la
variable de entorno
Introducción a la programación HPC (17-20 Junio 08)
Variables de entorno
• OMP_NUM_THREADS : especifica el número de
hilos que serán usados durante la ejecución de las
regiones paralelas definidas dentro de una programa
OpenMP.
– Valor tipico : 1 – Número de procesadores
• OMP_SCHEDULE : afecta a la forma en que funciona
la directiva !$OMP DO y !$OMP PARALLEL DO.
Especifica la forma en la que ha de repartirse el
trabajo.
– Valores posibles = STATIC, DYNAMIC o GUIDED
Introducción a la programación HPC (17-20 Junio 08)
Variables de entorno
• OMP_DYNAMIC : en máquinas SMP, dónde
diferentes programas se ejecutan simultáneamente,
es posible ajustar el número de hilos de forma
dinámica para aprovechar al máximo la máquina.
– Valor posible = TRUE o FALSE
• OMP_NESTED : especifica el comportamiento del
programa en caso de regiones paralelas anidadas.
– Valor posible = TRUE o FALSE
• ¿OTROS? : si, en función del compilador
Introducción a la programación HPC (17-20 Junio 08)
EJEMPLOS
Introducción a la programación HPC (17-20 Junio 08)
¡GRACIAS!
OpenMP

Más contenido relacionado

Similar a OpenMP.ppt

Ec2
Ec2Ec2
Pic16f84(1)
Pic16f84(1)Pic16f84(1)
Pic16f84(1)
Erick Perez
 
programacion con microcontrolador pic 16f84
programacion con microcontrolador pic 16f84programacion con microcontrolador pic 16f84
programacion con microcontrolador pic 16f84
guestf09168b
 
Introducción a la programacion Pic16F84
Introducción a la programacion Pic16F84Introducción a la programacion Pic16F84
Introducción a la programacion Pic16F84
Daniel Remondegui
 
Dudas printf()
Dudas printf()Dudas printf()
Dudas printf()
bad_666
 
El sistema NWP HARMONIE: Introducción a la Computación de Altas
El sistema NWP HARMONIE: Introducción a la Computación de AltasEl sistema NWP HARMONIE: Introducción a la Computación de Altas
El sistema NWP HARMONIE: Introducción a la Computación de Altas
Tomás Morales
 
Fundamentos de Programación - Unidad II: Introducción a la Programación
Fundamentos de Programación - Unidad II: Introducción a la ProgramaciónFundamentos de Programación - Unidad II: Introducción a la Programación
Fundamentos de Programación - Unidad II: Introducción a la Programación
José Antonio Sandoval Acosta
 
Características Generales de EIGRP
Características Generales de EIGRPCaracterísticas Generales de EIGRP
Características Generales de EIGRP
Hugo Alberto Rivera Diaz
 
"Hola Mundo" C18, PIC18F y MPLAB
"Hola Mundo"  C18,  PIC18F y MPLAB"Hola Mundo"  C18,  PIC18F y MPLAB
"Hola Mundo" C18, PIC18F y MPLAB
BlackD10
 
Rutinas y Sub Rutinas del MicroZ80
Rutinas y Sub Rutinas del MicroZ80Rutinas y Sub Rutinas del MicroZ80
Rutinas y Sub Rutinas del MicroZ80
Pablo Chumania
 
Openmp
OpenmpOpenmp
Openmp
Unex
 
Estructura .COM
Estructura .COMEstructura .COM
Estructura .COM
Alejandro Muñiz
 
Dialnet programando microcontroladorespicenlenguajec-4587553
Dialnet programando microcontroladorespicenlenguajec-4587553Dialnet programando microcontroladorespicenlenguajec-4587553
Dialnet programando microcontroladorespicenlenguajec-4587553
RoxanneLamas2
 
Practica1
Practica1Practica1
Practica1
san jaramillo
 
Practica1
Practica1Practica1
Practica1
rexmersxa7
 
38912287 practica1
38912287 practica138912287 practica1
38912287 practica1
rexmersxa7
 
Metodología de la programación
Metodología de la programaciónMetodología de la programación
Metodología de la programación
Ansd
 
Manuel Blanco - GNU/Linux Binary Exploitation I&II [rooted2018]
Manuel Blanco - GNU/Linux Binary Exploitation I&II [rooted2018]Manuel Blanco - GNU/Linux Binary Exploitation I&II [rooted2018]
Manuel Blanco - GNU/Linux Binary Exploitation I&II [rooted2018]
RootedCON
 
Introduccion al assembler
Introduccion al assemblerIntroduccion al assembler
Introduccion al assembler
angel
 
Fundamentos de Programacion - Unidad 3 Introduccion a la programacion
Fundamentos de Programacion - Unidad 3 Introduccion a la programacionFundamentos de Programacion - Unidad 3 Introduccion a la programacion
Fundamentos de Programacion - Unidad 3 Introduccion a la programacion
José Antonio Sandoval Acosta
 

Similar a OpenMP.ppt (20)

Ec2
Ec2Ec2
Ec2
 
Pic16f84(1)
Pic16f84(1)Pic16f84(1)
Pic16f84(1)
 
programacion con microcontrolador pic 16f84
programacion con microcontrolador pic 16f84programacion con microcontrolador pic 16f84
programacion con microcontrolador pic 16f84
 
Introducción a la programacion Pic16F84
Introducción a la programacion Pic16F84Introducción a la programacion Pic16F84
Introducción a la programacion Pic16F84
 
Dudas printf()
Dudas printf()Dudas printf()
Dudas printf()
 
El sistema NWP HARMONIE: Introducción a la Computación de Altas
El sistema NWP HARMONIE: Introducción a la Computación de AltasEl sistema NWP HARMONIE: Introducción a la Computación de Altas
El sistema NWP HARMONIE: Introducción a la Computación de Altas
 
Fundamentos de Programación - Unidad II: Introducción a la Programación
Fundamentos de Programación - Unidad II: Introducción a la ProgramaciónFundamentos de Programación - Unidad II: Introducción a la Programación
Fundamentos de Programación - Unidad II: Introducción a la Programación
 
Características Generales de EIGRP
Características Generales de EIGRPCaracterísticas Generales de EIGRP
Características Generales de EIGRP
 
"Hola Mundo" C18, PIC18F y MPLAB
"Hola Mundo"  C18,  PIC18F y MPLAB"Hola Mundo"  C18,  PIC18F y MPLAB
"Hola Mundo" C18, PIC18F y MPLAB
 
Rutinas y Sub Rutinas del MicroZ80
Rutinas y Sub Rutinas del MicroZ80Rutinas y Sub Rutinas del MicroZ80
Rutinas y Sub Rutinas del MicroZ80
 
Openmp
OpenmpOpenmp
Openmp
 
Estructura .COM
Estructura .COMEstructura .COM
Estructura .COM
 
Dialnet programando microcontroladorespicenlenguajec-4587553
Dialnet programando microcontroladorespicenlenguajec-4587553Dialnet programando microcontroladorespicenlenguajec-4587553
Dialnet programando microcontroladorespicenlenguajec-4587553
 
Practica1
Practica1Practica1
Practica1
 
Practica1
Practica1Practica1
Practica1
 
38912287 practica1
38912287 practica138912287 practica1
38912287 practica1
 
Metodología de la programación
Metodología de la programaciónMetodología de la programación
Metodología de la programación
 
Manuel Blanco - GNU/Linux Binary Exploitation I&II [rooted2018]
Manuel Blanco - GNU/Linux Binary Exploitation I&II [rooted2018]Manuel Blanco - GNU/Linux Binary Exploitation I&II [rooted2018]
Manuel Blanco - GNU/Linux Binary Exploitation I&II [rooted2018]
 
Introduccion al assembler
Introduccion al assemblerIntroduccion al assembler
Introduccion al assembler
 
Fundamentos de Programacion - Unidad 3 Introduccion a la programacion
Fundamentos de Programacion - Unidad 3 Introduccion a la programacionFundamentos de Programacion - Unidad 3 Introduccion a la programacion
Fundamentos de Programacion - Unidad 3 Introduccion a la programacion
 

Último

APLICACIONES EN INTERNET-GOOGLE.20240pdf
APLICACIONES EN INTERNET-GOOGLE.20240pdfAPLICACIONES EN INTERNET-GOOGLE.20240pdf
APLICACIONES EN INTERNET-GOOGLE.20240pdf
jordanovillacorta09
 
DuckDuckGo (Motor de Busqueda) - JRM - APSTI I A
DuckDuckGo (Motor de Busqueda) -  JRM - APSTI I ADuckDuckGo (Motor de Busqueda) -  JRM - APSTI I A
DuckDuckGo (Motor de Busqueda) - JRM - APSTI I A
DarnotOcxalFlorianoP
 
IF y SWITCH: Claves para una Lógica de Programación
IF y SWITCH: Claves para una Lógica de ProgramaciónIF y SWITCH: Claves para una Lógica de Programación
IF y SWITCH: Claves para una Lógica de Programación
bvaldivieso014
 
Aplicación de las sentencias de control en telecomunicaciones
Aplicación de las sentencias de control en telecomunicacionesAplicación de las sentencias de control en telecomunicaciones
Aplicación de las sentencias de control en telecomunicaciones
ambuludimateo2
 
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
micarnavaltupatrimon
 
herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcelherramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
Eduardo455921
 
Casos de éxito en Negocios online: Estrategias WPO que funcionan - Presentac...
Casos de éxito en Negocios online: Estrategias WPO que funcionan - Presentac...Casos de éxito en Negocios online: Estrategias WPO que funcionan - Presentac...
Casos de éxito en Negocios online: Estrategias WPO que funcionan - Presentac...
Javier Martinez Seco
 
TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptxTARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
dayronfabricioruizmo
 
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
micarnavaltupatrimon
 
PLUGIN (Mary Cielo Huañec Paz) .pdf
PLUGIN (Mary Cielo Huañec Paz)      .pdfPLUGIN (Mary Cielo Huañec Paz)      .pdf
PLUGIN (Mary Cielo Huañec Paz) .pdf
MaryCieloHuaecPaz
 
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
Maria Celeste Trujillo Cruz
 
sesión 8 tipos de componentes SMD SOFTWARE
sesión 8 tipos de componentes SMD SOFTWAREsesión 8 tipos de componentes SMD SOFTWARE
sesión 8 tipos de componentes SMD SOFTWARE
YanelyMedalithBM
 

Último (12)

APLICACIONES EN INTERNET-GOOGLE.20240pdf
APLICACIONES EN INTERNET-GOOGLE.20240pdfAPLICACIONES EN INTERNET-GOOGLE.20240pdf
APLICACIONES EN INTERNET-GOOGLE.20240pdf
 
DuckDuckGo (Motor de Busqueda) - JRM - APSTI I A
DuckDuckGo (Motor de Busqueda) -  JRM - APSTI I ADuckDuckGo (Motor de Busqueda) -  JRM - APSTI I A
DuckDuckGo (Motor de Busqueda) - JRM - APSTI I A
 
IF y SWITCH: Claves para una Lógica de Programación
IF y SWITCH: Claves para una Lógica de ProgramaciónIF y SWITCH: Claves para una Lógica de Programación
IF y SWITCH: Claves para una Lógica de Programación
 
Aplicación de las sentencias de control en telecomunicaciones
Aplicación de las sentencias de control en telecomunicacionesAplicación de las sentencias de control en telecomunicaciones
Aplicación de las sentencias de control en telecomunicaciones
 
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
 
herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcelherramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
 
Casos de éxito en Negocios online: Estrategias WPO que funcionan - Presentac...
Casos de éxito en Negocios online: Estrategias WPO que funcionan - Presentac...Casos de éxito en Negocios online: Estrategias WPO que funcionan - Presentac...
Casos de éxito en Negocios online: Estrategias WPO que funcionan - Presentac...
 
TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptxTARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
 
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
 
PLUGIN (Mary Cielo Huañec Paz) .pdf
PLUGIN (Mary Cielo Huañec Paz)      .pdfPLUGIN (Mary Cielo Huañec Paz)      .pdf
PLUGIN (Mary Cielo Huañec Paz) .pdf
 
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
 
sesión 8 tipos de componentes SMD SOFTWARE
sesión 8 tipos de componentes SMD SOFTWAREsesión 8 tipos de componentes SMD SOFTWARE
sesión 8 tipos de componentes SMD SOFTWARE
 

OpenMP.ppt

  • 1. Introducción a la programación HPC (17-20 Junio 08) Introducción al OpenMP Alejandro J. Soriano Martínez Josep Vidal Canet
  • 2. Introducción a la programación HPC (17-20 Junio 08) Índice Índice: 1) Introducción 2) Directivas de compilación 1) Formato para C y Fortran 2) Regiones paralelas: cláusulas 3) Construcciones paralelas: cláusulas 3) Librería de funciones en tiempo de ejecución 4) Variables de entorno
  • 3. Introducción a la programación HPC (17-20 Junio 08) INTRODUCCIÓN OpenMP
  • 4. Introducción a la programación HPC (17-20 Junio 08) Introducción • Sistemas de memoria distribuida: Memoria Procesador Memoria Procesador Memoria Procesador Memoria Procesador INTERCONEXIÓN
  • 5. Introducción a la programación HPC (17-20 Junio 08) Introducción • Sistemas de memoria compartida: Memoria Procesador Procesador Procesador Procesador
  • 6. Introducción a la programación HPC (17-20 Junio 08) Introducción OpenMP (Open specifications for Multi Processing) es una API (Application Programming Interface – Interfaz de Programación de Aplicaciones) para la paralelización de programas en plataformas de memoria compartida. Tiene implementaciones en C/C++ y FORTRAN (77, 90 y 95) y está disponible en la gran mayoría de compiladores. OpenMP Arquitecture Review Board: se encarga de crear y revisar las especificaciones de OpenMP (http://openmp.org/wp/)
  • 7. Introducción a la programación HPC (17-20 Junio 08) Introducción http://openmp.org/wp/openmp-compilers
  • 8. Introducción a la programación HPC (17-20 Junio 08) Introducción • Es un conjunto de especificaciones, como puede serlo MPI (Message Passing Interface), implementado por: – Directivas de compilación – Una librería de funciones en tiempo de ejecución – Variables de entorno • ¿Qué se puede paralelizar en OpenMP? – Bucles (for en C, do en fortran) : paralelismo de “grano fino”. El programa reparte la carga usando el índice del bucle. – Regiones paralelas : paralelismo de “grano grueso”. El usuario reparte la carga en bloques de trabajo.
  • 9. Introducción a la programación HPC (17-20 Junio 08) Introducción Modelo de ejecución: fork-join (imagen wikipedia)
  • 10. Introducción a la programación HPC (17-20 Junio 08) DIRECTIVAS DE COMPILACIÓN OpenMP
  • 11. Introducción a la programación HPC (17-20 Junio 08) Directivas de compilación La mayoría de las construcciones en OpenMP son directivas de compilación o pragmas: Las directivas son tomadas por comentarios por aquellos compiladores que no están preparados para interpretarlas. Lenguaje Centinela Directiva [Cláusulas] C/C++ #pragma omp Justo después del centinela y antes de las opciones Opciones aplicables a la directiva Fortran !$OMP C$OMP *$OMP Justo después del centinela y antes de las opciones Opciones aplicables a la directiva
  • 12. Introducción a la programación HPC (17-20 Junio 08) int main() { double a[1000],b[1000],c[1000]; int i; for (i = 0; i< 1000; i++){ a[i] = b[i] + c[i]; } } Program Ejemplo1 Implicit none real(8) :: a(1000),b(1000),c(1000) integer :: i do i=0,1000 a(i) = b(i) + c(i) end do end Directivas de compilación int main() { double a[1000],b[1000],c[1000]; int i; #pragma omp for for (i = 0; i< 1000; i++){ a[i] = b[i] + c[i]; } } Program Ejemplo1 Implicit none real(8) :: a(1000),b(1000),c(1000) integer :: i !$OMP PARALLEL DO do i=0,1000 a(i) = b(i) + c(i) end do !$OMP END PARALLEL DO end
  • 13. Introducción a la programación HPC (17-20 Junio 08) Directivas de compilación Compilando con OpenMP: basta con indicarle al compilador que interprete las directivas. Si no se hace, el compilador creerá que son comentarios e ignorará las líneas. En los compiladores de Intel instalados en Cesar y Multivac la opción es “- openmp”. ifort ejem1.F90 -o ejem1.exe Genera el ejecutable secuencial ifort ejem1.F90 -o ejem1.exe –openmp (-fpp) Genera el ejecutable paralelo Lo mismo con C/C++: icc … -openmp ¡CONTINUAMOS EN FORTRAN!
  • 14. Introducción a la programación HPC (17-20 Junio 08) Directivas de compilación 1) Regiones paralelas: !$OMP PARALLEL cláusula1 cláusula2... Código paralelo !$OMP END PARALLEL Región serie Región paralela Thread 0 Thread 0 Thread 1 Thread Np Normas básicas: 1)Debe aparecer en la misma rutina del programa 2)No se puede saltar dentro o fuera de la región paralela (GOTO) 3)Está permitido ANIDAR regiones paralelas
  • 15. Introducción a la programación HPC (17-20 Junio 08) Directivas de compilación • Ejem2: usa Ejecuta.sh para ver: !$OMP PARALLEL write(*,*) “Hello World” !$OMP END PARALLEL Cláusulas: – PRIVATE (lista) – SHARED (lista) – DEFAULT ( PRIVATE | SHARED | NONE ) – FIRSTPRIVATE (lista) – REDUCTION (operador : lista) – COPYIN (lista) – IF ( expresión lógica ) – NUM_THREADS ( entero )
  • 16. Introducción a la programación HPC (17-20 Junio 08) Directivas de compilación PRIVATE: !$OMP PARALLEL PRIVATE(a,b) SHARED: !$OMP PARALLEL SHARED(c,d) Región serie Región paralela Thread 0 Thread 0 Thread 1 Thread Np Memoria Compartida Memoria Compartida a b a b a b a b Región serie Región paralela Thread 0 Thread 0 Thread 1 Thread Np Memoria Compartida Memoria Compartida c d c d
  • 17. Introducción a la programación HPC (17-20 Junio 08) Directivas de compilación DEFAULT (PRIVATE|SHARED|NONE): !$OMP PARALLEL DEFAULT(PRIVATE) SHARED(a) Para declarar muchas variables de golpe. “None” implica declararlas todas. Región serie Región paralela Thread 0 Thread 0 Thread 1 Thread Np Memoria Compartida Memoria Compartida b = 1 a = 2 b = 1 a = ? b = 1 a = ? b = 1 a = ? FIRSTPRIVATE(list): !$OMP PARALLEL PRIVATE(a) FIRSTPRIVATE(b)
  • 18. Introducción a la programación HPC (17-20 Junio 08) Directivas de compilación REDUCTION (operador : lista): Muchas veces hay variables en memoria compartida que sólo deben ser actualizadas por un único hilo cada vez. Hay dos opciones: – Pongo barreras en el momento de actualizar la variable (lo veremos): esto afecta al rendimiento. – Creo una copia privada de la variable y la inicializo. Dejo que cada hilo actualice su copia privada de la variable y al sincronizar los hilos actualizo el valor de la variable con los diferentes parciales. Operador Inicialización + 0 * 1 - 0 .AND. .TRUE. .OR. .FALSE. .EQV. .TRUE. .NEQV. .FALSE.
  • 19. Introducción a la programación HPC (17-20 Junio 08) Directivas de compilación IF (EXPRESIÓN LÓGICA): !$OMP PARALLEL IF (N > 1000) Ejeción condicional: la región sólo se ejecuta en paralelo si se cumple la condición expuesta en el IF. NUM_THREADS ( entero ): !$OMP PARALLEL IF (N > 1000) Fija el número de hilos que ejecutarán la región paralela. Prevalece sobre el valor fijado en las variables de entorno.
  • 20. Introducción a la programación HPC (17-20 Junio 08) Directivas de compilación 2) Bucles DO: !$OMP DO cláusula1 cláusula2... Código paralelo !$OMP END DO cláusula de finalización Región serie Región paralela Thread 0 Thread 0 Thread 1 Thread 3 i=1, 100 i=101, 200 i=201, 300
  • 21. Introducción a la programación HPC (17-20 Junio 08) Directivas de compilación Cláusulas: – PRIVATE (lista) – FIRSTPRIVATE (lista) – LASTPRIVATE(lista) – REDUCTION (operador : lista) – SCHEDULE (tipo, chunk) – ORDERER Adicionalmente: una cláusula de terminación – NOWAIT : existe una sincronización implícita cuando finaliza el entorno paralelo. Esta directiva anula dicha sincronización, por lo que debe tenerse cuidado al usar determinadas variables.
  • 22. Introducción a la programación HPC (17-20 Junio 08) Directivas de compilación LASTPRIVATE (lista): !$OMP DO LASTPRIVATE(I) El estado final de las variables privadas de cada hilo generalmente queda indeterminado al finalizar la región paralela. Esta opción hace que tenga el valor que hubiera tenido si se hubiera ejecutado en serie. Ej: índice del bucle do. ORDERED: Una determinada parte de un bucle puede necesitar ejecutarse de forma ordenada. Esta directiva lo hace posible al hacerlo secuencial !$OMP DO ORDERED do i = 1, 1000 !$OMP ORDERED A(i) = 2 * A (i -1) !$OMP END ORDERED end do !$OMP END DO
  • 23. Introducción a la programación HPC (17-20 Junio 08) Directivas de compilación Ejemplo: do i = 1, 10 do j = 1, 10 !$OMP DO do k = 1, 10 A(i,j,k) = i * j * k end do !$OMP END DO end do end do Cada hilo ejecuta un k/N del último bucle, pero reparte el trabajo i*j veces. !$OMP DO do i = 1, 10 do j = 1, 10 do k = 1, 10 A(i,j,k) = i * j * k end do end do end do !$OMP END DO Cada hilo ejecuta j*k elementos de los dos últimos bucles, pero reparte el trabajo 1 vez sólo.
  • 24. Introducción a la programación HPC (17-20 Junio 08) Directivas de compilación 3) Secciones paralelas: !$OMP SECTIONS cláusula1 cláusula2... !$OMP SECTION Código sección 1 !$OMP SECTION Código sección N !$OMP END DO cláusula de finalización Región serie Región paralela Thread 0 Thread 0 Thread 1 Thread 3 Sección 1 Sección 2 Sección 3 • Pueden ponerse cualquier número de secciones. Si supera el número de hilos, cada hilo ejecutará más de una sección de forma secuencial. • La carga computaciona de cada hilo NO tiene por qué ser simétrica. • Todas las directivas !$OMP SECTION deben estar en la misma subroutina. • Cláusulas: PRIVATE, FIRSTPRIVATE, LASTPRIVATE, REDUCTION
  • 25. Introducción a la programación HPC (17-20 Junio 08) Directivas de compilación 3) Secciones secuenciales: !$OMP SINGLE cláusula1 cláusula2... Código secuencial !$OMP END SINGLE cláusula de finalización Sólo ejecuta un hilo, el resto esperan a que termine ese hilo, a menos que cerremos con un NOWAIT. No puede ejecutarse dentro de un bucle DO, ya que la carga de trabajo se ha repartido ya ANTES de llegar a la sentencia SINGLE.
  • 26. Introducción a la programación HPC (17-20 Junio 08) Directivas de compilación Sincronización de hilos: !$OMP MASTER / !$OMP END MASTER : sólo el hilo 0 (el master) ejecuta el código. El resto NO esperan. [SINGLE con NOWAIT] !$OMP CRITIAL / !$OMP END CRITICAL : asegura que sólo un hilo ejecuta una acción en concreto (escribir fichero, leer de teclado). El resto espera a que el anterior termine para poder ejecutar ese fragmento de código. !$OMP BARRIER : debe existir para todos los hilos o para ninguno. Todos esperan hasta que llegan a ese punto. Si sólo 1 tiene la barrera, se produce un deadlock. !$OMP ATOMIC : asegura que sólo 1 hilo actualiza una variable compartida. Por ejemplo (a = a +1). [Critical]
  • 27. Introducción a la programación HPC (17-20 Junio 08) Directivas de compilación • Ejemplo: cálculo del número pi Integración numérica por el método de los trapecios. – Convertir el código secuencial a paralelo – Cuidado con las condiciones de carrera • Ejemplo : multiplicación de matrices – Ejecuta el código en secuencial y mide el tiempo – Convierte el código a paralelo y mide el tiempo
  • 28. Introducción a la programación HPC (17-20 Junio 08) LIBRERÍA DE FUNCIONES (RUN-TIME) OpenMP
  • 29. Introducción a la programación HPC (17-20 Junio 08) Librería de Funciones Librería de funciones accesibles en tiempo de ejecución que sirven para controlar y hacer consultas desde el interior del programa al entorno de ejecución paralelo. Se llama “omp_lib” y debe ser llamada en el programa (use omp_lib). OMP_set_num_threads(número) : fija el número de threads que serán usados por las regiones paralelas en el código. (call OMP_set…) OMP_get_num_threads : obtiene el número de threads que están ejecutándose en la región paralela desde la que es llamada. OMP_get_thread_num : obtiene el identificador del thread actual dentro de la región paralela. OMP_get_num_procs : devuelve el número de procesadores disponible para el programa. OMP_set_dynamic : activa (.TRUE.) o desactiva (.FALSE.) el
  • 30. Introducción a la programación HPC (17-20 Junio 08) Librería de Funciones OMP_get_dynamic : obtiene el estado del mecanismo de ajuste dinámico de threads (.TRUE. o .FALSE.) OMP_set_nested : activa o desactiva el anidado de regiones paralelas. OMP_get_nested : obtiene el estado del mecanismo anterior. Bloqueos: OMP_init_lock(variable) : inicializa una variable que será asociada con un bloqueo. OMP_set_lock(variable) : cuando un thread llama a esta subroutine, adquiere la posesión del bloqueo si está libre. Si no lo está, espera a que lo esté OMP_unset_lock(variable) : libera la propiedad de un bloqueo. OMP_destry_lock(variable): desinicializa la variable asociada con el bloqueo.
  • 31. Introducción a la programación HPC (17-20 Junio 08) Librería de Funciones program Main use omp_lib implicit none integer(kind = OMP_lock_kind) :: lck integer(kind = OMP_integer_kind) :: ID call OMP_init_lock(lck) !$OMP PARALLEL SHARED(LCK) PRIVATE(ID) ID = OMP_get_thread_num() call OMP_set_lock(lck) write(*,*) "My thread is ", ID call OMP_unset_lock(lck) !$OMP END PARALLEL call OMP_destroy_lock(lck) end program Main El primer hilo que llegue a tomar el control del bloqueo, escribirá por pantalla, el resto quedarán a la espera hasta que sea liberado. Antes de poder usar el bloqueo, hay que inicializarlo. Una vez no es necesario el bloqueo, se elimina. Hay que llamar a la librería para poder usarla (compilador).
  • 32. Introducción a la programación HPC (17-20 Junio 08) VARIABLES DE ENTORNO OpenMP
  • 33. Introducción a la programación HPC (17-20 Junio 08) Variables de entorno Se puede controlar algunos aspectos de la ejecución de programas OpenMP asignando valores a determinadas variables de entorno. Algunas de estas variables pueden ser fijadas con llamadas a la librería de funciones. Ej: Usando bash: export OMP_NUM_THREADS=Número : Fija el valor de una variable de entorno. echo $OMP_NUM_THREADS : Muestra el valor de la variable de entorno
  • 34. Introducción a la programación HPC (17-20 Junio 08) Variables de entorno • OMP_NUM_THREADS : especifica el número de hilos que serán usados durante la ejecución de las regiones paralelas definidas dentro de una programa OpenMP. – Valor tipico : 1 – Número de procesadores • OMP_SCHEDULE : afecta a la forma en que funciona la directiva !$OMP DO y !$OMP PARALLEL DO. Especifica la forma en la que ha de repartirse el trabajo. – Valores posibles = STATIC, DYNAMIC o GUIDED
  • 35. Introducción a la programación HPC (17-20 Junio 08) Variables de entorno • OMP_DYNAMIC : en máquinas SMP, dónde diferentes programas se ejecutan simultáneamente, es posible ajustar el número de hilos de forma dinámica para aprovechar al máximo la máquina. – Valor posible = TRUE o FALSE • OMP_NESTED : especifica el comportamiento del programa en caso de regiones paralelas anidadas. – Valor posible = TRUE o FALSE • ¿OTROS? : si, en función del compilador
  • 36. Introducción a la programación HPC (17-20 Junio 08) EJEMPLOS
  • 37. Introducción a la programación HPC (17-20 Junio 08) ¡GRACIAS! OpenMP