domingo, 22 de mayo de 2011

Programación de Memoria Compartida con OpenMP


Saludos nuevamente estoy por aca... hoy vengo a hablarles un poco sobre un conjunto de directivas que podemos añadir a nuestros codigos en C/C++ o FORTRAM, para paralelizar nuestros algoritmos en un paradigma de memoria compartida, este conjunto de directivas se llama OpenMP.


OpenMP

Como mencione al principio OpenMP, es un conjunto de directivas estandar para la programación paralela de memoria compartida. Existen otras formas de mas bajo nivel como POSIX que sirven para paralelizar, sin embargo POXIS es mucho mas robusto que OpenMP y ademas a pesar de que también se incluyen directivas como OpenMP, al incluirlas en nuestro codigo este no seria portable, es decir solo serviria en maquinas con el mismo sistema operativo.

A diferencia de esto OpenMP si es estandar, es mucho mas sencillo y si responde a la necesidad de portabilidad. se puede correr en cualquier tipo de maquina, incluye menos directivas que otros lenguajes, no modifica el código principal, pues si lo agregamos las directivas como comentarios dentro del archivo, este dejaría el codigo tal y como es. (El Secuencial).  OpenMP es el que las grandes compañias han buscado estandarizar.


Un poco mas sobre OpenMP

La idea clara que debemos tener sobre OpenMP, es que es un conjunto de directivas, librerias y variables de entorno para programar de forma paralela en FORTRAB, C/C++.

Actualmente es el estandar para programación de sistemas de memoria comapartida y sistemas de memoria compartida fisicamente distribuida. OpenMP es diseñada por lo miembros del OpenMP Architecture Review Board (OpenMP ARB). La misión de la ARB es estandarizar las API para el multiprocesamiento de memoria compartida.
Las especificaciones son gratuitas y no requieren licencia.
Historia  
  • 1997 OpenMP 1.0 FORTRAM
  • 1998 OpemMP 1.0 C/C++
  • 1999 OpenMP 1.1 FORTRAM
  • 2002 OpenMP 2.0 C/C++
  • 2005 OpenMP 2.5 F,C/C++
OpenMP utiliza el modelo de programación Fork-Join. Los que saben un poco mas a fondo sobre esto, saben que a nivel de sistema la funcion fork() crea un proceso independiente, por tanto el sistema funcionaria asi:
  1. Un programa comienza su ejecución con un proceso unico (Hilo Maestro)
  2. Cuando se encuentra la primera construcción paralela, crea un conjunto de hilos.
  3. El trabajo se reparte entre todos los hilos incluido el maestro.
  4. Cuando termina la region paralela el solo hilo maestro continua la ejecución.
Modelo Fork-Join
En forma general, normalmente OpenMP se emplea en la paralelización de lazoos y bucles. Es decir se buscan los lazos, computacionalmente mas costosos y se reparten sus iteraciones entre hilos.

En estos momentos no conocemos mucho sobre sus directivas, puesto que hablare de ellas mas adelante en otro post, sin embargo estos son dos breves ejemplos de como seria un codigo secuencial y otro paralelizado con OpenMP.

Solo se detalla la funcion main, buscando enfatizar la directiva que paralelizaria el codigo.

/*Codigo Secuencial*/
int main() 
{ int i; double suma[1000]; 
  for (i=0; i<1000; i++)
  CalculaSuma(Suma(i)); 
}

/*Codigo Paralelizado*/
int main() 
{ int i; double suma[1000]; 
  #pragma omp parallel for  /*Incluimos la directiva pragma*/
  for (i=0; i<1000; i++)
  CalculaSuma(Suma(i)); 
}

Lo que sucede en el primer código es que se ejecuta el bloque en un solo procesador, mientras que en el segundo la directiva #pragma reparte las iteraciones del for entre los hilos que se encuentren disponibles.

Bueno amigos, nos vemos hasta un nuevo post, posiblemente estaré hablando mas sobre OpenMP, algunas directivas, ejemplos y finalmente de como compilamos nuestro código, en otras palabras nuestro primer HOLA MUNDO PARALELIZADO!!! .

0 comentarios:

Publicar un comentario