Escolar Documentos
Profissional Documentos
Cultura Documentos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion
Proyecto Universidad-Secundaria
de contenidos de programacion
paralela en
Incorporacion
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
1/45
Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion
Posible utilizacion
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
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
La gestion
que la de procesos.
4/45
Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion
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
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.
en el tiempo de ejecucion
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.
7/45
Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion
Necesarios mecanismos de
creacion
ejecucion
finalizacion
comunicacion
sincronizacion
de hilos.
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
9/45
Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion
Ejecucion
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.
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).
11/45
Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion
Comunicacion
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
Semaforos:
es un tipo abstracto de datos que se usa para
controlar el acceso a un recurso compartido (memoria,
simultaneamente
se habla de semaforos
binarios, y se
mutua.
accede al recurso en exclusion
13/45
Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion
- Pthreads
Sincronizacion
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:
15/45
Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion
- OpenMP
Sincronizacion
secuencial:
Hay constructores de ejecucion
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
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
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
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
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
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
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
maximo
de un vector, utilizando metodos
sincronizados.
Funciona igual que el programa anterior,
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
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.
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);
}
}
cuantos
hilos se ejecutan?
Univ de Murcia-IES Ing. de la Cierva
23/45
Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion
en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP
Ejemplo basico
- Componentes de OpenMP
24/45
Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion
en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP
Ejemplo basico
- Componentes de OpenMP
25/45
Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion
en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP
Directivas
Tienen la forma:
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...
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):
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.
27/45
Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion
en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP
Paralelismo anidado
paralelismo anidado.
obteniendose
El paralelismo anidado se habilita con omp set nested(1) (con 0
se deshabilita).
28/45
Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion
en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP
del trabajo
Distribucion
ejemplo for.c):
#pragma omp for [cl
ausulas]
odigo
bloque de c
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.
Admite clausulas
de acceso a variables (private,
firstprivate, lastprivate y reduction).
30/45
Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion
en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP
La clausula
schedule indica la forma como se dividen las
iteraciones del for entre los hilos:
OMP SCHEDULE.
Univ de Murcia-IES Ing. de la Cierva
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
32/45
Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion
en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP
Constructores combinados
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:
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)
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.
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
35/45
Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion
en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP
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.
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
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.
Las clausulas
pueden ser:
38/45
Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion
en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP
Tareas - Sincronizacion
39/45
Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion
en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP
Tareas - Ejemplo
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
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
41/45
Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion
en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP
Funciones de librera
el numero
de hilos se pueda ajustar dinamicamente
en las
regiones paralelas.
42/45
Hilos
Multihilo
Elementos de Programacion
Multihilo
Entornos de Programacion
en Pthreads
Sincronizacion
en Java
Sincronizacion
OpenMP
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.
numero
de hilos.
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
45/45