Você está na página 1de 45

Hilos

Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

Proyecto Universidad-Secundaria

de contenidos de programacion
paralela en
Incorporacion

la rama de tecnologas informaticas

Facultad Informatica,
Universidad de Murcia e

Instituto de Ensenanza
Secundaria Ingeniero Juan de la Cierva

Multihilo
Programacion
Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

1/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

Posible utilizacion

de servicios y procesos, segundo


Modulo
de Programacion
de Desarrollo de Aplicaciones Multiplataforma

Parcialmente se podra usar en Tecnologas de la Informacion


y de las Comunicaciones, primero de Bachillerato

Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

2/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

Contenido

Hilos

Multihilo
Elementos de Programacion

Multihilo
Entornos de Programacion
en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP

Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

3/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

Concepto de hilo

mas
pequena
de instrucciones
Un hilo (thread) es la porcion
de un programa que puede gestionar de forma independiente
el planificador (scheduler) del sistema operativo.
Normalmente los hilos se ejecutan dentro de un proceso.
Un proceso puede tener subprocesos o hilos, que son
dentro del codigo

secuencias independientes de ejecucion


de
un proceso.
de hilos por el sistema operativo sera mas
rapida

La gestion
que la de procesos.

Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

4/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

Recursos asociados a los hilos

recursos que
Los hilos dentro de un proceso comparten mas
los procesos: la memoria, los descriptores de fichero, la

del codigo,

ultima
instruccion
valores de las variables
Cada hilo dentro de un proceso tiene su propia: pila, copia de
los registros, contador de programa, y posiblemente algo de
almacenamiento local
El planificador puede asociar hilos distintos a cores distintos
en un sistema multicore

Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

5/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

Multithreading - Hyperthreading

y ejecucion
de varios
Multithreading es el modelo de programacion
hilos dentro de un proceso.
Con hyperthreading (de Intel) se simulan dos cores dentro de un

unico
core.

Se asignan recursos del sistema a varios hilos simultaneamente,


y
real
se ve el sistema con el doble de cores, aunque la reduccion
depende de la aplicacion.

en el tiempo de ejecucion

Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

6/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

Estados de un hilo
Al igual que los procesos, los hilos se crean, se les
asigna recursos, pueden bloquearse y finalizan.
En un programa cada proceso tiene un hilo
maestro
que puede crear hilos esclavos,
cuando un hilo esclavo crea un conjunto de hilos
esclavos hablamos de paralelismo anidado.
Los hilos en un conjunto de hilos esclavos (incluido
el maestro) se ejecutan concurrentemente, pero
mutua.
puede haber zonas de exclusion
Los hilos de un conjunto de esclavos se
continuando
sincronizan y finalizan su ejecucion,
el hilo maestro, que puede volver a crear nuevos
grupos de hilos.

Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

7/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

Necesarios mecanismos de

creacion

ejecucion

finalizacion

comunicacion

sincronizacion
de hilos.

Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

8/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

Creacion
asociado. Este hilo puede crear grupos
Al lanzar un proceso se crea el hilo a el

de hilos esclavos, y estos a su vez pueden crear otros hilos, obteniendose


paralelismo anidado.
Con Pthreads:
Se declara una variable de tipo pthread t
y se pone en marcha con pthread create
En OpenMP:

omp set num threads


Se indica el numeros
de hilos a crear con la funcion
o la variable de entorno OMP NUM THREADS
y se generan los hilos esclavos con el constructor

#pragma omp parallel


En Java:
Se crea un objeto Thread t=new...
que hereda de la clase Runnable

y se pone en marcha llamando al metodo


t.start
de hilos)
(tiene otras formas de gestion
Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

9/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

Ejecucion

Una vez puestos en marcha, el hilo maestro y los hilos que el


creo trabajan de forma conjunta.
Ejecutan el mismo programa, pero pueden ejecutar zonas de

codigo
distinto; utilizando el identificador de hilo para
determinar las instrucciones a ejecutar.
Comparten las variables, pero se pueden declarar variables
locales a los hilos.
Puede haber problemas de coherencia en el acceso a las
variables comunes.
mutua
Hay mecanismos para asegurar el acceso en exclusion
a las variables comunes.

Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

10/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

Finalizacion
de un hilo con una llamada a una funcion
de finalizacion
o
Se puede acabar la ejecucion
implcita.
con una finalizacion
(core, variables locales...) se liberan.
Cuando un hilo finaliza, los recursos asignados a el
Con Pthreads:
pthread cancel para cancelar un hilo,
Se puede usar la funcion
se puede usar pthread kill, pero en este caso se manda una senal
que
tambien
debe tratarse.
El hilo que puso en marcha otro hilo hijo lo puede esperar con pthread join
En OpenMP:
Al final del bloque del constructor #pragma omp parallel con que se creo un grupo
de hilos esclavos, el maestro espera a que acaben todos los hilos para continuar su

ejecucion.
En Java:
de un objeto de la
Como se hace con los objetos en Java, al acabar la ejecucion
clase Thread se ejecuta el destructor y se liberan los recursos asignados.

Hay metodos
para comprobar si un hilo esta activo (isAlive) y para esperar a que
acabe (join).

Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

11/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

Comunicacion

Al trabajar con memoria compartida, los hilos no se


comunican por paso de mensajes, si no escribiendo y leyendo
en la memoria.
Puede haber problemas de coherencia en los datos al
leer-escribir varios hilos concurrentemente, por lo que los
y de
lenguajes proporcionan mecanismos de sincronizacion
mutua.
acceso en exclusion

Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

12/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

Sincronizacion
A los recursos compartidos por varios hilos se accede en zonas de

codigo
que se llaman secciones crticas.
mutua a estas zonas de codigo

Para acceder en exclusion


los
lenguajes pueden ofrecer distintas herramientas:

Semaforos:
es un tipo abstracto de datos que se usa para
controlar el acceso a un recurso compartido (memoria,

pantalla...). Controlan el numero


de hilos que acceden a la
puede acceder un hilo
vez al recurso. Si solo

simultaneamente
se habla de semaforos
binarios, y se
mutua.
accede al recurso en exclusion

Llaves: son implementaciones del tipo abstracto semaforo,


y
por tanto sirven para controlar el acceso a recursos
compartidos.
Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

13/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

- Pthreads
Sincronizacion

Se declaran variables del tipo mutex con

pthread mutex t variable


crtica controlada por
Un hilo, antes de entrar en la seccion
esa variable llama a

pthread mutex lock (&mutexsum)


crtica se llama a
y al salir de la seccion

pthread mutex unlock (&mutexsum)


por otro hilo.
para permitir el acceso a esa seccion

Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

14/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

- Java
Sincronizacion
Se sincroniza el acceso a objetos por medio de bloques de

codigo
synchronized:

synchronized(objecto) {
secci
on cr
tica
}
Cada hilo realizara el acceso a los datos de ese objeto,

ejecutando el metodo
correspondiente, dentro de un bloque
sincronizado.
es posible declarar metodos

Tambien
sincronizados:

public synchronized void metodo...


del metodo

que aseguran que la ejecucion


se realiza en
mutua.
exclusion

Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

15/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

- OpenMP
Sincronizacion
secuencial:
Hay constructores de ejecucion

#pragma omp single: el bloque de codigo


lo ejecuta un unico
hilo

#pragma omp master: el bloque de codigo


lo ejecuta el hilo maestro

#pragma omp ordered: el bloque de codigo


se ejecuta como lo hara en
secuencial
El constructor #pragma omp critical [nombre] asegura el acceso en
mutua a un bloque de codigo.

exclusion
Se puede asignar nombre, de forma que hilos distintos pueden acceder
concurrentemente a secciones con nombres distintos.
se
El constructor #pragma omp atomic asegura que una expresion

ejecuta de forma atomica


(sin interrupcion).
Para sincronizar todos los hilos en un grupo se usa el constructor barrier.
sincronizacion
implcita de todos los hilos en un grupo al final
Hay tambien
de algunos constructores.
Ofrece un tipo para llaves (omp lock t) y funciones para trabajar con ellas
(omp init lock, omp init destroy, omp set lock, omp unset lock,
omp test lock).
Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

16/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

Prioridades
se pueden asignar
En algunos entornos de programacion
prioridades a los hilos.
antes los recursos
A un hilo con mayor prioridad se asignaran
(core para trabajar con ese hilo) que a otros con menor prioridad.
En Java se puede
establecer la prioridad de un hilo, con setPriority()
obtener la prioridad de un hilo, con getPriority()
En C++ un hilo tiene el valor ThreadPriority, al que se
pueden asignar valores distintos.
Una vez que se establece la prioridad para un hilo, el sistema hace
corresponder ese valor a uno de los que puede tener un hilo en el
sistema operativo con el que se este trabajando.
Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

17/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP

multihilo:
Veremos ejemplos basicos
de programacion
en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP
en memoria compartida en OpenMP
veremos programacion
con versiones nuevas de los ejemplos vistos en la
a la Programacion
Paralela,
Introduccion

y se podra trabajar con la prueba PP-FP2014 de la pagina


del
Paralela.
Concurso de Programacion

Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

18/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP

Ejemplo: maximo
de datos en un vector
El programa en programas/Pthreads/maximo.cpp obtiene el

maximo
de un vector,

del vector,
cada hilo calcula el maximo
de una porcion
accede en exclusion
mutua a la variable global
y a continuacion
maximo para actualizarla.
Para controlar el acceso utiliza una llave que declara e inicializa
con

pthread mutex t llave = PTHREAD MUTEX INITIALIZER


crtica con
pide la entrada a la seccion

pthread mutex lock( &llave)


y se libera la llave con

pthread mutex unlock( &llave)

Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

19/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP

por
Ejemplo: calculo
de maximo,
con sincronizacion
datos

El programa en programas/Java/maximo dat.java obtiene el maximo


de un vector.
En el programa principal se declara un vector de hilos:

Thread[] t=new Thread[nt];


a ejecutar y se ponen en marcha:
a los que se asigna una funcion

for (int i = 0; i < t.length; i++) {


t[i] = new Thread(new threadmaximo());
t[i].start();
y el maestro espera a que acaben con:

for(int i=0;i<nt;i++)
while(t[i].isAlive());
threadmaximo,
Los hilos ejecutan la funcion
mutua (synchronized)
que llama a funciones que acceden en exclusion
a los arrays indices y valormaximo, para tomar los ndices de datos

con los que trabajar, y para actualizar el valor del maximo.


Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

20/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP

de
Ejemplo: calculo
de maximo,
con sincronizacion

metodos

El programa en programas/Java/maximo met.java obtiene el

maximo
de un vector, utilizando metodos
sincronizados.
Funciona igual que el programa anterior,

y se crea un vector de hilos que ejecutan la funcion


threadmaximo,
que llama a las funciones obtenerlimites y actualizarmaximo
que se han declarado sincronizadas (synchronized),
mutua.
por lo que el trabajo dentro de ellas se hace en exclusion

Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

21/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP

de 1997.
Primera version

en memoria
Es el estandar
de facto para programacion
compartida.
fork-join, con generacion

Utiliza el modelo de programacion

de multiples
hilos.
Inicialmente se ejecuta un hilo hasta que aparece el primer
constructor paralelo,
se crean hilos esclavos y el que los pone en marcha es el
maestro.
la
Al final del constructor se sincronizan los hilos y continua

ejecucion el maestro.

Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

22/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP

Ejemplo basico
en programas/OpenMP/codigo3-11.c):
Ejemplo de Hola mundo (otra version
1
2
3
4
5
6
7
8
9
10
11
12

#include <omp.h>
int main() {
int iam =0, np = 1;
#pragma omp parallel private(iam,np)
{
#if defined (_OPENMP)
np = omp_get_num_threads();
iam = omp_get_thread_num();
#endif
printf("Hello from thread %d out of %d \n",iam,np);
}
}

Se compila con el compilador normal de C y la librera OpenMP:

cc -O3 codigo3-11.c -fopenmp


Se ejecuta como un programa normal: ./a.out

cuantos
hilos se ejecutan?
Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

23/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP

Ejemplo basico
- Componentes de OpenMP

Hay que incluir la librera omp.h


utilizar constructores de OpenMP

#pragma omp parallel private


Se pueden usar constantes de la librera ( OPENMP)
y funciones de la librera:

omp get num threads


omp get thread num

Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

24/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP

Ejemplo basico
- Componentes de OpenMP

Hay que incluir la librera omp.h


utilizar constructores de OpenMP

#pragma omp parallel private


Se pueden usar constantes de la librera ( OPENMP)
y funciones de la librera:

omp get num threads


omp get thread num

Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

25/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP

Directivas
Tienen la forma:

#pragma omp nombre-directiva [cl


ausulas]
#pragma omp: es directiva del compilador. Si se compila sin
enlazar con la librera de OpenMP (-fopenmp) se obtiene un
programa secuencial.

nombre-directiva: hay directivas de varios tipos, que

veremos a continuacion.

[cl
ausulas]: las directivas pueden tener varios tipos de

clausulas,
para indicar como
repartir el trabajo entre los hilos,

como
acceder a los datos...

Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

26/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP

de hilos
Creacion

Hay un unico
constructor para crear hilos (ejemplo
codigo3-12.c):

#pragma omp parallel [cl


ausulas]
odigo
bloque de c
de
Se crea un grupo de hilos. El que los pone en marcha actua
maestro.

una expresion
y si da valor distinto de cero se
Con la clausula
if se evalua
crean los hilos. Si es cero se hace en secuencial.

El numero
de hilos a crear se obtiene por variables de entorno o llamadas
a librera.

Hay barrera implcita al final de la region.


paralela hay otro constructor paralelo, cada
Cuando dentro de una region
esclavo crea otro grupo de hilos esclavos de los que es maestro.

de variables (private, firstprivate,


Hay clausulas
de comparticion
default, shared, copyin y reduction).
Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

27/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP

Paralelismo anidado

Un hilo dentro de un grupo de hilos puede crear nuevos hilos


(ejemplo nested),

paralelismo anidado.
obteniendose
El paralelismo anidado se habilita con omp set nested(1) (con 0
se deshabilita).

Se pueden establecer numeros


de hilos distintos en distintos

niveles, e incluso hilos distintos pueden tener numeros


de
esclavos distintos.

Se utiliza omp set num threads para fijar el numero


de hilos a
poner en marcha.

Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

28/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP

del trabajo
Distribucion

Hay dos constructores para para asignar trabajo a los hilos:


Para dividir el trabajo de un bucle (ejemplos codigo3-13.c,

ejemplo for.c):
#pragma omp for [cl
ausulas]
odigo
bloque de c

Para asignar trozos distintos de codigo


(ejemplo
codigo3-14.c):

#pragma omp sections [cl


ausulas]
bloque de c
odigo con varias secciones

Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

29/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP

Constructor for
Las iteraciones se ejecutan en paralelo por hilos ya creados.
del for debe ser una asignacion.

La parte de inicializacion
La parte de incremento debe ser una suma o resta.
es la comparacion
de una variable
La parte de evaluacion
entera sin signo con un valor, utilizando un comparador mayor
o menor (puede incluir igual).
Los valores que aparecen en las tres partes del for deben
ser enteros.

Hay barrera al final a no ser que se utilice la clausula


nowait.

Admite clausulas
de acceso a variables (private,
firstprivate, lastprivate y reduction).

Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

30/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP

Constructor for - Reparto de trabajo

La clausula
schedule indica la forma como se dividen las
iteraciones del for entre los hilos:

schedule(static,tamano): se dividen cclicamente bloques


se divide por igual entre
de tamano. Si no se indica el tamano
los hilos. (ejemplo for static.c)
schedule(dynamic,tamano): se dividen bloques de tamano

y se asignan a los hilos dinamicamente


cuando van acabando
su trabajo. (ejemplo for dynamic.c)

schedule(guided,tamano): se asignan dinamicamente


a
decrecientes.
los hilos pero con tamanos
(ejemplo for guided.c)
para el tiempo de
schedule(runtime): deja la decision
y se obtiene de la variable de entorno
ejecucion,

OMP SCHEDULE.
Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

31/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP

Constructor sections
#pragma omp sections [cl
ausulas]
{
[#pragma omp section]
bloque
[#pragma omp section
bloque
...
]
}
se ejecuta por un hilo.
Cada seccion

Hay barrera al final a no ser que se utilice la clausula


nowait.

de variables son private,


Las clausulas
para comparticion
firstprivate, lastprivate y reduction.
Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

32/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP

Constructores combinados

Crean los hilos y les asignan trabajo:


Forma abreviada de parallel + for (ejemplo
codigo3-15.c):

#pragma omp parallel for [cl


ausulas]
odigo
bloque de c

Admite todas las clausulas


del for menos la nowait.
Forma abreviada de parallel + sections:

#pragma omp parallel sections [cl


ausulas]
bloque de c
odigo con varias secciones

Admite todas las clausulas


del sections menos la nowait.

Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

33/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP

secuencial
Constructores de ejecucion
paralela se pueden ejecutar bloques en
Dentro de una region
secuencial:

#pragma omp single [cl


ausulas]

Un unico
hilo ejecuta el bloque. (ejemplo single.c)
Hay barrera al final si no se especifica nowait.
#pragma omp master [cl
ausulas]
El hilo maestro ejecuta el bloque. (ejemplo master.c)
#pragma omp ordered [cl
ausulas]
El bloque se ejecuta como se ejecutara en secuencial, pero
pueden intervenir varios hilos. (ejemplo ordered.c)

Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

34/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP

Constructores de sincronizacion
#pragma omp critical [nombre]
mutua en el acceso a un bloque.
Asegura exclusion
(ejemplo critical.c)
El nombre se usa para secciones crticas distintas, que no
interfieren entre s.

#pragma omp barrier


Sincroniza todos los hilos en un grupo, hasta que no llegan
(ejemplo barrier.c)
todos a ese punto no se continua.

#pragma omp atomic


expresi
on
de la expresion
de forma atomica

Asegura la ejecucion
(sin

interrupcion).
tiene que ser de la forma x binop=exp, x++,
La expresion
++x, x-- o --x.
Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

35/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP

Constructores de manejo de variables


#pragma omp flush [lista]
Se actualizan las variables de la lista para que todos los hilos
vean su valor actual. (ejemplo flush.c)
Si no se pone la lista se actualizan todas las variables
compartidas.
Hay flush impcito al acabar barrier, al entrar o salir de
critical u ordered, y al salir de parallel, for, sections
y single.
Mientras no se hace flush cada hilo trabaja con copias
locales de las variables, por lo que no ve los cambios hechos
por otros hilos.

#pragma omp threadprivate (lista)


Declara variables privadas a los hilos. (ejemplo copying.c)
Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

36/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP

Clausulas
de alcance de datos
private(lista)
Privadas a los hilos. No se inicializan antes de entrar y no se guarda su valor al salir.

firstprivate(lista)
Privadas, se inicializan al entrar con el valor que tuviera la variable correspondiente.

lastprivate(lista)

o seccion.

Privadas, al salir quedan con el valor de la ultima


iteracion

shared(lista)
Compartidas por todos los hilos.

default(shared|none)

Indica como
son las variables por defecto. Si no se indica son compartidas.

reduction(operador:lista)
Se obtiene su valor aplicando el operador. Por ejemplo, calcular la suma por varios
hilos.

copyin(lista)
Para asignar el valor de la variable en el master a variables locales a los hilos.
Se pueden consultar los ejemplos private, firstprivate, lastprivate, reduction y

copying.
Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

37/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP

Tareas
3.0 de OpenMP se incluye la programacion
basada
En la version
con la basada en hilos de las
en tareas, en contraposicion
versiones anteriores.

#pragma omp task [cl


ausulas]
bloque
hilo del grupo de
Se genera una tarea, que ejecutara algun
hilos.

Las clausulas
pueden ser:

if (scalar expression) para comprobar si se pone en


marcha.
untied para indicar que la tarea no esta ligada a un hilo (si
esta ligada el mismo hilo la ejecuta completa).
De alcance de datos: default, private, firstprivate y
shared.
Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

38/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP

Tareas - Sincronizacion

Una tarea espera a que acaben sus tareas hijas con

#pragma omp taskwait


las tareas se sincronizan
Ademas,
en barreras implcitas (por ejemplo, al final de constructor
parallel)
o explcitas de hilos (por ejemplo, al final de constructor barrier)

Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

39/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP

Tareas - Ejemplo

En ejemplo fibo.c se calculan numeros


de Fibonacci
(1,1,2,3,5,8...) utilizando tareas:
paralela (constructor parallel)
En una region

para
un unico
hilo (constructor single) llama a una funcion

calcular el numero
de Fibonacci.
se lanzan dos tareas. Al ser una funcion

En la funcion
cada uno
recursiva los hilos que ejecuten cada tarea lanzaran
de ellos dos tareas...
Todas las tareas generadas las ejecutan los hilos en el grupo
de hilos creado con parallel.
Cada tarea espera a las dos que genero (y por tanto a las
generadas por sus tareas descendientes) con el constructor
taskwait.
Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

40/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP

Funciones de librera
void omp set num threads(int num threads): establece

paralela.
el numero
de hilos a usar en la siguiente region

int omp get num threads(void): obtiene el numero


de
usando en una region
paralela.
hilos que se estan

int omp get max threads(void): obtiene la mayor


cantidad posible de hilos.

int omp get thread num(void): devuelve el numero


del
hilos.

int omp get num procs(void): devuelve el maximo


numero
de procesadores que se pueden asignar al programa.

int omp in parallel(void): devuelve valor distinto de


paralela.
cero si se ejecuta dentro de una region
Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

41/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP

Funciones de librera

int omp set dynamic(void): permite poner o quitar el que

el numero
de hilos se pueda ajustar dinamicamente
en las
regiones paralelas.

int omp get dynamic(void): devuelve un valor distinto de

cero si esta permitido el ajuste dinamico


del numero
de hilos.

int omp set nested(void): para permitir o desautorizar el


paralelismo anidado.

int omp get nested(void) devuelve un valor distinto de


cero si esta permitido el paralelismo anidado.

Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

42/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP

Funciones de librera - Llaves

void omp init lock(omp lock t *lock): inicializa una


llave. Se inicializa como no bloqueada.

void omp init destroy(omp lock t *lock): para destruir


una llave.

void omp set lock(omp lock t *lock): pide una llave.


void omp unset lock(omp lock t *lock): para liberar una
llave.

int omp test lock(omp lock t *lock): pide una llave


pero no se bloquea si no esta disponible.
Se puede ver ejemplo lock.c

Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

43/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP

Variables de entorno
Su valor se establece en lnea de comandos antes de ejecutar el
programa.
Hay funciones de librera equivalentes.
de una funcion
de librera dentro del programa
La ejecucion
prevalece sobre el valor de la variable de entorno correspondiente.

OMP SCHEDULE: indica el tipo de scheduling para for y


parallel for.

OMP NUM THREADS: pone el numero


de hilos a usar.

OMP DYNAMIC: autoriza o desautoriza el ajuste dinamico


del

numero
de hilos.

OMP NESTED: autoriza o desautoriza el anidamiento.

Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

44/45

Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion

en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP

Otros ejemplos
Los programas mul-fil-omp, mul-fil-sections y
de matrices
mul-fil-tasks contienen ejemplos de multiplicacion
con el constructor for y sections, y con uso de tareas.
Los programas quicksort-omp, quicksort-tareas y
quicksort-tareas-critical son distintas variantes de una
por el metodo

ordenacion
quicksort. Este metodo
es distinto de las

ordenaciones por mezcla o por el metodo


de la burbuja vistos en
los ejemplos anteriores.
Se puede analizar el funcionamiento de estos ejemplos y
comparar las distintas formas de abordar el mismo problema,
y se pueden adaptar los programas para ejecutarlos en el

concurso PP FP2014 en la pagina


del Concurso de Programacion
y el B a la
Paralela. El problema A corresponde a la ordenacion
de matrices.
multiplicacion
Univ de Murcia-IES Ing. de la Cierva

Paralelismo en la rama de tecnologas informaticas

45/45

Você também pode gostar