Introducción al OpenMP

Slides:



Advertisements
Presentaciones similares
Laboratorio Lenguaje de Programación ING2101
Advertisements

Computadores de alta velocidad (la lista top500).
Sección 13 Programación de Obra
AIC – P9-10 Barreras en Multiprocesadores. Objetivo Programar el acceso a variables compartidas en multiprocesadores Uso de cerrojos en el acceso a las.
Programando con OpenMP*
ALGORITMOS Y LENGUAJES Estructuras de Control CONDICIONAL
PROGRAMACIÓN PARALELA Tema 5: Análisis de algoritmos paralelos
INTRODUCCIÓN A JAVA.
Curso de JAVA. Iniciando con las Técnologias Java.
Desarrollo de Aplicaciones para Internet
DIAGRAMAS DE FLUJO Y PSEUDOCÓDIGO
1.2 Sintaxis del lenguaje Java.
ALGORÍTMICA Dpto. Ingeniería de Sistemas y Automática
PROGRAMACIÓN DE SISTEMAS DE MEMORIA COMPARTIDA (SMP):
Arreglos (vectores, matrices, ….)
VISUAL BASIC CONSOLA Todas las ordenes o instrucciones se digitan dentro de sub Main() y End Sub ÁREA DE TRABAJO: Las aplicaciones de consola son aquellas.
Tema 3. Optimización de Código
MÓDULO DE PROCEDIMIENTOS Los módulos también pueden contener subrutinas y funciones → MÓDULO DE PROCEDIMIENTOS  PROCEDIMIENTOS → son compilados como parte.
Funciones en lenguaje C
El lenguaje de programación C - Funciones -
Modificadores.
POO Java Módulo 3 Elementos de programas Identificadores
Java Orientado a Objetos CLASES,OBJETOS Y MÉTODOS
Clases y objetos La unidad fundamental de programación OO son las clases. Conjunto de métodos y semántica Qué se va a hacer POO Clase: que define la implementación.
Tema 6: Clases Antonio J. Sierra.
CORPOCIDES Ing. Emilio Medina Baquero
TÉCNICO EN PROGRAMACIÓN DE SOFTWARE Instructor: Ingeniero Adrián Guerrero Taborda
Estructuras de control
Al término de la clase, el alumno reconoce las ventajas de usar JAVASCRIPT para un proyecto web.
HILOS Y COMUNICACIÓN ENTRE PROCESOS
Práctica 7 AOC. Gestión de la pila Una pila es una estructura de datos caracterizada por que el último dato que se almacena es el primero que se obtiene.
Lab.5: Taller básico de OpenMP
SCJP SUN CERTIFIED PROGRAMMER FOR JAVA 6. SCJP 6.0 SEMANA OCHO THREADS.
LÓGICA - DECISIONES Los valores lógicos: constantes, variables y expresiones lógicas, permiten controlar la ejecución de las sentencias de un programa.
Ing Florencia Ferrigno Tecnicas Digitales 3
Unidad III Administración de procesos
Aplicado a programas openMP
Algo mas de OPENMP y todo sobre PBS!. Algunas rutinas que devuelven variables de entorno  void omp_set_num_threads(int num_threads); // numero de threads.
Ejemplos openMP.
Java. Java nació el año 1991, por un par de ingenieros de la Sun Microsystems.
Capítulo 1 “Elementos de Programación”
Conversión cadena a número
Programación de Memoria Compartida
Programación de Memoria Compartida
Tema 10.3: Asignación de Espacio No Contiguo. Tema 10.3: 2 Silberschatz, Galvin and Gagne ©2005 Fundamentos de los Computadores (ITT, Sist. Electr.),
Programación con OpenMP* Intel Software College. Copyright © 2006, Intel Corporation. All rights reserved. Intel and the Intel logo are trademarks or.
OpenMP C and C++ Application Program Interface. Version October 1998.
Control de errores visual basic
Resumen Fundamentos de Programación/ Programación I
Capítulo 7 Gestión de memoria.
INTRODUCCIÓN A JAVA. Índice ¿Qué es Java? La plataforma Java 2 La Máquina Virtual de Java Características principales ¿Qué ventajas tengo como desarrollador?
14 de diciembre de 2005 Universidad de Murcia1 Programación en Memoria Compartida: OpenMP Domingo Giménez Departamento de Informática y Sistemas Universidad.
introducción al lenguaje
Introducción a los SOs.
Tema 8: Introducción a los SOs. Tema 8: 2 Silberschatz, Galvin and Gagne ©2005 Fundamentos de los Computadores (ITT, Sist. Electr.), Introducción.
Inicialización de arreglos de 2 variables INTEGER, DIMENSIÓN (4, 3) : : ini DO i=1, 4 DO j= 1,3 ini(i, j) = j END DO i=1123 i=2123 i=3123 i=4123 j=1j=2j=3.
COMPUTO III Ing. Jimmy Ojeda Arnica.
ELEMENTOS DE COMPUTACIÓN Profesor: Guillermo Figueroa
CARACTERÍSTICAS Es un lenguaje de programación estructurado de propósito general. Está estrechamente asociado al sistema operativo UNIX, ya que el propio.
Vamos a tratar algunos temas que es necesario conocer a la hora de administrar un sistema informático y que nos van a ser útiles sin importar el sistema.
PRINCIPIOS DE PROGRAMACIÓN
Por: Mario Felaco Mercedes Martinez Sistemas Operativos III Ene-Mar 2007.
Threads en Java  Threads: programas multitarea  Creación de threads  Ciclo de vida de un thread  Sincronización.
UTFSM - Sistemas Operativos
Práctica Profesional PHP.
Estructuras de Decisión
Desarrollador Profesional de Juegos Programación III Unidad II Hilos de ejecución Threads.
Programación con OpenMP* Dr. Marco Antonio Ramos Corchado Fuente Intel.
Estructuras de control selectivas Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión Práctica 3.
Tipos genéricos Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Unidad Didáctica 3.
Transcripción de la presentación:

Introducción al OpenMP Alejandro J. Soriano Martínez Josep Vidal Canet

Índice Índice: Introducción Directivas de compilación Formato para C y Fortran Regiones paralelas: cláusulas Construcciones paralelas: cláusulas Librería de funciones en tiempo de ejecución Variables de entorno

OpenMP INTRODUCCIÓN

Introducción INTERCONEXIÓN Sistemas de memoria distribuida: Memoria Procesador Memoria Procesador Memoria Procesador Memoria Procesador INTERCONEXIÓN

Introducción Memoria Sistemas de memoria compartida: Procesador

Introducción OpenMP (Open specifications for Multi Processing) es una API (Application Programming Interface – Interfaz de Programación de Aplicaciones) para la paralelización de programas en plataformas de memoria compartida. Tiene implementaciones en C/C++ y FORTRAN (77, 90 y 95) y está disponible en la gran mayoría de compiladores. OpenMP Arquitecture Review Board: se encarga de crear y revisar las especificaciones de OpenMP (http://openmp.org/wp/)

Introducción http://openmp.org/wp/openmp-compilers

Introducción Es un conjunto de especificaciones, como puede serlo MPI (Message Passing Interface), implementado por: Directivas de compilación Una librería de funciones en tiempo de ejecución Variables de entorno ¿Qué se puede paralelizar en OpenMP? Bucles (for en C, do en fortran) : paralelismo de “grano fino”. El programa reparte la carga usando el índice del bucle. Regiones paralelas : paralelismo de “grano grueso”. El usuario reparte la carga en bloques de trabajo.

Introducción Modelo de ejecución: fork-join (imagen wikipedia)

DIRECTIVAS DE COMPILACIÓN OpenMP DIRECTIVAS DE COMPILACIÓN

Directivas de compilación La mayoría de las construcciones en OpenMP son directivas de compilación o pragmas: Las directivas son tomadas por comentarios por aquellos compiladores que no están preparados para interpretarlas. Lenguaje Centinela Directiva [Cláusulas] C/C++ #pragma omp Justo después del centinela y antes de las opciones Opciones aplicables a la directiva Fortran !$OMP C$OMP *$OMP

Directivas de compilación int main() { double a[1000],b[1000],c[1000]; int i; #pragma omp for for (i = 0; i< 1000; i++){ a[i] = b[i] + c[i]; } Program Ejemplo1 Implicit none real(8) :: a(1000),b(1000),c(1000) integer :: i !$OMP PARALLEL DO do i=0,1000 a(i) = b(i) + c(i) end do !$OMP END PARALLEL DO end int main() { double a[1000],b[1000],c[1000]; int i; for (i = 0; i< 1000; i++){ a[i] = b[i] + c[i]; } Program Ejemplo1 Implicit none real(8) :: a(1000),b(1000),c(1000) integer :: i do i=0,1000 a(i) = b(i) + c(i) end do end

Directivas de compilación Compilando con OpenMP: basta con indicarle al compilador que interprete las directivas. Si no se hace, el compilador creerá que son comentarios e ignorará las líneas. En los compiladores de Intel instalados en Cesar y Multivac la opción es “-openmp”. ifort ejem1.F90 -o ejem1.exe Genera el ejecutable secuencial ifort ejem1.F90 -o ejem1.exe –openmp (-fpp) Genera el ejecutable paralelo Lo mismo con C/C++: icc … -openmp ¡CONTINUAMOS EN FORTRAN!

Directivas de compilación 1) Regiones paralelas: !$OMP PARALLEL cláusula1 cláusula2... Código paralelo !$OMP END PARALLEL Normas básicas: Debe aparecer en la misma rutina del programa No se puede saltar dentro o fuera de la región paralela (GOTO) Está permitido ANIDAR regiones paralelas Región serie Región paralela Thread 0 Thread 1 Thread Np

Directivas de compilación Ejem2: usa Ejecuta.sh para ver: !$OMP PARALLEL write(*,*) “Hello World” !$OMP END PARALLEL Cláusulas: PRIVATE (lista) SHARED (lista) DEFAULT ( PRIVATE | SHARED | NONE ) FIRSTPRIVATE (lista) REDUCTION (operador : lista) COPYIN (lista) IF ( expresión lógica ) NUM_THREADS ( entero )

Directivas de compilación Región serie Región paralela Thread 0 Thread 1 Thread Np Memoria Compartida a b PRIVATE: !$OMP PARALLEL PRIVATE(a,b) Región serie Región paralela Thread 0 Thread 1 Thread Np Memoria Compartida c d SHARED: !$OMP PARALLEL SHARED(c,d)

Directivas de compilación 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) Región serie Región paralela Thread 0 Thread 1 Thread Np Memoria Compartida b = 1 a = 2 a = ?

Directivas de compilación REDUCTION (operador : lista): Muchas veces hay variables en memoria compartida que sólo deben ser actualizadas por un único hilo cada vez. Hay dos opciones: Pongo barreras en el momento de actualizar la variable (lo veremos): esto afecta al rendimiento. Creo una copia privada de la variable y la inicializo. Dejo que cada hilo actualice su copia privada de la variable y al sincronizar los hilos actualizo el valor de la variable con los diferentes parciales. Operador Inicialización + * 1 - .AND. .TRUE. .OR. .FALSE. .EQV. .NEQV.

Directivas de compilación IF (EXPRESIÓN LÓGICA): !$OMP PARALLEL IF (N > 1000) Ejeción condicional: la región sólo se ejecuta en paralelo si se cumple la condición expuesta en el IF. NUM_THREADS ( entero ): !$OMP PARALLEL IF (N > 1000) Fija el número de hilos que ejecutarán la región paralela. Prevalece sobre el valor fijado en las variables de entorno.

Directivas de compilación 2) Bucles DO: !$OMP DO cláusula1 cláusula2... Código paralelo !$OMP END DO cláusula de finalización Región serie Región paralela Thread 0 Thread 1 Thread 3 i=1, 100 i=101, 200 i=201, 300

Directivas de compilación Cláusulas: PRIVATE (lista) FIRSTPRIVATE (lista) LASTPRIVATE(lista) REDUCTION (operador : lista) SCHEDULE (tipo, chunk) ORDERER Adicionalmente: una cláusula de terminación NOWAIT : existe una sincronización implícita cuando finaliza el entorno paralelo. Esta directiva anula dicha sincronización, por lo que debe tenerse cuidado al usar determinadas variables.

Directivas de compilación LASTPRIVATE (lista): !$OMP DO LASTPRIVATE(I) El estado final de las variables privadas de cada hilo generalmente queda indeterminado al finalizar la región paralela. Esta opción hace que tenga el valor que hubiera tenido si se hubiera ejecutado en serie. Ej: índice del bucle do. ORDERED: Una determinada parte de un bucle puede necesitar ejecutarse de forma ordenada. Esta directiva lo hace posible al hacerlo secuencial !$OMP DO ORDERED do i = 1, 1000 !$OMP ORDERED A(i) = 2 * A (i -1) !$OMP END ORDERED end do !$OMP END DO

Directivas de compilación Ejemplo: do i = 1, 10 do j = 1, 10 !$OMP DO do k = 1, 10 A(i,j,k) = i * j * k end do !$OMP END DO !$OMP DO do i = 1, 10 do j = 1, 10 do k = 1, 10 A(i,j,k) = i * j * k end do !$OMP END DO Cada hilo ejecuta j*k elementos de los dos últimos bucles, pero reparte el trabajo 1 vez sólo. Cada hilo ejecuta un k/N del último bucle, pero reparte el trabajo i*j veces.

Directivas de compilación 3) Secciones paralelas: !$OMP SECTIONS cláusula1 cláusula2... !$OMP SECTION Código sección 1 Código sección N !$OMP END DO cláusula de finalización Región serie Región paralela Thread 0 Thread 1 Thread 3 Sección 1 Sección 2 Sección 3 Pueden ponerse cualquier número de secciones. Si supera el número de hilos, cada hilo ejecutará más de una sección de forma secuencial. La carga computaciona de cada hilo NO tiene por qué ser simétrica. Todas las directivas !$OMP SECTION deben estar en la misma subroutina. Cláusulas: PRIVATE, FIRSTPRIVATE, LASTPRIVATE, REDUCTION

Directivas de compilación 3) Secciones secuenciales: !$OMP SINGLE cláusula1 cláusula2... Código secuencial !$OMP END SINGLE cláusula de finalización Sólo ejecuta un hilo, el resto esperan a que termine ese hilo, a menos que cerremos con un NOWAIT. No puede ejecutarse dentro de un bucle DO, ya que la carga de trabajo se ha repartido ya ANTES de llegar a la sentencia SINGLE.

Directivas de compilación Sincronización de hilos: !$OMP MASTER / !$OMP END MASTER : sólo el hilo 0 (el master) ejecuta el código. El resto NO esperan. [SINGLE con NOWAIT] !$OMP CRITIAL / !$OMP END CRITICAL : asegura que sólo un hilo ejecuta una acción en concreto (escribir fichero, leer de teclado). El resto espera a que el anterior termine para poder ejecutar ese fragmento de código. !$OMP BARRIER : debe existir para todos los hilos o para ninguno. Todos esperan hasta que llegan a ese punto. Si sólo 1 tiene la barrera, se produce un deadlock. !$OMP ATOMIC : asegura que sólo 1 hilo actualiza una variable compartida. Por ejemplo (a = a +1). [Critical]

Directivas de compilación Ejemplo: cálculo del número pi Integración numérica por el método de los trapecios. Convertir el código secuencial a paralelo Cuidado con las condiciones de carrera Ejemplo : multiplicación de matrices Ejecuta el código en secuencial y mide el tiempo Convierte el código a paralelo y mide el tiempo

LIBRERÍA DE FUNCIONES (RUN-TIME) OpenMP LIBRERÍA DE FUNCIONES (RUN-TIME)

Librería de Funciones Librería de funciones accesibles en tiempo de ejecución que sirven para controlar y hacer consultas desde el interior del programa al entorno de ejecución paralelo. Se llama “omp_lib” y debe ser llamada en el programa (use omp_lib). OMP_set_num_threads(número) : fija el número de threads que serán usados por las regiones paralelas en el código. (call OMP_set…) OMP_get_num_threads : obtiene el número de threads que están ejecutándose en la región paralela desde la que es llamada. OMP_get_thread_num : obtiene el identificador del thread actual dentro de la región paralela. OMP_get_num_procs : devuelve el número de procesadores disponible para el programa. OMP_set_dynamic : activa (.TRUE.) o desactiva (.FALSE.) el ajuste dinámico del número de threads para ejecutar regiones paralelas.

Librería de Funciones OMP_get_dynamic : obtiene el estado del mecanismo de ajuste dinámico de threads (.TRUE. o .FALSE.) OMP_set_nested : activa o desactiva el anidado de regiones paralelas. OMP_get_nested : obtiene el estado del mecanismo anterior. Bloqueos: OMP_init_lock(variable) : inicializa una variable que será asociada con un bloqueo. OMP_set_lock(variable) : cuando un thread llama a esta subroutine, adquiere la posesión del bloqueo si está libre. Si no lo está, espera a que lo esté OMP_unset_lock(variable) : libera la propiedad de un bloqueo. OMP_destry_lock(variable): desinicializa la variable asociada con el bloqueo.

Librería de Funciones program Main use omp_lib implicit none integer(kind = OMP_lock_kind) :: lck integer(kind = OMP_integer_kind) :: ID call OMP_init_lock(lck) !$OMP PARALLEL SHARED(LCK) PRIVATE(ID) ID = OMP_get_thread_num() call OMP_set_lock(lck) write(*,*) "My thread is ", ID call OMP_unset_lock(lck) !$OMP END PARALLEL call OMP_destroy_lock(lck) end program Main Hay que llamar a la librería para poder usarla (compilador). Antes de poder usar el bloqueo, hay que inicializarlo. El primer hilo que llegue a tomar el control del bloqueo, escribirá por pantalla, el resto quedarán a la espera hasta que sea liberado. Una vez no es necesario el bloqueo, se elimina.

OpenMP VARIABLES DE ENTORNO

Variables de entorno Se puede controlar algunos aspectos de la ejecución de programas OpenMP asignando valores a determinadas variables de entorno. Algunas de estas variables pueden ser fijadas con llamadas a la librería de funciones. Ej: Usando bash: export OMP_NUM_THREADS=Número : Fija el valor de una variable de entorno. echo $OMP_NUM_THREADS : Muestra el valor de la variable de entorno

Variables de entorno OMP_NUM_THREADS : especifica el número de hilos que serán usados durante la ejecución de las regiones paralelas definidas dentro de una programa OpenMP. Valor tipico : 1 – Número de procesadores OMP_SCHEDULE : afecta a la forma en que funciona la directiva !$OMP DO y !$OMP PARALLEL DO. Especifica la forma en la que ha de repartirse el trabajo. Valores posibles = STATIC, DYNAMIC o GUIDED

Variables de entorno OMP_DYNAMIC : en máquinas SMP, dónde diferentes programas se ejecutan simultáneamente, es posible ajustar el número de hilos de forma dinámica para aprovechar al máximo la máquina. Valor posible = TRUE o FALSE OMP_NESTED : especifica el comportamiento del programa en caso de regiones paralelas anidadas. ¿OTROS? : si, en función del compilador

EJEMPLOS

OpenMP ¡GRACIAS!