¿Qué es OpenMP?
API Paralela portable de memoria compartida
Fortran, C, y C++
Muchos distribuidores soporte para Linux y Windows
Estandariza tareas y paralelismo de ciclos
Soporta paralelismo de grano grueso
Combina código serial y paralelo en un solo fuente
Estandariza ~ 20 años de experiencia de paralelización dirigida por el compilador
Modelo de programación
El hilo maestro se divide en un equipo de hilos como sea necesario
El Paralelismo se añade incrementalmente: el programa secuencial se convierte en un programa paralelo
Regiones paralelas
Hilo maestro
Detalles de la sintaxis para comenzar
Muchas de las construcciones de OpenMP son directivas del compilador o pragmas
Para C y C++, los pragmas toman la forma:
#pragma omp construct [clause [clause]…]
Para Fortran, las directivas toman una de las formas:
C$OMP construct [clause [clause]…]
!$OMP construct [clause [clause]…]
*$OMP construct [clause [clause]…]
Archivo de cabecera o módulo de Fortran 90
#include “omp.h”
use omp_lib
Región Paralela y Bloques Estructurados (C/C++)
Muchas de las construcciones de OpenMP se aplican a bloques estructurados
Bloque Estructurado: un bloque con un punto de entrada al inicio y un punto de salida al final
Los únicos “saltos” permitidos son sentencias de STOP en Fortran y exit() en C/C++
Región Paralela y Bloques Estructurados (C/C++)
Un bloque estructurado
Un bloque no estructurado
if (go_now()) goto more;
#pragma omp parallel
{
int id = omp_get_thread_num();
more: res[id] = do_big_job(id);
if (conv (res[id])) goto done;
goto more;
}
done: if (!really_done()) goto more;
#pragma omp parallel
{
int id = omp_get_thread_num();
more: res[id] = do_big_job (id);
if (conv (res[id])) goto more;
}
printf (“All donen”);
Trabajo compartido
Trabajo compartido es el término general usado en OpenMP para describir la distribución de trabajo entre hilos.
Tres ejemplos de trabajo compartido en OpenMP son:
Construcción omp for
Construcción omp sections
Construcción omp task
Automáticamente divide el trabajo entre hilos
Construcción omp for
Los hilos se asignan a un conjunto de iteraciones independientes
Los hilos deben de esperar al final del bloque de construcción de trabajo en paralelo
(Gp:) #pragma omp parallel
(Gp:) #pragma omp for
(Gp:) Barrera implícita
(Gp:) i = 0
i = 1
i = 2
i = 3
(Gp:) i = 4
i = 5
i = 6
i = 7
(Gp:) i = 8
i = 9
i = 10
i = 11
// assume N=12
#pragma omp parallel
#pragma omp for
for(i = 0, i < N, i++)
c[i] = a[i] + b[i];
Combinando pragmas
Estos códigos son equivalentes
(Gp:) #pragma omp parallel
{
#pragma omp for
for (i=0;i< MAX; i++) { res[i] = huge();
}
}
(Gp:) #pragma omp parallel for
for (i=0;i< MAX; i++) {
res[i] = huge();
}
La cláusula Private
Reproduce la variable por cada hilo
Las variables no son inicializadas; en C++ el objeto es construido por default
Cualquier valor externo a la región paralela es indefinido
(Gp:) void* work(float* c, int N) {
float x, y; int i;
#pragma omp parallel for private(x,y)
for(i=0; i<= end; i += 2 )
{
if ( TestForPrime(i) ) gPrimesFound++;
}
Las iteraciones se dividen en bloques de 8
Si start = 3, el primer bloque es
i={3,5,7,9,11,13,15,17}
Actividad 2b – Planificación del Mandelbrot
Objetivo: crea una versión paralela de mandelbrot que use planificación dinámica de OpenMP
Sigue la actividad de Mandelbrot llamada Mandelbrot Scheduling en el documento de la práctica
Agenda
¿Qué es OpenMP?
Regiones Paralelas
Trabajo compartido
Ambiente de datos
Sincronización
Tópicos avanzados opcionales
Descomposición de tareas
a = alice();
b = bob();
s = boss(a, b);
c = cy();
printf ("%6.2fn", bigboss(s,c));
alice,bob, y cy pueden realizarse en paralelo
(Gp:) alice
(Gp:) bob
(Gp:) boss
(Gp:) bigboss
(Gp:) cy
Secciones omp
#pragma omp sections
Debe estar dentro de una región paralela
Precede un bloque de código que contiene N bloques de código que pueden ser ejecutados concurrentemente por N hilos
Abarca cada sección de omp
Página siguiente |