Open MP

26/6/2018 OpenMP Traducido al: español Tutoriales Mostrar texto original Opciones ▼ | Ceremonias | Resúmenes | Tall

Views 506 Downloads 3 File size 876KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

26/6/2018

OpenMP Traducido al: español

Tutoriales

Mostrar texto original

Opciones ▼

| Ceremonias | Resúmenes | Talleres LC | Comentarios | Buscar | Privacidad y aviso legal

OpenMP Autor: Blaise Barney, Laboratorio Nacional Lawrence Livermore

UCRL-MI-133316

Tabla de contenido 1. 2. 3. 4. 5. 6.

Abstracto Introducción Modelo de programación OpenMP Descripción general de la API OpenMP Compilación de programas OpenMP Directivas OpenMP 1. Formato directivo 2. Formato de la directriz C / C ++ 3. Alcance Directivo 4. Construcción PARALELA 5. Ejercicio 1 6. Construcciones de trabajo compartido 1. DO / para la Directiva 2. SECCIONES Directiva 3. SINGLE Directiva 7. Construcciones combinadas de trabajo compartido en paralelo 8. TASK Construct 9. Ejercicio 2 10. Construcciones de sincronización 1. Directiva MASTER 2. Directiva CRÍTICA 3. Directiva BARRERA 4. Directiva TASKWAIT 5. Directiva ATOMIC 6. Directiva FLUSH 7. PEDIDO Directiva 11. Directiva THREADPRIVATE 12. Cláusulas de atributos de alcance de datos 1. Cláusula PRIVADA 2. Cláusula COMPARTIDA 3. Cláusula DEFAULT 4. Cláusula FIRSTPRIVATE 5. Cláusula LASTPRIVATE 6. Cláusula COPYIN 7. Cláusula COPYPRIVATE 8. Cláusula REDUCCIÓN 13. Resumen de cláusulas / directivas 14. Reglas vinculantes y anidamiento de directivas 7. Rutinas de biblioteca en tiempo de ejecución 8. Variables de entorno 9. Tamaño de pila de subprocesos y enlace de subprocesos 10. Herramientas de monitoreo, depuración y análisis de rendimiento para OpenMP 11. Ejercicio 3 12. Referencias y más información 13. Apéndice A: Rutinas de biblioteca en tiempo de ejecución

Abstracto OpenMP es una interfaz de programa de aplicación (API), definida conjuntamente por un grupo de principales proveedores de hardware y software. OpenMP proporciona un modelo portátil y escalable para desarrolladores de aplicaciones paralelas de memoria compartida. La API admite C / C ++ y Fortran en una amplia variedad de arquitecturas. Este tutorial cubre la mayoría de https://computing.llnl.gov/tutorials/openMP/

1/55

26/6/2018

OpenMP

las características principales de OpenMP 3.1, incluidas sus diversas construcciones y directivas para especificar regiones paralelas, intercambio de trabajo, sincronización y entorno de datos. Las funciones de la biblioteca de tiempo de ejecución y las variables de entorno también están cubiertas. Este tutorial incluye códigos de ejemplo de C y Fortran y un ejercicio de laboratorio. Nivel / Prerrequisitos: Este tutorial es ideal para aquellos que son nuevos en la programación paralela con OpenMP. Se requiere una comprensión básica de la programación paralela en C o Fortran. Para aquellos que no están familiarizados con la programación paralela en general, el material cubierto en EC3500: Introducción a la computación en paralelo sería útil.

Introducción ¿Qué es OpenMP? OpenMP es: Una interfaz de programa de aplicación (API) que se puede usar para dirigir explícitamente el paralelismo de memoria compartida de subprocesos múltiples . Compuesto de tres componentes principales de API: Directivas del compilador Rutinas de la biblioteca de tiempo de ejecución Variables de entorno Una abreviatura para: Abrir Multi-Procesamiento OpenMP no es: Significa para sistemas paralelos de memoria distribuida (por sí mismo) Necesariamente implementado de forma idéntica por todos los proveedores Garantizado para hacer el uso más eficiente de la memoria compartida Se requiere para verificar dependencias de datos, conflictos de datos, condiciones de carrera, interbloqueos o secuencias de códigos que hacen que un programa se clasifique como no conforme. Diseñado para manejar E / S paralelas. El programador es responsable de sincronizar la entrada y la salida. Objetivos de OpenMP: Normalización: Proporcionar un estándar entre una variedad de arquitecturas / plataformas de memoria compartida Definido y avalado conjuntamente por un grupo de importantes proveedores de hardware y software Clara y directa: Establezca un conjunto simple y limitado de directivas para programar máquinas de memoria compartida. Se puede implementar un paralelismo significativo usando solo 3 o 4 directivas. Este objetivo es cada vez menos significativo con cada nuevo lanzamiento, al parecer. Facilidad de uso: Proporcionan la capacidad de paralelizar incrementalmente un programa en serie, a diferencia de las bibliotecas de paso de mensajes que generalmente requieren un enfoque de todo o nada. Proporcionar la capacidad de implementar el paralelismo de grano grueso y fino Portabilidad: La API se especifica para C / C ++ y Fortran Foro público para API y membresía La mayoría de las principales plataformas se han implementado, incluidas las plataformas Unix / Linux y Windows Historia: A principios de los 90, los vendedores de máquinas de memoria compartida suministraron extensiones de programación Fortran similares, basadas en directivas: El usuario aumentaría un programa Fortran en serie con directivas que especificaban qué bucles debían paralelizarse El compilador sería responsable de paralelizar automáticamente dichos bucles en los procesadores SMP. Las implementaciones fueron todas funcionalmente similares, pero fueron divergentes (como de costumbre) El

i

i t

t

tá d

https://computing.llnl.gov/tutorials/openMP/

f

lb

d

d ANSI X3H5

1994 N

f

d

t d

t d bid

l i t é2/55

26/6/2018

OpenMP

El primer intento en un estándar fue el borrador de ANSI X3H5 en 1994. Nunca fue adoptado, en gran parte debido al interés cada vez menor a medida que las máquinas de memoria distribuida se hicieron populares. Sin embargo, no mucho después de esto, comenzaron a prevalecer arquitecturas de máquinas de memoria compartida más nuevas y se reanudó el interés. La especificación estándar de OpenMP comenzó en la primavera de 1997, asumiendo el lugar donde se había dejado ANSI X3H5. Dirigido por OpenMP Architecture Review Board (ARB). Los miembros y colaboradores originales de ARB se muestran a continuación. (Descargo de responsabilidad: todos los nombres de socios derivados del sitio web de OpenMP ) Miembros de APR

Apoyando a los desarrolladores de aplicaciones

Compaq / Digital Compañía Hewlett-Packard Corporación Intel International Business Machines (IBM) Kuck & Associates, Inc. (KAI) Silicon Graphics, Inc. Sun Microsystems, Inc. Programa ASCI del Departamento de Energía de EE. UU.

ADINA R & D, Inc. ANSYS, Inc. Dash Associates Fluent, Inc. División ILOG CPLEX Livermore Software Technology Corporation (LSTC) MECALOG SARL Oxford Molecular Group PLC The Numerical Algorithms Group Ltd. (NAG)

Apoyando vendedores de software Absoft Corporation Editores portátiles de Edimburgo GENIAS Software GmBH Myrias Computer Technologies, Inc. The Portland Group, Inc. (PGI)

Historial de versiones OpenMP continúa evolucionando, se agregan nuevas construcciones y características con cada versión. Inicialmente, las especificaciones API se publicaron por separado para C y Fortran. Desde 2005, han sido lanzados juntos. La siguiente tabla muestra el historial de versiones de la API OpenMP. Fecha Oct 1997 Oct 1998 Nov 1999 Nov 2000 Mar 2002 Mayo 2005 Mayo 2008 Jul 2011 Jul 2013 Nov 2015

Versión Fortran 1.0 C / C ++ 1.0 Fortran 1.1 Fortran 2.0 C / C ++ 2.0 OpenMP 2.5 OpenMP 3.0 OpenMP 3.1 OpenMP 4.0 OpenMP 4.5

Este tutorial se refiere a OpenMP versión 3.1. La sintaxis y las funciones de las versiones más nuevas no están cubiertas actualmente.

Referencias Sitio web de OpenMP: especificaciones de OpenMP.org API, preguntas frecuentes, presentaciones, debates, comunicados de prensa, calendario, solicitud de membresía y más ... Wikipedia: en.wikipedia.org/wiki/OpenMP

Modelo de programación OpenMP Modelo de memoria compartida: OpenMP está diseñado para multiprocesador / núcleo, máquinas de memoria compartida. La arquitectura subyacente puede ser memoria compartida UMA o NUMA. https://computing.llnl.gov/tutorials/openMP/

3/55

26/6/2018

OpenMP

Acceso a memoria uniforme

Acceso a memoria no uniforme

Paralelismo basado en hilos: Los programas OpenMP logran el paralelismo exclusivamente a través del uso de hilos. Un hilo de ejecución es la unidad más pequeña de procesamiento que puede programar un sistema operativo. La idea de una subrutina que se puede programar para ejecutarse de forma autónoma podría ayudar a explicar qué es un hilo. Los hilos existen dentro de los recursos de un solo proceso. Sin el proceso, dejan de existir. Normalmente, la cantidad de subprocesos coincide con la cantidad de procesadores / núcleos de la máquina. Sin embargo, el uso real de los hilos depende de la aplicación. Paralelismo explícito: OpenMP es un modelo de programación explícito (no automático) que ofrece al programador un control total sobre la paralelización. La paralelización puede ser tan simple como tomar un programa en serie e insertar directivas de compilación ... O tan complejo como insertar subrutinas para establecer múltiples niveles de paralelismo, bloqueos e incluso bloqueos anidados. Horquilla - Unir modelo: OpenMP utiliza el modelo fork-join de ejecución paralela:

Todos los programas OpenMP comienzan como un proceso único: el hilo maestro . La secuencia maestra se ejecuta secuencialmente hasta que se encuentra la primera construcción de región paralela . HORQUILLA: el hilo maestro crea un equipo de hilos paralelos . Las declaraciones en el programa que están encerradas por la construcción de la región paralela se ejecutan luego en paralelo entre los diversos hilos del equipo. UNIRSE: cuando los hilos del equipo completan las instrucciones en la construcción de la región paralela, se sincronizan y terminan, dejando solo el hilo maestro. El número de regiones paralelas y los hilos que las componen son arbitrarias. Directiva del compilador basada: La mayoría de los paralelos de OpenMP se especifican a través del uso de directivas de compilación que están incrustadas en C / C ++ o el código fuente Fortran. https://computing.llnl.gov/tutorials/openMP/

4/55

26/6/2018

OpenMP

Paralelismo anidado: La API proporciona la ubicación de regiones paralelas dentro de otras regiones paralelas. Las implementaciones pueden o no admitir esta característica. Hilos dinámicos: La API proporciona el entorno de tiempo de ejecución para modificar dinámicamente la cantidad de subprocesos utilizados para ejecutar regiones paralelas. Con la intención de promover un uso más eficiente de los recursos, si es posible. Las implementaciones pueden o no admitir esta característica. E / S: OpenMP no especifica nada sobre E / S paralelas. Esto es particularmente importante si varios hilos intentan escribir / leer desde el mismo archivo. Si cada hilo conduce E / S a un archivo diferente, los problemas no son tan significativos. Depende totalmente del programador asegurarse de que la E / S se realice correctamente dentro del contexto de un programa de subprocesos múltiples. Modelo de memoria: FLUSH ¿A menudo? OpenMP proporciona una vista de "consistencia relajada" y "temporal" de la memoria de subprocesos (en sus palabras). En otras palabras, los hilos pueden "almacenar en caché" sus datos y no están obligados a mantener una coherencia exacta con la memoria real todo el tiempo. Cuando es crítico que todos los hilos vean una variable compartida de manera idéntica, el programador es responsable de asegurar que la variable sea FLUSHed por todos los hilos, según sea necesario. Más sobre esto más tarde ...

Descripción general de la API OpenMP Tres componentes: La API de OpenMP 3.1 se compone de tres componentes distintos: Directivas de compilación (19) Rutinas de la biblioteca en tiempo de ejecución (32) Variables de entorno (9) Las API posteriores incluyen los mismos tres componentes, pero aumentan el número de directivas, rutinas de biblioteca de tiempo de ejecución y variables de entorno. El desarrollador de la aplicación decide cómo emplear estos componentes. En el caso más simple, solo se necesitan unos pocos. Las implementaciones difieren en su compatibilidad con todos los componentes API. Por ejemplo, una implementación puede indicar que es compatible con el paralelismo anidado, pero la API deja en claro que puede estar limitado a un único hilo: el hilo maestro. ¿No es exactamente lo que el desarrollador podría esperar? Directrices del compilador: Las directivas del compilador aparecen como comentarios en su código fuente y los compiladores las ignoran a menos que usted les indique lo contrario, generalmente especificando el indicador del compilador apropiado, como se discutió en la sección Compilación más adelante. Las directivas de compilador OpenMP se utilizan para diversos fines: Engendrando una región paralela División de bloques de código entre hilos Distribuir iteraciones de bucle entre hilos Serializar secciones de código Sincronización de trabajo entre hilos Las directivas de compilación tienen la siguiente sintaxis: https://computing.llnl.gov/tutorials/openMP/

5/55

26/6/2018

OpenMP

Sentinel directive-name [cláusula, ...] Por ejemplo: Fortran ! $ OMP PREDETERMINADO PARALELO (COMPARTIDO) PRIVADO (BETA, PI) C / C ++ #pragma omp paralelo predeterminado (compartido) privado (beta, pi) Las directivas del compilador están cubiertas en detalle más adelante. Rutinas de biblioteca en tiempo de ejecución: La API OpenMP incluye un número cada vez mayor de rutinas de biblioteca en tiempo de ejecución. Estas rutinas se usan para una variedad de propósitos: Configuración y consulta del número de subprocesos Consultar el identificador único de un subproceso (ID de subproceso), el identificador de ancestro de un subproceso, el tamaño del equipo de subproceso Configuración y consulta de la función de subprocesos dinámicos Consultando si en una región paralela, y en qué nivel Establecer y consultar el paralelismo anidado Configuración, inicialización y terminación de bloqueos y bloqueos anidados Consultar el tiempo y la resolución del reloj de pared Para C / C ++, todas las rutinas de la biblioteca en tiempo de ejecución son subrutinas reales. Para Fortran, algunas son en realidad funciones, y algunas son subrutinas. Por ejemplo: Fortran FUNCIÓN INTEGER OMP_GET_NUM_THREADS () C / C ++ #include int omp_get_num_threads (void) Tenga en cuenta que para C / C ++, generalmente necesita incluir el archivo de encabezado . Las rutinas de Fortran no distinguen entre mayúsculas y minúsculas, pero sí las rutinas de C / C ++. Las rutinas de biblioteca en tiempo de ejecución se discuten brevemente como una visión general en el tiempo de ejecución de rutinas de biblioteca sección, y con más detalle en el Apéndice A . Variables de entorno: OpenMP proporciona varias variables de entorno para controlar la ejecución de código paralelo en tiempo de ejecución. Estas variables de entorno se pueden usar para controlar cosas tales como: Establecer el número de hilos Especificar cómo se dividen las interacciones de bucle Enlazando hilos a procesadores Habilitar / deshabilitar el paralelismo anidado; establecer los niveles máximos de paralelismo anidado Habilitar / deshabilitar hilos dinámicos Configurar el tamaño de la pila Configuración de la política de espera del hilo La configuración de las variables de entorno de OpenMP se realiza de la misma forma que configura cualquier otra variable de entorno, y depende de qué shell usar. Por ejemplo: csh / tcsh setenv OMP_NUM_THREADS 8 sh / bash exportar OMP_NUM_THREADS = 8 Las variables de entorno OpenMP se tratan en la sección Variables del entorno más adelante. Ejemplo de estructura de código OpenMP:

Fortran - Estructura general del código 1 2 3

PROGRAMA HOLA INTEGER VAR1

https://computing.llnl.gov/tutorials/openMP/

VAR2

VAR3

6/55

26/6/2018

OpenMP

3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

INTEGER VAR1, VAR2, VAR3 Código de serie . . . Principio de la región paralela. Tenedor un equipo de hilos. Especificar el alcance de variable ! $ OMP PARALELO PRIVADO (VAR1, VAR2) COMPARTIDO (VAR3) Región paralela ejecutada por todos los hilos . Otras directivas OpenMP . Llamadas a la biblioteca en tiempo de ejecución . Todos los hilos se unen al hilo principal y se disuelven ! $ OMP FINAL PARALELO Reanudar el código de serie . . . FIN

C / C ++ - Estructura general del código 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

#include principal () { int var1, var2, var3; Código de serie . . . Principio de la región paralela. Tenedor un equipo de hilos. Especificar el alcance de variable #pragma omp parallel private (var1, var2) shared (var3) { Región paralela ejecutada por todos los hilos . Otras directivas OpenMP . Llamadas a la biblioteca en tiempo de ejecución . Todos los hilos se unen al hilo principal y se disuelven } Reanudar el código de serie . . .

https://computing.llnl.gov/tutorials/openMP/

7/55

26/6/2018

OpenMP

33

}

Compilación de programas OpenMP Implementaciones LC OpenMP: A partir de junio de 2018, las fuentes de documentación para los compiladores por defecto de LC reclaman el siguiente soporte OpenMP: Plataforma

Compilador

Apoyos Bandera de versión

Linux

BG / Q

SIERRA CORAL EA

Versión predeterminada

Intel C / C ++, Fortran

--versión

16.0.3 (TOSS 2) 18.0.1 (TOSS 3)

OpenMP 4.0 OpenMP 4.5 (más)

GNU C / C ++, Fortran

--versión

4.4.7 (TOSS 2) 4.9.3 (TOSS 3)

OpenMP 3.0 OpenMP 4.0

PGI C / C ++, Fortran

-V --version

8.0.1 (TOSS 2) 18.1 (TOSS 3)

OpenMP 3.0 OpenMP 4.5 (limitaciones - sin descarga de GPU)

Clang C / C ++

--versión

3.7.0 (TOSS 2) 4.0.0 (TOSS 3)

OpenMP 3.1 Algunos OpenMP 4.0 y 4.5

IBM XL C / C ++

-version

12.1

OpenMP 3.1

IBM XL Fortran

-version

14.1

OpenMP 3.1

GNU C / C ++, Fortran

--versión

4.4.7

OpenMP 3.0

IBM XL C / C ++

-version

16.01 beta

OpenMP 4.5

IBM XL Fortran

-version

16.01 beta

OpenMP 4.5

GNU C / C ++

--versión

4.9.3

OpenMP 4.0

GNU Fortran

--versión

4.9.3

OpenMP 4.0

PGI C / C ++, Fortran

-V --version

18.5-0

OpenMP 4.5 (limitaciones - sin descarga de GPU)

Clang C / C ++ (IBM)

--versión

4.0 beta

OpenMP 4.5

Para ver todas las versiones del compilador LC, use los comandos: TOSS 2, BG / Q:

use -l compiladores

TOSS 3, CORAL EA: módulo disponible El mejor lugar para ver el soporte de OpenMP por una variedad de compiladores: https://www.openmp.org/resources/openmp-compilers-tools/ . Compilando: Todos los compiladores de LC requieren que utilice el indicador de compilación apropiado para "activar" las compilaciones de OpenMP. La tabla a continuación muestra qué usar para cada compilador. Para los comandos del compilador de MPI, consulte: https://computing.llnl.gov/tutorials/mpi/#BuildScripts Compilador / plataforma

Comandos del compilador

Bandera de OpenMP

Intel Linux

icc icpc ifort

-qopenmp

GNU Linux IBM Blue Gene

gcc g ++ g77

-fopenmp

https://computing.llnl.gov/tutorials/openMP/

8/55

26/6/2018

OpenMP

IBM Blue Gene Sierra, CORAL EA

g77 gfortran

PGI Linux Sierra, CORAL EA

pgcc pgCC pgf77 pgf90

-mp

Clang Linux Sierra, CORAL EA

clang clang ++

-fopenmp

IBM XL Blue Gene

bgxlc_r, bgcc_r bgxlC_r, bgxlc ++ _ r bgxlc89_r bgxlc99_r bgxlf_r bgxlf90_r bgxlf95_r bgxlf2003_r

-qsmp = omp

IBM XL Sierra, CORAL EA

xlc_r xlC_r, xlc ++ _ r xlf_r xlf90_r xlf95_r xlf2003_r xlf2008_r

-qsmp = omp

Documentación del compilador: Intel y PGI: los documentos del compilador se incluyen en el directorio / opt / compilername . De lo contrario, consulte las páginas web Intel o PGI. GNU: gnu.org Clang: http://clang.llvm.org/docs/ IBM BlueGene: www-01.ibm.com/software/awdtools/fortran/ y www-01.ibm.com/software/awdtools/xlcpp IBM Sierra, CORAL EA: seleccione la versión relevante de los documentos de Little Endian en http://www01.ibm.com/support/docview.wss?uid=swg27036675 (C / C ++) y http: // www-01. ibm.com/support/docview.wss? uid=swg27036672 (Fortran).

Directivas OpenMP Formato de directivas Fortran Formato: (sin distinción de mayúsculas y minúsculas) centinela Todas las directivas de Fortran OpenMP deben comenzar con un centinela. Los centinelas aceptados dependen del tipo de fuente de Fortran. Los posibles centinelas son:

nombre-directiva

[cláusula ...]

Una directiva OpenMP válida. Debe aparecer después del centinela y antes de cualquier cláusula.

Opcional. Las cláusulas pueden estar en cualquier orden y repetirse según sea necesario a menos que se restrinja de otra manera.

! $ OMP C $ OMP * $ OMP Ejemplo:

! $ OMP PREDETERMINADO PARALELO (COMPARTIDO) PRIVADO (BETA, PI)

Fuente de forma fija: ! $ OMP C $ OMP * $ OMP son aceptados como centinelas y deben comenzar en la columna 1 T d

l

l

d f

l i fij d F t

https://computing.llnl.gov/tutorials/openMP/

l

l

d l

it d d lí

i

bl

ti



9/55

26/6/2018

OpenMP

Todas las reglas de formulario fijo de Fortran para las columnas de longitud de línea, espacio en blanco, continuación y comentario se aplican a toda la línea directiva. Las líneas de directiva inicial deben tener un espacio / cero en la columna 6. Las líneas de continuación deben tener un espacio no cero en la columna 6. Fuente de forma gratuita: ! $ OMP es el único centinela aceptado. Puede aparecer en cualquier columna, pero debe estar precedido solo por espacios en blanco. Todas las reglas de forma libre de Fortran para las columnas de longitud de línea, espacio en blanco, continuación y comentario se aplican a toda la línea directiva. Las líneas de directiva iniciales deben tener un espacio después del centinela. Las líneas de continuación deben tener un ampersand como el último carácter que no está en blanco en una línea. La siguiente línea debe comenzar con un centinela y luego con las directivas de continuación. Reglas generales: Los comentarios no pueden aparecer en la misma línea que una directiva Solo se puede especificar un nombre de directiva por directiva Los compiladores Fortran que están habilitados para OpenMP generalmente incluyen una opción de línea de comando que instruye al compilador a activar e interpretar todas las directivas OpenMP. Varias directivas de Fortran OpenMP vienen en pares y tienen el formulario que se muestra a continuación. La directiva "final" es opcional, pero se recomienda su legibilidad. Directiva $ OMP [bloque de código estructurado] ! $ OMP directiva final

Directivas OpenMP Formato de directivas C / C ++ Formato: #pragma omp

nombre-directiva

[cláusula, ...]

nueva línea

Requerido para todas las directivas OpenMP C / C ++.

Una directiva OpenMP válida. Debe aparecer después del pragma y antes de cualquier cláusula.

Opcional. Las cláusulas pueden estar en cualquier orden y repetirse según sea necesario a menos que se restrinja de otra manera.

Necesario. Precede al bloque estructurado que está encerrado por esta directiva.

Ejemplo:

#pragma omp paralelo predeterminado (compartido) privado (beta, pi)

Reglas generales: Distingue mayúsculas y minúsculas Las directivas siguen las convenciones de los estándares C / C ++ para directivas de compilación Solo se puede especificar un nombre de directiva por directiva https://computing.llnl.gov/tutorials/openMP/

10/55

26/6/2018

OpenMP

Cada directiva se aplica como máximo a una declaración siguiente, que debe ser un bloque estructurado. Las líneas directivas largas se pueden "continuar" en líneas sucesivas escapando del carácter de nueva línea con una barra diagonal inversa ("\") al final de una línea directiva.

Directivas OpenMP Alcance Directivo ¿Hacemos esto ahora ... o lo hacemos más tarde? Oh, bueno, terminemos pronto ... Estático (Léxico) Extensión: El código encerrado textualmente entre el principio y el final de un bloque estructurado siguiendo una directiva. La extensión estática de una directiva no abarca múltiples rutinas o archivos de código Directiva huérfana: Se dice que una directiva OpenMP que aparece independientemente de otra directiva adjunta es una directiva huérfana. Existe fuera de la extensión estática (léxica) de otra directiva. Extenderá las rutinas y posiblemente los archivos de códigos Extensión dinámica: El alcance dinámico de una directiva incluye tanto su alcance estático (léxico) como la extensión de sus directivas huérfanas. Ejemplo:

! $ ! $

! $

! $

PRUEBA DEL PROGRAMA ... OMP PARALELO ... OMP DO DO I = ... ... CALL SUB1 ... ENDDO OMP END DO ... LLAMAR SUB2 ... OMP FINAL PARALELO

EXTENSIÓN ESTÁTICA La directiva DO se produce dentro de una región paralela envolvente

SUBROUTINA SUB1 ... ! $ OMP CRÍTICA ... ! $ OMP END CRITICAL FIN SUBROUTINA SUB2 ... ! SECCIONES $ OMP ... ! $ OMP SECCIONES FINALES ... FIN DIRECTIVAS HUÉRFANAS Las directivas CRÍTICAS y SECCIONES ocurren fuera de una región paralela que lo encierra

LA EXTENSIÓN DINÁMICA Las directivas CRÍTICAS y SECCIONES se producen dentro del alcance dinámico de las directivas DO y PARALLEL. ¿Porque es esto importante? OpenMP especifica una serie de reglas de alcance sobre cómo las directivas pueden asociar (vincular) y anidar entre sí Pueden producirse programas ilegales y / o incorrectos si se ignoran las reglas de enlace y anidamiento de OpenMP. Consulte las Reglas de vinculación y anidación de directivas para obtener detalles específicos

Directivas OpenMP Construcción de la región PARALELA

https://computing.llnl.gov/tutorials/openMP/

11/55

26/6/2018

Construcción de la región PARALELA

OpenMP

Propósito: Una región paralela es un bloque de código que será ejecutado por múltiples hilos. Esta es la construcción paralela de OpenMP. Formato: ! $ OMP PARALLEL [cláusula ...] IF (scalar_logical_expression) PRIVATE (list) SHARED (lista) PREDETERMINADO (PRIVADO | FIRSTPRIVATE | COMPARTIDO | NINGUNO) FIRSTPRIVATE (list) REDUCTION (operador: list) Fortran COPYIN (list) NUM_THREADS (expresión-entero-escalar) bloquear ! $ OMP FINAL PARALELO

C/C ++

#pragma omp parallel [cláusula ...] newline if (scalar_expression) private (lista) shared (lista) predeterminado (compartido | ninguno) firstprivate (list) reduction (operador: list) copyin (list) num_threads (integer-expression) structure_block

Notas: Cuando un hilo alcanza una directiva PARALELA, crea un equipo de hilos y se convierte en el maestro del equipo. El maestro es miembro de ese equipo y tiene el número de hilo 0 dentro de ese equipo. Comenzando desde el comienzo de esta región paralela, el código se duplica y todos los hilos ejecutarán ese código. Hay una barrera implícita al final de una región paralela. Solo el hilo maestro continúa la ejecución más allá de este punto. Si un hilo termina en una región paralela, todos los hilos del equipo finalizarán y el trabajo realizado hasta ese momento no estará definido. ¿Cuántos hilos? El número de subprocesos en una región paralela está determinado por los siguientes factores, en orden de precedencia: 1. Evaluación de la cláusula IF 2. Configuración de la cláusula NUM_THREADS 3. Uso de la función de biblioteca omp_set_num_threads () 4. Configuración de la variable de entorno OMP_NUM_THREADS 5. Valor predeterminado de implementación: por lo general, el número de CPU en un nodo, aunque podría ser dinámico (consulte el siguiente punto). Los hilos están numerados de 0 (hilo maestro) a N-1 Hilos dinámicos: Utilice la función de biblioteca omp_get_dynamic () para determinar si los subprocesos dinámicos están habilitados. https://computing.llnl.gov/tutorials/openMP/

12/55

26/6/2018

OpenMP

Si es compatible, los dos métodos disponibles para habilitar los hilos dinámicos son: 1. La rutina de la biblioteca omp_set_dynamic () 2. Configuración de la variable de entorno OMP_DYNAMIC en TRUE Regiones paralelas anidadas: Utilice la función de biblioteca omp_get_nested () para determinar si las regiones paralelas anidadas están habilitadas. Los dos métodos disponibles para habilitar regiones paralelas anidadas (si se admiten) son: 1. La rutina de la biblioteca omp_set_nested () 2. Configuración de la variable de entorno OMP_NESTED en TRUE Si no se admite, una región paralela anidada dentro de otra región paralela da como resultado la creación de un nuevo equipo, que consiste en un hilo, por defecto. Cláusulas: Cláusula IF : si está presente, debe evaluar a .TRUE. (Fortran) o distinto de cero (C / C ++) para que se cree un equipo de subprocesos. De lo contrario, la región se ejecuta en serie mediante el hilo maestro. Las cláusulas restantes se describen en detalle más adelante, en la sección Cláusulas de atributos del alcance de los datos . Restricciones Una región paralela debe ser un bloque estructurado que no abarca múltiples rutinas o archivos de código Es ilegal ramificar (entrar) dentro o fuera de una región paralela Solo se permite una sola cláusula IF Solo se permite una sola cláusula NUM_THREADS Un programa no debe depender del orden de las cláusulas

Ejemplo: Región Paralela Programa simple "Hello World" Cada hilo ejecuta todo el código encerrado en la región paralela Las rutinas de la biblioteca OpenMP se utilizan para obtener identificadores de subprocesos y el número total de subprocesos

Fortran - Ejemplo de región paralela 1 PROGRAMA HOLA 2 3 INTEGER NTHREADS, TID, OMP_GET_NUM_THREADS , 4 + OMP_GET_THREAD_NUM 5 6 ! ¡Tenedor de un equipo de hilos con cada hilo que tiene una variable TID privada 7 ! $ OMP PARALELO PRIVADO (TID) 8 9 ! Obtenga e imprima la id del hilo 10 TID = OMP_GET_THREAD_NUM () 11 IMPRIMIR *, 'Hello World from thread =', TID 12 13 ! Solo el hilo maestro hace esto 14 IF (TID .EQ. 0) ENTONCES 15 NTHREADS = OMP_GET_NUM_THREADS () 16 PRINT *, 'Número de hilos =', NTHREADS 17 TERMINARA SI 18 19 ! ¡Todos los hilos se unen al hilo maestro y se disuelven 20 ! $ OMP END PARALLEL 21

https://computing.llnl.gov/tutorials/openMP/

13/55

26/6/2018

OpenMP

21 22 FIN

C / C ++ - Ejemplo de región paralela 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

#include main (int argc, char * argv []) { int nthreads, tiempo; / * Tenedor de un equipo de hilos con cada hilo que tiene una variable tid privada * / #pragma omp paralelo privado (tid) { / * Obtenga e imprima la id del hilo * / tid = omp_get_thread_num () ; printf ("Hola mundo desde el hilo =% d \ n", tid); / * Solo el hilo maestro hace esto * / if (tiempo == 0) { nthreads = omp_get_num_threads () ; printf ("Número de hilos =% d \ n", n hilos); } }

/ * Todos los hilos unen el hilo maestro y terminan * /

}

Ejercicio 1 de OpenMP Empezando Visión de conjunto: Inicie sesión en el grupo de talleres con el nombre de usuario de su taller y el token OTP Copie los archivos de ejercicios a su directorio de inicio Familiarizarse con el entorno OpenMP de LC Escriba un simple programa "Hello World" OpenMP Compila con éxito tu programa Ejecute con éxito su programa Modificar la cantidad de hilos utilizados para ejecutar su programa

IR AL EJERCICIO AQUÍ

Aprox. 20 minutos

https://computing.llnl.gov/tutorials/openMP/

14/55

26/6/2018

OpenMP

Directivas OpenMP Construcciones de trabajo compartido Una construcción de trabajo compartido divide la ejecución de la región de código adjunta entre los miembros del equipo que la encuentra. Las construcciones de trabajo compartido no lanzan nuevos hilos No existe una barrera implícita al ingresar a una construcción de trabajo compartido, sin embargo, hay una barrera implícita al final de una construcción de trabajo compartido. Tipos de construcciones de trabajo compartido: NOTA: La construcción de trabajo compartido Fortran no se muestra aquí. DO / for - comparte iteraciones de un bucle en el equipo. Representa un tipo de "paralelismo de datos".

SECCIONES : divide el trabajo en SINGLE - serializa una sección de secciones separadas y discretas. Cada código sección se ejecuta mediante un hilo. Se puede usar para implementar un tipo de "paralelismo funcional".

Restricciones Una construcción de trabajo compartido debe estar encerrada dinámicamente dentro de una región paralela para que la directiva se ejecute en paralelo. Los constructos de trabajo compartido deben ser encontrados por todos los miembros de un equipo o ninguno en absoluto Las construcciones sucesivas de trabajo compartido deben ser encontradas en el mismo orden por todos los miembros de un equipo

Directivas OpenMP Construcciones de trabajo compartido DO / para directiva Propósito: La directiva DO / for especifica que el equipo debe ejecutar paralelamente las iteraciones del ciclo inmediatamente posterior. Esto supone que ya se ha iniciado una región paralela; de lo contrario, se ejecuta en serie en un solo procesador. https://computing.llnl.gov/tutorials/openMP/

15/55

26/6/2018

OpenMP

Formato: ! $ OMP DO [cláusula ...] HORARIO (tipo [, fragmento]) ORDENADO PRIVADO (lista) FIRSTPRIVATE (lista) LASTPRIVATE (lista) COMPARTIDA (lista) Fortran REDUCCIÓN (operador: lista) COLAPSO (n) do_loop ! $ OMP END DO [NOWAIT]

C/C ++

#pragma omp para [cláusula ...] calendario de nueva línea (tipo [, fragmento]) ordenado privado (lista) primerprivado (lista) últimoprivado (lista) compartido (lista) reducción (operador: lista) colapso (n) no, espera en bucle

Cláusulas: PROGRAMA : Describe cómo las iteraciones del ciclo se dividen entre los hilos del equipo. El cronograma predeterminado depende de la implementación. Para una discusión sobre cómo un tipo de programación puede ser más óptima que otras, vea http://openmp.org/forum/viewtopic.php?f=3&t=83 . ESTÁTICO Iteraciones del bucle se dividen en piezas de tamaño de trozo y luego asignados estáticamente a las roscas. Si no se especifica el fragmento, las iteraciones se dividen uniformemente (si es posible) de forma contigua entre los hilos. DINÁMICA Iteraciones del bucle se dividen en piezas de tamaño de trozo , y dinámicamente programadas entre los hilos; cuando un hilo termina un trozo, dinámicamente se le asigna otro. El tamaño de fragmento predeterminado es 1. GUIADO Las iteraciones se asignan dinámicamente a los hilos en bloques a medida que los hilos los solicitan hasta que no quedan bloques por asignar. Similar a DYNAMIC excepto que el tamaño del bloque disminuye cada vez que se le da un paquete de trabajo a un hilo. El tamaño del bloque inicial es proporcional a: number_of_iterations / number_of_threads Los bloques posteriores son proporcionales a number_of_iterations_remaining / number_of_threads El parámetro de fragmento define el tamaño de bloque mínimo. El tamaño de fragmento predeterminado es 1. DURACIÓN La variable de entorno OMP_SCHEDULE difiere la decisión de programación hasta el tiempo de ejecución. Es ilegal especificar un tamaño de fragmento para esta cláusula. AUTO La decisión de programación se delega al compilador y / o al sistema de tiempo de ejecución. NO WAIT / nowait : si se especifica, los hilos no se sincronizan al final del ciclo paralelo. ORDERED : especifica que las iteraciones del ciclo deben ejecutarse como lo harían en un programa en serie. COLAPSO : especifica cuántos bucles de un bucle anidado deben colapsarse en un espacio grande de iteración y dividirse según la cláusula de programación La ejecución secuencial de las iteraciones en todos los bucles asociados determina el

https://computing.llnl.gov/tutorials/openMP/

16/55

26/6/2018

OpenMP

según la cláusula de programación . La ejecución secuencial de las iteraciones en todos los bucles asociados determina el orden de las iteraciones en el espacio de iteración contraído. Otras cláusulas se describen en detalle más adelante en la sección Cláusulas de atributos del alcance de los datos .

Restricciones El bucle DO no puede ser un bucle DO WHILE o un bucle sin control de bucle. Además, la variable de iteración de bucle debe ser un número entero y los parámetros de control de bucle deben ser los mismos para todos los hilos. La corrección del programa no debe depender de qué hilo ejecuta una iteración particular. Es ilegal realizar una bifurcación (salida) de un bucle asociado con una directiva DO / for. El tamaño del fragmento debe especificarse como un bucle en una expresión entera invariable, ya que no hay sincronización durante su evaluación por diferentes subprocesos. Las cláusulas ORDERED, COLLAPSE y SCHEDULE pueden aparecer una vez cada una. Consulte el documento de la especificación OpenMP para conocer las restricciones adicionales.

Ejemplo: DO / para Directiva Programa simple vector-add Las matrices A, B, C y la variable N serán compartidas por todos los hilos. Variable Seré privado para cada hilo; cada hilo tendrá su propia copia única. Las iteraciones del bucle se distribuirán dinámicamente en piezas de tamaño CHUNK. Los hilos no se sincronizarán al completar sus piezas individuales de trabajo (NOWAIT).

Ejemplo de Directiva Fortran - DO 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

PROGRAMA VEC_ADD_DO INTEGER N, CHUNKSIZE, CHUNK, I PARÁMETRO (N = 1000) PARÁMETRO (CHUNKSIZE = 100) REAL A (N), B (N), C (N) ! Algunas inicializaciones DO I = 1, N A (I) = I * 1.0 B (I) = A (I) ENDDO CHUNK = CHUNKSIZE ! $ OMP PARALELO COMPARTIDO (A, B, C, CHUNK) PRIVADO (I) ! $ OMP DO SCHEDULE (DINÁMICO, CHUNK) DO I = 1, N C (I) = A (I) + B (I) ENDDO ! $ OMP END DO NOWAIT ! $ OMP FINAL PARALELO FIN

C / C ++ - para el ejemplo de directiva 1

#include

https://computing.llnl.gov/tutorials/openMP/

17/55

26/6/2018

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

# c ude o p. #define N 1000

OpenMP

#define CHUNKSIZE 100 main (int argc, char * argv []) { int i, pedazo; flotar a [N], b [N], c [N]; / * Algunas inicializaciones * / para (i = 0; i