Está en la página 1de 37

Introduccin al

OpenMP
Alejandro J. Soriano Martnez
Josep Vidal Canet

Introduccin a la programacin HPC (17-20

ndice
ndice:
1)Introduccin
2)Directivas de compilacin
1) Formato para C y Fortran
2) Regiones paralelas: clusulas
3) Construcciones paralelas: clusulas

3)Librera de funciones en tiempo de ejecucin


4)Variables de entorno

Introduccin a la programacin HPC (17-20

OpenMP

INTRODUCCIN

Introduccin a la programacin HPC (17-20

Introduccin
Sistemas de memoria distribuida:

Procesador

Procesador

Procesador

Procesador

Memoria

Memoria

Memoria

Memoria

INTERCONEXIN
Introduccin a la programacin HPC (17-20

Introduccin
Sistemas de memoria compartida:

Procesador

Procesador

Procesador

Procesador

Memoria

Introduccin a la programacin HPC (17-20

Introduccin
OpenMP (Open specifications for Multi Processing)
es una API (Application Programming Interface
Interfaz de Programacin de Aplicaciones) para la
paralelizacin de programas en plataformas de
memoria compartida.
Tiene implementaciones en C/C++ y FORTRAN (77,
90 y 95) y est disponible en la gran mayora de
compiladores.
OpenMP Arquitecture Review Board: se encarga de
crear y revisar las especificaciones de OpenMP
(http://openmp.org/wp/)
Introduccin a la programacin HPC (17-20

Introduccin
http://openmp.org/wp/openmp-compilers

Introduccin a la programacin HPC (17-20

Introduccin
Es un conjunto de especificaciones, como puede
serlo
MPI
(Message
Passing
Interface),
implementado por:
Directivas de compilacin
Una librera de funciones en tiempo de ejecucin
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.
Introduccin a la programacin HPC (17-20

Introduccin
Modelo de ejecucin: fork-join (imagen wikipedia)

Introduccin a la programacin HPC (17-20

OpenMP

DIRECTIVAS DE
COMPILACIN
Introduccin a la programacin HPC (17-20

Directivas de compilacin
La mayora de las construcciones en OpenMP son
directivas de compilacin o pragmas:
Lenguaje

Centinela

Directiva

[Clusulas]

C/C++

#pragma omp

Justo despus
del centinela y
antes de las
opciones

Opciones
aplicables a la
directiva

Fortran

!$OMP
C$OMP
*$OMP

Justo despus
del centinela y
antes de las
opciones

Opciones
aplicables a la
directiva

Las directivas son tomadas por comentarios por


aquellos compiladores que no estn preparados
para interpretarlas.
Introduccin a la programacin HPC (17-20

Directivas de compilacin
int main() {

Program Ejemplo1
Implicit none

double
a[1000],b[1000],c[1000];
int i;

real(8) ::
a(1000),b(1000),c(1000)
integer :: i

#pragma omp for

!$OMP PARALLEL DO

for (i = 0; i< 1000; i++){


a[i] = b[i] + c[i];
}

do i=0,1000
a(i) = b(i) + c(i)
end do
!$OMP END PARALLEL DO

end

Introduccin a la programacin HPC (17-20

Directivas de compilacin
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 lneas. En los compiladores de Intel
instalados en Cesar y Multivac la opcin es openmp.
ifort ejem1.F90 -o ejem1.exe

Genera el ejecutable
secuencial
ifort ejem1.F90 -o ejem1.exe openmp (-fpp)
Genera el
ejecutable
paralelo
Introduccin a la programacin HPC (17-20
Lo mismo con C/C++: icc -openmp

Directivas de compilacin
1) Regiones paralelas:
!$OMP PARALLEL clusula1 clusula2...
Cdigo paralelo
!$OMP END PARALLEL
Normas bsicas:

Regin serie
Thread
0
Regin paralela
Thread
0

Thread
1

Thread
Np

1)Debe aparecer en la misma


rutina del programa
2)No se puede saltar dentro o
fuera de la regin paralela
(GOTO)
3)Est permitido ANIDAR
regiones paralelas

Introduccin a la programacin HPC (17-20

Directivas de compilacin

Introduccin a la programacin HPC (17-20

Directivas de compilacin
PRIVATE:
!$OMP PARALLEL
PRIVATE(a,b)

Regin serie

Memoria
Comparti
da

Thread
0

a b

Regin paralela
Thread
a 0b

SHARED:
!$OMP PARALLEL
SHARED(c,d)

Thread
a 1b

Thread
aNpb

Regin serie

Memoria
Comparti
da

Thread
0

c d

Regin paralela
Thread
0

Memoria
Comparti
da

Thread
1

Thread
Np

Memoria
Comparti
da

c d

Introduccin a la programacin HPC (17-20

Directivas de compilacin
DEFAULT (PRIVATE|SHARED|NONE):
!$OMP PARALLEL DEFAULT(PRIVATE) SHARED(a)
Para declarar muchas variables de golpe. None implica
declararlas todas.

FIRSTPRIVATE(list):
!$OMP PARALLEL PRIVATE(a) FIRSTPRIVATE(b)
Regin serie

Memoria
Comparti
da

Thread
0

a=2
b=1

Regin paralela
Thread
a =0 ?
b=1

Thread
a 1= ?
b=1

Thread
a Np
=?
b=1

Memoria
Comparti
da

Introduccin a la programacin HPC (17-20

Directivas de compilacin
REDUCTION (operador : lista):
Muchas veces hay variables en memoria compartida que slo
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
Operador
Inicializaci
diferentes parciales.
n
+

.AND.

.TRUE.

.OR.

.FALSE.

.EQV.

.TRUE.

Introduccin a la programacin HPC (17-20

Directivas de compilacin
IF (EXPRESIN LGICA):
!$OMP PARALLEL IF (N > 1000)
Ejecin condicional: la regin slo se ejecuta en paralelo si se
cumple la condicin expuesta en el IF.

NUM_THREADS ( entero ):
!$OMP PARALLEL IF (N > 1000)
Fija el nmero de hilos que ejecutarn la regin paralela.
Prevalece sobre el valor fijado en las variables de entorno.

Introduccin a la programacin HPC (17-20

Directivas de compilacin
2) Bucles DO:
!$OMP DO clusula1 clusula2...
Cdigo paralelo
!$OMP END DO clusula de finalizacin
Regin serie
Thread
0

Regin paralela
Thread
i=1,0100

Thread
1 200
i=101,

Thread
3 300
i=201,

Introduccin a la programacin HPC (17-20

Directivas de compilacin
Clusulas:
PRIVATE (lista)
FIRSTPRIVATE (lista)
LASTPRIVATE(lista)
REDUCTION (operador : lista)
SCHEDULE (tipo, chunk)
ORDERER
Adicionalmente: una clusula de terminacin
NOWAIT : existe una sincronizacin implcita cuando finaliza el
entorno paralelo. Esta directiva anula dicha sincronizacin, por
lo que debe tenerse cuidado al usar determinadas variables.

Introduccin a la programacin HPC (17-20

Directivas de compilacin
LASTPRIVATE (lista):
!$OMP DO LASTPRIVATE(I)
El estado final de las variables privadas de cada hilo
generalmente queda indeterminado al finalizar la regin
paralela. Esta opcin hace que tenga el valor que hubiera
tenido si se hubiera ejecutado en serie. Ej: ndice del bucle
do.

Introduccin a la programacin HPC (17-20

Directivas de compilacin
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 slo.

Introduccin a la programacin HPC (17-20

Directivas de compilacin
3) Secciones paralelas:
Regin serie
!$OMP SECTIONS clusula1 clusula2...
Thread
!$OMP SECTION
0
Cdigo seccin 1
!$OMP SECTION
Regin paralela
Cdigo seccin N
!$OMP END DO clusula de finalizacin
Thread
Thread
0 1
Seccin

1 2
Seccin

Thread
3 3
Seccin

Pueden ponerse cualquier nmero de secciones. Si supera el nmero


de hilos, cada hilo ejecutar ms de una seccin de forma secuencial.
La carga computaciona de cada hilo NO tiene por qu ser simtrica.
Todas las directivas !$OMP SECTION deben estar en la misma
subroutina.
Clusulas: PRIVATE, FIRSTPRIVATE, LASTPRIVATE, REDUCTION
Introduccin a la programacin HPC (17-20

Directivas de compilacin
3) Secciones secuenciales:
!$OMP SINGLE clusula1 clusula2...
Cdigo secuencial
!$OMP END SINGLE clusula de finalizacin

Slo 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.

Introduccin a la programacin HPC (17-20

Directivas de compilacin
Sincronizacin de hilos:
!$OMP MASTER / !$OMP END MASTER : slo el hilo 0 (el
master) ejecuta el cdigo. El resto NO esperan. [SINGLE con
NOWAIT]
!$OMP CRITIAL / !$OMP END CRITICAL : asegura que slo un
hilo ejecuta una accin en concreto (escribir fichero, leer de
teclado). El resto espera a que el anterior termine para
poder ejecutar ese fragmento de cdigo.
!$OMP BARRIER : debe existir para todos los hilos o para
ninguno. Todos esperan hasta que llegan a ese punto. Si
slo 1 tiene la barrera, se produce un deadlock.
!$OMP ATOMIC : asegura que slo 1 hilo actualiza una variable
compartida. Por ejemplo (a = a +1). [Critical]
Introduccin a la programacin HPC (17-20

Directivas de compilacin
Ejemplo: clculo del nmero pi

Integracin numrica
trapecios.

por

el

mtodo

de

los

Convertir el cdigo secuencial a paralelo


Cuidado con las condiciones de carrera

Ejemplo : multiplicacin de matrices


Ejecuta el cdigo en secuencial y mide el tiempo
Convierte el cdigo a paralelo y mide el tiempo
Introduccin a la programacin HPC (17-20

OpenMP

LIBRERA DE FUNCIONES
(RUN-TIME)
Introduccin a la programacin HPC (17-20

Librera de Funciones
Librera de funciones accesibles en tiempo de ejecucin
que sirven para controlar y hacer consultas desde el
interior del programa al entorno de ejecucin paralelo.
Se llama omp_lib y debe ser llamada en el programa
(use omp_lib).
OMP_set_num_threads(nmero) : fija el nmero de threads
que sern usados por las regiones paralelas en el cdigo.
(call OMP_set)
OMP_get_num_threads : obtiene el nmero de threads que
estn ejecutndose en la regin paralela desde la que es
llamada.
OMP_get_thread_num : obtiene el identificador del thread
actual dentro de la regin paralela.
OMP_get_num_procs : devuelve el nmero de procesadores
disponible para el programa.
Introduccin a la programacin HPC (17-20

Librera de Funciones
OMP_get_dynamic : obtiene el estado del mecanismo de
ajuste dinmico 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 posesin 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.
Introduccin a la programacin HPC (17-20

Librera de Funciones
program Main
use omp_lib

Hay que llamar a la librera para


poder usarla (compilador).

implicit none
integer(kind = OMP_lock_kind) :: lck
integer(kind = OMP_integer_kind) :: ID

Antes de poder usar el bloqueo,


hay que inicializarlo.

call OMP_init_lock(lck)
!$OMP
PARALLEL
PRIVATE(ID)

SHARED(LCK)

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 quedarn a
la espera hasta que sea liberado.

Una vez no es necesario el


bloqueo, se elimina.
Introduccin a la programacin HPC (17-20

OpenMP

VARIABLES DE ENTORNO

Introduccin a la programacin HPC (17-20

Variables de entorno
Se puede controlar algunos aspectos de la
ejecucin de programas OpenMP asignando
valores a determinadas variables de entorno.
Algunas de estas variables pueden ser fijadas con
llamadas a la librera de funciones.
Ej: Usando bash:
export OMP_NUM_THREADS=Nmero : Fija el valor
de una variable de entorno.
echo $OMP_NUM_THREADS : Muestra el valor de la
variable de entorno
Introduccin a la programacin HPC (17-20

Variables de entorno
OMP_NUM_THREADS : especifica el nmero de
hilos que sern usados durante la ejecucin de
las regiones paralelas definidas dentro de una
programa OpenMP.
Valor tipico : 1 Nmero 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
Introduccin a la programacin HPC (17-20

Variables de entorno
OMP_DYNAMIC : en mquinas SMP, dnde
diferentes
programas
se
ejecutan
simultneamente, es posible ajustar el nmero de
hilos de forma dinmica para aprovechar al
mximo la mquina.
Valor posible = TRUE o FALSE

OMP_NESTED : especifica el comportamiento del


programa en caso de regiones paralelas
anidadas.
Valor posible = TRUE o FALSE
Introduccin a la programacin HPC (17-20

EJEMPLOS

Introduccin a la programacin HPC (17-20

OpenMP

GRACIAS!

Introduccin a la programacin HPC (17-20