Programacion Con OpenMP PDF
Programacion Con OpenMP PDF
Programacion Con OpenMP PDF
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:
Fujitsu
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
Antecedentes de OpenMP
El estndar OpenMP se introdujo para resolver lo anterior:
En 1997 se public la versin 1.0
HP
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
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
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;
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)
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
barrera
250..499
500..749
759..999
Directiva for
Las directivas parallel y for pueden juntarse en
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):
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.