Anda di halaman 1dari 47

UNIVERSIDAD AUTNOMA DE SINALOA

Facultad de Informtica Culiacn Licenciatura en Informtica

Taller de Programacin Avanzadas


Programacin con OpenMP

M.C. Gerardo Beltrn Gutirrez

Que es OpenMP?
El OpenMP Application Program Interface (API) es:
Conjunto de directivas de compilacin, bibliotecas y variables de entorno que permiten expresar el paralelismo de tareas en programas escritos en C, C++ y Fortran.
Toda la informacin est disponible en la pgina web:

Quin define OpenMP?


El estndar 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

Quin 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

Antecedentes de OpenMP
Antes de la introduccin de OpenMP:
Cada fabricante tena su propio estndar
Los programas tenan portabilidad nula El estndar ANSI X3H5 fracas por falta de apoyo

Se perdi inters en las mquinas SMP

Antecedentes de OpenMP
El estndar OpenMP se introdujo para resolver lo anterior:
En 1997 se public la versin 1.0

En 1999 se public la versin 1.1


En 2000 se public la versin 2.0 En 2005 se public la versin 2.5

Caractersticas fundamentales de OpenMP


OpenMP se fundamenta en directivas y clusulas:
Las directivas especifican qu hacer Las clusulas indican cmo hacerlo

Tipos de directivas en OpenMP:


Directivas de distribucin de trabajo Directivas de sincronizacin de tareas

Tipos de clusulas en OpenMP:


Clusulas de datos Clusulas de comportamiento Clusulas de sincrona

Caractersticas fundamentales de OpenMP


Ventajas de OpenMP:
Sencillo: no requiere el envo de mensajes como en MPI La descomposicin de los datos es automtica

Admite la paralelizacin incremental del cdigo


Mismo cdigo fuente para las versiones serial y paralela Permite implementar granularidad gruesa y fina Elevada portabilidad

Caractersticas fundamentales de OpenMP


Inconvenientes de OpenMP:
Requiere un compilador que entienda OpenMP
El estndar slo contempla C y Fortran Slo es eficiente en mquinas 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 cdigo

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)

Compiladores que soportan OpenMP


Intel Software Development Products PathScale GNU GCC (a partir de la versin 4.2)

HP

Compilando con GNU GCC


El soporte para OpenMP ha de ser activado:

Versin serial de un programa:


[gerardo@profesor~]$ gcc ejemplo.c -o ejemplo

Versin paralela de un programa:


[gerardo@profesor~]$ gcc -fopenmp ejemplo.c -o ejemplo

En casi todos los compiladores la opcin es openmp

El modelo de programacin en OpenMP


El paralelismo en OpenMP se especifica a travs de directivas que se insertan en el cdigo de C. Bsicamente un programa en OpenMP es un programa secuencias que se aaden 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>

El modelo de programacin en OpenMP


Una compilador secuencias ignora la sentencia #pragma y generar el cdigo ejecutable secuencial habitual. Un compilador OpenMP reconocer la directiva #pragma y generar un cdigo ejecutable paralelizado que se podr ejecutar en una mquina de memoria compartida. OpenMP implementa un paralelismo basado en mltiples hebras o hilos sobre el paradigma de programacin de memoria compartida

El modelo de programacin en OpenMP

La ejecucin de los mltiples hilos o hebras sigue el modelo fork-join.

El modelo de programacin en OpenMP

Conceptualmente, la programacin de aplicaciones con OpenMP consiste en definir zonas del cdigo que sern ejecutadas por un nmero determinado de hilos. Estas zonas de cdigo reciben el nombre de regiones paralelas. Todos los programas OpenMP comienzan con una nica hebra, llamada maestra.

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; }

Variable de Ambiente

Establece del numero mximo de hilos de ejecucin $ export OMP_NUM_THREADS=2

Biblioteca de funciones
Establece el numero de hilos a utilizar en la siguiente regin 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();

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); }

Ejercicio Desarrolle un programa que lea en paralelo 4 archivos que contienen una serie de nmeros de tipo flotante, es necesario saber cual es el valor menor de cada archivo adems de saber cual es el mayor de los 4. Procese los archivos en paralelo.

Gestin de Datos
La comparticin 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 debern ser propias de cada hilo, privadas. Para poder especificar adecuadamente el mbito de validez de cada variable, se aaden una serie de clusulas a la directiva parallel, en las que se indica el carcter de las variables que se utilizan en dicha regin paralela.

Gestin de Datos
Para la gestin de datos en las directivas paralelas se dispone de las siguientes clusulas.

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 sern compartidas por todos los hilos de ejecucin. Slo existe una copia, y todos los hilos acceden y modifican dicha copia.

Gestin de Datos
Ejemplo
X no est inicializada

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 mantiene el nuevo valor

Gestin 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 regin paralela son privadas.

Gestin de Datos
Para la gestin de datos en las directivas paralelas se dispone de las siguientes clusulas.

firstprivate (Lista_variables). Es similar a private solo que las variables se inicializan al entrar a los hilos paralelos con los valores que contena antes de la directiva paralela.

Gestin de Datos
Ejemplo:
valores dentro de la regin paralela? X =2 Y =? Z =2

X = Y = Z = 2;

#pragma omp parallel private(Y) firstprivate(Z)


{ ... X = Y = Z = 1; }
...

valores fuera de la regin paralela? X = 1 Y = 2 Z = 2

Gestin de Datos
default (none / shared) none: obliga a declarar explcitamente 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).

Clausula if
if (expresin)

La regin paralela slo se ejecutar en paralelo si la expresin es distinta de 0.


Dado que paralelizar cdigo implica costos aadidos (generacin y sincronizacin de los hilos), la clusula permite decidir en ejecucin si merece la pena la ejecucin paralela segn el tamao de las tareas (por ejemplo, en funcin del tamao de los vectores a procesar).

Clausula num_threads
num_threads(expresin) Indica el nmero de hilos que hay que utilizar en la regin paralela.

Distribucin de tareas
Las opciones de que disponemos son: Directiva for, para repartir la ejecucin de las iteraciones de un ciclo entre todos los hilos (nmero de iteraciones conocida). Directiva sections, para definir trozos o secciones de una regin paralela a repartir entre los hilos.

Directiva single, para definir un trozo de cdigo que slo debe ejecutar un hilo.

Directiva for

#pragma omp parallel [...] {

#pragma omp for [clausulas]


for (i=0; i<1000; i++) A[i] = A[i] + 1;
} 0..249

barrera

250..499
500..749

759..999

Directiva for
Las directivas parallel y for pueden juntarse en

#pragma omp parallel for


cuando la regin paralela contiene nicamente un ciclo. La decisin de paralelizar un ciclo debe tomarse tras el correcto anlisis de las dependencias.

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 cdigo?

Directiva for

Serial
for (i=0; i<N; i++) Z[i] = a * X[i] + b;

Paralelo
#pragma omp parallel for for (i=0; i<N; i++) Z[i] = a * X[i] + b;

Directiva for
El ciclo puede paralelizarse sin problemas, ya que todas las iteraciones son independientes. La directiva parallel for implica la generacin de hilos, que se repartirn la ejecucin del ciclo. Hay una barrera de sincronizacin implcita al final del ciclo. El mster retoma la ejecucin cuando todos terminan. El ndice del ciclo, i, es una variable privada (no es necesario declararla como tal).

Directiva for

Serial
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; }

Paralelo
#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; }

Se ejecutar en paralelo el ciclo externo, y los hilos ejecutarn el ciclo interno. Las variables j y X deben declararse como privadas.

Directiva for

Serial
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; }

Paralelo
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; }

Los hilos ejecutarn en paralelo el ciclo interno (el externo se ejecuta en serie). La variable X debe declararse como privada.

Directiva for
Las clusulas de mbito de una directiva for son (como las de una regin paralela):

private, firstprivate, default


Y se aade ms clusula: lastprivate reduction

Directiva for
lastprivate(Lista_variables)
Permite guardar el valor de la variable privada correspondiente a la ltima iteracin del ciclo.

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.

Tarea Desarrolle el algoritmo de multiplicacin de matrices utilizando las OpenMP, los datos de las matrices estn contenidos en un par de archivos.

Directiva for
reduction(operador:Lista_variables)
Las operaciones de reduccin son tpicas en muchas aplicaciones paralelas. Utilizan variables a las que acceden todos los procesos y sobre las que se efecta alguna operacin de acumulacin. 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: +, -, *

Directiva sections

Permite usar paralelismo de funcin. Reparte secciones de cdigo independiente a hilos diferentes. Cada seccin paralela es ejecutada por un slo hilo, y cada hilo ejecuta ninguna o alguna seccin. Una barrera implcita sincroniza el final de las secciones o tareas.

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(); } }

Directiva sections
Al Igual que en el caso del pragma for, si la regin paralela slo tiene secciones, pueden juntarse ambos pragmas en uno solo: #pragma omp parallel sections [clusulas]

Directiva single
Define un bloque bsico de cdigo, dentro de una regin paralela, que no debe ser paralelizado; es decir, que debe ser ejecutado por un nico hilo. (por ejemplo, una operacin de entrada/salida). No se especifica qu hilo ejecutar la tarea.

Anda mungkin juga menyukai