OpenMP
De Wikipedia, la enciclopedia libre
OpenMP es una API que permite añadir concurrencia a las aplicaciones mediante paralelismo con memoria compartida. Se basa en la creación de hilos de ejecución paralelos compartiendo las variables del proceso padre que los crea.
Esta disponible en múltiples plataformas y lenguajes, desde las derivadas de UNIX hasta las plataforma Windows. Existen extensiones para los lenguajes más conocidos como C, C++, Fortran,...
Contenido |
[editar] Modelo de ejecución
OpenMP se basa en el modelo fork-join, paradigma que proviene de los sistemas unix, donde una tarea muy pesada se divide en K hilos (fork) con menor peso, para luego "recolectar" sus resultados al final y unirlos en un solo resultado (join). Modelo Fork-join
[editar] Sintaxis básica
La sintaxis básica que nos encontramos en una directiva de OpenMP es:
# pragma omp <directiva> [clausula [ , ...] ...]
[editar] Modelo de Ejecución
Cuando se incluye una directiva OpenMP esto implica que se incluye una sincronización obligatoria en todo el bloque. Es decir, el bloque de código se marcará como paralelo y se lanzarán hilos según las características que nos dé la directiva, y al final de ella habrá una barrera para la sincronización de los diferentes hilos (salvo que implícitamente se indique lo contrario con la directiva nowait). Este tipo de ejecución se denomina fork-join.
[editar] Directivas
También se suelen llamar constructores:
- parallel: Esta directiva nos indica que la parte de código que la comprende puede ser ejecutada por varios hilos.
- for: Igual que parallel pero optimizado para los bucles for. Su formato es:
#pragma parallel for [clausula, ... , clausula]
- section y sections: Indica secciones que pueden ejecutarse en paralelo pero por un único hilo.
- single: La parte de código que define esta directiva, sólo se puede ejecutar un único hilo de todos los lanzados, y no tiene que ser obligatoriamente el hilo padre.
- master: La parte de código definida, sólo se puede ejecutar por el hilo padre.
- critical: Sólo un hilo puede estar en esta sección. Definen secciones críticas o condiciones de carrera.
- atomic: Se utiliza cuando la operación atañe a sólo una posición de memoria, y tiene que ser actualizada sólo por un hilo simultáneamente. Operaciones tipo x++ o --x son las que usan esta claúsula.
- flush: Esta directiva resuelve la consistencia, al exportar a todos los hilos un valor modificado de una variable que ha realizado otro hilo en el procesamiento paralelo.
[editar] Funciones
- omp_set_num_threads: Fija el número de hilos simultaneos.
- omp_get_num_threads: Devuelve el número de hilos en ejecución.
- omp_get_max_threads: Devuelve el número máximo de hilos que lanzará nuestro programa en las zonas paralelas. Es muy útil para reservar memoria para cada hilo.
- omp_get_thread_num: Devuelve el número del thread dentro del equipo (valor entre 0 y omp_get_num_threads()-1)
- omp_get_num_procs: Devuelve en número de procesadores de nuestro ordenador o disponibles (para sistemas virtuales).
- omp_set_dinamic: Valor booleano que nos permite expecificar si queremos que el número de hilos crezca y decrezca dinámicamente.

