programacion con openmp.pdf
TRANSCRIPT
![Page 1: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/1.jpg)
M.C. Gerardo Beltrán Gutiérrez
UNIVERSIDAD AUTÓNOMA DE SINALOA Facultad de Informática Culiacán
Licenciatura en Informática
Taller de Programación
Avanzadas
Programación con OpenMP
![Page 2: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/2.jpg)
¿Qu´e es OpenMP?
El OpenMP Application Program Interface (API) es:
– Conjunto de directivas de compilación, bibliotecas y
variables de entorno que permiten expresar el
paralelismo de tareas en programas escritos en C, C++
y Fortran.
– Toda la información está disponible en la página web:
![Page 3: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/3.jpg)
¿Quién define OpenMP?
El estándar es definido y revisado por el comité
OpenMP Architecture Review Board compuesto por:
– U.S. DoD: Aeronautical Systems Center
– cOMPunity (Comunidad de usuarios de OpenMP)
– Edinburgh Parallel Computing Centre (EPCC)
– Laboratorio NASA Ames
– ST Microelectronics: The Portland Group
– Fujitsu
![Page 4: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/4.jpg)
¿Quién define OpenMP?
– Hewlett Packard
– International Business Machines (IBM)
– Intel Corporation
– KAI Software Lab (KSL)
– NEC Corporation
– Silicon Graphics Inc. (SGI)
– Sun Microsystems
– Universidad RWTH Aachen
![Page 5: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/5.jpg)
Antecedentes de OpenMP
Antes de la introducción de OpenMP:
– Cada fabricante tenía su propio “estándar”
– Los programas tenían portabilidad nula
– El estándar ANSI X3H5 fracasó por falta de apoyo
– Se perdió interés en las máquinas SMP
![Page 6: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/6.jpg)
Antecedentes de OpenMP
El estándar OpenMP se introdujo para resolver
lo anterior:
– En 1997 se publicó la versión 1.0
– En 1999 se publicó la versión 1.1
– En 2000 se publicó la versión 2.0
– En 2005 se publicó la versión 2.5
![Page 7: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/7.jpg)
Características fundamentales de OpenMP
• OpenMP se fundamenta en directivas y cláusulas:
– Las directivas especifican qué hacer
– Las cláusulas indican cómo hacerlo
• Tipos de directivas en OpenMP:
– Directivas de distribución de trabajo
– Directivas de sincronización de tareas
• Tipos de cláusulas en OpenMP:
– Cláusulas de datos
– Cláusulas de comportamiento
– Cláusulas de sincronía
![Page 8: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/8.jpg)
Características fundamentales de OpenMP
• Ventajas de OpenMP:
– Sencillo: no requiere el envío de mensajes como en MPI
– La descomposición de los datos es automática
– Admite la paralelización incremental del código
– Mismo código fuente para las versiones serial y paralela
– Permite implementar granularidad gruesa y fina
– Elevada portabilidad
![Page 9: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/9.jpg)
Características fundamentales de OpenMP
• Inconvenientes de OpenMP:
– Requiere un compilador que entienda OpenMP
– El estándar sólo contempla C y Fortran
– Sólo es eficiente en máquinas de memoria compartida
– En general la eficiencia paralela es baja
– La escalabilidad está limitada por el acceso a memoria
– Aumentar la eficiencia requiere reestructurar el código
![Page 10: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/10.jpg)
Compiladores que soportan OpenMP
– SGI MIPSpro
– IBM XL
– Sun Studio
– Portland Group Compilers and Tools
– Absoft Pro FortranMP
– Lahey/Fujitsu Fortran 95
– Fujitsu-Siemens Fortran 95 (Solaris)
![Page 11: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/11.jpg)
Compiladores que soportan OpenMP
– Intel Software Development Products
– PathScale
– GNU GCC (a partir de la versión 4.2)
– HP
![Page 12: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/12.jpg)
Compilando con GNU GCC
El soporte para OpenMP ha de ser activado:
• Versión serial de un programa:
[gerardo@profesor~]$ gcc ejemplo.c -o ejemplo
• Versión paralela de un programa:
– [gerardo@profesor~]$ gcc -fopenmp ejemplo.c -o ejemplo
–
• En casi todos los compiladores la opción es -
openmp
![Page 13: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/13.jpg)
El modelo de programación en OpenMP
• El paralelismo en OpenMP se especifica a través de directivas que se insertan en el código de C.
• Básicamente un programa en OpenMP es un programa secuencias que se añaden directivas OpenMP en el punto adecuado.
• En Lenguaje C una directiva OpenMP tiene la forma:
• #pragma omp <directiva OpenMP especificada>
• Todos los programas OpenMP deben incluir el archivo cabecera #include <omp.h>
![Page 14: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/14.jpg)
El modelo de programación en OpenMP
• Una compilador secuencias ignora la sentencia
#pragma y generará el código ejecutable secuencial
habitual.
• Un compilador OpenMP reconocerá la directiva
#pragma y generará un código ejecutable
paralelizado que se podrá ejecutar en una máquina
de memoria compartida.
• OpenMP implementa un paralelismo basado en
múltiples hebras o hilos sobre el paradigma de
programación de memoria compartida
![Page 15: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/15.jpg)
El modelo de programación en OpenMP
• La ejecución de los múltiples hilos o hebras sigue el
modelo fork-join.
![Page 16: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/16.jpg)
El modelo de programación en OpenMP
• Conceptualmente, la programación de aplicaciones
con OpenMP consiste en definir zonas del código
que serán ejecutadas por un número determinado de
hilos.
• Estas zonas de código reciben el nombre de
regiones paralelas.
• Todos los programas OpenMP comienzan con una
única hebra, llamada maestra.
![Page 17: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/17.jpg)
Ejemplo
#include <stdio.h>
#include <omp.h>
int main( int argc, char * argv[] ) {
printf("Hola mundo \n");
#pragma omp parallel
{
printf("Hola desde desde el hilo \n");
}
return 0;
}
![Page 18: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/18.jpg)
Variable de Ambiente
Establece del numero máximo de hilos de
ejecución
$ export OMP_NUM_THREADS=2
![Page 19: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/19.jpg)
Biblioteca de funciones
• Establece el numero de hilos a utilizar en la siguiente región paralela
void omp_set_num_threads(int num_hilos);
• Obtiene el ID del hilo actual
• int omp_get_thread_num();
• Obtiene el numero CPUs/cores disponibles
• int omp_get_num_threads();
• obtiene el numero total de hilos requeridos
• int omp_get_num_procs();
•
![Page 20: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/20.jpg)
Ejemplo
#include <stdio.h>
#include <omp.h>
int main(int argc, char *argv[]){
#pragma omp parallel {
int IdHilo,NumHilos, NumCPUs;
/* obtiene el ID de la hilo actual */
IdHilo = omp_get_thread_num();
NumHilos = omp_get_num_threads();
NumCPUs = omp_get_num_procs();
printf("Hola yo soy el hilo %d \n", IdHilo);
if (IdHilo == 0) {
printf("Num. de CPUs = %d \n", NumCPUs);
printf("Num. de Hilos Totales = %d \n", NumHilos);
}
}
return(0);
}
![Page 21: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/21.jpg)
Ejercicio
• Desarrolle un programa que lea en paralelo 4
archivos que contienen una serie de números
de tipo flotante, es necesario saber cual es el
valor menor de cada archivo además de
saber cual es el mayor de los 4.
• Procese los archivos en paralelo.
![Page 22: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/22.jpg)
Gestión de Datos
• La compartición de variables es el punto clave en un
sistema paralelo de memoria compartida, por lo que es
necesario controlar correctamente el ámbito de cada
variable.
• Las variables globales son compartidas por todos los
hilos. Sin embargo, algunas variables deberán ser propias
de cada hilo, privadas.
• Para poder especificar adecuadamente el ámbito de
validez de cada variable, se añaden una serie de
cláusulas a la directiva parallel, en las que se indica el
carácter de las variables que se utilizan en dicha región
paralela.
![Page 23: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/23.jpg)
Gestión de Datos
• Para la gestión de datos en las directivas
paralelas se dispone de las siguientes cláusulas.
• private (lista_variables). Indica que la Lista de
variables es local a cada hilo sin inicializar.
• shared (Lista_variables). Indica que las variables de
la lista serán compartidas por todos los hilos de
ejecución. Sólo existe una copia, y todos los hilos
acceden y modifican dicha copia.
![Page 24: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/24.jpg)
Gestión de Datos
Ejemplo
x = 2;
y = 1;
z = 3;
#pragma omp parallel
shared(y) private(x,z)
{ z = x * x + 3;
x = y * 3 + z;
}
printf(“x = %d \n”, x);
X no está
inicializada
X no mantiene
el nuevo valor
![Page 25: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/25.jpg)
Gestión de Datos
• Se declaran objetos completos: no se puede
declarar un elemento de un arreglo como compartido
y el resto como privado.
• Por defecto, las variables son shared.
• Cada hilo utiliza su propia pila, por lo que las
variables declaradas en la propia región paralela son
privadas.
![Page 26: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/26.jpg)
Gestión de Datos
• Para la gestión de datos en las directivas
paralelas se dispone de las siguientes cláusulas.
• firstprivate (Lista_variables). Es similar a private
solo que las variables se inicializan al entrar a los
hilos paralelos con los valores que contenía antes de
la directiva paralela.
![Page 27: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/27.jpg)
Gestión de Datos
Ejemplo:
X = Y = Z = 2;
#pragma omp parallel
private(Y) firstprivate(Z)
{
...
X = Y = Z = 1;
}
...
valores dentro de la
región paralela? X =2 Y =? Z =2
valores fuera de la
región paralela? X = 1 Y = 2 Z = 2
![Page 28: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/28.jpg)
Gestión de Datos
default (none / shared)
none: obliga a declarar explícitamente el ámbito de
todas las variables. Útil para no olvidarse de declarar
ninguna variable (provoca error al compilar).
shared: las variables sin declarar son shared (por
defecto).
![Page 29: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/29.jpg)
Clausula if
if (expresión)
• La región paralela sólo se ejecutará en paralelo si la
expresión es distinta de 0.
• Dado que paralelizar código implica costos añadidos
(generación y sincronización de los hilos), la cláusula
permite decidir en ejecución si merece la pena la
ejecución paralela según el tamaño de las tareas (por
ejemplo, en función del tamaño de los vectores a
procesar).
![Page 30: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/30.jpg)
Clausula num_threads
num_threads(expresión)
Indica el número de hilos que hay que utilizar en la
región paralela.
![Page 31: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/31.jpg)
Distribución de tareas
• Las opciones de que disponemos son:
• Directiva for, para repartir la ejecución de las iteraciones
de un ciclo entre todos los hilos (número de iteraciones
conocida).
• Directiva sections, para definir trozos o secciones de una
región paralela a repartir entre los hilos.
• Directiva single, para definir un trozo de código que sólo
debe ejecutar un hilo.
![Page 32: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/32.jpg)
Directiva for
#pragma omp parallel [...]
{ …
#pragma omp for [clausulas]
for (i=0; i<1000; i++) A[i] = A[i] + 1;
…
}
0..249
250..499
500..749
759..999
barrera
![Page 33: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/33.jpg)
Directiva for
Las directivas parallel y for pueden juntarse en
#pragma omp parallel for
cuando la región paralela contiene únicamente un ciclo.
La decisión de paralelizar un ciclo debe tomarse tras el
correcto análisis de las dependencias.
![Page 34: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/34.jpg)
Directiva for
Dependencias de datos
a[0] = val;
for( i = 1; i < N; i++ ){
a[i] = a[i-1] + 1;
}
¿Es posible paralelizar este fragmento de código?
![Page 35: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/35.jpg)
Directiva for
Serial Paralelo for (i=0; i<N; i++) Z[i] = a * X[i] + b;
#pragma omp parallel for for (i=0; i<N; i++) Z[i] = a * X[i] + b;
![Page 36: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/36.jpg)
Directiva for
• El ciclo puede paralelizarse sin problemas, ya que
todas las iteraciones son independientes.
• La directiva parallel for implica la generación de
hilos, que se repartirán la ejecución del ciclo.
• Hay una barrera de sincronización implícita al final
del ciclo. El máster retoma la ejecución cuando todos
terminan.
• El índice del ciclo, i, es una variable privada (no es
necesario declararla como tal).
![Page 37: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/37.jpg)
Directiva for
Se ejecutará en paralelo el ciclo externo, y los hilos ejecutarán el ciclo interno.
Las variables j y X deben declararse como privadas.
Serial Paralelo
for (i=0; i<N; i++) for (j=0; j<M; j++){ X = B[i][j] * B[i][j]; A[i][j] = A[i][j] + X; C[i][j] = X * 2 + 1; }
#pragma omp parallel for private (j,X) for (i=0; i<N; i++) for (j=0; j<M; j++){ X = B[i][j] * B[i][j]; A[i][j] = A[i][j] + X; C[i][j] = X * 2 + 1; }
![Page 38: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/38.jpg)
Directiva for
Los hilos ejecutarán en paralelo el ciclo interno (el externo se ejecuta en serie).
La variable X debe declararse como privada.
Serial Paralelo for (i=0; i<N; i++) for (j=0; j<M; j++){ X = B[i][j] * B[i][j]; A[i][j] = A[i][j] + X; C[i][j] = X * 2 + 1; }
for (i=0; i<N; i++) #pragma omp parallel for private (X) for (j=0; j<M; j++){ X = B[i][j] * B[i][j]; A[i][j] = A[i][j] + X; C[i][j] = X * 2 + 1; }
![Page 39: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/39.jpg)
Directiva for
Las cláusulas de ámbito de una directiva for son (como
las de una región paralela):
private, firstprivate, default
Y se añade más cláusula:
lastprivate
reduction
![Page 40: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/40.jpg)
Directiva for
lastprivate(Lista_variables)
Permite guardar el valor de la variable privada
correspondiente a la última iteración del ciclo.
![Page 41: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/41.jpg)
Ejercicio
• Se cuenta con un archivo que contiene un
numero determinado de datos de tipo
flotante, los cuales se requieren procesar en
un programa para determinar cuantos son
primos.
![Page 42: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/42.jpg)
Tarea
• Desarrolle el algoritmo de multiplicación de
matrices utilizando las OpenMP, los datos de
las matrices están contenidos en un par de
archivos.
![Page 43: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/43.jpg)
Directiva for
reduction(operador:Lista_variables)
Las operaciones de reducción son típicas en muchas
aplicaciones paralelas. Utilizan variables a las que
acceden todos los procesos y sobre las que se efectúa
alguna operación de acumulación. Ejemplo: En la suma
de los elementos de un vector, es capaz de acumular
todos los resultados parciales y sumarlos al final.
Operador pueden ser: +, -, *
![Page 44: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/44.jpg)
Directiva sections
• Permite usar paralelismo de función. Reparte
secciones de código independiente a hilos diferentes.
• Cada sección paralela es ejecutada por un sólo hilo,
y cada hilo ejecuta ninguna o alguna sección.
• Una barrera implícita sincroniza el final de las
secciones o tareas.
![Page 45: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/45.jpg)
Directiva sections
Ejemplo:
#pragma omp parallel [clausulas]
{
#pragma omp sections [clausulas]
{
#pragma omp section
funcion_A();
#pragma omp section
funcion_B();
#pragma omp section
funcion_C();
}
}
![Page 46: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/46.jpg)
Directiva sections
Al Igual que en el caso del pragma for, si la región
paralela sólo tiene secciones, pueden juntarse ambos
pragmas en uno solo:
#pragma omp parallel sections [cláusulas]
![Page 47: Programacion con OpenMP.pdf](https://reader034.vdocuments.co/reader034/viewer/2022042510/557211cf497959fc0b8f85cf/html5/thumbnails/47.jpg)
Directiva single
Define un bloque básico de código, dentro de una
región paralela, que no debe ser paralelizado; es
decir, que debe ser ejecutado por un único hilo.
(por ejemplo, una operación de entrada/salida).
No se especifica qué hilo ejecutará la tarea.