Programación Multihilo

Documentos relacionados
Programación con OpenMP

Sistemas Complejos en Máquinas Paralelas

Paralelización de Programas Secuenciales: OpenMP

Cómputo paralelo con openmp y C

Programación paralela con OpenMP

1 Primitivas básicas de OpenMP

Unidad IV: Programación concurrente (MultiHilos) 4.1. Concepto de hilo

Arquitecturas cliente/servidor

Procesos Definición y Estados

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

PARTE II PROGRAMACION CON THREADS EN C

Paralelismo. MPI Paso de mensajes. Francisco García Sánchez Departamento de Informática y Sistemas

Tema 6. Threads: programas multitarea

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Sistemas Operativos. Procesos

de Gran Canaria Centro de Tecnología Médica Programación Concurrente

Guillermo Román Díez

Fundamentos PHP. El término puntuación nos referimos a la sintaxis usada en PHP para la terminación de una línea de código (;)

2º curso / 2º cuatr. Arquitectura de Computadores. Grado en Ing. Informática. Seminario 1. Herramientas de programación paralela I: Directivas OpenMP

Acceso coordinado a recursos compartidos

Programación Multihebra con OpenMP. José Miguel Mantas Ruiz Depto. de Lenguajes y Sistemas Informáticos Universidad de Granada

Lección 3 Sentencias de control

Laboratorio de Paralelismo OpenMP: ejemplos y ejercicios

Tema 2. El lenguaje JAVA

CLUSTER FING: ARQUITECTURA Y APLICACIONES

Soluciones a ejercicios de paralelismo y concurrencia

Tema 6: Clases. Índice

Clases y Objetos en C++

Dobles: Es el caso de la instrucción if-else (punto 1.2).

Concurrencia Monitores. Guillermo Román Díez

Arquitectura de Computadores: Exámenes y Controles

Principios de Computadoras II

CDI Arquitecturas que soportan la concurrencia. granularidad

Estructura de datos y Programación

Modelos de programación paralela y concurrente

Algoritmo, Estructuras y Programación I Ing. Marglorie Colina

Unidad Didáctica 3. Tipos genéricos. Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos

Programación concurrente

Sincronización de Threads

Concurrencia. Programación Concurrente. Espera ocupada. Primitivas IPC con bloqueo

Hilos Secciones Stallings:

Tema 2: EL TIPO DE DATOS ENTERO. INSTRUCCIÓN DE ASIGNACIÓN Y DE COMPOSICIÓN SECUENCIAL

TEMA 5: PARALELISMO A NIVEL DE HILOS, TAREAS Y PETICIONES (TLP, RLP) (primera parte).

Programación Orientada a Objetos en C++

Paradigmas de lenguajes de programación. Introducción a la programación imperativa. Lenguaje C. Programación imperativa

Programación Concurrente y Paralela. Unidad 1 Introducción

Java y JVM: programación concurrente. Adolfo López Díaz

Concurrencia de Procesos

Master en Java Certificación para Programadores

Autoestudio 2: Variables y Operadores

Palabras reservadas de C++ y C. Una palabra reservada no puede declararse como un identificador, esto haría un conflicto entre conectores y funciones.

PROGRAMACIÓN CONCURRENTE

Concurrencia. Primitivas IPC con bloqueo

Programación Orientada a Objetos Sentencias Java Parte I Ing. Julio Ernesto Carreño Vargas MsC.

Procesos e Hilos en C

Multiplicación de Matrices en Sistemas cc-numa Multicore. Autor: Jesús Cámara Moreno Director: Domingo Giménez Cánovas

Interbloqueo. Concurrencia: Interbloqueo e Inanición

Programación Orientada a Objetos. Resumen de Temas Unidad 3: Constructores y destructores

Estructuras de control selectivas

Concurrencia y paralelismo

Tema 3 SUBRUTINAS. Estructura de Computadores OCW_2015 Nekane Azkona Estefanía

Escuela Politécnica Superior de Elche

Cómputo en paralelo con OpenMP 1

Programación asíncrona con C#

Sistemas operativos. Hasta ahora hemos visto. Relación programa-sistema operativo Gestión de memoria

Heterogénea y Jerárquica

PARADIGMA y LENGUAJES DE PROGRAMACIÓN

Programación n Orientada a Objetos Sentencias Java Parte I. Ing. Julio Ernesto Carreño o Vargas MsC.

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.

T5-multithreading. Indice

Unidad IV. Este tipo de codificación nos es permitido gracias a la sobrecarga, la cual se aplica a métodos y constructores.

12. Tipos de atributos

Manipulación de procesos

Programación concurrente y semáforos en Java

TEMA 3:Programación con Clases y Objetos.

Elementos de un programa en C

Unidad V. Ya veremos qué poner en "algunas_palabras" y "algo_más", por ahora sigamos un poco más.

2.2 Nombres, Ligado y Ámbito

Fundamentos de programación

Test : Conteste exclusivamente en una HOJA DE LECTURA ÓPTICA, no olvidando marcar que su tipo de examen es A.

7. Programación Concurrente

Operadores aritméticos

Adolfo J. Banchio. FaMAF, IFEG-CONICET, Universidad Nacional de Córdoba Seminario de grupo 1

INFORMATICA TECNICATURA DE NIVEL SUPERIOR ALGUNOS EJERCICIOS DE SELECCIÓN E ITERACION

TEMA 4: Programación estructurada

Procesos y Threads Procesos y Threads. Rendimiento Rendimiento (paralelismo) (paralelismo) Productividad Productividad

Tema 12: El sistema operativo y los procesos

Sistemas Operativos Practica 1: procesos y concurrencia.

SISTEMAS OPERATIVOS I (Sistemas) / SISTEMAS OPERATIVOS (Gestión) septiembre 2009

Transcripción:

Proyecto Universidad-Secundaria Incorporación de contenidos de programación paralela en la rama de tecnologías informáticas Facultad Informática, Universidad de Murcia e Instituto de Enseñanza Secundaria Ingeniero Juan de la Cierva Programación Multihilo Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 1/45

Posible utilización Hilos Módulo de Programación de servicios y procesos, segundo de Desarrollo de Aplicaciones Multiplataforma Parcialmente se podría usar en Tecnologías de la Información y de las Comunicaciones, primero de Bachillerato Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 2/45

Contenido Hilos 1 Hilos 2 3 Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 3/45

Concepto de hilo Hilos Un hilo (thread) es la porción más pequeña de instrucciones 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 secuencias independientes de ejecución dentro del código de un proceso. La gestión de hilos por el sistema operativo será más rápida que la de procesos. Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 4/45

Recursos asociados a los hilos Los hilos dentro de un proceso comparten más recursos que los procesos: la memoria, los descriptores de fichero, la última instrucción del código, 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 tecnologías informáticas 5/45

Multithreading - Hyperthreading Multithreading es el modelo de programación y ejecución de varios hilos dentro de un proceso. Con hyperthreading (de Intel) se simulan dos cores dentro de un único core. Se asignan recursos del sistema a varios hilos simultáneamente, y se ve el sistema con el doble de cores, aunque la reducción real en el tiempo de ejecución depende de la aplicación. Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 6/45

Estados de un hilo Hilos 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 puede haber zonas de exclusión mutua. Los hilos de un conjunto de esclavos se sincronizan y finalizan su ejecución, continuando 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 tecnologías informáticas 7/45

Necesarios mecanismos de creación ejecución finalización comunicación sincronización de hilos. Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 8/45

Creación Hilos Al lanzar un proceso se crea el hilo a él asociado. Este hilo puede crear grupos de hilos esclavos, y estos a su vez pueden crear otros hilos, obteniéndose paralelismo anidado. Con Pthreads: Se declara una variable de tipopthreadt y se pone en marcha conpthreadcreate En : Se indica el números de hilos a crear con la funciónompsetnumthreads o la variable de entornoompnumthreads 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 métodot.start (tiene otras formas de gestión de hilos) Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 9/45

Ejecución Hilos Una vez puestos en marcha, el hilo maestro y los hilos que él creó trabajan de forma conjunta. Ejecutan el mismo programa, pero pueden ejecutar zonas de código 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. Hay mecanismos para asegurar el acceso en exclusión mutua a las variables comunes. Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 10/45

Finalización Hilos Se puede acabar la ejecución de un hilo con una llamada a una función de finalización o con una finalización implícita. Cuando un hilo finaliza, los recursos asignados a él (core, variables locales...) se liberan. Con Pthreads: Se puede usar la función pthread cancel para cancelar un hilo, también se puede usarpthreadkill, pero en este caso se manda una señal que debe tratarse. El hilo que puso en marcha otro hilo hijo lo puede esperar conpthreadjoin En : Al final del bloque del constructor#pragma omp parallel con que se creó un grupo de hilos esclavos, el maestro espera a que acaben todos los hilos para continuar su ejecución. En Java: Como se hace con los objetos en Java, al acabar la ejecución de un objeto de la clase Thread se ejecuta el destructor y se liberan los recursos asignados. Hay métodos para comprobar si un hilo está activo (isalive) y para esperar a que acabe (join). Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 11/45

Comunicación Hilos 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 lenguajes proporcionan mecanismos de sincronización y de acceso en exclusión mutua. Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 12/45

Sincronización Hilos A los recursos compartidos por varios hilos se accede en zonas de código que se llaman secciones críticas. Para acceder en exclusión mutua a estas zonas de código los lenguajes pueden ofrecer distintas herramientas: Semáforos: es un tipo abstracto de datos que se usa para controlar el acceso a un recurso compartido (memoria, pantalla...). Controlan el número de hilos que acceden a la vez al recurso. Si sólo puede acceder un hilo simultáneamente se habla de semáforos binarios, y se accede al recurso en exclusión mutua. Llaves: son implementaciones del tipo abstracto semáforo, y por tanto sirven para controlar el acceso a recursos compartidos. Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 13/45

Sincronización - Pthreads Se declaran variables del tipo mutex con pthread mutex t variable Un hilo, antes de entrar en la sección crítica controlada por esa variable llama a pthread mutex lock (&mutexsum) y al salir de la sección crítica se llama a pthread mutex unlock (&mutexsum) para permitir el acceso a esa sección por otro hilo. Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 14/45

Sincronización - Java Se sincroniza el acceso a objetos por medio de bloques de código synchronized: synchronized(objecto) { sección crítica } Cada hilo realizará el acceso a los datos de ese objeto, ejecutando el método correspondiente, dentro de un bloque sincronizado. También es posible declarar métodos sincronizados: public synchronized void metodo... que aseguran que la ejecución del método se realiza en exclusión mutua. Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 15/45

Sincronización - Hay constructores de ejecución secuencial: #pragma omp single: el bloque de código lo ejecuta un único hilo #pragma omp master: el bloque de código lo ejecuta el hilo maestro #pragma omp ordered: el bloque de código se ejecuta como lo haría en secuencial El constructor#pragma omp critical [nombre] asegura el acceso en exclusión mutua a un bloque de código. Se puede asignar nombre, de forma que hilos distintos pueden acceder concurrentemente a secciones con nombres distintos. El constructor#pragma omp atomic asegura que una expresión se ejecuta de forma atómica (sin interrupción). Para sincronizar todos los hilos en un grupo se usa el constructor barrier. Hay también sincronización implícita de todos los hilos en un grupo al final de algunos constructores. Ofrece un tipo para llaves (omplockt) y funciones para trabajar con ellas (ompinitlock,ompinitdestroy,ompsetlock,ompunsetlock, omp test lock). Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 16/45

Prioridades Hilos En algunos entornos de programación se pueden asignar prioridades a los hilos. A un hilo con mayor prioridad se asignarán antes los recursos (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 valorthreadpriority, 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 esté trabajando. Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 17/45

Veremos ejemplos básicos de programación multihilo: veremos programación en memoria compartida en con versiones nuevas de los ejemplos vistos en la Introducción a la Programación Paralela, y se podrá trabajar con la pruebapp-fp2014 de la página del Concurso de Programación Paralela. Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 18/45

Ejemplo: máximo de datos en un vector El programa en programas/pthreads/maximo.cpp obtiene el máximo de un vector, cada hilo calcula el máximo de una porción del vector, y a continuación accede en exclusión mutua a la variable global maximo para actualizarla. Para controlar el acceso utiliza una llave que declara e inicializa con pthread mutex t llave = PTHREAD MUTEX INITIALIZER pide la entrada a la sección crítica con 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 tecnologías informáticas 19/45

Ejemplo: cálculo de máximo, con sincronización por datos El programa en programas/java/maximo dat.java obtiene el máximo de un vector. En el programa principal se declara un vector de hilos: Thread[] t=new Thread[nt]; a los que se asigna una función a ejecutar y se ponen en marcha: 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()); Los hilos ejecutan la función threadmaximo, que llama a funciones que acceden en exclusión mutua (synchronized) a los arrays indices y valormaximo, para tomar los índices de datos con los que trabajar, y para actualizar el valor del máximo. Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 20/45

Ejemplo: cálculo de máximo, con sincronización de métodos El programa en programas/java/maximo met.java obtiene el máximo de un vector, utilizando métodos sincronizados. Funciona igual que el programa anterior, y se crea un vector de hilos que ejecutan la función threadmaximo, que llama a las funciones obtenerlimites y actualizarmaximo que se han declarado sincronizadas (synchronized), por lo que el trabajo dentro de ellas se hace en exclusión mutua. Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 21/45

Primera versión de 1997. Es el estándar de facto para programación en memoria compartida. Utiliza el modelo de programación fork-join, con generación de múltiples 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. Al final del constructor se sincronizan los hilos y continúa la ejecución el maestro. Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 22/45

Ejemplo básico Hilos Ejemplo de Hola mundo (otra versión en programas//codigo3-11.c): 1 #include <omp.h> 2 int main() { 3 int iam =0, np = 1; 4 #pragma omp parallel private(iam,np) 5 { 6 #if defined (_OPENMP) 7 np = omp_get_num_threads(); 8 iam = omp_get_thread_num(); 9 #endif 10 printf("hello from thread %d out of %d \n",iam,np); 11 } 12 } Se compila con el compilador normal de C y la librería : cc -O3 codigo3-11.c -fopenmp Se ejecuta como un programa normal:./a.out cuántos hilos se ejecutan? Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 23/45

Ejemplo básico - Componentes de Hay que incluir la librería omp.h utilizar constructores de #pragma omp parallel private Se pueden usar constantes de la librería ( OPENMP) y funciones de la librería: omp get num threads ompgetthreadnum Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 24/45

Ejemplo básico - Componentes de Hay que incluir la librería omp.h utilizar constructores de #pragma omp parallel private Se pueden usar constantes de la librería ( OPENMP) y funciones de la librería: omp get num threads ompgetthreadnum Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 25/45

Directivas Hilos Tienen la forma: #pragma omp nombre-directiva [cláusulas] #pragma omp: es directiva del compilador. Si se compila sin enlazar con la librería de (-fopenmp) se obtiene un programa secuencial. nombre-directiva: hay directivas de varios tipos, que veremos a continuación. [cláusulas]: las directivas pueden tener varios tipos de cláusulas, para indicar cómo repartir el trabajo entre los hilos, cómo acceder a los datos... Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 26/45

Creación de hilos Hilos Hay un único constructor para crear hilos (ejemplo codigo3-12.c): #pragma omp parallel [cláusulas] bloque de código Se crea un grupo de hilos. El que los pone en marcha actúa de maestro. Con la cláusulaif se evalúa una expresión y si da valor distinto de cero se crean los hilos. Si es cero se hace en secuencial. El número de hilos a crear se obtiene por variables de entorno o llamadas a librería. Hay barrera implícita al final de la región. Cuando dentro de una región paralela hay otro constructor paralelo, cada esclavo crea otro grupo de hilos esclavos de los que es maestro. Hay cláusulas de compartición de variables (private, firstprivate, default, shared, copyin y reduction). Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 27/45

Paralelismo anidado Un hilo dentro de un grupo de hilos puede crear nuevos hilos (ejemplo nested), obteniéndose paralelismo anidado. El paralelismo anidado se habilita con omp set nested(1) (con 0 se deshabilita). Se pueden establecer números de hilos distintos en distintos niveles, e incluso hilos distintos pueden tener números de esclavos distintos. Se utilizaompsetnumthreads para fijar el número de hilos a poner en marcha. Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 28/45

Distribución del trabajo 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áusulas] bloque de código Para asignar trozos distintos de código (ejemplo codigo3-14.c): #pragma omp sections [cláusulas] bloque de código con varias secciones Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 29/45

Constructor for Hilos Las iteraciones se ejecutan en paralelo por hilos ya creados. La parte de inicialización del for debe ser una asignación. La parte de incremento debe ser una suma o resta. La parte de evaluación es la comparación de una variable entera sin signo con un valor, utilizando un comparador mayor o menor (puede incluir igual). Los valores que aparecen en las tres partes delfor deben ser enteros. Hay barrera al final a no ser que se utilice la cláusulanowait. Admite cláusulas de acceso a variables (private, firstprivate, lastprivate y reduction). Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 30/45

Constructor for - Reparto de trabajo La cláusula schedule indica la forma como se dividen las iteraciones del for entre los hilos: schedule(static,tamano): se dividen cíclicamente bloques detamano. Si no se indica el tamaño se divide por igual entre los hilos. (ejemplo for static.c) schedule(dynamic,tamano): se dividen bloques de tamano y se asignan a los hilos dinámicamente cuando van acabando su trabajo. (ejemplo for dynamic.c) schedule(guided,tamano): se asignan dinámicamente a los hilos pero con tamaños decrecientes. (ejemplo for guided.c) schedule(runtime): deja la decisión para el tiempo de ejecución, y se obtiene de la variable de entorno OMP SCHEDULE. Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 31/45

Constructor sections #pragma omp sections [cláusulas] { [#pragma omp section] bloque [#pragma omp section bloque... ] } Cada sección se ejecuta por un hilo. Hay barrera al final a no ser que se utilice la cláusulanowait. Las cláusulas para compartición de variables son private, firstprivate, lastprivate y reduction. Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 32/45

Constructores combinados Crean los hilos y les asignan trabajo: Forma abreviada de parallel + for (ejemplo codigo3-15.c): #pragma omp parallel for [cláusulas] bloque de código Admite todas las cláusulas del for menos la nowait. Forma abreviada de parallel + sections: #pragma omp parallel sections [cláusulas] bloque de código con varias secciones Admite todas las cláusulas del sections menos la nowait. Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 33/45

Constructores de ejecución secuencial Dentro de una región paralela se pueden ejecutar bloques en secuencial: #pragma omp single [cláusulas] Un único hilo ejecuta el bloque. (ejemplo single.c) Hay barrera al final si no se especificanowait. #pragma omp master [cláusulas] El hilo maestro ejecuta el bloque. (ejemplo master.c) #pragma omp ordered [cláusulas] El bloque se ejecuta como se ejecutaría en secuencial, pero pueden intervenir varios hilos. (ejemplo ordered.c) Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 34/45

Constructores de sincronización #pragma omp critical [nombre] Asegura exclusión mutua en el acceso a un bloque. (ejemplo critical.c) El nombre se usa para secciones críticas distintas, que no interfieren entre sí. #pragma omp barrier Sincroniza todos los hilos en un grupo, hasta que no llegan todos a ese punto no se continúa. (ejemplo barrier.c) #pragma omp atomic expresión Asegura la ejecución de la expresión de forma atómica (sin interrupción). La expresión tiene que ser de la formax binop=exp,x++, ++x,x-- o--x. Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 35/45

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. Hayflush impícito al acabarbarrier, al entrar o salir de critical u ordered, y al salir de parallel, for, sections ysingle. Mientras no se haceflush cada hilo trabaja con copias locales de las variables, por lo que no vé 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 tecnologías informáticas 36/45

Cláusulas 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) Privadas, al salir quedan con el valor de la última iteración o sección. shared(lista) Compartidas por todos los hilos. default(shared none) Indica cómo 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 tecnologías informáticas 37/45

Tareas Hilos En la versión 3.0 de se incluye la programación basada en tareas, en contraposición con la basada en hilos de las versiones anteriores. #pragma omp task [cláusulas] bloque Se genera una tarea, que ejecutará algún hilo del grupo de hilos. Las cláusulas pueden ser: if (scalar expression) para comprobar si se pone en marcha. untied para indicar que la tarea no está ligada a un hilo (si está 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 tecnologías informáticas 38/45

Tareas - Sincronización Una tarea espera a que acaben sus tareas hijas con #pragma omp taskwait Además, las tareas se sincronizan en barreras implícitas (por ejemplo, al final de constructor parallel) o explíıcitas de hilos (por ejemplo, al final de constructor barrier) Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 39/45

Tareas - Ejemplo Hilos En ejemplo fibo.c se calculan números de Fibonacci (1,1,2,3,5,8...) utilizando tareas: En una región paralela (constructor parallel) un único hilo (constructor single) llama a una función para calcular el número de Fibonacci. En la función se lanzan dos tareas. Al ser una función recursiva los hilos que ejecuten cada tarea lanzarán cada uno 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 generó (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 tecnologías informáticas 40/45

Funciones de librería void omp set num threads(int num threads): establece el número de hilos a usar en la siguiente región paralela. int omp get num threads(void): obtiene el número de hilos que se están usando en una región paralela. int omp get max threads(void): obtiene la mayor cantidad posible de hilos. int omp get thread num(void): devuelve el número del hilos. int omp get num procs(void): devuelve el máximo número de procesadores que se pueden asignar al programa. int omp in parallel(void): devuelve valor distinto de cero si se ejecuta dentro de una región paralela. Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 41/45

Funciones de librería int omp set dynamic(void): permite poner o quitar el que el número de hilos se pueda ajustar dinámicamente en las regiones paralelas. int omp get dynamic(void): devuelve un valor distinto de cero si está permitido el ajuste dinámico del número 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 está permitido el paralelismo anidado. Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 42/45

Funciones de librería - 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 ompsetlock(omplockt *lock): pide una llave. void omp unset lock(omp lock t *lock): para liberar una llave. int omptestlock(omplockt *lock): pide una llave pero no se bloquea si no está disponible. Se puede ver ejemplo lock.c Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 43/45

Variables de entorno Su valor se establece en línea de comandos antes de ejecutar el programa. Hay funciones de librería equivalentes. La ejecución de una función de librería dentro del programa prevalece sobre el valor de la variable de entorno correspondiente. OMPSCHEDULE: indica el tipo de scheduling parafor y parallel for. OMPNUMTHREADS: pone el número de hilos a usar. OMP DYNAMIC: autoriza o desautoriza el ajuste dinámico del número de hilos. OMP NESTED: autoriza o desautoriza el anidamiento. Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 44/45

Otros ejemplos Hilos Los programas mul-fil-omp, mul-fil-sections y mul-fil-tasks contienen ejemplos de multiplicación de matrices con el constructorfor ysections, y con uso de tareas. Los programas quicksort-omp, quicksort-tareas y quicksort-tareas-critical son distintas variantes de una ordenación por el método quicksort. Este método es distinto de las ordenaciones por mezcla o por el método 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 página del Concurso de Programación Paralela. El problemaacorresponde a la ordenación y elbala multiplicación de matrices. Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologías informáticas 45/45