domingo, 22 de mayo de 2011

Sintaxis General de Pragmas de OpenMP en C/C++


Que tal amigos, hoy vengo a hablarles un poco sobre algunas pragmas de OpenMP. Esencialmente OpenMP consta de tres elementos.
  1. Control de Paralelismo  
    • Directivas parallel 
    • Directivas de reparto de trabajo. Ejemplo Directiva "for" 
  2.  Control de datos y comunicaciones
    • Variables privadas y compartidas
  3. Sincronización 
    • Para coordinar el acceso a los datos (Barreras, secciones, críticas, etc.)
 La directiva parallel es aquella que define una region paralela. Sintaxis:

//C/C++
#pragma omp parallel[clausulas]
{ //bloque estructurado
}

Una región paralela es un bloque de codigo ejecutado en paralelo por varios hilos. Para las directivas parallel simplemente hay repetición del bloque de codigo, aun no hay repartición de trabajo. 

Clausulas Posibles de : "Parallel[ Clausulas ]"
  • IF(expresion escalar logica)
  • NUM_THREADS(Expresion escalar entera)
  • SHARED(Lista de Variables)
  • PRIVATE(Lista de Variables)
  • DEFAULT(Private|Sharede|None)
  • FIRST PRIVATE(Lista de variables)
  • REDUCTION(operador: Lista de variables)
Ejemplo
Para el siguiente codigo no nesecitamos saber que hace la función Calcula(), los que nos interesa saber que es lo que esta sucediendo al incluir la directiva parallel antes del bloque estructurado.Suponga que tenemos el siguiente bloque de código.
double A[100];
omp_set_num_threads(4);
#pragma omp parallel private(id) shared(A)
{ id = omp_get_thread_num();
  calcula(A,id);
}
printf("\nFinalizado");

La directiva omp_set_num__theads(4)establece el numero de hilos y como se declaro la variable id privada se crean 4 copias para cada hilo, la variable A se declaro compartida, asi que cada procesador podra ver la misma dirección de memoria.

Expliquemos un poco lo que sucede:
  • Al llegar a la región paralela se cream 4 hilos
  • Cada hilo ejecuta el codigo dentro del bloque estructurado
  • Se llama a la funcion calcula() para id=1,2,3 o 4.
 
En OpenMP cuando el hilo maestro encuentra una región paralela este queda identificado con el numero cero (0). En OpenMP tambien se pueden tener hilos anidados es decir cuando un hilo encuentra otra region paralela, en este caso este hilo se convierte en un hilo maestro para este nuevo grupo de hilos, pero no es identificado con cero sino con el mismo identificador que tenia.

Directivas de Reparto de Trabajo

Las directivas do/for, sections, single etc. hacen parte de las directivas de reparto de OpenMP y como su nombre lo dice, reparten y distribuyen el trabajo entre los procesadores. Por ejemplo:
#pragma omp for[clausulas]
for(iteraciones del bucle, se reparten entre hilos)
{}
Las clausulas que soporta son las mismas especificadas anteriormente. Las restricciones para las directivas de reparto es que la variable de control del bucle o lazo debe ser de tipo entero y el bucle debe ser un bloque estructurado y no puede usar algun "exit" o un "goto" o algun "break" para salir del lazo.

Nota: Los indices de control del for siempre son variables privadas.

Hola mundo paralelo.
Aqui les dejo un primer codigo usando OpenMP.
#include 
#include 

 int main (int argc, char *argv[])
{
   int id;
   omp_set_num_threads(4);
   #pragma omp parallel private(id)
   {
     id = omp_get_thread_num();
     printf("Hola Mundo desde id: %d\n", id);
   }
   return 0;
}
Y lo compilan de la siguiente forma:
 g++ -fopenmp Hola.cpp -o Hola
 ./Hola
Hasta una nueva sección amigos, en el nuevo post les seguire hablando mucho mas sobre las variables privadas y compartidas y de algunas directivas de sincronización. Nos vemos...

0 comentarios:

Publicar un comentario