OpenMP

OpenMP
Información sobre la plantilla
Openmp.png
Concepto:OpenMP es una API diseñada para explotar el paralelismo en diferentes lenguajes de programación


OpenMP es una interfaz de programación de aplicaciones (API por sus siglas en inglés) para la programación paralela en diferentes plataformas. Esta permite añadir procesamiento concurrente a programas codificados en C, C++ y Fortran sobre la base del modelo de ejecución fork/join. Esta API esta disponible en múltiples plataformas como Microsoft Windows o Linux. Consiste en un conjunto directivas de compilador, rutinas de biblioteca y variables de entorno que permiten al programador controlar el comportamiento de un programa en tiempo de ejecución.

Su diseño, implementación y soporte está dirigido por un conjunto de fabricantes de software y hardware, siendo portable y escalable es una buena alternativa para la programación paralela en plataformas que varían desde una computador de escritorio (PC) hasta las supercomputadoras. Un sistema híbrido como los clústers de computadoras puede programarse usando OpenMP y MPI(Interfaz de Paso de Mensaje) ya que esta arquitectura posee memoria compartida y distribuida, o también se podría usar una extensión de OpenMP para la programación sobre memoria distribuida.[1]

Modelo de ejecución


Se entiende como modelo de ejecución fork/join una técnica heredada de sistemas Unix en la que un proceso se divide en k hilos menores (fork), luego cada uno de estos hilos arroja ciertos "resultados" los cuales son unificados en uno sólo (join).

Cuando se incluye una directiva de compilador #openmp esto implica que en el bloque de código se aplicarán una serie de mecanismos de sincronización. Esto quiere decir que automáticamente el código sera marcado como paralelo y, en dependencia de la configuración de la directiva, se lanzarán una serie de hilos y al final habrá una barrera en la que un hilo debe esperar a que el resto termine para continuar la ejecución (a no ser que se específique con la directiva nowait, en cuyo caso los hilos continuarán)

Ahora bien, el modelo además incluye mecanismos de paralelismo de "tareas". Recordemos que ningún proceso puede ejecutarse si todas sus dependencias no estan satisfechas por lo que en estos casos OpenMP implementa un mecanismo en el que los procesos no se ejecutan hasta que estos estén disponibles. A este estilo de paralelismo se le llama asíncrono ya que no es estrictamente necesario que se implementen barreras en la que los hilos tengan que esperar hasta que el resto termine la ejecución del bloque de código. Si se usan procesos con dependencias se implementa un grafo de dependencia en el que se puede definir el orden de ejecución de los procesos que poseen esta necesidad.

Sintáxis básica

La sintáxis básica de una directiva de OpenMP para C y C++ es la siguiente:

# pragma omp <directiva> [cláusula [ , ...] ...]

para Fortran:

!$OMP  PARALLEL <directiva> [cláusulas]
    [ bloque de código ]
!$OMP END <directiva>

A continuación se verán algunas de las directivas que pueden ser usadas en OpenMP [2]

Directivas

  • parallel: Esta directiva indica que el código en cuestión puede ser ejecutado por varios hilos. Cada uno de los hilos se dividen en tareas implícitas que le son asignadas. Este es un ejemplo sencillo de un código de bucle for ejecutado con esta directiva
#pragma omp parallel for
    for (i=1; i<n; i++)
        b[i] = (a[i] + a[i-1]) / 2.0;
  • for: Esta directiva indica que el bucle for subsiguiente ejecuta una o más partes de iteracciones divididas entre los hilos. Un hilo ejecuta una parte de las iteraciones del bucle (convirtiéndose en una tarea interna explícita) y la cantidad de hilos en los que se divide la ejecución es determinado por la configuración de esta directiva.
  • section y sections: Esta directiva indica que varias secciones de código pueden ejecutarse en paralelo pero por un único hilo.
  • single:Esta directiva indica que el bloque de código solo puede ejecutarse por un único hilo que no tiene porque ser el hilo maestro.
  • master: Esta directiva define que el código solo puede ser ejecutado por el hilo maestro.
  • critical:Interesante directiva que define que el bloque de código subsiguiente es una zona crítica y que por consiguiente solo puede estarla ejecutando un solo hilo y los otros que así lo deseen deben esperar hasta que se cumplan las condiciones de carrera.

A continuación veremos algunas claúsulas usadas en la declaración de la directiva.

Claúsulas

  • shared(variable1,...,variablen): Define que las variables o datos pueden ser visibles y accesibles por todos los hilos en ejecución. Por defecto todas las variables que se encuentran en la región paralela son compartidas excepto el contador de las iteraciones.
  • private(variable1,...,variablen): Las variables o datos declarados en la claúsula son almacenados en el espacio local del hilo (comúnmente en la pila), lo que quiere decir que el hilo los úsara como variable temporal y por tanto solo él tendrá acceso al mismo.

Fuentes