PROCESAMIENTO PARALELO DE IMAGENES
OBJETIVO:
El objetivo principal del presente proyecto consiste en demostrar la utilidad y potencialidad del procesamiento paralelo.
INTRODUCCIÓN
El presente trabajo ha sido posible ser desarrollado gracias a la tecnología actual, como es de nuestro conocimiento la tecnología avanza cada día a pasos agigantados, y en lo que para nosotros nos es de mayor interés, como es los ordenadores, se ve como la tecnología en cuanto a procesadores avanza inexorablemente; hoy en día la capacidad de procesamiento de un ordenador es asombrosa, sin embargo las demandas de procesamiento son cada día mayores, es decir tenemos la necesidad de procesar enormes volúmenes de datos para obtener información.
La presente aplicación tiene como finalidad realizar un procesamiento en paralelo de un gran conjunto de datos, en este caso para nuestro trabajo se va ha realizar la comparación pixel a pixel de dos imágenes en blanco y negro; para lograr este objetivo se ha utilizado MPI (Message Passing Interface). MPI no es más que una “Interface de Paso de Mensajes”, en otras palabras, es una interface estandarizada para la realización de aplicaciones paralelas basadas en paso de mensajes.
Es importante mencionar que, la primera imagen será diseñada o armada en base a las distintas partes que hemos diseñado, para lo cual, se ha construido una interfaz de usuario en la que se puede escoger las distintas partes antes mencionadas; y la segunda imagen será generada mediante un algoritmo genético.
“En este mundo cambiante muy poco puede consolidarse como una verdad”
DESARROLLO
Herramientas de desarrollo
-
Una implementación del estándar MPI, en este caso hemos utilizado DeinoMPI (http://mpi.deino.net/) para implementar la aplicación paralelizada.
-
Microsoft Visual Studio, utilizando Visual C# para construir la interface de usuario, y Visual C++ en el cual esta desarrollado la aplicación que realiza las tareas de multiprocesamiento en el tratamiento de la imagen.
Tratamiento de las imágenes
El proceso de tratamiento de la imagen comienza cuando el usuario, diseña una imagen a partir de varias partes de un rostro humano definidas, estas partes pueden ser: cabello, ojos, nariz, forma del rostro, cejas, boca luego con un rostro definido, se representa cada característica en una cadena de bits, en total 17 bits. Una vez obtenida la imagen se procede a obtener todos los pixeles, los mismos que son transformados a una matriz de ceros y unos de acuerdo al color, un “1″ para el color negro y un “0″ para el color blanco, ahora bien esta matriz es guardada en un archivo de texto plano, que será el archivo principal o archivo patrón que usaremos para compararlo a otras representaciones de rostros generadas mediante una implementación del algoritmo genético.
El algoritmo genético, es un algoritmo genérico, que se puede utilizar en cualquier tipo de problema, utiliza básicamente el principio de evolución natural, el cual dice que en una generación de individuos, aquel con las mejores características o aquel que se adapte mejor a un escenario pasa a la siguiente generación, así el algoritmo genético utiliza tres métodos principales: selección, cruce y mutación.
El método de selección, permite seleccionar dos individuos que originan un nuevo individuo o hipótesis, en nuestra aplicación la selección se realiza al azar.
Estrategia de Multiprocesamiento
Trabajando con MPI hemos encontrado varios contratiempos, debido a nuestra falta de experiencia trabajando en una programación multiprocesamiento, así también entender el modelo que el estándar MPI implanta, ya que MPI considera la migración de procesos, hemos escogido como solución, utilizar Servicios Web para la implementación del multiprocesamiento.
Un programa típico de MPI contiene la siguiente estructura:
#include <mpi.h>
int main(int argc,char* argv)
{
MPI_Init(&argc,&argv);
int numProcesos;
int idProceso;
MPI_Comm_rank(MPI_COMM_WORLD,&idProceso);
MPI_Comm_size(MPI_COMM_WORLD,&numProcesos);
if(idProceso == 0)
//Enviar datos a los demas procesos
else
for(int i = 0; i < numProcesos; i++)
//Recibir datos procesados
MPI_Finalize();
}
Programa MPI
Como un programa de MPI se carga en un proceso y luego este es migrado hacia los demás equipos en el clúster, generalmente se utiliza estructuras de control condicionales (if – else) para controlar cual es el código que deberá ejecutar el proceso que estemos utilizando como director, generalmente el proceso 0, y cual es el código para los procesos que ejecutan las tareas paralelas, estas tareas paralelas usualmente significan que implementamos un método que contiene el mismo código para todas las tareas asignadas a los procesadores, pero con diferentes datos para cada uno de los procesos.
Tomando en cuenta ese escenario creemos que es factible aplicar esta misma estructura de un programa MPI, separándolo en Servicios Web, así cada nodo de nuestro clúster contendrá, un método publico, expuesto como Método Web que recibirá los datos correspondientes desde un programa cliente que actúa como director, e invocador de los Servicios Web.
nodo1.Service proxy1 = new hp.nodo1.Service();
nodo2.Service proxy2 = new hp.nodo2.Service();
nodo3.Service proxy3 = new hp.nodo3.Service();
string sp1 = proxy1.HpMethod(p1);
string sp2 = proxy2.HpMethod(p2);
string sp3 = proxy3.HpMethod(p3);
Invocación a Servicios Web
Entonces cada clúster contiene el mismo servicio web, el programa cliente o invocador es el encargado de determinar los parámetros para cada invocación a las diferentes instancias (proxies) de los servicios.
Ventajas
-
No se necesita conocer en profundidad la forma de programación en red, tales como el uso de sockets, RMI (Remote Method Invocation), etc., ya que los Servicios Web abstraen toda esa funcionalidad.
-
Debido a que un Servicio Web se “ejecuta” sobre Internet, los equipos que conforman el clúster no necesariamente deberían estar en el mismo espacio geográfico que el director o los otros clúster de la topología.
-
Los Servicios Web utilizan protocolos estándar (HTTP, XML, SOAP) lo cual permite que estén implementados en cualquier tecnología, servicios Web en Java, .NET, etc. Logrando así poder tener una topología con ambientes de ejecución heterogéneos.
Desventajas
-
La topología del clúster es estática, ya que la invocación al servicio web de cada nodo debe ser establecida durante el desarrollo de la aplicación.
-
No se puede añadir nodos dinámicamente a la topología.
-
Se debe controlar en la aplicación el fallo de un nodo, si un nodo falla la aplicación debe reorganizar las invocaciones.
Topología
Conclusiones
-
Los algoritmos genéticos pueden ser usados para simular vagamente la evolución, pero una evolución aplicada a cualquier tipo de contexto del cual debemos implementar las operaciones comunes.
-
Hemos usado los primeros métodos del algoritmo genético, es decir una selección aleatoria, cruce por el método de punto único (single point), y mutación aleatoria con cambio de un único bit de la hipótesis.
-
Acerca de los procesos de multiprocesamiento al utilizar Servicios Web, nos da la posibilidad de publicar un servicio de multiprocesamiento en Internet.
-
A diferencia de MPI, el cual migra los procesos entre los nodos del clúster como desarrolladores debemos implementar en cada nodo la funcionalidad requerida.
Bibliografia
http://www.w3.org/XML
http://msdn.microsoft.com/xml
http://msdn.microsoft.com/xml/general/wsdl.asp
http://www.w3.org/TR/SOAP
http://msdn.microsoft.com/soap
http://msdn.microsoft.com/xml/general/disco.asp
http://www.microsoft.com/PressPass/features/2000/sept00/09-06uddi.asp)



TUTORES:
Ing. Fausto Loja.
Ing. Greyson Alberca.
AUTORES:
Luís A Cuenca Macas.
Fernando Cumbicos.
Edison Torres.





Muy buen trabajo y muy interesante, yo ahora estoy trabajando junto con dos compañeros sobre MPI-2 implementando un sistema de ficheros en entorno linux, ahora estamos haciendo pruebas con benchmarks (IOR) sobre el sistema de ficheros PVFS en version 2, es muy interesante entrar en el mundo de MPI, por ahora estoy aumentando el conocimiento sobre esta plataforma de paso de mensajes.
Un saludo y te felicito por tu trabajo.
Raúl H. P.