Unidad 7: OpenMP#
Contenido de la unidad#
Hilos en C#
Note
Veamos cómo se programan
Ver el Notebook “threadsC.ipynb”
Diferencias entre threads y OpenMP#
API y nivel de abstracción
Threads en C son de bajo nivel.
OpenMP es de más alto nivel.
Ejecución paralela
Threads en C permiten una ejecución paralela fina-grano.
OpenMP se centra en la ejecución paralela a nivel de bucles y funciones.
Sincronización
Threads en C proporcionan primitivas de sincronización de bajo nivel.
OpenMP proporciona constructos de sincronización de más alto nivel.
Paralelismo de bucles
OpenMP permite paralelizar bucles de forma automática.
Threads en C, esto debe hacerse manualmente.
API y nivel de abstracción: Los threads en C son una API de bajo nivel que requieren un mayor conocimiento del programador sobre cómo funcionan los hilos y cómo sincronizarlos. En cambio, OpenMP es una API de más alto nivel que proporciona constructos de programación paralela más sencillos para el usuario.
Ejecución paralela: Los threads en C permiten una ejecución paralela fina-grano, lo que significa que el programador puede controlar exactamente qué se ejecuta en cada hilo. En cambio, OpenMP se centra en la ejecución paralela a nivel de bucles y funciones, lo que significa que el programador tiene menos control sobre cómo se ejecuta el código en paralelo.
Sincronización: Los threads en C proporcionan primitivas de sincronización de bajo nivel como mutexes y semáforos para controlar el acceso concurrente a secciones críticas. OpenMP, por otro lado, proporciona constructos de sincronización de más alto nivel como barreras y locks implícitos.
Paralelismo de bucles: OpenMP permite una forma sencilla de paralelizar bucles utilizando la directiva #pragma omp parallel for. Esta directiva permite paralelizar un bucle de forma automática en varios hilos sin necesidad de crear manualmente cada hilo. Los threads en C también pueden paralelizar bucles, pero el programador debe realizar esta tarea manualmente.
OpenMP versus threads#
Los threads en C proporcionan un mayor nivel de control y flexibilidad, pero requieren un mayor conocimiento del programador.
OpenMP es más fácil de usar y proporciona una mayor portabilidad y una mayor abstracción del hardware subyacente.
Tanto los threads en C como el uso de OpenMP en C permiten crear programas paralelos que pueden ejecutar tareas en múltiples procesadores o núcleos de forma simultánea.
Introducción#
Características#
Es estándar para la programación de aplicaciones en el modelo de memoria compartida.
Está soportado en lenguajes de programación como: C, C++ y Fortran
Está basado o compuesto de:
Directivas: desarrollar elementos de programación paralela
Funciones o librerías: útiles para según se necesiten
Variables de entorno: pasar información a los programas
Runtime: ambiente de ejecución
Modelo para OpenMP#
Modelo de ejecución en OpenMP#
El programa comienza en el hilo de ejecución principal (main).
Los hilos de trabajo (Workers) son generados en las regiones paralelas.
En medio de las regiones paralelas los hilos son pausados.
OpenMP se basa en Fork/Join
Directivas y región paralela#
Directivas#
En programación en general: las directivas son una construcción del lenguaje que indican cómo un compilador debería procesar un bloque de código
En OpenMP: las directivas indicarán cómo el compilador deberá interpretar ciertas reglas de código para la ejecución en paralelo
Directivas OpenMP#
Lenguaje orientado a directivas.
#pragma
No son parte de la especificación o comportamiento de C
Si un compilador no tiene soporte, simplemente ignora las directivas
Región paralela - especificando#
Paralelismo expresado de manera explícita
#pragma omp parallel
{
// Bloque estructurado
}
Región paralela - bloque estructurado#
Características:
Tiene exactamente un punto de entrada en la parte superior
Tiene exactamente un punto de salida en la parte inferior
No se permite ramificación hacia afuera o hacia adentro
Si se permite la terminación del programa
Región paralela - bloque estructurado#
Manejo de recursos#
¿Cuántos hilos para mi programa?#
Lo puedo definir usando una variable de entorno
OMP_NUM_THREADS = 6
Lo puedo definir usando una cláusula num_threads():
#pragma omp parallel num_threads(6)
Modifican el funcionamiento de las directivas
Permite que el programador especifique el número de hilos que va a ejecutar el siguiente bloque de código
Programación con OpenMP#
Note
Veamos cómo se programan
Ver el Notebook “OpenMP_en_C.ipynb”