EL PROCESAMIENTO DISTRIBUIDO Y SU APLICACIÓN AL TRATAMIENTO DE IMÁGENES 1.INTRODUCCIÓN 2.ESTADO DE LA TÉCNICA 3.PROCESAMIENTO DISTRIBUIDO CON MPI 4.PROCESAMIETNO DISTRIBUIDO IMÁGENES GENÉRICO CON VTK DE 5.PROCESAMIENTO DISTRIBUIDO IMÁGENES GENÉRICO CON MATLAB DE 6.PROCESAMIENTO DISTRIBUIDO DE IMÁGENES.

Download Report

Transcript EL PROCESAMIENTO DISTRIBUIDO Y SU APLICACIÓN AL TRATAMIENTO DE IMÁGENES 1.INTRODUCCIÓN 2.ESTADO DE LA TÉCNICA 3.PROCESAMIENTO DISTRIBUIDO CON MPI 4.PROCESAMIETNO DISTRIBUIDO IMÁGENES GENÉRICO CON VTK DE 5.PROCESAMIENTO DISTRIBUIDO IMÁGENES GENÉRICO CON MATLAB DE 6.PROCESAMIENTO DISTRIBUIDO DE IMÁGENES.

Slide 1

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 2

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 3

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 4

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 5

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 6

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 7

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 8

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 9

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 10

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 11

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 12

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 13

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 14

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 15

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 16

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 17

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 18

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 19

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 20

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 21

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 22

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 23

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 24

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 25

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 26

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 27

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 28

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 29

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 30

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 31

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 32

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 33

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 34

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 35

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 36

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 37

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 38

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 39

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 40

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 41

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 42

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 43

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 44

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 45

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 46

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 47

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 48

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 49

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 50

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 51

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 52

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 53

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 54

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 55

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 56

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 57

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 58

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 59

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 60

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 61

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 62

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 63

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 64

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 65

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 66

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 67

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 68

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 69

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN


Slide 70

EL PROCESAMIENTO DISTRIBUIDO Y SU
APLICACIÓN AL TRATAMIENTO DE
IMÁGENES

1.INTRODUCCIÓN
2.ESTADO DE LA TÉCNICA
3.PROCESAMIENTO DISTRIBUIDO CON MPI

4.PROCESAMIETNO
DISTRIBUIDO
IMÁGENES GENÉRICO CON VTK

DE

5.PROCESAMIENTO
DISTRIBUIDO
IMÁGENES GENÉRICO CON MATLAB

DE

6.PROCESAMIENTO
DISTRIBUIDO
DE
IMÁGENES GENÉRICO CON PARAVIEW
7.RENDERIZACIÓN DE UNA NEURONA
8.PROCESAMIENTO DISTRIBUIDO CON C++
9.CONCLUSIONES Y LÍNEAS DE MEJORA

CAPÍTULO 1: INTRODUCCIÓN

OBJETIVOS QUE PERSIGUE EL PROYECTO

1. Dar una visión más en profundidad de lo que entendemos por procesamiento
distribuido: el conocimiento y manejo de las implementaciones existentes a
la hora de realizar este procesamiento distribuido, como pueden ser MPI y
MatlabMPI

2. La aplicación de estas diversas técnicas de procesamiento distribuido al
tratamiento y procesado de imágenes

3. Dar una introducción a las implementaciones existentes para desarrollar el
procesamiento distribuido en otros lenguajes, como es el lenguaje C++: PVM
y CORBA.

CAPÍTULO 2: ESTADO DE LA
TÉCNICA

¿QUÉ ES UN SISTEMA DISTRIBUIDO?

Un sistema distribuido es un conjunto de computadoras conectadas en red de
forma que le da la sensación al usuario de ser una sola computadora. Los
sistemas de procesamiento distribuidos brindan una buena relación preciodesempeño y pueden aumentar su tamaño de manera gradual al aumentar la
carga de trabajo.

VENTAJAS

DESVENTAJAS

ECONOMÍA

COMPLEJIDAD DE

VELOCIDAD

IMPLEMENTACIÓN

ALTA DISPONIBILIDAD
ESCALABILIDAD
SISTEMA DE FICHEROS DE RAÍZ ÚNICA
COMUNICACIÓN ENTRE PROCESOS

INTERCAMBIO DE DATOS UNIVERSAL

LOS CLUSTERS

De forma genérica, podemos definir un cluster como un conjunto de máquinas
unidas por una red de comunicación trabajando por un objetivo conjunto.
Según el tipo puede ser dar alta disponibilidad, alto rendimiento etc...

Podemos resumir las características de un cluster en las siguientes:

1. Un cluster consta de 2 o más nodos. Los nodos necesitan estar conectados
para llevar a cabo su misión.
2. Los nodos de un cluster están conectados entre sí por un canal de
comunicación funcional.
3. Los clusters necesitan software especializado. Existen varios tipos de
software que pueden conformar un cluster: software a nivel de aplicación y
software a nivel de sistema.
4. Acoplamiento del software: entendemos por acoplamiento del software a la
integración que tengan todos los elementos software que existan en cada
nodo: acoplamiento fuerte, acoplamiento medio y acoplamiento débil.

Cluster a nivel de sistema y a
nivel de aplicación

Podemos catalogar los clusters según una serie de consideraciones:
1. Acoplamiento: fuerte, medio, débil
2. Control: centralizado o descentralizado
3. Homogeneidad: homogéneos o heterogéneos
4. Seguridad

Según lo visto anteriormente, podemos catalogar los clusters en tres tipos
diferentes:


CLUSTERS DE ALTO RENDIMIENTO (HP): Los clusters de alto rendimiento
han sido creados para compartir el recurso más valioso de un ordenador, es
decir, el tiempo de proceso. La misión de este tipo de clusters es mejorar el
rendimiento en la obtención de la solución de un problema.



CLUSTERS DE ALTA DISPONIBILIDAD (HA): Los clusters de alta
disponibilidad han sido diseñados para que proporcionen la máxima
disponibilidad sobre los servicios que presenta el cluster. La mayoría de los
problemas que tratan de resolver este tipo de clusters están ligados a la
necesidad de dar servicio continuado de cualquier tipo a una serie de
clientes de manera ininterrumpida.



CLUSTERS DE ALTA CONFIABILIDAD (HR): Estos clusters tratan de
aportar la máxima confiabilidad en un entorno en el cual se necesite saber
que el sistema se va a comportar de una manera determinada.

CAPÍTULO 3: PROCESAMIENTO
DISTRIBUIDO CON MPI

MPI
MPI (Message Passing Interface) es un interfaz estandarizado para la
implementación de aplicaciones paralelas basadas en paso de mensajes

OBJETIVOS DE MPI

1. Entorno de programación único para asegurar la portabilidad de las aplicaciones
paralelas.
2. Definir el interfaz de programación sin especificar cómo debe ser la
implementación del mismo.
3. Favorecer la extensión del estándar.

LIMITACIONES DE MPI

1. No existe un mecanismo estandarizado de entrada/salida paralela.
2. MPI asume un número de procesos constante, que es establecido al arrancar la
aplicación.
3. El modelo de comunicación estandarizado por MPI sólo tiene en cuenta el paso
de mensajes.

4. Desarrollo de bindings para otros lenguajes: C++ y ADA.
5. Soporte para las aplicaciones de tiempo real.
6. No se define ningún aspecto relacionado con la interacción mediante GUIs con
una aplicación paralela.

ubicación de MPI en el proceso de programación de aplicaciones paralelas

ESTRÚCTURA BÁSICA DE LOS PROGRAMAS MPI

# include "mpi.h"
main (int argc, char **argv) {
int nproc; /* Número de procesos */
int yo; /* Mi dirección: 0<=yo<= (nproc-1) */
MPI_Init (&argc, &argv); /* Inicio aplicación paralela */
MPI_Comm_size (MPI_COMM_WORLD, &nproc);
MPI_Comm_rank (MPI_COMM_WORLD, &yo);

/* CUERPO DEL PROGRAMA */
MPI_Finalize ();
}

para averiguar el número
de procesos que
toman parte en la
aplicación en
cuestión

para dar por finalizada la
aplicación

para que cada proceso
averigüe su dirección
(identificador) dentro del
conjunto de diferentes
procesos que componen la
aplicación

COMUNICACIÓN A TRAVÉS DE MPI: COMUNICACIÓN PUNTO A PUNTO
MODELOS DE COMUNICACIÓN
1. Modelo de comunicación bloqueante (blocking)
2. Modelo de comunicación no bloqueante (non-blocking)
MODELOS DE ENVÍO EN MPI
1. BÁSICO (BASIC): dependiente de la implementación
2. CON BUFFER (BUFFERED): una copia del mensaje que se envía se guarda en
el buffer
3. SÍNCRONO (SYNCHRONOUS): la operación se da por terminada cuando el
mensaje es recibido en el destino
4. LISTO (READY): sólo se puede realizar si antes el receptor está preparado

OPERACIONES COLECTIVAS CON MPI

1. BARRERAS DE SINCRONIZACIÓN: (MPI_Barrier ())
2. BROADCAST (DIFUSIÓN): (MPI_Broadcast ())

3. GATHER (RECOLECCIÓN): (MPI_Gather ())

4. SCATTER (DISTRIBUCIÓN): (MPI_Scatter ())

5. REDUCCIÓN
6. COMUNICACIÓN CON TODOS LOS NODOS: (MPI_Alltoall ())

MODULARIDAD

MPI permite definir grupos de procesos. Un grupo de procesos es una colección
de procesos, y define un espacio de direcciones (desde 0 hasta el tamaño del
grupo menos 1).
Un comunicador consiste en un grupo de procesos, y un contexto de
comunicación.
Entre las funciones más comunes sobre comunicadores podemos encontrar las
siguientes:
• MPI_Comm_size ()
• MPI_Comm_rank ()
• MPI_Comm_dup ()
• MPI_Comm_free ()
• MPI_Comm_split ()

CAPÍTULO 4: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON VTK

VTK
VTK (Visualization ToolKit) son un conjunto de librerías que se
utilizan para la visualización y el procesamiento de imágenes y
objetos gráficos 2D y 3D. Constan de código abierto y software
orientado a objetos

ARQUITECTURA BÁSICA DE VTK
VTK consta de dos partes fundamentales:
• Un núcleo compilado (implementado en C++): Las estructuras de datos, los
algoritmos y las funciones de sistema de tiempo crítico están implementadas en el
núcleo de C++
• Una capa de interpretación generada automáticamente: Mientras el núcleo nos
proporciona velocidad y eficiencia, la capa de interpretación nos ofrece flexibilidad y
extensibilidad

SUBSISTEMAS DE VTK
VTK está constituido por dos grandes subsistemas: Graphics Model y Visualization
Model
GRAPHICS MODEL

El graphics model forma una capa abstracta por encima del lenguaje de los
gráficos (por ejemplo, OpenGL) para asegurar la portabilidad entre las
diferentes plataformas. Los conceptos de gráficos abstractos y capas
independientes de los dispositivos crearon el modelo gráfico.

Los objetos principales que componen el Graphics Model son:
• vtkActor, vtkActor2D, vtkVolume

• vtkTransform

• vtkLight

• vtkLookupTable, vtkColorTransferFunction

• vtkCamera

• vtkRenderer

• vtkProperty, vtkProperty2D

• vtkRenderWindow

• vtkMapper, vtkMapper2D

• vtkRenderWindowInteractor

VISUALIZATION MODEL:

El pipeline de procesamiento de datos de VTK transforma los datos de forma que
puedan ser visualizados en los subsistemas gráficos descritos con anterioridad.

El modelo Visualization Model es el encargado de construir la representación
geométrica que será renderizada por el pipeline gráfico. Los objetos principales
que componen el Visualization Model son los siguientes:


vtkDataObject: Los “data objects” representan datos de varios tipos. La clase
vtkDataObject puede interpretarse como un conjunto genérico de datos. A los
datos que tienen una estructura formal se les llama “dataset” (de la clase
vtkDataSet).



vtkProcessObject: Los “process objects”, también llamados filtros, operan en
los data objects para generar nuevos data objects. Representan los algoritmos
del sistema. Process y data objects se conectan para formar los pipelines de
visualización.

Objetos dataset en VTK

PROCESAMIENTO DE LAS IMÁGENES CON VTK

VTK tiene un extenso número de métodos para el procesamiento de imágenes y
renderización de volúmenes. Los datos de imágenes 2D y 3D vienen dados
por la clase vtkImageData. En un dataset de imagen los datos son
ordenados en un vector regular alineado con los ejes. Mapas de bits y
mapas de píxeles son ejemplos de datasets de imágenes 2D, y volúmenes
(pilas de imágenes 2D) lo son de datasets de imágenes 3D.

Los process objects en un pipeline de imagen siempre tienen como entradas y
salidas data objects de imagen. Debido a la naturaleza regular y simple de
los datos, el pipeline de imagen tiene otros rasgos importantes. La
renderización de volumen se usa para visualizar objetos 3D de la clase
vtkImageData, y visores especiales de imágenes se usan para ver objetos
2D.

Los filtros detectan de forma automática el número disponible de procesos en el
sistema y crean el mismo número de uniones durante la ejecución;
igualmente separan automáticamente los datos en partes que fluyen a través
del pipeline.

CREACIÓN DE UNA APLICACIÓN GRÁFICA CON VTK

Los pasos a seguir para crear una aplicación gráfica con VTK son:

1. Construcción de un pipeline de datos para procesar los datos: es decir,
conectar fuentes (crear datos), filtros (procesar datos) y mappers
(transformar datos en gráficos).

2. Creamos los objetos gráficos necesarios para poder interpretar estos datos.
Los pasos para crear estos objetos gráficos son:


Crear una ventana de renderización



Crear un render



Crear un interactor



Crear uno o más actores



Renderizar

UTILIZACIÓN DE VTK CON MPI
VTK dispone de una serie de clases preparadas para su aplicación en el
procesamiento en paralelo. Estas clases hacen uso de la librería MPI. Entre las
más destacadas se encuentran las siguientes:

vtkMPIController

vtkMPIEventLog

vtkMPICommunicator

vtkMultiProcessController

vtkMPIGroup

El uso de comunicadores definidos por el usuario se realiza a través de
vtkMPICommunicator y vtkMPIGroup. Las funciones que más se utilizan de esta
clase son las siguientes:

Inicialize (int *argc, char ***argv)
GetLocalProcessId ()

GetNumberOfProcesses ()
Finalize ()

Un ejemplo de la visualización
lograda a través del empleo de VTK

CAPÍTULO 5: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON MATLAB

MATLAB MPI
MATLAB es el lenguaje de programación predominante y más extendido para la
implementación de cómputos numéricos, desarrollo e implementación de
algoritmos, simulación, reducción de datos, comprobación y evaluación de
sistemas.

MATLAB MPI es una implementación para MATLAB de MPI que permite que
cualquier programa creado bajo MATLAB pueda ser ejecutado en múltiples
procesadores. Consiste en un conjunto de instrucciones de MATLAB que
implementan un subconjunto de MPI, permitiendo que cualquier programa de
MATLAB pueda ser ejecutado en una computadora paralela.

CARÁCTERÍSTICAS DE MATLAB MPI

• Implementación extremadamente compacta (aproximadamente 100 líneas de
código).
• Implementación muy pura.
• La implementación funcionará en cualquier punto en donde MATLAB también
funcione.
• MATLAB MPI puede igualar el ancho de banda de comunicación del lenguaje C
basado en MPI en el envío de mensajes de gran tamaño.
REQUISITOS DEL SISTEMA
• Sistemas de memoria compartida: una única licencia de MATLAB
• Sistemas de memoria distribuida: una licencia de MATLAB por máquina

PROGRAMA EJEMPLO DE INTERCAMBIO DE MENSAJES A TRAVÉS DE
MATLABMPI

MPI_Init;
comm = MPI_COMM_WORLD;
comm_size = MPI_Comm_size(comm);
my_rank = MPI_Comm_rank(comm);
source = 0;
dest = 1;
tag = 1;
if(comm_size == 2)
if (my_rank == source)
data = 1:10;
MPI_Send(dest,tag,comm,data);
end
if (my_rank == dest)
data=MPI_Recv(source,tag,comm);
end
end
MPI_Finalize;
exit;

% Inicia MPI.
% Crea el comunicador
% Nº procesadores
% Rango procesador
% Identifica la fuente
% Identifica el destino
% Etiqueta del mensaje
% Check nº procesadores
% Si source
% Crea dato a enviar
% Envía dato
% Si destino.
% Recive dato

% Finaliza MatlabMPI.
% Sale de Matlab

ANCHO DE BANDA Y RESULTADO DE LAS PRUEBAS REALIZADAS

Ancho de banda. Ancho de banda en función del tamaño del mensaje probado en el SGI
ORIGIN 2000. MATLAB MPI iguala la implementación en lenguaje C en mensajes de gran
tamaño.

Ancho de banda
en un cluster de
LINUX.

velocidad de la
memoria paralela
compartida

velocidad
paralela
compartida/
distribuida

Productividad vs rendimiento. Las línea de código como función del
máximo rendimiento alcanzado (medido en unidades de pico de
procesador) para diferentes implementaciones para la misma aplicación
de filtrado de imagen

Futura arquitectura en forma de capas: diseño de unas herramientas paralelas de
Matlab las cuales crearán una estructura de datos distribuida y objetos dataflow
construidos en la cima de MatlabMPI

CAPÍTULO 6: PROCESAMIENTO
DISTRIBUIDO DE IMÁGENES
GENÉRICO CON PARAVIEW

PARAVIEW

ParaView es una aplicación que se utiliza
para visualizar datos en 2D o 3D. Puede ser
utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores, lo
que permite a ParaView ejecutar grandes
cadenas de datos mediante la utilización de
procesamiento distribuido.

CARACTERÍSTICAS GENERALES DE PARAVIEW
1. Es una aplicación de visualización multiplataforma de libre distribución.
2. Soporta procesamiento distribuido para procesar grandes cantidades de datos.
3. Dispone de una flexible e intuitiva interfaz de usuario.
4. Desarrolla una extensible arquitectura basada en estándares abiertos.

OBJETIVO DE PARAVIEW
El objetivo de ParaView es desarrollar una herramienta paralela escalable que
realice procesamiento distribuido de memoria

FICHEROS SOPORTADOS POR PARAVIEW

ParaView Files, VTK Files

• BYU Files

• Parallel VTK files

• POP Ocean Files

• Legacy VTK Files

• Protein Data Bank Files

• Parallel legacy VTK

• Xmol Files

• EnSight Files

• XDMF Files

•PLOT3D Files
•Stereo Lithography

TIPOS DE DATOS ADMITIDOS POR PARAVIEW

COMANDOS DE PARAVIEW
Distinguiremos cuatro categorías:

General
start-empty, -e
disable-registry, -dr
play-demo, -pd
batch, -b
Stereo
use-offscreen-rendering, -os
render-module
help
Client/Server
client, -c
server, -v
host

Paralelo
use-rendering-group, -p
group-file, -gf
use-tiled-display, -td
tile-dimensions-x, -tdx
tile-dimensions-y, -tdy

Mesa
use-software-rendering, -r
use-satellite-software, -s

PARAVIEW CON MPI

Para lanzar ParaView en paralelo con MPI hay que realizarlo de igual modo que
cualquier otra aplicación MPI, es decir, en la línea de comandos habrá que poner
algo como:
C:\temp\mpirun –np 4 –localroot C:\ParaView\bin\debug\ParaView

Una vez realizado lo anterior se abrirá la pantalla de ParaView (solo en el nodo
raíz) y podremos realizar las operaciones que queramos interactuando con los
menús.

CAPÍTULO 7: RENDERIZACIÓN DE
UNA NEURONA

RENDERIZACIÓN

Denominamos Renderización al proceso mediante el cual una estructura poligonal
(tridimensional) digital más o menos básica obtiene una definición mucho mayor
con juegos de luces, texturas y acentuado y mejorado de los polígonos, simulando
ambientes y estructuras físicas.

Algunos métodos de Render son:
• Wireframe: es un algoritmo de renderización del que resulta una imagen
semitransparente.
• Sólido: es un algoritmo de renderización algo más complejo que el Wireframe.
• Sombreado Goraud: interpola los valores de iluminación en los vértices del
polígono teniendo en cuenta la superficie curva mediante la malla.
• Sombreado Phong: se caracteriza por crear precisos brillos especulares. A cada
píxel se le da un color basado en el modelo de iluminación aplicado al punto.
• Radiosidad: En este algoritmo calculamos las interacciones entre la luz y el color
de los objetos más o menos próximos.

PARALELISMO EN EL PROCESO DE RENDERIZACIÓN

Existen diferentes tipos de paralelismo aplicables al proceso de renderización; entre
ellos destacan por su importancia:

1. El paralelismo Funcional: Consiste en dividir el proceso de renderización en una
serie de etapas que pueden aplicarse de forma sucesiva a un conjunto de datos.

2. El paralelismo de Datos: En lugar de aplicarse una secuencia de operaciones
consecutivas a un único flujo de datos, existe la posibilidad de dividir los datos
en múltiples flujos y operar con ellos en unidades de procesamiento
independientes.

3. El paralelismo Temporal: En este caso el paralelismo puede obtenerse de forma
casi inmediata dividiendo el número de imágenes entre los procesadores
disponibles, de modo que la unidad de trabajo sea una imagen completa.

4. Métodos híbridos: Es posible integrar varias formas de paralelismo en un mismo
sistema.

CONCEPTOS ALGORÍTMICOS

La mayor parte de algoritmos paralelos introducen una serie de sobrecargas que no
están presentes en sus equivalentes secuenciales. Las causas de dichas
sobrecargas pueden ser las siguientes:


Comunicación entre procesos



Desvíos en el balanceo de la carga



Computación redundante



Mayor espacio de almacenamiento requerido, debido a estructuras de datos
replicadas o auxiliares.

RENDERIZACIÓN DE UNA NEURONA

Partimos del código fuente AbrirPic.m. A través de este script lo que hacemos es
abrir la imagen de una neurona segmentada en 76 rodajas (slices), con el nombre
NUEVO1.PIC. A continuación reducimos las dimensiones de la imagen original (512
x 512 x 3), para reducir el tiempo computacional (128 x 128x 3).

A continuación dividimos la imagen abierta en tres subimágenes distintas para
llevar a cabo la renderización por separado de cada una de las subimágenes.

Una vez realizada la segmentación seleccionamos el algoritmo de filtrado a utilizar
(Average, Disk, Gaussian, Motion, Prewitt, Sobel, Unsharp).
Después realizamos la visualización conjunta de la imagen y subimágenes
originales y de la imagen y subimágenes filtradas.

A continuación realizamos la reconstrucción 3D de la imagen filtrada y de las
subimágenes.

reconstrucción 3D de la imagen

CAPÍTULO 8: PROCESAMIENTO
DISTRIBUIDO CON C++

INTRODUCCIÓN A C++

El lenguaje C++ proviene del lenguaje C. El lenguaje C nació en los laboratorios
Bell de AT&T en los años 70. Su eficiencia y claridad, y la posibilidad de realizar
tanto acciones de bajo como de alto nivel han hecho de este lenguaje el principal
tanto en el mundo del desarrollo de sistemas operativos como de aplicaciones tanto
industriales como de ofimática.
Dentro de esta estandarización se incluye un conjunto de clases, algoritmos y
plantillas que constituyen la librería estandar de C++.

Esta librería introduce facilidades para manejar las entradas y salidas del programa,
para la gestión de listas, pilas, colas, vectores, para tareas de búsqueda y
ordenación de elementos, para el manejo de operaciones matemáticas complejas,
gestión de cadenas de caracteres, tipos de datos genéricos, etc. A este conjunto de
algoritmos, contenedores y plantillas, se los denomina habitualmente por las siglas
STL (Standard Template Library).

ESTÁNDARES PARA LA PROGRAMACIÓN PARALELA EN C++

El lenguaje C++ no incluye ninguna primitiva para poder realizar la implementación
de aplicaciones paralelas. No existe ninguna manera a través del lenguaje C++
para especificar que dos o más instrucciones deberían ser ejecutadas de forma
paralela.

Para poder llevar a cabo la implementación de capacidades paralelas en C++,
debemos recurrir a estándares externos que suplen esta función. Los tres
estándares que vamos a estudiar van a ser:
• El estándar MPI

• El estándar PVM
• El estándar CORBA

EL ESTÁNDAR MPI

MPI es la implementación estándar para llevar a cabo la comunicación basándose
en el intercambio de mensajes.

MPI fue desarrollado para su ejecución tanto en máquinas paralelas como en
clusters de estaciones de trabajo. Para trabajar con MPI utilizamos la
implementación MPICH.

MPICH es una implementación de MPI libre y portable. MPICH proporciona al
programador de C++ un conjunto de APIs y librerías que soportan programación
paralela.

MPI es especialmente útil para la programación SPMD (Single Program Multiple
Data) y MPMD (Multiple Program Multiple Data).

EL ESTÁNDAR PVM

PVM significa “Parallel Virtual Machine”. Es un software que permite ejecutar
aplicaciones paralelas distribuidas en redes de ordenadores heterogéneos.

PVM es un paquete de software que permite a una colección heterogénea de
computadoras conectarse mutuamente a través de una red para ser utilizadas
como una gran computadora paralela.

El objetivo de un sistema PVM es permitir que una colección de computadoras
puedan ser utilizadas para la computación paralela.

PVM es, junto con MPI, uno de los paquetes de software más utilizados para
implementar aplicaciones paralelas.

La librería PVM es especialmente útil para sistemas de varios procesadores que
pueden ser conectados juntos para formal un procesador virtual paralelo.

PVM soporta:
• Heterogeneidad en términos de máquinas, redes y aplicaciones
• Modelos de pase de mensajes explícitos
• Computación basada en procesos
• Soporte multiprocesador (MPP, SMP)
• Acceso al hardware: las aplicaciones bien pueden ignorar o aprovechar las
diferencias entre el hardware
• Lista de host configurable dinámicamente: los procesadores pueden ser añadidos
o eliminados y se pueden incluir procesadores mixtos

Un programa paralelo en PVM, generalmente, constará de un proceso maestro y
varios procesos esclavos, realizando cada esclavo una parte del trabajo global.

Esquemas Maestro-Esclavo

VENTAJAS Y DESVENTAJAS DEL USO DE PVM
Algunas de las ventajas que presenta la utilización de PVM son:

• Fiabilidad
• Reduce el "wall clock execution time"
• Fácil instalación y uso
• Extensión

• Flexibilidad
• Tolerancia a fallos
• Precio
• Heterogeneidad

• Disponibilidad

Las desventajas que presenta la utilización de PVM son, principalmente:
• El paralelismo fuertemente acoplado
• La abstracción de la máquina virtual, la independencia del hardware y la
independencia de la codificación tienen un coste

FUNCIONES DE PVM

1. Funciones de Control de Procesos.

2. Funciones de Información.

3. Funciones de Configuración de grupos.

4. Funciones de Empaquetamiento de datos y control de Buffers.

5. Funciones de Envío de Mensajes.

6. Funciones de Recepción de mensajes.

EL ESTÁNDAR CORBA

En computación, Common Object Request Broker Architecture (CORBA) es un
estándar que establece una plataforma de desarrollo de sistemas distribuidos
facilitando la invocación de métodos remotos bajo un paradigma orientado a
objetos.

CORBA utiliza un lenguaje de definición de interfaces (IDL) para especificar los
interfaces con los servicios que los objetos ofrecerán.

CORBA puede especificar a partir de este IDL la interfaz a un lenguaje
determinado, describiendo cómo los tipos de dato CORBA deben ser utilizados en
las implementaciones del cliente y del servidor.

Implementaciones estándar existen para Ada, C, C++, Smalltalk, Java y Python.
Hay también implementaciones para Perl y TCL.

CORBA se encarga habitualmente de los siguientes aspectos en los sistemas
distribuidos:

• Registro de objetos

• Localización de objetos
• Activación de objetos

• Gestión de errores
• Multiplexación y desultiplexación de invocaciones
• Aplanado y desaplanado de datos

Los tipos de componentes de los que consta CORBA son, generalmente:

• Objects Services

• Common Facilities

• Domain Interfaces

• Application Interfaces

Descripción de la arquitectura CORBA

Descripción de interfaces y objetos

Estructura cliente de
CORBA

Estructura servidor de
CORBA

CAPÍTULO 9: CONCLUSIONES Y
LÍNEAS DE MEJORA

CONCLUSIONES SOBRE MPI

Gracias a MPI conseguimos portabilidad, proveyendo una librería de paso de
mensajes estándar independiente de la plataforma y de dominio público. La
especificación de esta librería está en una forma independiente del lenguaje y
proporciona funciones para ser usadas con C, C++ y Fortran. Abstrae los sistemas
operativos y el hardware.

El usuario en MPI tiene que crear la máquina virtual decidiendo qué nodos del
cluster usar para poner en funcionamiento sus aplicaciones cada vez que las
arranca.

La implementación del cluster es sencilla, pero resulta conveniente que todos los
nodos que lo forman sean similares en cuanto a potencia y prestaciones, para
facilitar la función de paralelización de los programas.

MPI CON VTK Y PARAVIEW

VTK (Visualization Toolkit) son un conjunto de librerías destinadas a la visualización
y el procesado de imágenes. Incluyen código abierto y software orientado a objetos.
Son muy amplias y complejas, pero aún así, están diseñadas para ser sencillas de
usar con cualquier lenguaje de programación orientado a objetos, como son C++,
Java, Tcl, etc.

Paraview es una aplicación que se utiliza para visualizar datos en dos o tres
dimensiones. Esta aplicación puede ser utilizada en un solo puesto de trabajo o
también en un cluster de ordenadores. Esto último permite a paraview ejecutar
grandes cadenas de datos mediante la utilización de procesamiento distribuido.

PROCESAMIENTO DISTRIBUIDO CON MATLAB

MatlabMPI es una implementación para Matlab de MPI (Message Passing
Interface) que permite que cualquier programa creado bajo Matlab pueda ser
ejecutado en múltiples procesadores. MatlabMPI consiste en un conjunto de
instrucciones de Matlab que implementan un subconjunto de MPI, permitiendo que
cualquier programa de Matlab pueda ser ejecutado en una computadora paralela.
Además, MatlabMPI podrá ejecutarse en cualquier sistema de computadoras que
soporten Matlab.

La simplicidad y funcionalidad de MATLAB MPI lo hace una elección muy
aconsejable para programadores que quieran acelerar sus códigos MATLAB en
computadoras paralelas. El trabajo para el futuro será el de crear objetos de mayor
rango (como, por ejemplo, matrices distribuidas). El resultado será la construcción
de una capa de comunicaciones dentro de MATLAB MPI, que permita a un usuario
lograr un aceptable desarrollo paralelo sin un aumento de las líneas de código.

PROCESAMIENTO DISTRIBUIDO CON C++

En este capítulo hemos visto una visión aproximada de tres de las
implementaciones existentes para implementar el procesamiento distribuido en
C++: MPI, PVM y CORBA.

La implementación con MPI está más desarrollada. Sin embargo, las otras dos
implementaciones existentes, PVM y CORBA, no son tan conocidas y
desarrolladas. Faltaría como conclusión el desarrollo más en profundidad de estas
implementaciones, así como el desarrollo de diversos ejemplos.

LÍNEAS DE MEJORA

1. Realización e implementación de un cluster basado en el sistema operativo
Linux.
2. Utilización de otra implementación de MPI como puede ser LAM-MPI.
3. Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de
realización e implementación de un cluster basado en el sistema operativo
Linux.
1.
1.

Utilización de otra implementación de MPI como puede ser LAM-MPI.
Profundizar más en la utilización de MPI con Matlab, en especial en lo que se
refiere a la hora del envío de datos entre procesadores, en especial de

FIN