OpenMP ( Open Multi-Processing ) es un estándar abierto para paralelizar programas en C , C++ y Fortran . Proporciona una descripción de un conjunto de directivas de compilador , procedimientos de biblioteca y variables de entorno que están destinados a la programación de aplicaciones de subprocesos múltiples en sistemas de procesadores múltiples con memoria compartida .
La especificación del estándar es desarrollada por la organización sin fines de lucro OpenMP Architecture Review Board (ARB) [1] , que incluye a todos los principales fabricantes de procesadores, así como a varios laboratorios de supercomputación y universidades. La primera versión de la especificación se lanzó en 1997, destinada solo para Fortran, al año siguiente se lanzó una versión para C y C ++.
OpenMP implementa la computación paralela utilizando subprocesos múltiples , en los que el subproceso maestro crea un conjunto de subprocesos esclavos y la tarea se distribuye entre ellos . Se supone que los subprocesos se ejecutan en paralelo en una máquina con múltiples procesadores (la cantidad de procesadores no necesita ser mayor o igual que la cantidad de subprocesos).
Las tareas realizadas por subprocesos en paralelo, así como los datos necesarios para realizar estas tareas, se describen utilizando directivas especiales del preprocesador del lenguaje correspondiente: "pragmas". Por ejemplo, una sección de código Fortran que debe ser ejecutada por varios subprocesos, cada uno de los cuales tiene su propia copia de la variable N, está precedida por la siguiente directiva:!$OMP PARALLEL PRIVATE(N)
El número de subprocesos creados puede ser regulado tanto por el propio programa llamando a los procedimientos de la biblioteca, como desde el exterior, mediante el uso de variables de entorno.
Elementos clave de la norma:
Un programa Fortran-77 que crea un número de subprocesos previamente desconocido (está determinado por una variable de entorno OMP_NUM_THREADSantes de iniciar el programa), cada uno de los cuales imprime un saludo junto con su propio número; el hilo principal (numerado 0) también imprime el número total de hilos, pero solo después de que todos hayan "pasado" la directiva BARRIER:
PROGRAM HELLO INTEGER ID , NTHRDS INTEGER OMP_GET_THREAD_NUM , OMP_GET_NUM_THREADS C $OMP PARALLEL PRIVATE ( ID ) ID = OMP_GET_THREAD_NUM () PRINT * , ' HELLO WORLD FROM THREAD' , ID C$ OMP BARRIER IF ( ID . EQ . 0 ) () PRINT * , 'HAY' , NTHRDS , 'HILOS' END IF C$OMP END PARALELO ENDPrograma en C que agrega diez subprocesos de matriz aa matriz b(compilado con gcc-4.4 y versiones posteriores con el indicador -fopenmp ):
#incluir <stdio.h> #incluir <omp.h> #definir N 100 int principal ( int argc , char * argv []) { doble a [ N ], b [ N ], c [ N ]; ent i ; omp_set_dynamic ( 0 ); // evita que la biblioteca openmp cambie el número de subprocesos durante la ejecución omp_set_num_threads ( 10 ); // establece el número de subprocesos en 10 // inicializa arreglos para ( i = 0 ; i < N ; i ++ ) { un [ yo ] = yo * 1.0 ; b [ yo ] = yo * 2.0 ; } // calcula la suma de los arreglos #pragma omp paralelo para shared(a, b, c) private(i) for ( i = 0 ; i < N ; i ++ ) c [ yo ] = un [ yo ] + segundo [ yo ]; printf ( "%f \n " , c [ 10 ]); devolver 0 ; }OpenMP es compatible con muchos compiladores modernos.
Los compiladores de Sun Studio admiten la especificación OpenMP 2.5 [2] con soporte para el sistema operativo Solaris ; Soporte de Linux planificado para la próxima versión[ especificar ] . Estos compiladores crean un procedimiento separado del código fuente ubicado debajo de la directiva parallely, en lugar de la directiva misma, insertan una llamada al procedimiento de la __mt_MasterFunction_biblioteca libmtsk, pasándole la dirección de uno creado artificialmente. Por lo tanto, los datos compartidos ( shared ) se pueden pasar en último lugar por referencia, y los propios ( private ) se declaran dentro de este procedimiento, siendo independientes de sus copias en otros subprocesos. El procedimiento __mt_MasterFunction_crea un grupo de subprocesos (número 9 en el ejemplo de C anterior) que ejecutarán el código de la construcción parallel, y el subproceso que lo llamó se convierte en el subproceso principal del grupo. Luego, el subproceso principal organiza el trabajo de los subprocesos esclavos, después de lo cual comienza a ejecutar el código de usuario. Cuando el código está listo, el hilo principal llama a una rutina _mt_EndOfTask_Barrier_que lo sincroniza con los demás.
Visual C++ 2005 y 2008 es compatible con OpenMP 2.0 en las ediciones Professional y Team System, 2010 en las ediciones Professional, Premium y Ultimate, 2012 en todas las ediciones [3] .
GCC 4.2 ha introducido compatibilidad con OpenMP para C, C++ y Fortran (basado en gfortran ), y algunas distribuciones (como Fedora Core 5) han incluido compatibilidad con GCC 4.1. Clang y LLVM 3.7 son compatibles con OpenMP 3.1 . [4] .
Intel C++ Compiler , Intel Fortran Compiler e Intel Parallel Studio son compatibles con la versión 3.0 de OpenMP, así como con Intel Cluster OpenMP para la programación de memoria distribuida. También hay implementaciones en el compilador IBM XL, PGI (Grupo Portland), Pathscale, compiladores HP[ especificar ] .
distribuida y paralela | Software para computación|
---|---|
Normas, bibliotecas | |
Software de monitoreo | |
Software de control |