La interfaz de programación de aplicaciones (API) OpenMP ( Open Multi-Processing ) admite la programación multiprocesamiento de memoria compartida multiplataforma en C , C ++ y Fortran , [3] en muchas plataformas, arquitecturas de conjuntos de instrucciones y sistemas operativos , incluidos Solaris , AIX , HP-UX , Linux , macOS y Windows . Consiste en un conjunto de directivas del compilador , rutinas de biblioteca yvariables de entorno que influyen en el comportamiento en tiempo de ejecución. [2] [4] [5]
![]() | |
Autor (es) original (es) | Junta de revisión de arquitectura OpenMP [1] |
---|---|
Desarrollador (es) | Junta de revisión de arquitectura OpenMP [1] |
Lanzamiento estable | 5.1 / 13 de noviembre de 2020 |
Sistema operativo | Multiplataforma |
Plataforma | Multiplataforma |
Tipo | Extensión a C , C ++ y Fortran ; API |
Licencia | Varios [2] |
Sitio web | openmp |
OpenMP es administrado por el consorcio de tecnología sin fines de lucro OpenMP Architecture Review Board (o OpenMP ARB ), definido conjuntamente por una amplia gama de proveedores líderes de hardware y software, 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 brinda 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 usando OpenMP y Message Passing Interface (MPI), de modo que OpenMP se usa para el paralelismo dentro de un nodo (multi-core) mientras que MPI se usa para el paralelismo entre nodos . También se han realizado esfuerzos para ejecutar OpenMP en sistemas de memoria compartida distribuida por software , [6] para traducir OpenMP a MPI [7] [8] y extender OpenMP para sistemas de memoria no compartida. [9]
Diseño
![](http://wikiimg.tojsiabtv.com/wikipedia/commons/thumb/f/f1/Fork_join.svg/220px-Fork_join.svg.png)
OpenMP es una implementación de multiproceso , un método de paralelización mediante el cual un subproceso primario (una serie de instrucciones ejecutadas consecutivamente) bifurca un número específico de subprocesos y el sistema divide una tarea entre ellos. Luego, los subprocesos se ejecutan al mismo tiempo , y el entorno de ejecución asigna subprocesos a diferentes procesadores.
La sección de código que debe ejecutarse en paralelo está marcada en consecuencia, con una directiva de compilador que hará que los subprocesos se formen antes de que se ejecute la sección. [3] Cada hilo tiene un ID adjunto que se puede obtener usando 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 subprocesos se vuelven a unir en el subproceso principal, que continúa hasta el final del programa.
De forma predeterminada, cada subproceso ejecuta la sección de código paralelizada de forma independiente. Las construcciones de trabajo compartido se pueden utilizar para dividir una tarea entre los subprocesos de modo que cada subproceso ejecute su parte asignada del código. Tanto el paralelismo de tareas y el paralelismo de datos se puede lograr utilizando OpenMP de esta manera.
El entorno de ejecución asigna subprocesos a los procesadores según el uso, la carga de la máquina y otros factores. El entorno de ejecución puede asignar el número de subprocesos en función de las variables del entorno , o el código puede hacerlo mediante funciones. Las funciones de OpenMP se incluyen en un archivo de encabezado denominado omp.h en C / C ++ .
Historia
La Junta de Revisión de Arquitectura OpenMP (ARB) publicó sus primeras especificaciones API, OpenMP para Fortran 1.0, en octubre de 1997. En octubre del año siguiente lanzaron el estándar C / C ++. 2000 vio la versión 2.0 de las especificaciones de Fortran con la versión 2.0 de las especificaciones de C / C ++ que se lanzó en 2002. La versión 2.5 es una especificación combinada de C / C ++ / Fortran que se lanzó en 2005.
Hasta la versión 2.0, OpenMP especificaba principalmente formas de paralelizar bucles muy regulares, tal como 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 tareas paralelas a las implementaciones. En 2005, se formó un esfuerzo por 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 fue lanzada en mayo de 2008. Incluido en las nuevas características en 3.0 está 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 componían 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 ; atómica ; manejo de errores; afinidad de hilo ; extensiones de tareas; reducción definida por el usuario ; Soporte SIMD ; Soporte de Fortran 2003 . [14] [ se necesita una cita completa ]
La versión actual es 5.1, lanzada en noviembre de 2020.
Tenga en cuenta que no todos los compiladores (y sistemas operativos) admiten el conjunto completo de funciones para las últimas versiones.
Elementos principales
![](http://wikiimg.tojsiabtv.com/wikipedia/commons/thumb/9/9b/OpenMP_language_extensions.svg/220px-OpenMP_language_extensions.svg.png)
Los elementos centrales de OpenMP son las construcciones para la creación de subprocesos, la distribución de cargas de trabajo (trabajo compartido), la gestión del entorno de datos, la sincronización de subprocesos, las rutinas de tiempo de ejecución a nivel de usuario y las variables de entorno.
En C / C ++, OpenMP usa #pragmas . Los pragmas específicos de OpenMP se enumeran a continuación.
Creación de hilo
El pragma omp paralelo se utiliza para bifurcar hilos adicionales para realizar el trabajo encerrado en la construcción en paralelo. El hilo original se indicará como hilo maestro con ID de hilo 0.
Ejemplo (programa C): Mostrar "Hola, mundo". utilizando varios hilos.
#include #include int main ( void ) { #pragma omp paralelo printf ( "Hola, mundo. \ n " ); return 0 ; }
Use flag -fopenmp para compilar usando GCC:
$ gcc -fopenmp hola.c -o hola
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.rld.
(Si printf
es seguro para subprocesos depende de la implementación. C ++ std::cout
, por otro lado, siempre es seguro para subprocesos).
Construcciones de trabajo compartido
Se utiliza para especificar cómo asignar trabajo independiente a uno o todos los subprocesos.
- omp for u omp do : se utiliza para dividir iteraciones de bucle entre los subprocesos, también llamadas construcciones de bucle.
- secciones : asignación de bloques de código consecutivos pero independientes a diferentes subprocesos
- single : especificando un bloque de código que es ejecutado por un solo hilo, una barrera está implícita al final
- master : similar a single, pero el bloque de código será ejecutado solo por el hilo maestro y no hay barrera implícita al final.
Ejemplo: inicializar el valor de una matriz grande en paralelo, usando cada hilo para hacer parte del trabajo
int main ( int argc , char ** argv ) { int a [ 100000 ]; #pragma omp paralelo para for ( int i = 0 ; i < 100000 ; i ++ ) { a [ i ] = 2 * i ; } return 0 ; }
Este ejemplo es vergonzosamente paralelo y depende solo del valor de i . El OpenMP En paralelo para la bandera le dice al sistema OpenMP que divida esta tarea entre sus subprocesos de trabajo. Cada uno de los hilos recibirá una versión única y privada de la variable. [15] Por ejemplo, con dos subprocesos de trabajo, a un subproceso se le puede entregar una versión de i que va de 0 a 49999 mientras que el segundo obtiene una versión que va de 50000 a 99999.
Directivas variantes
Las directivas variantes es 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 metadirectivas y directivas de declaración para que los usuarios programen la misma región de código con directivas variantes.
- La metadirectiva es una directiva ejecutable que se resuelve condicionalmente en otra directiva en tiempo de compilación seleccionando entre múltiples variantes de directiva basadas en rasgos que definen una condición o contexto de OpenMP.
- La directiva declare variant tiene una funcionalidad similar a la metadirectiva, pero selecciona una variante de función en el sitio de llamada en función del contexto o las condiciones definidas por el usuario.
El mecanismo proporcionado por las dos directivas de variantes para seleccionar variantes es más conveniente 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 variantes y contexto.
// adaptación de código usando directivas de preprocesamientoint v1 [ N ], v2 [ N ], v3 [ N ]; #si está definido (nvptx) #pragma omp los equipos de destino distribuyen el mapa de bucle paralelo (a: v1, v2) mapa (de: v3) para ( int i = 0 ; i < N ; i ++ ) v3 [ i ] = v1 [ i ] * v2 [ i ]; #else #pragma omp mapa de bucle paralelo de destino (a: v1, v2) mapa (de: v3) para ( int i = 0 ; i < N ; i ++ ) v3 [ i ] = v1 [ i ] * v2 [ i ]; #terminara si// adaptación de código usando metadirectiva en OpenMP 5.0int v1 [ N ], v2 [ N ], v3 [ N ]; #pragma omp target map (to: v1, v2) map (from: v3) #pragma omp metadirective \ when (device = {arch (nvptx)}: los equipos de destino distribuyen el bucle paralelo) \ default (target paralelo loop) 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 intercambio de datos agregándolas a la directiva OpenMP. Los diferentes tipos de cláusulas son:
- Cláusulas de atributos de intercambio de datos
- compartido : los datos declarados fuera de una región paralela se comparten, lo que significa que todos los subprocesos son visibles y accesibles simultáneamente. De forma predeterminada, todas las variables de la región de trabajo compartido se comparten, excepto el contador de iteraciones de bucle.
- privado : los datos declarados dentro de una región paralela son privados para cada hilo, lo que significa que cada hilo tendrá una copia local y la usará como una variable temporal. Una variable privada no se inicializa y el valor no se mantiene para su uso fuera de la región paralela. De forma predeterminada, los contadores de iteraciones de bucle en las construcciones de bucle de OpenMP son privados.
- default : permite al programador indicar que el alcance de datos predeterminado dentro de una región paralela será compartido , o ninguno para C / C ++, o compartido , firstprivate , privado o ninguno para Fortran. La opción none obliga al programador a declarar cada variable en la región paralela utilizando las cláusulas de atributos de intercambio de datos.
- firstprivate : como privado excepto inicializado al valor original.
- lastprivate : como privado excepto que el valor original se actualiza después de la construcción.
- reducción : una forma segura de unir el trabajo de todos los hilos después de la construcción.
- Cláusulas de sincronización
- crítico : el bloque de código adjunto será ejecutado por un solo subproceso a la vez, y no será ejecutado simultáneamente por varios subprocesos. A menudo se utiliza para proteger los datos compartidos de las condiciones de carrera .
- atómico : la actualización de la memoria (escribir, o leer-modificar-escribir) en la siguiente instrucción se realizará de forma atómica. No hace que toda la declaración sea atómica; solo la actualización de la memoria es atómica. Un compilador puede usar instrucciones de hardware especiales para un mejor rendimiento que cuando usa crítico .
- ordenado : el bloque estructurado se ejecuta en el orden en el que se ejecutarían las iteraciones en un bucle secuencial
- barrera : cada hilo espera hasta que todos los demás hilos de un equipo hayan llegado a este punto. Una construcción de trabajo compartido tiene una sincronización de barrera implícita al final.
- nowait : especifica que los subprocesos que completan el trabajo asignado pueden continuar sin esperar a que finalicen todos los subprocesos del equipo. En ausencia de esta cláusula, los subprocesos encuentran una sincronización de barrera al final de la construcción de trabajo compartido.
- Cláusulas de programación
- schedule (type, chunk) : esto es útil si la construcción de trabajo compartido es un bucle do o un bucle for. Las iteraciones en la construcción de trabajo compartido se asignan a subprocesos de acuerdo con el método de programación definido por esta cláusula. Los tres tipos de programación son:
- static : Aquí, a todos los subprocesos se les asignan iteraciones antes de ejecutar las iteraciones de bucle. Las iteraciones se dividen equitativamente entre subprocesos de forma predeterminada. Sin embargo, especificar un número entero para el fragmento de parámetro asignará el número de fragmentos de iteraciones contiguas a un subproceso en particular.
- dinámico : aquí, algunas de las iteraciones se asignan a un número menor de subprocesos. Una vez que un hilo en particular termina su iteración asignada, regresa para obtener otro de las iteraciones que quedan. El fragmento de parámetro define el número de iteraciones contiguas que se asignan a un subproceso a la vez.
- guiado : una gran parte de iteraciones contiguas se asigna a cada hilo de forma dinámica (como se indica arriba). El tamaño del fragmento disminuye exponencialmente con cada asignación sucesiva hasta un tamaño mínimo especificado en el fragmento del parámetro.
- SI control
- if : Esto hará que los subprocesos paralelicen la tarea solo si se cumple una condición. De lo contrario, el bloque de código se ejecuta en serie.
- Inicialización
- firstprivate : los datos son privados para cada hilo, pero se inicializan usando el valor de la variable usando el mismo nombre del hilo maestro.
- lastprivate : los datos son privados para cada hilo. El valor de estos datos privados se copiará a una variable global con el mismo nombre fuera de la región paralela si la iteración actual es la última iteración en el ciclo paralelizado. Una variable puede ser tanto firstprivate como lastprivate .
- threadprivate : los datos son datos globales, pero son privados en cada región paralela durante el tiempo de ejecución. La diferencia entre threadprivate y private es el ámbito global asociado con threadprivate y el valor preservado en las regiones paralelas.
- Copia de datos
- copyin : similar a firstprivate para variables privadas , las variables threadprivate no se inicializan, a menos que se use copyin para pasar el valor de las variables globales correspondientes. No se necesita copia porque el valor de una variable privada de subproceso se mantiene durante la ejecución de todo el programa.
- copyprivate : se utiliza con single para admitir la copia de valores de datos de objetos privados en un hilo (el hilo único ) a los objetos correspondientes en otros hilos del equipo.
- Reducción
- reducción (operador | intrínseco: lista) : la variable tiene una copia local en cada hilo, pero los valores de las copias locales se resumirán (reducirán) en una variable compartida global. Esto es muy útil si una operación en particular (especificada en el operador para esta cláusula en particular) en una variable se ejecuta de forma iterativa, de modo que su valor en una iteración particular depende de su valor en una iteración anterior. Los pasos que conducen al incremento operativo se paralelizan, pero los subprocesos actualizan la variable global de una manera segura para subprocesos. Esto sería necesario para paralelizar la integración numérica de funciones y ecuaciones diferenciales , como un ejemplo común.
- Otros
- flush : el valor de esta variable se restaura del registro a la memoria para usar este valor fuera de una parte paralela
- master : ejecutado solo por el hilo maestro (el hilo que bifurcó todos los demás durante la ejecución de la directiva OpenMP). Sin barrera implícita; no es necesario que otros miembros del equipo (subprocesos) alcancen.
Rutinas de tiempo 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, activar / desactivar bloqueos, funciones de temporización, etc.
Variables de entorno
Un método para alterar las funciones de ejecución de aplicaciones OpenMP. Se utiliza para controlar la programación de iteraciones de bucle, el número predeterminado de subprocesos, etc. Por ejemplo, OMP_NUM_THREADS se utiliza para especificar el número de subprocesos para 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 las ediciones Professional, Team System, Premium y Ultimate [16] [17] [18] ), así como Intel Parallel Studio para varios procesadores . [19] Los compiladores y herramientas de Oracle Solaris Studio admiten las últimas especificaciones OpenMP con mejoras de productividad para el sistema operativo Solaris (UltraSPARC y x86 / x64) y plataformas Linux. Los compiladores Fortran, C y C ++ de The Portland Group también son compatibles con OpenMP 2.5. GCC también es compatible con OpenMP desde la versión 4.2.
Compiladores con implementación de OpenMP 3.0:
- CGC 4.3.1
- Compilador de mercurio
- Compiladores Intel Fortran y C / C ++ versiones 11.0 y 11.1, Intel C / C ++ y Fortran Composer XE 2011 e Intel Parallel Studio.
- Compilador IBM XL [20]
- La actualización 1 de Sun Studio 12 tiene una implementación completa de OpenMP 3.0 [21]
- Computación multiprocesador ( "MPC" .)
Varios compiladores admiten OpenMP 3.1:
- CCG 4.7 [22]
- Compiladores Intel Fortran y C / C ++ 12.1 [23]
- Compiladores IBM XL C / C ++ para AIX y Linux, V13.1 [24] y compiladores IBM XL Fortran para AIX y Linux, V14.1 [25]
- LLVM / Clang 3.7 [26]
- Compiladores de Absoft Fortran v. 19 para Windows, Mac OS X y Linux [27]
Compiladores compatibles con OpenMP 4.0:
- GCC 4.9.0 para C / C ++, GCC 4.9.1 para Fortran [22] [28]
- Compiladores Intel Fortran y C / C ++ 15.0 [29]
- IBM XL C / C ++ para Linux, V13.1 (parcial) [24] y XL Fortran para Linux, V15.1 (parcial) [25]
- LLVM / Clang 3.7 (parcial) [26]
Varios compiladores que admiten OpenMP 4.5:
- GCC 6 para C / C ++ [30]
- Compiladores Intel Fortran y C / C ++ 17.0, 18.0, 19.0 [31]
- LLVM / Clang 12 [32]
Soporte parcial para OpenMP 5.0:
- GCC 9 para C / C ++ [33]
- Compiladores Intel Fortran y C / C ++ 19.1 [34]
- LLVM / Clang 12 [32]
Compiladores de paralelización automática que generan código fuente anotado con directivas OpenMP:
- iPat / OMP
- Parallware
- PLUTÓN
- ROSE (marco del compilador)
- S2P de KPIT Cummins Infosystems Ltd.
Varios perfiladores y depuradores admiten expresamente OpenMP:
- Intel VTune Profiler: un generador de perfiles para las arquitecturas de CPU x86 y GPU X e
- Intel Advisor : una herramienta de análisis y asistencia de diseño para códigos OpenMP y MPI
- Herramienta de depuración distribuida de Allinea (DDT): depurador de códigos OpenMP y MPI
- Allinea MAP - generador de perfiles para códigos OpenMP y MPI
- TotalView: depurador de Rogue Wave Software para OpenMP, MPI y códigos de serie
- ompP - generador de perfiles para OpenMP
- VAMPIR - generador de perfiles para código OpenMP y MPI
Pros y contras
Pros:
- Código portátil de subprocesos múltiples (en C / C ++ y otros lenguajes, normalmente se deben llamar primitivas específicas de la plataforma para obtener subprocesos múltiples).
- Simple: no es necesario que se ocupe del paso de mensajes como lo hace MPI .
- El diseño y la descomposición de los datos se gestionan automáticamente mediante directivas.
- Escalabilidad comparable a MPI en sistemas de memoria compartida. [35]
- Paralelismo incremental: puede funcionar en una parte del programa a la vez, no se necesita ningún cambio drástico en el código.
- Código unificado para aplicaciones en serie y en paralelo: las construcciones OpenMP se tratan como comentarios cuando se utilizan compiladores secuenciales.
- Las declaraciones de código original (en serie) no necesitan, en general, modificarse cuando se paralelizan con OpenMP. Esto reduce la posibilidad de introducir errores inadvertidamente.
- Tanto grano grueso y de grano fino son posibles paralelismo.
- En aplicaciones multifísicas irregulares que no se adhieren únicamente al modo de cálculo SPMD , como se encuentra en los sistemas de partículas de fluido estrechamente acoplados, la flexibilidad de OpenMP puede tener una gran ventaja de rendimiento sobre MPI . [35] [36]
- Se puede utilizar en varios aceleradores como GPGPU [37] y FPGA .
Contras:
- Riesgo de introducir errores de sincronización y condiciones de carrera difíciles de depurar . [38] [39]
- A partir de 2017[actualizar]solo se ejecuta de manera eficiente en plataformas multiprocesador de memoria compartida (consulte, no obstante, Cluster OpenMP de Intel y otras plataformas de memoria compartida distribuida ).
- Requiere un compilador que admita OpenMP.
- La escalabilidad está limitada por la arquitectura de la memoria.
- No hay soporte para comparar e intercambiar . [40]
- Falta un manejo confiable de errores.
- Carece de mecanismos detallados para controlar el mapeo del procesador de subprocesos.
- Alta probabilidad de escribir accidentalmente código falso para compartir .
Expectativas de desempeño
Uno podría esperar obtener una aceleración N veces cuando se ejecuta un programa en paralelo usando OpenMP en una plataforma de procesador N. Sin embargo, esto rara vez ocurre por estas razones:
- Cuando existe una dependencia, un proceso debe esperar hasta que se calculen los datos de los que depende.
- Cuando varios procesos comparten un recurso de prueba no paralelo (como un archivo para escribir), sus solicitudes se ejecutan secuencialmente. Por lo tanto, cada hilo debe esperar hasta que el otro hilo libere el recurso.
- Una gran parte del programa puede no ser paralelizado por OpenMP, lo que significa que el límite superior teórico de aceleración está limitado de acuerdo con la ley de Amdahl .
- N procesadores en un multiprocesamiento simétrico (SMP) pueden tener N veces la potencia de cálculo, pero el ancho de banda de la memoria generalmente no aumenta N veces. Muy a menudo, varios procesadores comparten la ruta de memoria original y se puede observar una degradación del rendimiento cuando compiten por el ancho de banda de la memoria compartida.
- Muchos otros problemas comunes que afectan la aceleración final en la computación paralela también se aplican a OpenMP, como el equilibrio de carga y la sobrecarga de sincronización.
- La optimización del compilador puede no ser tan efectiva al invocar OpenMP. Esto comúnmente puede llevar a que un programa OpenMP de un solo subproceso se ejecute más lento que el mismo código compilado sin un indicador OpenMP (que será completamente serial).
Afinidad de hilo
Algunos proveedores recomiendan configurar la afinidad del procesador en subprocesos OpenMP para asociarlos con núcleos de procesador particulares. [41] [42] [43] 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).
Benchmarks
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
- OmpSCR: repositorio de código fuente OpenMP
Los puntos de referencia de rendimiento incluyen:
- Conjunto de microevaluaciones EPCC OpenMP / MPI
- Benchmark NAS paralelo
- Barcelona OpenMP Task Suite una colección de aplicaciones que permiten probar implementaciones de tareas de OpenMP.
- Serie SPEC
- SPEC OMP 2012
- La suite de pruebas SPEC ACCEL prueba la API de descarga de destino de OpenMP 4
- El punto de referencia SPEChpc® 2002
- Códigos de referencia ASC Sequoia
- Puntos de referencia de CORAL
- Rodinia centrándose en aceleradores.
- Paquete de referencia basado en problemas
Los puntos de referencia de corrección incluyen:
- Suite de validación OpenMP
- Conjunto de pruebas de validación y verificación de OpenMP
- DataRaceBench es una suite de referencia diseñada para evaluar sistemática y cuantitativamente la efectividad de las herramientas de detección de carrera de datos de OpenMP.
- AutoParBench es una suite de referencia para evaluar compiladores y herramientas que pueden insertar automáticamente directivas OpenMP.
Ver también
- Capilla (lenguaje de programación)
- Cilk
- Cilk Plus
- Interfaz de paso de mensajes
- Simultaneidad (informática)
- Arquitectura de sistema heterogénea
- Computación paralela
- Modelo de programación paralela
- Hilos POSIX
- Paralelo unificado C
- X10 (lenguaje de programación)
- Máquina virtual paralela
- Paralelo síncrono a granel
- Despacho de Grand Central
- Espacio de direcciones global particionado
- GPGPU
- CUDA - Nvidia
- Octopiler
- OpenCL
- OpenACC
- SecuenciaL
- Enduro / X
Referencias
- ^ a b c "Acerca de OpenMP ARB y" . OpenMP.org. 2013-07-11. Archivado desde el original el 9 de agosto de 2013 . Consultado el 14 de agosto de 2013 .
- ^ a b "Compiladores y herramientas de OpenMP" . OpenMP.org. Noviembre de 2019 . Consultado el 5 de marzo de 2020 .
- ^ a b Gagne, Abraham Silberschatz, Peter Baer Galvin, Greg (17 de diciembre de 2012). Conceptos del sistema operativo (9ª ed.). Hoboken, Nueva Jersey: Wiley. págs. 181-182. ISBN 978-1-118-06333-0.
- ^ Tutorial de OpenMP en Supercomputing 2008
- ^ Uso de OpenMP - Programación paralela de memoria compartida portátil - Descargar ejemplos de libros y discutir
- ^ Costa, JJ; et al. (Mayo de 2006). "Ejecutar aplicaciones OpenMP de manera eficiente en un SDSM de todo compartido". Revista de Computación Paralela y Distribuida . 66 (5): 647–658. doi : 10.1016 / j.jpdc.2005.06.018 .
- ^ Basumallik, Ayón; Min, Seung-Jai; Eigenmann, Rudolf (2007). Programación de sistemas de memoria distribuida [sic] usando OpenMP . Actas del Simposio internacional de procesamiento paralelo y distribuido de IEEE 2007 . 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.Una preimpresión está disponible en la página de inicio de Chen Ding ; consulte especialmente la Sección 3 sobre la traducción de OpenMP a MPI.
- ^ 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[actualizar] el software KLCoMP descrito en este documento no parece estar disponible públicamente)
- ^ Cluster OpenMP (un producto que solía estar disponible para lasversiones 9.1 a 11.1 del compilador Intel C ++ pero que se eliminó en la 13.0)
- ^ Ayguade, Eduard; Copty, Nawal; Durán, Alejandro; Hoeflinger, Jay; Lin, Yuan; Massaioli, Federico; Su, Ernesto; Unnikrishnan, Priya; Zhang, Guansong (2007). Una propuesta de paralelismo de tareas en OpenMP (PDF) . Proc. Taller internacional sobre OpenMP.
- ^ "Interfaz del programa de aplicación OpenMP, versión 3.0" (PDF) . openmp.org. Mayo de 2008 . Consultado el 6 de febrero de 2014 .
- ^ LaGrone, James; Aribuki, Ayodunni; Addison, Cody; Chapman, Barbara (2011). Una implementación en tiempo de ejecución de tareas de OpenMP . Proc. Taller internacional sobre OpenMP. págs. 165-178. CiteSeerX 10.1.1.221.2775 . doi : 10.1007 / 978-3-642-21487-5_13 .
- ^ "Lanzamiento de la API de OpenMP 4.0" . OpenMP.org. 2013-07-26. Archivado desde el original el 9 de noviembre de 2013 . Consultado el 14 de agosto de 2013 .
- ^ "Interfaz del programa de aplicación OpenMP, versión 4.0" (PDF) . openmp.org. Julio de 2013 . Consultado el 6 de febrero de 2014 .
- ^ "Tutorial - Paralelo para bucles con OpenMP" . 2009-07-14.
- ^ Ediciones de Visual C ++, Visual Studio 2005
- ^ Ediciones de Visual C ++, Visual Studio 2008
- ^ Ediciones de Visual C ++, Visual Studio 2010
- ^ David Worthington, "Intel trata el ciclo de vida del desarrollo con Parallel Studio". Archivado el15 de febrero de 2012en Wayback Machine , SDTimes, 26 de mayo de 2009 (consultado el 28 de mayo de 2009).
- ^ "XL C / C ++ para características de Linux" , (consultado el 9 de junio de 2009)
- ^ "Red de tecnología de Oracle para desarrolladores de Java | Red de tecnología de Oracle | Oracle" . Developers.sun.com . Consultado el 14 de agosto de 2013 .
- ^ a b "openmp - Wiki de GCC" . Gcc.gnu.org. 2013-07-30 . Consultado el 14 de agosto de 2013 .
- ^ Enviado por Patrick Kennedy ... el viernes, 02/09/2011 - 11:28 (06/09/2011). "Los compiladores Intel® C ++ y Fortran ahora admiten la especificación OpenMP * 3.1 | Intel® Developer Zone" . Software.intel.com . Consultado el 14 de agosto de 2013 .
- ^ a b https://www.ibm.com/support/docview.wss?uid=swg27007322&aid=1
- ^ a b http://www-01.ibm.com/support/docview.wss?uid=swg27007323&aid=1
- ^ a b "Notas de la versión 3.7 de Clang" . llvm.org . Consultado el 10 de octubre de 2015 .
- ^ "Página de inicio de Absoft" . Consultado el 12 de febrero de 2019 .
- ^ "Serie de versiones GCC 4.9 - Cambios" . www.gnu.org.
- ^ "Funciones de OpenMP * 4.0 en el compilador Intel 15.0" . Software.intel.com. 2014-08-13.
- ^ "Serie de versiones GCC 6 - Cambios" . www.gnu.org.
- ^ "Compiladores y herramientas de OpenMP" . openmp.org . www.openmp.org . Consultado el 29 de octubre de 2019 .
- ^ a b "Soporte OpenMP - Documentación de Clang 12" . clang.llvm.org . Consultado el 23 de octubre de 2020 .
- ^ "GOMP - Una implementación de OpenMP para GCC - Proyecto GNU - Free Software Foundation (FSF)" . gcc.gnu.org . Consultado el 23 de octubre de 2020 .
- ^ "Soporte OpenMP *" . Intel . Consultado el 23 de octubre de 2020 .
- ^ a b Amritkar, Amit; Tafti, Danesh; Liu, Rui; Kufrin, Rick; Chapman, Barbara (2012). "Paralelismo OpenMP para sistemas fluido y fluido-particulado". Computación paralela . 38 (9): 501. doi : 10.1016 / j.parco.2012.05.005 .
- ^ Amritkar, Amit; Deb, Surya; Tafti, Danesh (2014). "Simulaciones CFD-DEM paralelas eficientes utilizando OpenMP" . Revista de Física Computacional . 256 : 501. Código bibliográfico : 2014JCoPh.256..501A . doi : 10.1016 / j.jcp.2013.09.007 .
- ^ Soporte de OpenMP Accelerator para GPU
- ^ Detectar y evitar condiciones de carrera de OpenMP en C ++
- ^ Alexey Kolosov, Evgeniy Ryzhkov, Andrey Karpov 32 trampas OpenMP para desarrolladores de C ++
- ^ Stephen Blair-Chappell, Intel Corporation, Convertirse en un experto en programación paralela en nueve minutos, presentación en laconferencia ACCU 2010
- ^ Chen, Yurong (15 de noviembre de 2007). "Software de varios núcleos". Revista de tecnología de Intel . 11 (4). doi : 10.1535 / itj.1104.08 .
- ^ "Resultado OMPM2001" . ESPECIFICACIONES. 2008-01-28.
- ^ "Resultado OMPM2001" . ESPECIFICACIONES. 2003-04-01.
Otras lecturas
- Quinn Michael J, Programación paralela en C con MPI y OpenMP McGraw-Hill Inc. 2004. ISBN 0-07-058201-7
- R. Chandra, R. Menon, L. Dagum, D. Kohr, D. Maydan, J. McDonald, Programación paralela en OpenMP. Morgan Kaufmann, 2000. ISBN 1-55860-671-8
- R. Eigenmann (Editor), M. Voss (Editor), OpenMP Shared Memory Parallel Programming: International Workshop on OpenMP Applications and Tools, WOMPAT 2001, West Lafayette, IN, EE. UU., 30 al 31 de julio de 2001. (Lecture Notes in Computer Ciencias). Springer 2001. ISBN 3-540-42346-X
- B. Chapman, G. Jost, R. van der Pas, DJ Kuck (prólogo), Uso de OpenMP: Programación paralela de memoria compartida portátil. The MIT Press (31 de octubre de 2007). ISBN 0-262-53302-2
- Procesamiento paralelo a través de MPI y OpenMP, M. Firuziaan, O. Nommensen. Linux Enterprise, 10/2002
- Artículo de MSDN Magazine sobre OpenMP
- Tutorial de SC08 OpenMP (PDF): introducción práctica a OpenMP, Mattson y Meadows, de SC08 (Austin)
- Especificaciones de OpenMP
- Programación paralela en Fortran 95 usando OpenMP (PDF)
enlaces externos
- Sitio web oficial que incluye las últimas especificaciones de OpenMP, enlaces a recursos, un animado conjunto de foros donde los expertos e implementadores de OpenMP pueden hacer preguntas y responderlas.
- OpenMPCon , sitio web de la OpenMP Developers Conference
- IWOMP , sitio web del Taller internacional anual sobre OpenMP
- Usuarios de OpenMP del Reino Unido , sitio web para la conferencia y el grupo de usuarios de OpenMP del Reino Unido
- IBM Octopiler con soporte OpenMP
- Blaise Barney, sitio del Laboratorio Nacional Lawrence Livermore en OpenMP
- Combinando OpenMP y MPI (PDF)
- Mezcla de MPI y OpenMP
- Mida y visualice el paralelismo de OpenMP por medio de un planificador de enrutamiento C ++ calculando el factor Speedup
- Asesor de Intel