stringtranslate.com

OpenMP

OpenMP ( Open Multi-Processing ) es una interfaz de programación de aplicaciones (API) que admite la programación multiprocesamiento de memoria compartida en múltiples plataformas en C , C++ y Fortran , [3] en muchas plataformas, arquitecturas de conjuntos de instrucciones y sistemas operativos , incluidos Solaris , AIX , FreeBSD , HP-UX , Linux , macOS y Windows . Consiste en un conjunto de directivas de compilador , rutinas de biblioteca y variables de entorno que influyen en el comportamiento en tiempo de ejecución. [2] [4] [5]

OpenMP es administrado por el consorcio tecnológico sin fines de lucro OpenMP Architecture Review Board (o OpenMP ARB ), definido conjuntamente por una amplia franja de proveedores líderes de hardware y software de computadoras, incluidos Arm , AMD , IBM , Intel , Cray , HP , Fujitsu , Nvidia , NEC , Red Hat , Texas Instruments y Oracle Corporation . [1]

OpenMP utiliza un modelo portátil y escalable que ofrece a los programadores una interfaz simple y flexible para desarrollar aplicaciones paralelas para plataformas que van desde la computadora de escritorio estándar hasta la supercomputadora .

Una aplicación construida con el modelo híbrido de programación paralela puede ejecutarse en un clúster de computadoras que utilice tanto OpenMP como Message Passing Interface (MPI), de modo que OpenMP se utiliza para el paralelismo dentro de un nodo (multinúcleo) mientras que MPI se utiliza para el paralelismo entre nodos. También se han hecho esfuerzos para ejecutar OpenMP en sistemas de memoria compartida distribuidos por software , [6] para traducir OpenMP a MPI [7] [8] y para extender OpenMP para sistemas de memoria no compartida. [9]

Diseño

Una ilustración de subprocesos múltiples donde el subproceso principal se bifurca a una serie de subprocesos que ejecutan bloques de código en paralelo.

OpenMP es una implementación de subprocesos múltiples , un método de paralelización mediante el cual un subproceso principal (una serie de instrucciones ejecutadas consecutivamente) bifurca una cantidad específica de subprocesos y el sistema divide una tarea entre ellos. Luego, los subprocesos se ejecutan simultáneamente y el entorno de ejecución asigna subprocesos a diferentes procesadores.

La sección de código que se va a ejecutar en paralelo se marca en consecuencia, con una directiva del compilador que hará que los hilos se formen antes de que se ejecute la sección. [3] Cada hilo tiene un ID asociado que se puede obtener mediante una función (llamada omp_get_thread_num()). El ID del hilo es un número entero y el hilo principal tiene un ID de 0 . Después de la ejecución del código paralelizado, los hilos se vuelven a unir al hilo principal, que continúa hasta el final del programa.

De forma predeterminada, cada subproceso ejecuta la sección paralelizada del código de forma independiente. Se pueden utilizar estructuras de trabajo compartido para dividir una tarea entre los subprocesos de modo que cada uno ejecute la parte del código que le corresponde. De esta forma, se puede lograr el paralelismo de tareas y de datos utilizando OpenMP.

El entorno de ejecución asigna subprocesos a los procesadores en función del uso, la carga de la máquina y otros factores. El entorno de ejecución puede asignar la cantidad de subprocesos en función de variables de entorno , o el código puede hacerlo mediante funciones. Las funciones OpenMP se incluyen en un archivo de encabezado denominado omp.h en C / C++ .

Historia

En octubre de 1997, la OpenMP Architecture Review Board (ARB) publicó sus primeras especificaciones API, OpenMP para Fortran 1.0. En octubre del año siguiente, publicaron el estándar C/C++. En 2000, se publicó la versión 2.0 de las especificaciones Fortran y, en 2002, la versión 2.0 de las especificaciones C/C++. La versión 2.5 es una especificación combinada C/C++/Fortran que se publicó en 2005. [ cita requerida ]

Hasta la versión 2.0, OpenMP especificaba principalmente formas de paralelizar bucles altamente regulares, como los que ocurren en la programación numérica orientada a matrices , donde el número de iteraciones del bucle se conoce en el momento de la entrada. Esto se reconoció como una limitación y se agregaron varias extensiones de paralelismo de tareas a las implementaciones. En 2005, se formó un esfuerzo para estandarizar el paralelismo de tareas, que publicó una propuesta en 2007, inspirándose en las características de paralelismo de tareas en Cilk , X10 y Chapel . [10]

La versión 3.0 se lanzó en mayo de 2008. Entre las nuevas características de la versión 3.0 se incluye el concepto de tareas y la construcción de tareas , [11] ampliando significativamente el alcance de OpenMP más allá de las construcciones de bucle paralelo que conformaban la mayor parte de OpenMP 2.0. [12]

La versión 4.0 de la especificación se publicó en julio de 2013. [13] Agrega o mejora las siguientes características: soporte para aceleradores ; atomicidad ; manejo de errores; afinidad de subprocesos ; extensiones de tareas; reducción definida por el usuario ; soporte para SIMD ; soporte para Fortran 2003. [14] [ cita completa necesaria ]

La versión actual es la 5.2, lanzada en noviembre de 2021. [15]

La versión 6.0 se lanzará en 2024. [16]

Tenga en cuenta que no todos los compiladores (y sistemas operativos) admiten el conjunto completo de características de las últimas versiones.

Elementos básicos

Diagrama de construcciones OpenMP

Los elementos centrales de OpenMP son las construcciones para la creación de subprocesos, la distribución de la carga de trabajo (reparto del trabajo), la gestión del entorno de datos, la sincronización de subprocesos, las rutinas de ejecución a nivel de usuario y las variables de entorno.

En C/C++, OpenMP utiliza #pragmas . Los pragmas específicos de OpenMP se enumeran a continuación.

Creación de hilo

El pragma omp parallel se utiliza para bifurcar subprocesos adicionales para realizar el trabajo incluido en la construcción en paralelo. El subproceso original se denominará subproceso maestro con ID de subproceso 0.

Ejemplo (programa C): Mostrar "Hola, mundo" utilizando múltiples subprocesos.

#incluir <stdio.h> #incluir <omp.h>  int main ( void ) { #pragma omp parallel printf ( "Hola, mundo. \n " ); return 0 ; }     

Utilice el indicador -fopenmp para compilar usando GCC:

$  gcc  -fopenmp  hola.c  -o  hola  -ldl

Salida en una computadora con dos núcleos y, por lo tanto, dos subprocesos:

Hola  Mundo.Hola  Mundo.

Sin embargo, la salida también puede estar distorsionada debido a la condición de carrera causada por los dos subprocesos que comparten la salida estándar .

Hola,  hola,  mundo.Enero.

Si printfes atómico depende de la implementación subyacente [17] a diferencia de C++11 std::cout, que es seguro para subprocesos de manera predeterminada. [18]

Constructos de reparto de trabajo

Se utiliza para especificar cómo asignar trabajo independiente a uno o todos los hilos.

Ejemplo: inicializar el valor de una matriz grande en paralelo, utilizando cada hilo para hacer parte del trabajo

int principal ( int argc , char ** argv ) { int a [ 100000 ];       #pragma omp paralelo para para ( int i = 0 ; i < 100000 ; i ++ ) { a [ i ] = 2 * i ; }                 devuelve 0 ; } 

Este ejemplo es vergonzosamente paralelo y depende únicamente del valor de i . El indicador paralelo for de OpenMP le indica al sistema OpenMP que divida esta tarea entre sus subprocesos de trabajo. Cada subproceso recibirá una versión única y privada de la variable. [19] Por ejemplo, con dos subprocesos de trabajo, a un subproceso se le puede entregar una versión de i que se ejecuta desde 0 hasta 49999 mientras que el segundo obtiene una versión que se ejecuta desde 50000 hasta 99999.

Directivas variantes

Las directivas de variantes son una de las principales características introducidas en la especificación OpenMP 5.0 para facilitar a los programadores la mejora de la portabilidad del rendimiento. Permiten la adaptación de pragmas OpenMP y código de usuario en tiempo de compilación. La especificación define rasgos para describir construcciones OpenMP activas, dispositivos de ejecución y funcionalidad proporcionada por una implementación, selectores de contexto basados ​​en los rasgos y condiciones definidas por el usuario, y directivas metadirectivas y de declaración para que los usuarios programen la misma región de código con directivas de variantes.

El mecanismo proporcionado por las dos directivas variantes para seleccionar variantes es más cómodo de usar que el preprocesamiento de C/C++ ya que admite directamente la selección de variantes en OpenMP y permite que un compilador de OpenMP analice y determine la directiva final a partir de las variantes y el contexto.

// Adaptación de código mediante directivas de preprocesamientoint v1 [ N ], v2 [ N ], v3 [ N ]; #si se define (nvptx) #pragma omp objetivo equipos distribuir paralelo para map(to:v1,v2) map(from:v3) para ( int i = 0 ; i < N ; i ++ ) v3 [ i ] = v1 [ i ] * v2 [ i ]; #sino #pragma omp objetivo paralelo para map(to:v1,v2) map(from:v3) para ( int i = 0 ; i < N ; i ++ ) v3 [ i ] = v1 [ i ] * v2 [ i ]; #finsi                               // Adaptación de código mediante metadirectiva en OpenMP 5.0int v1 [ N ], v2 [ N ], v3 [ N ]; #pragma omp target map(to:v1,v2) map(from:v3) #pragma omp metadirectiva \  cuando(dispositivo={arch(nvptx)}: los equipos de destino distribuyen en paralelo para)\  predeterminado(objetivo paralelo para) para ( int i = 0 ; i < N ; i ++ ) v3 [ i ] = v1 [ i ] * v2 [ i ];                 

Cláusulas

Dado que OpenMP es un modelo de programación de memoria compartida, la mayoría de las variables en el código OpenMP son visibles para todos los subprocesos de forma predeterminada. Pero a veces las variables privadas son necesarias para evitar condiciones de carrera y existe la necesidad de pasar valores entre la parte secuencial y la región paralela (el bloque de código ejecutado en paralelo), por lo que la gestión del entorno de datos se introduce como cláusulas de atributos de uso compartido de datos agregándolas a la directiva OpenMP. Los diferentes tipos de cláusulas son:

Cláusulas de atributos de intercambio de datos
Cláusulas de sincronización
Cláusulas de programación
Control SI
Inicialización
Copia de datos
Reducción
Otros

Rutinas de ejecución a nivel de usuario

Se utiliza para modificar/verificar el número de subprocesos, detectar si el contexto de ejecución está en una región paralela, cuántos procesadores hay en el sistema actual, establecer/desestablecer bloqueos, funciones de temporización, etc.

Variables de entorno

Un método para modificar las características de ejecución de las aplicaciones OpenMP. Se utiliza para controlar la programación de iteraciones de bucles, la cantidad predeterminada de subprocesos, etc. Por ejemplo, OMP_NUM_THREADS se utiliza para especificar la cantidad de subprocesos de una aplicación.

Implementaciones

OpenMP se ha implementado en muchos compiladores comerciales. Por ejemplo, Visual C++ 2005, 2008, 2010, 2012 y 2013 lo admiten (OpenMP 2.0, en ediciones Professional, Team System, Premium y Ultimate [20] [21] [22] ), así como Intel Parallel Studio para varios procesadores. [23] Los compiladores y herramientas de Oracle Solaris Studio admiten las últimas especificaciones de OpenMP con mejoras de productividad para el sistema operativo Solaris (UltraSPARC y x86/x64) y las plataformas Linux. Los compiladores Fortran, C y C++ de The Portland Group también admiten OpenMP 2.5. GCC también ha admitido OpenMP desde la versión 4.2.

Compiladores con una implementación de OpenMP 3.0:

Varios compiladores admiten OpenMP 3.1:

Compiladores compatibles con OpenMP 4.0:

Varios compiladores compatibles con OpenMP 4.5:

Soporte parcial para OpenMP 5.0:

Compiladores autoparalelizadores que generan código fuente anotado con directivas OpenMP:

Varios perfiladores y depuradores admiten expresamente OpenMP:

Pros y contras

Ventajas:

Contras:

Expectativas de desempeño

Se podría esperar obtener una aceleración de N veces al ejecutar un programa paralelizado usando OpenMP en una plataforma de N procesadores. Sin embargo, esto rara vez ocurre por estas razones:

Afinidad de hilos

Algunos proveedores recomiendan configurar la afinidad del procesador en los subprocesos OpenMP para asociarlos con núcleos de procesadores específicos. [45] [46] [47] Esto minimiza la migración de subprocesos y el costo de cambio de contexto entre núcleos. También mejora la localidad de los datos y reduce el tráfico de coherencia de caché entre los núcleos (o procesadores).

Puntos de referencia

Se ha desarrollado una variedad de puntos de referencia para demostrar el uso de OpenMP, probar su rendimiento y evaluar su corrección.

Ejemplos sencillos

Los parámetros de rendimiento incluyen:

Los parámetros de corrección incluyen:

Véase también

Referencias

  1. ^ abc "Acerca de OpenMP ARB y". OpenMP.org. 2013-07-11. Archivado desde el original el 2013-08-09 . Consultado el 2013-08-14 .
  2. ^ ab "Compiladores y herramientas de OpenMP". OpenMP.org. Noviembre de 2019. Consultado el 5 de marzo de 2020 .
  3. ^ ab Gagne, Abraham Silberschatz, Peter Baer Galvin, Greg (17 de diciembre de 2012). Conceptos de sistemas operativos (novena edición). Hoboken, Nueva Jersey: Wiley. Págs. 181-182. ISBN 978-1-118-06333-0.{{cite book}}: CS1 maint: varios nombres: lista de autores ( enlace )
  4. ^ Tutorial de OpenMP en Supercomputación 2008
  5. ^ Uso de OpenMP – Programación paralela con memoria compartida portátil – Descargar ejemplos de libros y discutir
  6. ^ Costa, JJ; et al. (mayo de 2006). "Ejecución eficiente de aplicaciones OpenMP en un SDSM totalmente compartido". Journal of Parallel and Distributed Computing . 66 (5): 647–658. doi :10.1016/j.jpdc.2005.06.018. hdl : 2117/370260 .
  7. ^ Basumallik, Ayón; Min, Seung-Jai; Eigenmann, Rudolf (2007). "Programación de sistemas de memoria distribuida mediante OpenMP". 2007 Simposio internacional de procesamiento distribuido y paralelo del IEEE . Nueva York: IEEE Press. págs. 1–8. CiteSeerX 10.1.1.421.8570 . doi :10.1109/IPDPS.2007.370397. ISBN  978-1-4244-0909-9. Número de identificación del sujeto  14237507.Hay una preimpresión disponible en la página de inicio de Chen Ding; consulte especialmente la Sección 3 sobre Traducción de OpenMP a MPI.
  8. ^ Wang, Jue; Hu, ChangJun; Zhang, JiLin; Li, JianJiang (mayo de 2010). "Compilador OpenMP para arquitecturas de memoria distribuida". Science China Information Sciences . 53 (5): 932–944. doi : 10.1007/s11432-010-0074-0 .(A partir de 2016, el software KLCoMP descrito en este documento no parece estar disponible públicamente)
  9. ^ Cluster OpenMP (un producto que solía estar disponible para las versiones 9.1 a 11.1 del compilador Intel C++ pero que se eliminó en la versión 13.0)
  10. ^ Ayguade, Eduard; Copty, Nawal; Duran, Alejandro; Hoeflinger, Jay; Lin, Yuan; Massaioli, Federico; Su, Ernesto; Unnikrishnan, Priya; Zhang, Guansong (2007). Una propuesta para el paralelismo de tareas en OpenMP (PDF) . Proc. Int'l Workshop on OpenMP.
  11. ^ "Interfaz de programación de aplicaciones OpenMP, versión 3.0" (PDF) . openmp.org. Mayo de 2008 . Consultado el 6 de febrero de 2014 .
  12. ^ LaGrone, James; Aribuki, Ayodunni; Addison, Cody; Chapman, Barbara (2011). Una implementación en tiempo de ejecución de tareas OpenMP . Proc. Int'l Workshop on OpenMP. págs. 165–178. CiteSeerX 10.1.1.221.2775 . doi :10.1007/978-3-642-21487-5_13. 
  13. ^ "Lanzamiento de la API de OpenMP 4.0". OpenMP.org. 26 de julio de 2013. Archivado desde el original el 9 de noviembre de 2013. Consultado el 14 de agosto de 2013 .
  14. ^ "Interfaz de programación de aplicaciones OpenMP, versión 4.0" (PDF) . openmp.org. Julio de 2013 . Consultado el 6 de febrero de 2014 .
  15. ^ "Especificación OpenMP 5.2".
  16. ^ "OpenMP ARB publica el informe técnico 12".
  17. ^ "C - Cómo usar printf() en múltiples hilos".
  18. ^ "std::cout, std::wcout - cppreference.com".
  19. ^ "Tutorial – Bucles for paralelos con OpenMP". 14 de julio de 2009.
  20. ^ Ediciones de Visual C++, Visual Studio 2005
  21. ^ Ediciones de Visual C++, Visual Studio 2008
  22. ^ Ediciones de Visual C++, Visual Studio 2010
  23. ^ David Worthington, "Intel aborda el ciclo de vida del desarrollo con Parallel Studio", Archivado el 15 de febrero de 2012 en Wayback Machine , SDTimes, 26 de mayo de 2009 (consultado el 28 de mayo de 2009)
  24. ^ "Características de XL C/C++ para Linux" (consultado el 9 de junio de 2009)
  25. ^ "Oracle Technology Network para desarrolladores de Java | Oracle Technology Network | Oracle". Developers.sun.com . Consultado el 14 de agosto de 2013 .
  26. ^ ab "openmp – GCC Wiki". Gcc.gnu.org. 2013-07-30 . Consultado el 2013-08-14 .
  27. ^ Kennedy, Patrick (6 de septiembre de 2011). "Los compiladores Intel® C++ y Fortran ahora son compatibles con la especificación OpenMP* 3.1 | Intel® Developer Zone". Software.intel.com . Consultado el 14 de agosto de 2013 .
  28. ^ ab "Características de los compiladores IBM XL C/C++". IBM . 13 de diciembre de 2018.
  29. ^ ab "Características de los compiladores Fortran de IBM XL". 13 de diciembre de 2018.
  30. ^ ab "Notas de la versión de Clang 3.7". llvm.org . Consultado el 10 de octubre de 2015 .
  31. ^ "Página de inicio de Absoft" . Consultado el 12 de febrero de 2019 .
  32. ^ "Serie de versiones GCC 4.9 – Cambios". www.gnu.org.
  33. ^ "Características de OpenMP* 4.0 en Intel Compiler 15.0". Software.intel.com. 13 de agosto de 2014. Archivado desde el original el 16 de noviembre de 2018. Consultado el 10 de noviembre de 2014 .
  34. ^ "Serie de lanzamiento de GCC 6 - Cambios". www.gnu.org.
  35. ^ "Compiladores y herramientas de OpenMP". openmp.org . www.openmp.org . Consultado el 29 de octubre de 2019 .
  36. ^ ab "Compatibilidad con OpenMP: documentación de Clang 12". clang.llvm.org . Consultado el 23 de octubre de 2020 .
  37. ^ "GOMP — Una implementación de OpenMP para GCC - Proyecto GNU - Free Software Foundation (FSF)". gcc.gnu.org . Archivado desde el original el 2021-02-27 . Consultado el 2020-10-23 .
  38. ^ "Compatibilidad con OpenMP*". Intel . Consultado el 23 de octubre de 2020 .
  39. ^ ab Amritkar, Amit; Tafti, Danesh; Liu, Rui; Kufrin, Rick; Chapman, Barbara (2012). "Paralelismo OpenMP para sistemas fluidos y fluido-partículas". Computación paralela . 38 (9): 501. doi :10.1016/j.parco.2012.05.005.
  40. ^ Amritkar, Amit; Deb, Surya; Tafti, Danesh (2014). "Simulaciones CFD-DEM paralelas eficientes utilizando OpenMP" . Journal of Computational Physics . 256 : 501. Bibcode :2014JCoPh.256..501A. doi :10.1016/j.jcp.2013.09.007.
  41. ^ Compatibilidad del acelerador OpenMP con GPU
  42. ^ Detección y prevención de condiciones de carrera de OpenMP en C++
  43. ^ "Alexey Kolosov, Evgeniy Ryzhkov, Andrey Karpov 32 trampas OpenMP para desarrolladores de C++". Archivado desde el original el 7 de julio de 2017. Consultado el 15 de abril de 2009 .
  44. ^ Stephen Blair-Chappell, Intel Corporation, Cómo convertirse en un experto en programación paralela en nueve minutos, presentación en la conferencia ACCU 2010
  45. ^ Chen, Yurong (15 de noviembre de 2007). "Software multinúcleo". Intel Technology Journal . 11 (4). doi :10.1535/itj.1104.08.
  46. ^ "Resultado OMPM2001". ESPECIFICACIÓN. 28 de enero de 2008.
  47. ^ "Resultado de la OMPM2001". ESPECIFICACIÓN. 1 de abril de 2003. Archivado desde el original el 25 de febrero de 2021. Consultado el 28 de marzo de 2008 .

Lectura adicional

Enlaces externos