Sei sulla pagina 1di 6

Programacin en C simple, MPI, OpenMP, y programacin hbrida

Resumen: Introduccion
La programacin paralela se encarga de suplir las necesidades
de desarrollar software eficiente y seguro para plataformas
multiprocesador. La programacin paralela permite tener en
uso multiple procesadores ejecutando las tareas asignadas, es
decir el trabajo es divido y cada procesador realiza una
porcin del problema gracias al intercambio de datos mediante
una red de interconexin o a travs de la memoria. El objetivo
principal es resolver la integral de Riemann asignando cada
rea a calcular a cada proceso, el proceso principal se
encargara de sumar cada una de esas reas calculadas y dar el
resultado, as como la integral de Riemann indica. Este
problema se realiz bajo la API OpenMP, el estndar MPI, y
la programacin hbrida, cada uno es un cdigo por s solo.
I. PROBLEMA A RESOLVER
Se propone resolver la integral de Riemann utilizando como
mquina de prueba un clster, para esto es necesario distribuir
la tarea en cuantos nodos sean necesarios y en cuantos
procesos o hilos se requieran.
II. PROGRAMACION CON MPI
A. Conceptos Bsicos
MPI es un estndar que consta de funciones contenidas en una
biblioteca diseada para el paso de mensajes, la cual explota la
existencia de mltiples procesadores utilizando un mismo
programa. Para aportar sincronizacin entre procesos y
garantizar la exclusin mutua se utilizan mltiples
herramientas como los semforos o monitores, en el proyecto
matrices se implementa el paso de mensajes, lo cual es
aportado por el estndar MPI. Este estandar permite obtener:
Estandarizacin.
Portabilidad: multiprocesadores, multicomputadores,
redes, heterogneos
Trabaja bajo la estructura SPMD (Single
Program/Multiple Data).
Los datos se comparten por medio del paso de
mensajes
Consiste en una librera bajo el lenguaje C.
Simplicidad.
Ofrece gran funcionalidad.
B. Librerias Utilizadas
include <stdlib.h>
Es el archivo de cabecera de la biblioteca estndar de
propsito general de C. Contiene los prototipos de
funciones de C para conversin, memoria, control de
procesos, ordenacin y bsqueda y matemticas.
#include <stdio.h>
Stdio.h significa standard input-output header, es una
de las bibliotecas estndar del lenguaje de
programacin C, contiene las definiciones de macros,
las constantes, las declaraciones de funciones y la
definicin de tipos usados por varias operaciones
estndar de entrada y salida. Las funciones
declaradas en stdio.h son funciones de manipulacin
de ficheros y funciones de manipulacin de entradas
y salidas.
# mpi.h
El archivo mpi.h contiene las definiciones y las
declaraciones necesarias para compilar un programa
que use la librera MPI. Colocando la lnea #include
<mpi.h> en el programa, es posible acceder a ms de
cien subrutinas. MPI declara tipos de datos
equivalentes a los preexistentes en C, como
MPI_FLOAT, MPI_DOUBLE, MPI_INT, que se
pueden intercambiar entre procesos, pero tambin
permite definir tipos diseados por el usuario. Todos
los identificadores de MPI contienen el prefijo: MPI_
C. Funciones principales implementadas
MPI_Init (int *argc, char ***argv): Esta funcin
inicializa todas las estructuras de datos necesarias
para permitir la comunicacin entre procesos basados
en el envo de mensajes MPI. Reserva el canal de
comunicacin, asigna un valor a la constante
MPI_COMM_WORLD Esta rutina, o
MPI_Init_thead, debe ser llamado antes que cualquier
otra rutina de MPI. Debe ser llamada una nica vez,
en caso de no hacerlo as sera erroneo. Todos los
programas MPI deben tener siempre una llamada a
esta funcin. Los argumentos que recibe no son ni
modificados, ni interpretados ni distribuidos.
MPI_Comm_rank(MPI_COMM_WORLD, &rank):
Determina el rango (identificador) del proceso que lo
llama dentro del comunicador global
MPI_Comm_size(MPI_COMM_WORLD, &size):
Obtenemos el numero de procesos en el comunicador
MPI_Reduce(&process_result, &result, sbuff,
MPI_DOUBLE, MPI_SUM, dest,
MPI_COMM_WORLD): MPI Reduce un valor de
un grupo de procesos en un nico proceso raz. Tiene
como variables la Direccin inicial del buffer en
envo, Direccin inicial del buffer en recepcion,
numero de elementos en el envio, tipo de datos MPI
en el buffer, tipo de operacion MPI a realizar, Rango
del proceso raz el proceso receptor, el comunicador
en que se realiza la operacin.
double num_integrate(double x0, int n, double h):
calculo de la integral, num_integrate hace la llamada
a la funcion double funct(double x) la cual obtiene
predefinido la funcion en donde se evalua el punto.
int MPI_Finalize():Corta la comunicacin entre los
procesos y elimina los tipos de datos creados para
ello.
III. PROGRAMACION CON OPENMP
A. Conceptos Bsicos
OpenMP es una API o interfaz de programacin de
aplicaciones diseada para la programacin multiprocesos de
memoria compartida. Uno de los beneficios que ofrece esta
API es la concurrencia, esta se aplica sobre la base del modelo
de ejecucin fork-join con generacin de mltiples threads
(procesos ligeros), con este modelo, se trata de dividir en K
hilos o fork una tarea muy pesada, para luego juntar todos los
resultados calculados por cada hilo y unirlos en un solo
resultado (join).
OpenMP est diseado para sistemas en las que cada hilo o
proceso pueden tener acceso a la memoria disponible. En la
programacin con OpenMP, el sistema se muestra como una
coleccin de ncleos o CPUs (que procesan los hilos), cada
uno de ellos tienen acceso a la memoria principal.
B. Librerias Utilizadas
#include <stdio.h>
Stdio.h significa standard input-output header, es una
de las bibliotecas estndar del lenguaje de
programacin C, contiene las definiciones de macros,
las constantes, las declaraciones de funciones y la
definicin de tipos usados por varias operaciones
estndar de entrada y salida. Las funciones
declaradas en stdio.h son funciones de manipulacin
de ficheros y funciones de manipulacin de entradas
y salidas.
#include <stdlib.h>
Es el archivo de cabecera de la biblioteca estndar de
propsito general de C. Contiene los prototipos de
funciones de C para conversin, memoria, control de
procesos, ordenacin y bsqueda y matemticas.
#include <omp.h>
El archivo omp.h contiene todas las funciones de la
biblioteca de OpenMP, para gestionar o sincronizar
los threads.
C. Funciones principales implementadas
omp_set_num_threads(threadnum): Establece el
nmero de subprocesos o hilos que se ejecutaran en
el programa.
#pragma omp parallel for shared(a,b,c) private(i, j):
Es una de las sintaxis bsicas de las directivas
OpenMP, los datos dentro de una regin paralela es
compartido, lo que significa visible y accesible para
todos los threads simultneamente. Por defecto, todas
las variables en la regin de la reparticin del trabajo
son compartidos, excepto el contador de iteracin del
bucle.
IV. PROGRAMACION HIBRIDA
A. Conceptos Bsicos
La programacin hbrida permite obtener una mayor eficiencia
en la programacin multiprocesador, en este problema
utilizamos el esquema MPI+OpenMP, donde MPI se utiliza
para el pase de mensajes entre los nodos del Cluster y
OpenMP utiliza la memoria compartida de los procesadores
con el uso de hilos, el numero de hilos va de acuerdo al
numero de procesadores de determinado nodo.
B. Ventajas de la programacin hbrida
Ventajas de la Programacin Hbrida
Para mejorar la escalabilidad
Cuando muchas tareas producen desbalanceo
Reduccin del tiempo de desarrollo de cdigo
Cuando el nmero de procesos MPI es fijo
C. Modelos en la programacin hbrida
MPI+OpenMP: OpenMP usado para paralelizacin
de bucles
OpenMP+MPI: Threads no seguros
Procesos MPI y OpenMP en modelo SPMD: Reduce
el coste de las comunicaciones
D. Librerias Utilizadas
include <stdlib.h>
#include <stdio.h>
#include"mpi.h"
#include <omp.h>
E. Funciones principales implementadas
Funciones MPI
o MPI_Init (int *argc, char ***argv): Esta
funcin inicializa todas las estructuras de
datos necesarias para permitir la
comunicacin entre procesos basados en el
envo de mensajes MPI. Reserva el canal de
comunicacin, asigna un valor a la constante
MPI_COMM_WORLD Esta rutina, o
MPI_Init_thead, debe ser llamado antes que
cualquier otra rutina de MPI. Debe ser
llamada una nica vez, en caso de no hacerlo
as sera erroneo. Todos los programas MPI
deben tener siempre una llamada a esta
funcin. Los argumentos que recibe no son
ni modificados, ni interpretados ni
distribuidos.
o MPI_Comm_rank(MPI_COMM_WORLD,
&rank): Determina el rango (identificador)
del proceso que lo llama dentro del
comunicador global.
o MPI_Comm_size(MPI_COMM_WORLD,
&size): Obtenemos el numero de procesos
en el comunicador.
o int MPI_Finalize():Corta la comunicacin
entre los procesos y elimina los tipos de
datos creados para ello.
o MPI_Bcast(&NoIntervals, 1, MPI_INT,
Root, MPI_COMM_WORLD):
Compartimos el numero de intervalos entre
todas los procesos, Enva un mensaje desde
un proceso origen a todos los procesos
pertenecientes al mismo grupo.
o MPI_Reduce(&mypi, &totalsum, 1,
MPI_DOUBLE, MPI_SUM, Root,
MPI_COMM_WORLD): MPI Reduce un
valor de un grupo de procesos en un nico
proceso raz. Tiene como variables la
Direccin inicial del buffer en envo,
Direccin inicial del buffer en recepcion,
numero de elementos en el envio, tipo de
datos MPI en el buffer, tipo de operacion
MPI a realizar, Rango del proceso raz el
proceso receptor y el comunicador en que se
realiza la operacin.
o int MPI_Finalize():Corta la comunicacin
entre los procesos y elimina los tipos de
datos creados para ello.

Funciones en OpenMP
o omp_set_num_threads(4): Establece el
numero de subprocesos o hilos que se
ejecutaran en el programa.
o #pragma omp parallel for private(x,interval):
Es una de las sintaxis bsicas de las
directivas OpenMP, esto incluye una
sincronizacin obligatoria en todo el bloque,
la palabra parallel dice que la parte del
cdigo ser ejecutada en paralelo por varios
hilos, optimizndolo para un bucle con la
palabra for.
#pragma omp critical: la seccin critica especifica que solo un
hilo puede estar en la seccin de cdigo establecida con esta
directiva.
V. PROGRAMACION EN C SIMPLE
A. Librerias Utilizadas
#include <stdio.h>
#include <math.h>
B. Funciones principales implementadas
double num_integrate(double x0, int n, double h):
Funcion que calcula la integral de una funcin.
double funct(double x): funcion que genera la imagen
del punto en la funcion.
VI. EJECUCIN Y RESULTADOS
A. Maquina empleada para la implementacion del programa:
El desarrollo del programa se realizo bajo el clster
perteneciente a la escuela de Ingeniera informtica, ste
clster posee 11 Nodos y un master bajo la distribucin de
Linux Rocks versin 6.0.
Compilacin y Ejecucin del proyecto bajo MPI:
Para compilar el programa de integrales en el clster
Car Caribe utilizamos el nombre de usuario:
Usuario1, contrasea: fruB2. La compilacin se
realiza de la siguiente manera:
mpicc integracion_mpi.c -o
integracion_mpi
La ejecucin se realiza colocando el nmero de
procesos:
mpirun np #cantidad_de_procesos -host
#nombre_nodo1,#nombre_nodo2,,#nombre_n
odoN

Compilacin y Ejecucin del proyecto bajo OpenMP:
La compilacin se realiza de la siguiente manera:
gcc -fopenmp integral_h.c -o integral_h
Para la ejecucin del programa realizamos la
siguiente lnea:
mpirun np #numero_hilos ./integral_h

Compilacin y Ejecucin del proyecto bajo
programacin hbrida:
La compilacin se realiza de la siguiente manera:
mpicc -fopenmp integral_h.c -o
integral_h
Para la ejecucin del programa realizamos la
siguiente lnea:
mpirun np #numero_hilos ./integral_h
Una de las tareas ha realizar en la ejecucin del proyecto es
utilizar la comunicacin SSH para realizar la conexin desde
una pc que posea SSH hacia la mquina que queremos realice
las acciones, hablamos del clster.
ssh ucabgwiki.ddns.net p 2222 l
grupo1
Tambin es posible usar utilidades como putty, encargada de
realizar una conexin al servidor mediante interfaces
amigables.
VII. CONCLUSIONES
El problema del calculo de integrales es un ejemplo claro de
como gracias a la programacin paralela multiples procesos
pueden dividirse una tarea y as obtener un resultado ms
eficiente. Para este tipo de problemas, la implementacin de
herramientas como OpenMP, MPI, y la programacin hbrida
basada en el modelo MPI+OpenMP ofrece una amplia lista de
bibliotecas o funciones que garantizan la programacin
paralela.
REFERENCIAS
Programacin Hbrida bajo cluster. (s.f.). Recuperado el
26 de Junio de 2014, de
http://sedici.unlp.edu.ar/bitstream/handle/109
15/23629/Documento_completo.pdf?sequence
=1
programacion paralela e hibrida. (s.f.). Recuperado el
26 de Junio de 2014, de
http://dis.um.es/~domingo/doctorado/0506/Co
mMatParUPCT/Sesion15ProHib.pdf

Potrebbero piacerti anche