Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Mpi Spanish PDF
Mpi Spanish PDF
Julio 2003
2
Resumen
3
4
ndice general
Objetivos I
Desarrollo III
1. Introduccin 3
1.1. Utilidades del Procesamiento Paralelo . . . . . . . . . . . . . . . . . . . . . 3
1.2. Definiciones Bsicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2.1. Caractersticas Fsicas de la Comunicacin . . . . . . . . . . . . . . 4
1.2.2. Estndares Relacionados . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3. Clasificacin Sistemas Paralelos . . . . . . . . . . . . . . . . . . . . . . . . 6
1.3.1. Paralelismo Implcito o de Bajo Nivel . . . . . . . . . . . . . . . . . 6
1.3.2. Paralelismo Explcito o de Alto Nivel . . . . . . . . . . . . . . . . . 7
1.4. Arquitecturas Basadas en Paralelismo Implcito . . . . . . . . . . . . . . . . 9
1.4.1. Segmentacin o pipeline . . . . . . . . . . . . . . . . . . . . . . . . 9
1.4.2. Tecnologa SWAR . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.4.3. Procesadores Auxiliares . . . . . . . . . . . . . . . . . . . . . . . . 15
1.5. Arquitecturas Basadas en Paralelismo Explcito . . . . . . . . . . . . . . . . 19
1.5.1. Multiprocesadores . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.5.2. Multicomputadores . . . . . . . . . . . . . . . . . . . . . . . . . . 26
1.5.3. Procesadores Matriciales . . . . . . . . . . . . . . . . . . . . . . . 37
1.5.4. Procesadores Vectoriales . . . . . . . . . . . . . . . . . . . . . . . . 38
5
6 NDICE GENERAL
II Gua MPI 55
3. El Estndar MPI 57
3.1. Origen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
3.2. Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
3.3. Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
3.4. Usuarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
3.5. Plataformas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
3.6. Versiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
3.6.1. MPI-1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
3.6.2. MPI-2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
3.7. Implementaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4. Conceptos Bsicos 67
4.1. Algoritmo Hola Mundo! . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
4.2. Programas MPI en General . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
4.3. Informndonos del Resto del Mundo . . . . . . . . . . . . . . . . . . . . . . 69
4.4. El Problema de la Entrada/Salida . . . . . . . . . . . . . . . . . . . . . . . . 69
4.5. Ubicacin de los Procesos . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
4.6. Informacin Temporal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
4.7. Implementacin Algoritmo Hola Mundo! . . . . . . . . . . . . . . . . . . . 71
5. Paso de Mensajes 73
5.1. Algoritmo Clculo de reas mediante Montecarlo . . . . . . . . . . . . . . . 73
5.2. El Entorno del Mensaje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
5.3. Funciones de Paso de Mensajes Bloqueantes . . . . . . . . . . . . . . . . . . 76
5.4. Funciones de Paso de Mensajes No Bloqueantes . . . . . . . . . . . . . . . . 77
5.5. Agrupaciones de Datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
5.5.1. Tipos Derivados . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
5.5.2. Vectores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
5.6. Implementacin Clculo de reas mediante Montecarlo . . . . . . . . . . . . 80
5.6.1. Implementacin con Mensajes Bloqueantes . . . . . . . . . . . . . . 80
5.6.2. Implementacin con Mensajes No Bloqueantes . . . . . . . . . . . . 86
6. Comunicacin Colectiva 93
6.1. Algoritmo Regla del Trapecio . . . . . . . . . . . . . . . . . . . . . . . . . 93
6.2. Distribucin y Recoleccin de los Datos . . . . . . . . . . . . . . . . . . . . 94
6.3. Operaciones de Comunicacin Colectiva . . . . . . . . . . . . . . . . . . . . 96
6.4. Operaciones de Reduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
6.5. Implementacin Regla del Trapecio . . . . . . . . . . . . . . . . . . . . . . 98
Conclusiones 203
Bibliografa 208
9
10 NDICE DE FIGURAS
11
12 NDICE DE CUADROS
ndice de algoritmos
13
14 NDICE DE ALGORITMOS
Objetivos
Con el objeto de delimitar el campo de estudio lo primero que debemos hacer es situar
el paralelismo basado en redes dentro de la amplia variedad de sistemas dedicados al proce-
samiento paralelo. Propondremos una clasificacin para los distintos tipos de paralelismo ex-
istentes en la actualidad, y explicaremos las caractersticas principales de cada uno de ellos.
Un aspecto bsico para el desarrollo de la investigacin consiste en disear e implemetar
un conjunto de algoritmos paralelos que pongan en prctica los tipos de comunicacin ms
importantes que se dan en el procesamiento paralelo basado en redes. Para lograr este objetivo
estudiaremos las caracterticas ms importantes de MPI (Message Passing Interface, Interfaz
de Paso de Mensajes) y emplearemos dicha interfaz en el desarrollo de diversos algoritmos
paralelos.
Por ltimo haremos un estudio detallado de los resultados obtenidos en las ejecuciones de
los algoritmos desarrollados, explicando paso a paso la manera en la que han sido realizados.
I
II OBJETIVOS
Dichos resultados sern utilizados para la generacin de grficos que nos ayuden a entender
las importantes ventajas que nos aporta el procesamiento paralelo.
Desarrollo
Paralelismo Implcito
Procesadores
Segmentacin Mltiples ALUs Auxiliares
El paralelismo explcito o de alto nivel hace referencia a aquellos sistemas en los cuales
se interconectan varios procesadores para cooperar en la ejecucin de los programas de apli-
cacin. Se trata de sistemas que ofrecen una infraestructura explcita para el desarrollo del soft-
ware del sistema y aplicaciones que exploten el paralelismo. A este tipo de paralelismo dedi-
caremos el resto de la investigacin, centrndonos concretamente en las arquitecturas MIMD
con memoria distribuida.
III
IV DESARROLLO
Paralelismo Explcito
MISD SIMD
(Procesadores Vectoriales) (Procesadores Matriciales) MIMD
Una vez resuelto el sistema de intercomunicacin fsica de los equipos, deben abordarse
los mecanismos para lograr la coordinacin entre los procesadores. En el captulo 2 analizamos
las caractersticas bsicas de los dos modelos de interaccin entre procesadores (paso de men-
sajes y memoria compartida), para luego centrarnos en las utilidades de desarrollo de software
paralelo ms populares que existen en la actualidad: PVM, MPI, p4, Express y Lynda.
Gua MPI
La segunda parte de nuestro estudio se centra en la utilizacin de la interfaz MPI (Mes-
sage Passing Interface, Interfaz de Paso de Mensajes) para el desarrollo de aplicaciones par-
alelas.
El estudio de la interfaz MPI comienza en el captulo 3 con una explicacin sobre el origen
y la motivacin que promovieron la creacin del estndar. Por otro lado analizamos los con-
tenidos del estndar, sus objetivos, su funcionamiento bsico y sus distintas versiones. Como
vemos en la figura 3, MPI es implementado normalmente como interfaz de comunicaciones,
utilizando las facilidades ofrecidas por el sistema que vayamos a usar (comunicacin va sock-
ets, operaciones de memoria compartida, etc).
MPI_Send() MPI_Recv()
MPI MPI
SO SO
Las operaciones de comunicacin colectiva son aquellas que se aplican al mismo tiempo
a todos los procesos pertenecientes a un comunicador. Tienen una gran importancia en el
estndar MPI, debido a la claridad de su sintaxis y a su eficiencia. En el captulo 6 analizamos
su utilidad y conveniencia implementando el algoritmo Regla del Trapecio de manera que haga
un uso inteligente de dichas operaciones.
El captulo 7 aborda el uso de comunicadores y topologas. Esta caracterstica hace a MPI
diferente de la mayora de los dems sistemas de paso de mensajes. En pocas palabras, un
comunicador es una coleccin de procesos que pueden mandarse mensajes entre ellos. Una
topologa es una estructura impuesta en los procesos de un comunicador que permite a los
procesos ser direccionados de diferentes maneras. Para ilustrar estas ideas desarrollaremos el
cdigo que implementa el algoritmo de Fox para multiplicar dos matrices cuadradas mediante
su subdivisin en una serie de procesos (cuadro 1).
0
Proceso 1
Proceso 2
Proceso
3
Proceso 4
Proceso
5
Proceso
6
Proceso 7
Proceso 8
Proceso
Cuadro 1: Subdivisin de Matrices Algoritmo de Fox
determinado sistema paralelo, lo primero que debemos hacer es medir el rendimiento de dicho
sistema. Dicha medicin se realiza a travs de herramientas especializadas en el anlisis, de
modo que podemos saber fcilmente y con seguridad cunto de apropiado es el sistema para la
ejecucin de determinados algoritmos paralelos. En las figuras 6 y 7 mostramos el rendimiento
del sistema en la ejecucin de paso de mensajes bloqueantes y operaciones de comunicacin
colectiva, respectivamente.
Comunicacion Bloqueante
1200
Com.Bloqueante
1000
800
Tiempo (micro-seg)
600
400
200
0
0 200 400 600 800 1000 1200
Tamano (bytes)
120000
Tiempo (micro-seg)
100000
80000
60000
40000
20000
0
0 2 4 6 8 10 12 14 16
Num.Procesos
1
Captulo 1
Introduccin
Aplicaciones con suficiente paralelismo como para hacer bueno el uso de mltiples
procesadores. El problema radica en identificar las porciones de programa que puedan
ser ejecutadas independiente y simultneamente en procesadores separados; sto en re-
alidad es complejo, ya que encontraremos aplicaciones que podran ser ejecutadas en
paralelo y sin embargo se ralentizan al ser paralelizadas en un sistema particular. Por
ejemplo, un programa que tarda 4 segundos en ser ejecutado en una sola mquina podra
tardar 1 segundo de procesamiento en cada uno de los cuatro procesadores disponibles
en una red, pero no lograramos nada si la coordinacin entre dichos procesadores tar-
dase ms de 3 segundos.
Implementaciones de algoritmos que o bien ya son paralelos (escritos para obtener las
ventajas del procesamiento paralelo) o bien esperamos paralelizar nosotros mismos,
codificando de nuevo al menos alguna de sus partes.
Si nos encontramos en alguno de estos casos veremos que el procesamiento paralelo puede
proporcionarnos el rendimiento de un supercomputador, aplicado a algunos programas que
realizan complejas operaciones u operan en grandes bloques de datos. Y lo que es ms, ello se
puede lograr con hardware relativamente barato. Adems es posible utilizar dichos sistemas
paralelos para la realizacin de otros trabajos cuando no estn ocupados con una tarea en
paralelo.
3
4 CAPTULO 1. INTRODUCCIN
Latencia
En un sistema de comunicacin llamamos latencia al mnimo tiempo empleado en transmi-
tir un dato, incluyendo la informacin de control necesaria para enviarlo o recibirlo. La latencia
es muy importante en procesamiento paralelo porque determina el tamao granular, es decir,
1.2. DEFINICIONES BSICAS 5
lo mnimo que debe tardar la ejecucin de un segmento de cdigo para que su ejecucin en
paralelo sea rentable, hablando en trminos de rendimiento computacional.
Bsicamente si un segmento de cdigo se ejecuta en menos tiempo del que se emplea en
transmitir su resultado (latencia), entonces ser ms rpido ejecutar dicho segmento de cdigo
de manera secuencial en el procesador que necesita dicho resultado; de este modo la ejecucin
secuencial evitara la sobrecarga en la comunicacin.
La organizacin de la memoria
El conjunto de instrucciones
Interrupciones y excepciones
Todos los microprocesadores Intel x86 (a partir del 80386) siguen el modelo IA32, inclui-
dos los ms recientes: Pentium, P6, Pentium 4, Pentium M y Xeon. AMD y Cyrix tambin
desarrollan multitud de procesadores compatibles con la arquitectura IA32.
Dado que Linux se desarroll en principio en procesadores IA32, y dado que sta fue la
manera en que se centr en el mercado, es conveniente usar dicha denominacin IA32 para
distinguir este tipo de procesadores de los PowerPC, Alpha, PA-RISC, MIPS, SPARC, etc.
RAID
Como en otras reas de rendimiento en los computadores, los diseadores de memorias de
disco reconocen que si uno de los componentes slo puede alcanzar un determinado lmite, se
puede conseguir una ganancia en prestaciones adicional usando varios de esos componentes
en paralelo. En el caso de las memorias de disco, esto conduce al desarrollo de conjuntos de
discos que operen independientemente y en paralelo.
Siguiendo este principio, el esquema RAID (Redundant Array of Independent Disks,
Conjunto Redundante de Discos Independientes) es una tecnologa sencilla para mejorar tanto
el ancho de banda como la fiabilidad de la E/S a disco. Consta de 6 niveles independientes,
desde 0 hasta 5. Estos niveles no implican una relacin jerrquica, pero designan diseos de
arquitecturas diferentes que poseen tres caractersticas comunes:
6 CAPTULO 1. INTRODUCCIN
Paralelismo Implcito
Procesadores
Segmentacin Mltiples ALUs Auxiliares
1. RAID es un conjunto de unidades fsicas de disco vistas por el sistema operativo como
una nica unidad lgica.
Los detalles de la caracterstica segunda y tercera cambian segn los distintos niveles de RAID.
RAID 0 no soporta la tercera caracterstica. Linux soporta los estndares RAID 0, 1, 4 y 5
adems de hardware RAID especializado.
Paralelismo Explcito
MISD SIMD
(Procesadores Vectoriales) (Procesadores Matriciales) MIMD
SISD (Single Instruction Single Data, Flujo de instrucciones nico y flujo de datos
nico): Un procesador interpreta una secuencia de instrucciones para operar con los
datos almacenados en una memoria. De este modo en cualquier momento slo se es-
t ejecutando una nica instruccin. Esta categora responde a la arquitectura de Von
Neumann, tambin llamados computadores serie escalares.
SIMD (Single Instruction Multiple Data, Flujo de instrucciones nico y flujo de datos
mltiple): Una nica instruccin es aplicada sobre diferentes datos al mismo tiempo. En
las mquinas de este tipo un cierto nmero de elementos procesadores son controlados
y sincronizados mediante una unidad de control. Cada elemento procesador tiene una
memoria asociada, de manera que cada instruccin es ejecutada simultneamente por
8 CAPTULO 1. INTRODUCCIN
todos los elementos procesadores pero sobre un conjunto de datos diferentes. Debido
a su utilidad en el procesamiento de matrices, a este tipo de mquinas se les llama
procesadores matriciales.
En la organizacin MIMD, los procesadores son de uso general, puesto que deben ser capaces
de procesar todas las instrucciones necesarias para realizar las transformaciones apropiadas de
los datos. Las arquitecturas MIMD se pueden subdividir adems segn la forma que tienen
los procesadores para comunicarse (figura 1.2). Si los procesadores comparten una memoria
comn, entonces cada procesador accede a los programas y datos almacenados en la memoria
compartida, y los procesadores se comunican unos con otros a travs de esa memoria. Este
tipo de sistemas se conocen como multiprocesadores fuertemente acoplados o simplemente
multiprocesadores.
Si cada procesador tiene una memoria dedicada, entonces cada elemento de proceso es
en s mismo un computador. La comunicacin entre los computadores se realiza a travs de
caminos fijos o mediante algn mecanismo de conmutacin de mensajes. Este tipo de sistemas
se conocen como multiprocesadores dbilmente acoplados o multicomputadores.
1.4. ARQUITECTURAS BASADAS EN PARALELISMO IMPLCITO 9
Solicitud de Solicitud de
instruccin operando Ms de Ms de
un operando un resultado
CAPTULO 1. INTRODUCCIN
Siguiente Cadena No
instruccin o vector interrupcin
Esperar Esperar
Nueva direccin
Descartar
La prdida de tiempo debida a la segunda razn puede reducirse haciendo una estimacin.
Una regla simple es la siguiente: cuando una instruccin de bifurcacin condicional pasa de
la etapa de captacin a la de ejecucin, la etapa de captacin capta la instruccin de memoria
que sigue a la instruccin de salto. Entonces si el salto no se produce no se pierde tiempo. Si
el salto se produce debe desecharse la instruccin captada y captar una nueva instruccin.
Aunque estos factores reduzcan la efectividad potencial del cauce de dos etapas, se produce
alguna aceleracin. Para conseguir una mayor aceleracin, el cauce debe tener ms etapas.
Consideremos la siguiente descomposicin del procesamiento de una instruccin:
Captar Operandos (Fetch Operands, FO): Captar cada operando de memoria. Los
operandos en registros no tienen que ser captados.
12 CAPTULO 1. INTRODUCCIN
1 2 3 4 5 6 7 8 9 10 11 12 13 14
FI DI CO FO EO WO
Instruccin 1
FI DI CO FO EO WO
Instruccin 2
FI DI CO FO EO WO
Instruccin 3
FI DI CO FO EO WO
Instruccin 4
FI DI CO FO EO WO
Instruccin 5
FI DI CO FO EO WO
Instruccin 6
FI DI CO FO EO WO
Instruccin 7
FI DI CO FO EO WO
Instruccin 8
FI DI CO FO EO WO
Instruccin 9
Con esta descomposicin las diversas etapas tienen casi igual duracin. Por motivos de clar-
idad asumamos que tienen igual duracin. La figura 1.6 muestra cmo un cauce de 6 etapas
puede reducir el tiempo de ejecucin de 9 instrucciones de 54 a 14 unidades de tiempo.
En realidad dicha simulacin es demasiado idealista. Para empezar no todas las instruc-
ciones recorren las 6 etapas del cauce; por ejemplo, una instruccin de carga no necesita la
etapa WO. Ello complica el hardware del cauce. Adems la mayora de los sistemas no per-
miten varios accesos a memoria simultneos, por lo que las etapas FI, FO y WO no podran
ejecutarse al mismo tiempo.
Otros factores como la dificultad en la ejecucin de la bifurcacin condicional ya comenta-
da, o la espera que se produce en ciertas etapas cuando no todas las etapas son de igual duracin
(lo cual es lo ms comn), complican el diseo y limitan la mejora de las prestaciones.
Segn toda esta discusin precedente, puede parecer que cuanto mayor sea el nmero de
etapas en el cauce, ms rpida ser la velocidad de ejecucin. Algunos diseadores del IBM
S/360 observaron dos factores que frustran este aparente sencillo patrn de diseo de altas
prestaciones, y que siguen siendo ciertos hoy da:
1. En cada etapa, hay algn gasto extra debido a la transferencia de datos de buffer a buffer
y a la realizacin de varias funciones de preparacin y distribucin.
1.4. ARQUITECTURAS BASADAS EN PARALELISMO IMPLCITO 13
Intel Pentium II & Pentium with MMX (MultiMedia eXtensions, Extensiones Multi-
media)
MDMX, pronunciado Mad Max (MIPS Digital Media eXtension, Extensiones Media
Digital MIPS)
A diferencia de lo que sucede con las tres firmas que aceptaron las primitivas MMX (In-
tel/AMD/Cyrix), todos los los dems conjuntos de instrucciones son difcilmente compara-
bles, y mutuamente incompatibles. Con el paso del tiempo las MMX tambin evolucionaron,
generandose nuevas extensiones como las EMMX de Cyrix, las 3DNow! de AMD o las SSE
y SSE2 de Intel, entre otras.
Operaciones sobre datos de tipo entero, cuanto ms pequeos mejor. Dos valores de 32
bits caben en un registro MMX de 64 bits, pero tambin lo hacen ocho caracteres de un
byte o incluso un tablero de ajedrez con valores de un bit. Cuando un dato ocupa varios
campos de un registro, determinadas operaciones (llamadas operaciones particionadas)
se ven afectadas por interacciones entre los campos debido al acarreo/resto, etc. Por ello,
cuanto menor sea el tamao de dichos enteros, ms limpias sern las operaciones y por
lo tanto mejor aprovecharemos el parelismo generado por la repeticin de ALUs.
Nota: En los juegos de instrucciones ms actuales, como lal EMMX, las 3DNow! o las
SSE2, tambin se admiten operaciones sobre datos de tipo flotante.
Es cierto que todas stas son restricciones muy duras, pero tambin es cierto que dicho tipo
de paralelismo se da en muchos algoritmos paralelos (no slo en aplicaciones multimedia).
Enfocada al tipo de paralelismo adecuado, la tecnologa SWAR puede ser ms eficiente que
utilizar SMPs o Clusters... y no cuesta nada utilizarla.
2. Usar las instrucciones MMX directamente. Esto es algo complicado por dos razones. El
primer problema es la portabilidad: no podremos ejecutar un programa as implementa-
do en procesadores que no tengan soporte para MMX. El segundo problema es que el
ensamblador para IA32 que utilicemos en Linux podra no soportar dichas instrucciones
MMX.
3. Utilizar un lenguage de alto nivel o un compilador que genere directamente las instruc-
ciones MMX apropiadas. En este sentido, en la Universidad de Purdue (URL [15]) se
ha desarrollado un lenguaje llamado SWARC y su compilador, el Scc, el cual est en
permanente fase experimental, aunque disponible. Como sus autores sealan, Scc no
pretende ser un producto de alta calidad en trminos de eficiencia; en cambio propor-
ciona una implementacin bsica del modelo SWAR.
Por otro lado tenemos los compiladores de Intel (URL [4]) de C++ y Fortran para Linux,
los cuales generan las instrucciones MMX deseadas de manera optimizada.
Flexibilidad
Fiabilidad
Disminuye costes
Existe un prspero mercado para estos procesadores. Aunque estos chips fueron generalmente
diseados para ser utilizados en sistemas de aplicacin especfica, tambin pueden ser utiliza-
dos como magnficos computadores paralelos auxiliares. Estos son los beneficios de utilizar
dichos procesadores como computadores paralelos auxiliares:
Muchos de ellos, como los Texas Instruments TMS320 y los Analog Devices SHARC
DSP, estn diseados para construir mquinas paralelas con poca o ninguna lgica de
enlace.
Son econmicos, especialmente por MIP o MFLOP. Incluyendo el coste de la lgica
de soporte bsica, suele decirse que su coste es una dcima parte de lo que cuesta un
procesador para PC con un rendimiento comparable.
No utilizan mucha energa ni desprenden demasiado calor. Esto significa que es posible
tener un grupo de estos chips alimentados por una fuente de alimentacin convencional
para PCs, y encerrarlos dentro del chasis del PC sin que se convierta en un horno.
Existen algunos elementos en los juegos de instrucciones de los DSP que los compi-
ladores de alto nivel no suelen usar de manera apropiada, como por ejemplo la operacin
Bit Reverse Addressing. Usando un sistema paralelo auxiliar, es posible compilar y
ejecutar la mayora del cdigo en el servidor, ejecutando aquellos algoritmos que hacen
un mayor consumo de tiempo en los DSPs. Dichos algoritmos pueden ser implementa-
dos mediante un cdigo cuidadosamente adaptado.
Los procesadores DSP no estn diseados para ejecutar un sistema operativo UNIX, y
generalmente no son muy buenos como procesadores de propsito general. Por ejemplo,
muchos de ellos no tienen hardware de manejo de memoria. En otras palabras, funcionan
mejor como clientes de un servidor de propsito ms general... como un PC bajo Linux.
Muchas tarjetas de sonido y modems incluyen procesadores DSP que pueden ser accedidos
mediante controladores de Linux sin ninguna dificultad. Lo difcil llega cuando utilizamos un
sistema paralelo auxiliar que contenga cuatro o ms procesadores DSP... y eso es exactamente
lo que nos interesa. Existen dos familias de procesadores DSP utilizados ampliamente para
procesamiento paralelo:
Texas Instruments TMS320 Muy populares durante mucho tiempo, resulta muy sencillo
construir un procesador paralelo basado en el TMS320. Existen versiones del TMS320
slo para enteros y tambin para punto flotante; los diseos ms antiguos usaban algn
tipo inusual del formato punto flotante de precisin simple, pero los nuevos modelos so-
portan los formatos IEEE. El antiguo TMS320C4x consigue hasta 80 Mflops usando el
formato punto flotante simple precisin especfico de Texas Instruments; en constraste,
el TMS320C67x proporciona hasta 1Gflop simple precisin o 420 Mflops doble pre-
cisin para los clculos en formato punto flotante IEEE. No slo es fcil configurar un
grupo de estos chips como un multiprocesador, si no que adems existen chips multi-
procesadores, como el TMS320C8x que combina en paralelo un procesador RISC mae-
stro con unidad de punto flotante IEEE a 100 Mflops con dos o cuatro DSPs esclavos
con unidad de entero.
18 CAPTULO 1. INTRODUCCIN
Analog Devices SHARC Estos chips pueden ser utilizados como un multiprocesador de 6
procesadores con memoria compartida y sin lgica de conexionado externa. Sistemas
mayores pueden ser construidos usando 6 enlaces de 4 bits por chip. Muchos de los
sistemas ms grandes son empleados en aplicaciones militares, y resultan econmicos.
En esta lnea la compaa Integrated Computing Engines, llamada en la actualidad Me-
dia100, ofrece una gama de tarjetas PCI llamadas GreeICE y BlueICE, sta ltima ms
actual. La primera versin (GreenICE) contiene una matriz de 16 procesadores SHARC
y es capaz de proporcionar picos de velocidad de hasta 1,9 Gflops usando el formato
IEEE simple precisin. BlueICE triplica dicha velocidad, y su coste no es elevado.
Virtual Computer Company Esta compaa ofrece una variedad de productos que usan FP-
GAs Xilinx dinmicamente reconfigurables basados en SDRAM. Destaca su tarjeta
Virtual ISA Proto Board de 8/16 bit para el puerto ISA.
E/S
E/S
Interconexin
E/S
Memoria Principal
2. Todos los procesadores comparten el acceso a una memoria global (comn). Tambin
pueden utilizarse memorias locales (privadas).
3. Todos los procesadores comparten el acceso a los dispositivos de E/S, bien a travs de
los mismos canales o bien a travs de canales distintos que proporcionan caminos de
acceso a los mismos dispositivos.
4. El sistema est controlado por un sistema operativo integrado que permite la interaccin
entre los procesadores y los programas.
ALU, registros y posiblemente una cach. Cada CPU tiene acceso a una memoria principal
compartida y a los dispositivos de E/S a travs de algn mecanismo de interconexin. Los
procesadores pueden comunicarse entre s a travs de la memoria (mensajes de informacin
de control almacenada en reas comunes de datos). Tambin es posible que las CPUs inter-
cambien seales directamente, como indican las lneas discontinuas. La memoria a menudo
se organiza de forma que sean posibles los accesos simultneos a bloques de memoria separa-
dos. En algunas configuraciones cada CPU puede tener tambin su propia memoria principal
privada y sus canales de E/S adems de los recursos compartidos.
1.5.1.1. Organizacin
Memoria Multipuerto
Direccionamiento: Debe ser posible distinguir los mdulos del bus para determinar la
fuente y el destino del mensaje.
Tiempo Compartido: Cuando un mdulo est controlando el bus, los dems mdulos no
tienen acceso al mismo y deben, si es necesario, suspender su funcionamiento hasta que
dispongan del bus.
La principal desventaja de la organizacin de bus compartido son las prestaciones. Todas las
referencias a memoria pasan por el bus. En consecuencia, la velocidad del sistema est limitada
por el tiempo de ciclo. Para mejorar las prestaciones es deseable equipar a cada CPU con una
memoria cach (figura 1.10). sta reducira considerablemente el nmero de accesos.
El uso de cachs introduce algunas consideraciones de diseo nuevas. Puesto que cada
cach local contiene una imagen de una parte de la memoria, si se altera una palabra en una
cach es posible que quede invalidada una palabra en otra cach. Para evitarlo debe avisarse a
las otras CPUs de que se ha producido una actualizacin de la memoria. Esto por lo general
complica el diseo del sistema.
Memorias Multipuerto
La organizacin de memorias multipuerto permite el acceso directo e independiente a
los mdulos de memoria desde cada una de las CPUs y los mdulos de E/S (figura 1.11).
Se necesitar un sistema de arbitraje para resolver los conflictos. El mtodo que se utiliza a
menudo para ello consiste en asignar prioridades fijas a cada puerto de memoria. Normalmente
22 CAPTULO 1. INTRODUCCIN
M1 M2 Mk
CPU1
E/S 1
CPUn
E/S m
La unidad de control central encauza las distintas secuencias de datos entre los distintos
mdulos independientes: CPU, memoria, E/S. El controlador puede almacenar temporalmente
peticiones y realizar las funciones de arbitraje y temporizacin. Adems puede transmitir men-
sajes de estado y control entre las CPUs y alertar sobre cambios en las cachs.
Puesto que toda la lgica de coordinacin de la configuracin de multiprocesador se con-
centra en la unidad de control central, las interfaces de E/S, memoria, y CPU no sufren cambios
esenciales. Esto proporciona la flexibilidad y simplicidad de conexin propias de la aproxi-
macin del bus compartido. Las desventajas clave de esta aproximacin son que la unidad de
control es bastante compleja y que representa un cuello de botella potencial para las presta-
ciones.
1.5. ARQUITECTURAS BASADAS EN PARALELISMO EXPLCITO 23
Antes de entrar a discutir aspectos ms tcnicos, debemos hacernos primero un par de cues-
tiones acerca de esta arquitectura que, si bien es una de las ms extendidas en procesamiento
paralelo, tiene un soporte relativamente reciente en Linux.
Funciona realmente SMP en Linux? Funciona. Adems es una opcin con una buena
relacin coste/rendimiento para paralelizar nuestro sistema, ya que una placa base con soporte
para varios procesadores y sus correspondientes micros normalmente elevar poco el precio
del sistema con respecto a un sistema uniprocesador.
En la mayora de las ocasiones para hacer que Linux se ejecute en dicho hardware slo
necesitamos realizar una instalacin de Linux con soporte para un solo procesador, y luego
recompilar el ncleo con la fila SMP=1 del fichero Makefile activa. Entonces informaremos
a lilo o nuestro gestor de arranque acerca del nuevo ncleo compilado, y a disfrutar. En cuanto
a rendimiento y estabilidad podemos decir son sistemas bastante firmes. En resumen, SMP
Linux realmente funciona.
24 CAPTULO 1. INTRODUCCIN
La siguiente cuestin es cunto soporte de alto nivel est disponible para escribir y ejecutar
programas paralelos con memoria compartida en SMP Linux. Actualmente existe bastante
software dedicado a este propsito. Por ejemplo, ahora podemos contar con una librera muy
completa para el manejo de hilos POSIX.
Aunque el rendimiento puede ser menor que utilizando mecanismos especialmente creados
para trabajar con memoria compartida, un sistema SMP Linux tambin puede usar la mayora
del software de procesamiento paralelo desarrollado originalmente para clusters de estaciones
de trabajo. Dicho tipo de software utiliza comunicacin va sockets, y puede funcionar en un
sistema SMP Linux e incluso en mltiples SMP conectados en red formando un cluster. De
todas formas la comunicacin va sockets implica mucha sobrecarga innecesaria en un sistema
SMP. Gran parte de esta sobrecarga se produce dentro del ncleo y en el manejo de interrup-
ciones; sto empeora el problema ya que SMP Linux generalmente slo admite un procesador
en el ncleo al mismo tiempo y el manejador de interrupciones est implementado de manera
que slo el procesador de arranque (boot processor) puede procesar interrupciones. A pesar
de ello el hardware de comunicacin de un SMP tpico es tan superior a la mayora de las
redes de comunicacin de los clusters, que el software diseado para dichos clusters a menudo
funcionar mejor en los sistemas SMP que en los clusters para los que fu creado.
En el resto de esta seccin estudiaremos qu tipo de sistemas SMP soporta Linux,
aclararemos qu es la Especificacin Multiprocesador de Intel, y haremos algunas observa-
ciones acerca del uso de la memoria cach y la configuracin del bus a utilizar.
Aunque los sistemas SMP han existido desde hace muchos aos, hasta hace poco cada
mquina tenda a implementar sus funciones bsicas de manera distinta al resto, de forma que
el soporte del sistema operativo no era portable. Lo que ha cambiado esta situacin es la MPS
(Intel MultiProcessor Specification, Especificacin Multiprocesador de Intel).
Los nicos sistemas que no cumplen la norma MPS ni la IA32 y tienen soporte bajo Linux
son las mquinas multiprocesador Sun4m de SPARC. Linux tiene soporte para la mayora de
las mquinas que cumplen la norma MPS 1.1 y MPS 1.4 con hasta 16 procesadores 486DX,
Pentium, Pentium Pro o superiores. Los procesadores IA32 que no tienen soporte son los
procesadores Intel 386, Intel 486SX/SLC (la falta de unidad de punto flotante interfiere en los
mecanismos SMP) y los procesadores AMD y Cyrix (requieren chips de soporte SMP que no
parecen estar disponibles por el momento).
Es importante entender que el rendimiento de los sistemas que cumplen la norma MPS
puede variar ampliamente. Como era previsto, una causa de las diferencias de rendimiento es
la velocidad del procesador: mayores frecuencias de reloj tienden a proporcionar sistemas ms
potentes, teniendo en cuenta que un procesador Pentium Pro es ms rpido que un Pentium. De
todas formas la norma MPS no especifica realmente cmo implementa el hardware la memoria
compartida; lo que s especifica es la manera en la que esta implementacin debe funcionar
desde el punto de vista del software. Esto significa que el rendimiento est tambin en funcin
de cmo interacta la implementacin de la memoria compartida con las caractersticas SMP
Linux y nuestro sistema particular.
La principal diferencia entre los sistemas que cumplen la norma MPS es la manera en la
que implementan fsicamente el acceso a la memoria compartida.
1.5. ARQUITECTURAS BASADAS EN PARALELISMO EXPLCITO 25
ux soporta el sistema que se desea emplear. Adems debemos tener en cuenta que actualmente
Linux permite slo un procesador en el ncleo al mismo tiempo, de manera que elegiremos
aquellas controladoras E/S que minimicen el tiempo requerido en el ncleo para realizar cada
operacin E/S. Para conseguir un alto nivel de rendimiento tendremos que considerar la posi-
bilidad de manejar la E/S de los dispositivos directamente, sin hacer llamadas al sistema... esto
no es tan difcil como parece, y tampoco debera comprometer la seguridad.
Es importante hacer notar que la relacin entre la velocidad del bus y la frecuencia de reloj
del procesador se ha vuelto ms difusa durante los ltimos aos. Actualmente no es extrao
encontrar sistemas con mayor frecuencia de reloj en el procesador y a la vez menor frecuencia
en el bus, en comparacin con otros sistemas. El ejemplo clsico de sto es el Pentium 133,
el cual usa generalmente un bus ms rpido que el Pentium 150, debido a la bsqueda de un
mayor rendimiento en varios bancos de prueba. Estos efectos se amplifican en los sistemas
SMP. De todos modos, en la mayora de los casos es ms importante tener un bus rpido.
1.5.2. Multicomputadores
Un sistema multicomputador es aquel que est formado por un conjunto de sistemas rel-
ativamente autnomos, en los que cada CPU dispone de su propia memoria principal y sus
canales de E/S.
En este tipo de sistemas, cada procesador tiene su propio espacio de memoria privado, que
no resulta visible para los otros procesadores. Segn sto los resultados y la informacin de
coordinacin debe pasarse entre los nodos a travs de una red de interconexin, usualmente en
forma de mensajes con un formato determinado.
Una de las motivaciones principales para el desarrollo de organizaciones de multicom-
putador es la de superar las limitaciones de escala de los multiprocesadores; de ste modo
los multicomputadores poseen una mayor escalabilidad. Se define como escalabilidad de un
sistema a su capacidad para responder a cargas de trabajo crecientes. En un sistema de proce-
samiento paralelo, se mide mediante el nmero de mquinas que pueden conectarse al sistema
sin que el rendimiento del sistema caiga. El objetivo es desarrollar una organizacin escalable
que pueda dar cabida a un amplio rango de nmero de procesadores.
Puesto que los procesadores en un multicomputador deben comunicarse mediante el in-
tercambio de mensajes, un elemento clave en el diseo es la red de interconexin, que debe
realizarse para operar lo ms eficientemente posible. En general existe un compromiso entre
la distancia mxima entre dos nodos y el nmero de conexiones fsicas que se desea en cada
nodo. Se han explorado varias tecnologas de interconexin para proporcionar escalabilidad y
hacer posible un comportamiento eficiente. A continuacin describiremos las topologas ms
extendidas:
Malla: La forma ms simple de una malla es una matriz bidimensional en la que cada
nodo se conecta a cuatro vecinos. En una malla simple de +* nodos, la distancia
mxima entre dos nodos es (-,.0/2143 . Si hay conexiones cclicas utilizando los nodos
de los bordes, la distancia mxima se reduce a (-,.'$)(53 . La organizacin en malla es
adecuada para ejecutar algoritmos orientados a matrices. La figura 1.13 ilustra una malla
de 3*3 nodos.
rbol: Las redes con topologa de rbol se han investigado para ejecutar algoritmos de
tipo divide-y-vencers, tales como los de bsqueda y ordenacin. La figura 1.14 ilustra
Clusters (o agrupamientos de nodos). Estos sistemas son grupos de nodos que se comu-
nican a travs de una interfaz de red. Deben tener un buena relacin coste/rendimiento,
por lo que en principio slo debemos utilizar para su montaje componentes hardware
relativamente comunes.
MPPs (Massively Parallel Processors, Procesadores Masivamente Paralelos). Estos
sistemas pueden distinguirse de los anteriores por las propiedades que los hacen Masi-
vamente Paralelos:
; Utilizacin de interconexiones de muy alto rendimiento
; Capacidad de E/S inmensa
; Tolerancia a fallos
Cada una de las mquinas de un cluster puede ser un sistema completo, que puede
ser utilizado para ejecutar una amplia gama de aplicaciones. sto lleva a pensar que el
procesamiento paralelo bajo clusters no es ms que una manera de aprovechar los ciclos
desperdiciados por los usuarios de PCs. Sin embargo no es tan sencillo aprovechar
estos ciclos sin ralentizar el trabajo primario para el que se utilizan dichas estaciones de
trabajo, pero puede hacerse.
La creciente popularidad de los sistemas en red hace que la mayora del hardware que
necesitamos para construir un cluster se fabrique a gran escala, con la correspondiente
bajada de precios como resultado. Tambin reduce el coste del sistema el hecho de que
slo necesitamos una consola (es decir, una tarjeta de vdeo, un monitor y un teclado)
para todo el cluster, aunque necesitemos conectar dicha consola a cada mquina al prin-
cipio para hacer una instalacin inicial; una vez hecha la instalacin, un PC bajo Linux
no necesita una consola para funcionar. En comparacin, los SMP y los Procesadores
Auxiliares pertenecen a mercados mucho ms restringidos, con lo que suelen tener pre-
cios ms elevados.
30 CAPTULO 1. INTRODUCCIN
Los clusters pueden llegar a formar sistemas verdaderamente amplios, no teniendo las
limitaciones de escala de los SMP. Mientras que es complicado encontrar sistemas SMP
compatibles con Linux con ms de 4 procesadores, podemos construir un cluster de
hasta 16 sistemas con casi cualquier hardware de red comn. Con no mucho trabajo,
cientos e incluso miles de mquinas pueden ser interconectadas. De hecho, Internet
entero puede ser vista como un cluster verdaderamente gigantesco.
La conclusin es que los clusters son econmicos, que los dispositivos necesarios para con-
struirlo estn disponibles, y que se pueden construir sistemas verdaderamente amplios; pero
por supuesto no todo son ventajas. Tambin existen una serie de problemas:
Excepto muy pocas excepciones, el hardware de red no est diseado para el proce-
samiento paralelo. Normalmente la latencia es muy alta y la velocidad de transferencia
de datos relativamente baja comparada con la proporcionada por los SMPs y los proce-
sadores auxiliares. Por ejemplo, la latencia casi nunca supera unos pocos microsegundos
en los SMPs, pero casi siempre es igual o mayor a cientos o miles de microsegun-
dos en un cluster. La velocidad de transferencia de datos en los SMP es mayor de 100
1.5. ARQUITECTURAS BASADAS EN PARALELISMO EXPLCITO 31
Mbytes/seg; aunque el hardware de red ms rpido (Gigabyte Ethernet) ofrece una ve-
locidad comparable, la mayora de las redes comunes son entre 10 y 1000 veces ms
lentas.
El rendimiento del hardware de red puede ser suficiente si es una red aislada para cluster.
Si la red no est aislada de otro trfico, el rendimiento puede ser sustancialmente peor.
Existe poco soporte de software para manejar un cluster como si se tratara de un slo
sistema. Por ejemplo, el comando ps nos informa de los procesos que concurren en un
sistema Linux, pero no nos informa de todos los procesos que concurren en el cluster de
sistemas Linux.
Con todo sto, podemos decir que los clusters ofrecen una gran potencia, pero dicha potencia
puede ser difcil de alcanzar en la mayora de las aplicaciones. Lo bueno es que existe una gran
cantidad de software que nos puede ayudar a conseguir un alto rendimiento en programas bien
adaptados a este entorno, y que existen redes diseadas especficamente para ampliar el rango
de programas que pueden alcanzar un buen rendimiento.
/home va NFS (Network File System, Sistema de Ficheros en Red) y podemos ejecutar
shell remoto (rsh) desde una mquina a otra, entonces podemos argumentar que tenemos un
sistema Beowulf simple de dos nodos.
BEOWULF CLASE I:
Este tipo de mquinas son construidas a base de componentes sacados del mercado comn.
La definicin estricta es que un Beowuf CLASE I debe se ensamblado a partir de componentes
que se puedan encontrar en al menos tres catlogos de publicidad nacionales o internacionales.
Las ventajas de los sistemas de CLASE I son:
Una clase no tiene porqu ser necesariamente mejor que la otra. Todo depende de nuestras
necesidades y nuestro presupuesto. sta clasificacin slo pretende que las discusiones sobre
los sistemas Beowulf sean coherentes y detalladas.
1.5. ARQUITECTURAS BASADAS EN PARALELISMO EXPLCITO 33
Las redes de ordenadores pertenecen a un campo en pleno auge. El desarrollo de las tec-
nologas y la aparicin de nuevos productos hacen que cada vez est ms al alcance de todos
generar procesamiento paralelo a travs de un cluster. Sin embargo no existe una tecnologa
de red que resuelva todos los problemas de la mejor manera; de hecho, la variedad de posibil-
idades, costes y rendimientos es tremenda.
A continuacin definiremos las caractersticas de algunos de los tipos de red ms popu-
lares:
ATM
Interfaz: PCI
Al menos en parte podra decirse que la tecnologa ATM (Asynchronous Transfer Mode,
Modo de Transferencia Asncrona) es el futuro. ATM no tiene un coste elevado y es ms rpida
que Fast Ethernet; adems puede ser usada a travs de las largas distancias que las compaas
de telfono pueden cubrir. El protocolo de red ATM est diseado para proporcionar una in-
terfaz software con poca sobrecarga y un manejo ms eficiente de los mensajes pequeos y de
las comunicaciones en tiempo real (p.ej. vdeo y audio digital). Adems es una de las redes
con mayor velocidad de transferencia de datos que Linux soporta actualmente. Lo malo es que
no es una tecnologa barata y que an existen algunos problemas de compatibilidad entre los
distintos fabricantes.
Ethernet
Interfaz: PCI
Fast Ethernet
Soporte bajo Linux: controladores del ncleo
Latencia: 80 <>=&?BA
Interfaz: PCI
Aunque existen varias tecnologas que se llaman a s mismas Fast Ethernet este trmino se
usa principalmente para referirnos a las Ethernet de 100 Mb/seg basadas en hub que son com-
patibles con los dispositivos y cables utilizados para las Ethernet 10 BaseT de 10 Mb/seg.
Como podamos esperar esta tecnologa posee un enorme mercado, con lo cual su relacin
prestaciones/precio es bastante mejor que en otras configuraciones. Sin embargo la trampa
est en que al dividir el ancho de banda de un nico bus de 100 Mb/seg entre un grupo de
ordenadores mediante un hub compartido, el rendimiento puede quedar por debajo del que
obtendramos al utilizar una Ethernet de 10 Mb/seg con un hub dedicado, la cual proporciona
a cada ordenador una conexin completa de 10 Mb/seg. Los hubs dedicados que proporcionan
100 Mb/seg a cada computador simultneamente son caros, aunque sus precios bajan a diario y
proporcionan un rendimiento muy superior al que obtenemos utilizando los hubs compartidos.
Gigabit Ethernet
Soporte bajo Linux: controladores del ncleo
Interfaz: PCI
En principio Gigabit Ethernet no tiene buenas razones tecnolgicas para ser llamada Ethernet.
Sin embargo dicho nombre refleja la intencin de que en un futuro sea una tecnologa barata
y destinada a un amplio mercado, con soporte nativo para IP. Sin embargo su precio actual
hace que no resulte econmica su utilizacin. Al contrario que en otras tecnologas Ethernet,
Gigabit Ethernet ofrece un control a bajo nivel que aporta fiabilidad a dicho tipo de red. Los
FDRs (Full Duplex Repeaters, Repetidores Full Duplex) multiplexan las lneas utilizando
buffers y control de flujo localizado para mejorar el rendimiento. La mayora de los hubs
dedicados estn siendo construidos con nuevos mdulos interfaces para que sean compatibles
con los dispositivos Gigabit. Existe un driver bajo Linux para la interfaz Yellowfin G-NIC de
Packet Engines (URL [13]). Los primeros test bajo Linux arrojaron un ancho de banda unas
2,5 veces superior a la 100 Mb/seg Fast Ethernet; en las redes Gigabit la configuracin del bus
PCI es un factor crtico.
Interfaz: PCI
FireWire (URL [2]), el estndar IEEE 1394-1995, est destinado a ser la red digital de bajo
coste y alta velocidad para consumidores en general. Aunque suela promocionarse como la
interfaz a la cual conectar cmaras de vdeo digitales a nuestro ordenador, FireWire est pen-
sada para ser utilizada en aplicaciones que van desde ser el sustituto de SCSI hasta conectar
los componentes de reproduccin de vdeo y audio. Permite conectar hasta 64k dispositivos
utilizando cualquier topologa que haga uso de buses y puentes sin ciclos, y automticamente
detecta los componentes cuando son conectados o desconectados (conexin en caliente). So-
porta mensajes cortos con baja latencia as como trasmisiones asncronas al estilo ATM (usadas
para mantener sincronizados los mensajes multimedia). Adaptec tiene productos FireWire que
permiten la conexin de hasta 63 dispositivos a una tarjeta PCI. Aunque FireWire no ser la
red de mayor ancho de banda disponible dentro de un tiempo, el mercado de consumo (que
puede abaratar bastante los precios) y el soporte para mensajes con baja latencia hacen de sta
una de las mejores tecnologas para construir clusters de PCs bajo Linux utilizando redes de
paso de mensajes, al menos durante los prximos aos.
PLIP
Soporte bajo Linux: controladores del ncleo
Interfaz: SPP
Slo por el coste de un cable LapLink, PLIP (Parallel Line Interface Protocol, Protocolo de
Interfaz de Lnea Paralela) permite comunicar dos mquinas Linux a travs del puerto paralelo
estndar utilizando software basado en sockets. En trminos de velocidad de transferencia de
datos, latencia y escalabilidad, no es una tecnologa de redes seria; sin embargo, su bajsimo
coste y alta compatibilidad lo hacen til. El controlador forma parte de las distribuciones
estndar del ncleo de Linux.
SLIP
Interfaz: RS232C
Aunque SLIP (Serial Line Interface Protocol, Protocolo de Interfaz de Lnea Serie) est
situado al final del espectro de rendimiento, SLIP (o CSLIP o PPP) permite establecer comu-
nicacin mediante sockets entre dos ordenadores a travs del puerto serie RS232 ordinario.
Los puertos RS232 pueden ser conectados mediante un cable serie null-modem RS232 o
incluso a travs de un mdem. En cualquier caso la latencia es alta y la velocidad de transfer-
encia de datos baja, de manera que SLIP slo debe ser usado cuando no exista otra alternativa
disponible. Sin embargo es mejor que nada; adems la mayora de los PCs tienen dos puertos
RS232, de manera que podemos crear una red conectando un grupo de ordenadores de manera
linear o en topologa de anillo. Tambin existe un software de comparticin llamado EQL.
USB
Interfaz: USB
UNIDAD DE
CONTROL
DISTRIBUIDOR DE LA RED
PE PE PE PE
PE PE PE PE
PE PE PE PE
ELEMENTOS PROCESADORES
USB (Universal Serial Bus, Bus Serie Universal) (URL [20]) es un bus serie que propor-
ciona la velocidad de una interfaz ethernet convencional. Soporta conexin en caliente (pode-
mos enchufar cualquier dispositivo USB con el ordenador encendido) y puede manejar si-
multneamente hasta 127 perifricos que van desde teclados hasta cmaras de videoconferen-
cia.
En realidad no existe una especificacin clara sobre la metodologa a seguir para conectar
varios PCs mediante este puerto; sin embargo la importancia del estndar y su comodidad
hacen de esta interfaz una alternativa a tener en cuenta. Se puede decir que USB es la versin
barata y de bajo rendimiento de FireWire que podemos utilizar en casi cualquier PC.
instrucciones escalares y de control de flujo como saltos, etc. se ejecutan en la UC, mientras
que las instrucciones aritmtico-lgicas, las de enrutado de datos y otras operaciones locales
son transmitidas a los EPs y ejecutadas por stos sobre su memoria local. Respecto a los datos,
los EPs tienen sus propios canales de E/S.
De esta manera, la instruccin que ejecutan simultneamente los EPs es la misma, mientras
que los datos sern los de la memoria de cada EP, y por tanto sern diferentes. Por todo ello
un procesador slo requiere un nico programa para controlar todos los EPs.
La idea de utilizacin de los procesadores matriciales es la de explotar el parlalelismo en
los datos de un problema ms que la de paralelizar la secuencia de ejecucin de las instruc-
ciones. El problema se paraleliza dividiendo los datos en particiones sobre las que se pueden
realizar las mismas operaciones. Un tipo de datos altamente particionable es el formado por
vectores y matrices, siendo ste ltimo el tipo de datos hacia el cual estn ms orientadas este
tipo de arquitecturas. Por ello a estos procesadores se les llama matriciales.
Aparte del propio paralelismo obtenido por el clculo en paralelo sobre los elementos de
un vector o matriz, la propia red de interconexin entre los EPs reduce el tiempo de ejecucin
en determinadas tareas. Dicha red se encarga de conectar a los EPs con sus propios vecinos.
De esta manera la topologa de la red de interconexin determinar qu tipo de clculos sacan
el mximo partido a determinado procesador matricial. Por ejemplo, en el tratamiento de im-
genes, donde muchas operaciones son clculos entre pxels vecinos, una arquitectura matricial
con una topologa adecuada paralelizara con facilidad dichos clculos.
Un caso particular de los procesadores matriciales son los Procesadores Asociativos o As-
sociative Processors cuya principal caracterstica es la utilizacin de memorias asociativas.
La ejecucin de la misma operacin sobre distintas informaciones se usa en la simulacin
de condiciones climatolgicas, control de trfico areo, operaciones con matrices, etc. Ejem-
plos de computadores con esta organizacin son el ILLIAC IV, PEPE, BSP STARAN y ICL-
DAP.
cin de ALUs y de su segmentacin. Sin embargo es la segmentacin la que hace que varias
instrucciones puedan ser ejecutadas al mismo tiempo sobre un determinado vector.
Dependiendo del tipo de procesador vectorial cada ALU ser totalmente funcional o bien
se encargar de realizar una funcin especfica, como suma/resta, multiplicacin, divisin, etc.
Adems debe existir una unidad de Carga/Almacenamiento encargada de leer los vectores
desde la memoria y almacenarlos en ella.
La diferencia entre este tipo de procesadores y los matriciales es que mientras los ma-
triciales son comandados por las instrucciones, los vectoriales son comandados por flujos de
datos continuos. As mientras en los procesadores matriciales slo existe un flujo de instruc-
ciones entre la unidad de control y los elementos procesadores, en los computadores vectori-
ales tenemos dos flujos separados: el de instrucciones y el de datos. En este caso, el procesador
escalar enva un flujo de datos continuo hacia el procesador vectorial, indicndole la operacin
que debe realizar mediante el flujo de instrucciones. En la figura 1.18 mostramos el diseo tpi-
co de un procesador vectorial con registros.
40
Procesador escalar
Cauces funcionales
escalares
CAPTULO 1. INTRODUCCIN
Almacenamiento Computador vectoriales
masivo anfitrin
E/S Usuario Cauce func. vectorial
Una vez resuelto el sistema de intercomunicacin fsica de los equipos, deben abordarse
los mecanismos para lograr la coordinacin entre los procesadores.
Bsicamente existen dos modelos de interaccin entre procesadores: paso de mensajes y
memoria compartida. Dichos modelos se pueden utilizar de varias formas. Como en todas las
reas de la programacin, existen varios mtodos para alcanzar el objetivo:
Por un lado podemos implementar dichos modelos a bajo nivel, utilizando cdigo mquina,
ensamblador o compiladores de lenguajes no especializados. Dicha alternativa nos per-
mite desarrollar un cdigo ms adaptado y optimizado para el hardware que vayamos a
usar.
Por otro lado podemos emplear utilidades de desarrollo de software paralelo, que son
bsicamente facilidades para la programacin a alto nivel de aplicaciones distribuidas
(compiladores, libreras, etc.) y herramientas para su ejecucin y monitorizacin. Dichas
utilidades de programacin permiten al programador generar de manera automtica co-
municacin mediante paso de mensajes y memoria compartida sin que deba preocuparse
de los detalles. Las ventajas de emplear dichas utilidades son su facilidad de manejo y
la portabilidad de los algoritmos desarrollados.
43
44 CAPTULO 2. HERRAMIENTAS DESARROLLO SOFTWARE PARALELO
Todas las unidades de proceso pueden ser origen o destino de mensajes en cualquier mo-
mento y todas pueden intercambiar datos entre s. El enrutamiento de mensajes se le deja al
sistema operativo y el nmero de saltos o puntos de intercomunicacin por los que el mensaje
debe pasar dependern de la topologa de la mquina en uso. Este sistema puede utilizarse al-
canzando un rendimiento ptimo en multicomputadores y en multiprocesadores con memoria
distribuida.
Aunque la sobrecarga en la comunicacin (latencia) en cada paso de mensaje puede ser
alta normalmente hay pocas restricciones sobre la cantidad de informacin que pueden con-
tener dichos mensajes. De este modo si contamos con un ancho de banda amplio el paso de
mensajes puede ser un mtodo muy efectivo para transmitir grandes bloques de datos de entre
los procesadores.
Sin embargo para minimizar la necesidad de costosas operaciones de paso de mensajes los
datos deben estar distribuidos entre los procesadores, de modo que el conjunto de datos refer-
enciados por cada procesador est en su memoria local. A sto se le conoce como distribucin
de datos (data layout).
Una gran ventaja del paso de mensajes reside en su elevada portabilidad, puesto que por
lo general consiste en el protocolo de comunicaciones estndar de la red ms las rutinas de
sincronizacin y comunicacin de procesos, que se ejecutan sobre dicho protocolo. Adems
dicho modelo puede usarse en una red de computadores heterognea.
En un sistema multitarea como Linux los sockets son la base para la comunicacin me-
diante paso de mensajes. Un socket es un punto de comunicacin que se comunica con otro
socket para enviarle mensajes. Son bidireccionales, los hay de varios tipos y nos permiten
comunicarnos con un proceso que est en otro ordenador o en el mismo.
Cuando queremos recibir datos por un socket creamos uno y escuchamos por l hasta
que nos lleguen datos. En caso de querer enviar datos lo que hacemos es crear un socket,
cumplimentar los datos de la direccin de destino y enviar los datos al otro socket a travs del
nuestro. Por consiguiente para que dos procesos se comuniquen mediante sockets cada uno
debe crear el suyo.
Para transmitir datos entre nodos bajo Linux usaremos normalmente la familia de sock-
ets AF_INET. Este tipo de sockets se usan principalmente en redes IP, como por ejemplo la
extensa Internet. En estas redes los ordenadores se identifican mediante una direccin IP que
es propia de cada nodo, o sea, no existen dos nodos con la misma direccin IP en una misma
red. De esta manera los sockets pueden ser identificados unvocamente en toda la red. Ello es
2.1. MODELOS DE INTERACCIN ENTRE PROCESADORES 45
importante ya que, conociendo todos los datos necesarios, podemos ponernos en contacto con
cualquier punto de comunicacin de cualquier nodo de nuestra red.
Los datos que identifican unvocamente a estos puntos de transmisin son:
La direccin IP del nodo en donde reside el proceso que est usando ese punto de conex-
in.
El nmero del puerto. El puerto es un nmero entero sin signo de 16 bits cuyo propsito
es el de permitir que en un ordenador puedan existir 65536 puntos posibles de comu-
nicacin para cada tipo de socket AF_INET. Esto es suficiente para que no suponga un
lmite (en la prctica) para el nmero de puntos de comunicacin diferentes que puede
haber al mismo tiempo en un ordenador.
Para referirnos a un socket usaremos la direccin de socket. Las direcciones de socket son
diferentes segn la familia. Llevan todos un primer parmetro que identifica la familia de
socket y luego, segn sta, los datos correspondientes.
En el caso de la familia de sockets para redes IP estos datos son la direccin del ordenador
y el nmero de puerto. Los tipos de sockets de esta familia son dos, que se corresponden
con los dos tipos transmisin de datos en una red de paquetes, y son los que definiremos a
continuacin.
Datagramas (UDP)
Es el modelo ms sencillo y tambin el menos robusto. Consiste en enviar paquetes de
datos a un destino determinado. Cada paquete que enviamos ha de llevar la direccin de desti-
no y es guiado por la red de manera independiente. Estos paquetes con la direccin de destino
incluida se llaman datagramas. Los datagramas tienen una longitud limitada, por lo que los
datos que enviamos no pueden exceder de esa longitud. Adems hay ciertos problemas deriva-
dos del hecho de que los paquetes transiten por una red, que se agravan cuanto ms extensa
sea sta:
Orden de los paquetes. En una red de rea extensa los paquetes atraviesan varios nodos
para llegar a su destino. En estos nodos los algoritmos de enrutamiento no suelen ser
estticos. De este modo para llegar al mismo destino un paquete puede seguir diferentes
rutas, debido a que en un momento dado un nodo puede decidir encaminar el paquete
por un sitio y luego por otro. Esto obedece sobre todo a causas derivadas del control de
la congestin (el congestionamiento de las lneas influye a la hora de determinar por cual
de ellas se enva el paquete) y de la robustez del sistema (si un nodo se cae se encaminan
los paquetes por otro sitio). La consecuencia es que dos paquetes que fueron enviados
pueden llegar desordenados por haber seguido distintas rutas.
46 CAPTULO 2. HERRAMIENTAS DESARROLLO SOFTWARE PARALELO
Estos problemas no suceden si las transmisiones se realizan dentro de una red de rea local, ya
que no es necesario encaminar los paquetes. El protocolo de soporte sobre IP que sigue este
esquema se llama UDP (User Datagram Protocol, Protocolo de Datagramas de Usuario) y
por consiguiente hablaremos de UDP/IP.
Consiste en realizar una conexin entre las dos partes. Tiene la desventaja de que se pierde
tiempo en establecer la conexin, pero despus la comunicacin es fiable, ordenada y utiliza
cabeceras ms pequeas.
El protocolo de soporte sobre IP que sigue este esquema se denomina TCP (Transfer Data
Protocol, Protocolo de Transferencia de Datos); hablaremos de flujos TCP/IP debido a que se
establece un canal por donde los datos fluyen de manera continua y ordenada.
El protocolo TCP es bastante ms complejo que UDP e implementa segmentacin, lo
cual nos permite pasar datos de gran longitud. Dichos datos sern segmentados en partes ms
pequeas, enviados conservando el orden y ensamblados en el destino.
Hilo 1
Hilo 2
Hilo sencillo Hilo sencillo
Hilo 3
Hilo 4
Hay dos modelos fundamentales usados comnmente en programacin con memoria com-
partida: Todo Compartido y Algo Compartido. Ambos modelos permiten la comunicacin
entre procesadores mediante lecturas y escrituras de/en la memoria compartida; la diferencia
consiste en que el modelo Todo Compartido ubica todos los datos en memoria compartida,
mientras que el modelo Algo Compartido requiere que el usuario indique explcitamente qu
datos pueden ser compartidos y cules son privados para un nico procesador.
Qu modelo de datos debemos usar? Lgicamente debemos usar el modelo que mejor se
adapte a nuestras necesidades, aunque muchas veces sto es slo cuestin de gustos. Mucha
gente prefiere el modelo Todo Compartido porque no hay necesidad de identificar qu datos
deben ser compartidos en el momento de su declaracin... simplemente bloqueamos los acce-
sos potencialmente conflictivos a objetos compartidos para asegurarnos de que slo un proce-
sador tenga acceso en un momento dado. De nuevo, sto no es tan simple... por ello mucha
gente prefiere la relativa seguridad del modelo Algo Compartido.
48 CAPTULO 2. HERRAMIENTAS DESARROLLO SOFTWARE PARALELO
Ninguno de estos dos tipos de problemas son usuales cuando se emplea el modelo Algo Com-
partido, debido a que slo los datos explcitamente marcados son compartidos. Adems resulta
obvio que el modelo Todo Compartido slo funciona si todos los procesos tienen exctamente
la misma imagen de la memoria; de este modo no es posible usar el modelo Todo Compartido
con diferentes imgenes del cdigo (slo se puede usar SPMD, no MIMD en general).
El soporte ms comn en programacin bajo el modelo Todo Compartido son las libreras
de hilos. Los hilos son esencialmente procesos poco pesados que podran no ser planificados
de la misma manera que los procesos UNIX y, lo que es ms importante, pueden tener acceso
compartido a un mismo mapa de memoria.
La primera librera que soport paralelismo en SMP Linux es la ahora algo obsoleta
bb_threads, una librera muy pequea que utiliza la llamada clone() para crear nuevos pro-
cesos planificados independientemente que comparten un mismo espacio de direcciones. Los
computadores SMP Linux pueden ejecutar mltiples hilos de este tipo en paralelo, ya que en
este caso cada hilo es en realidad un proceso Linux completo; la desventaja es que no obten-
emos la misma planificacin optimizada que realizan otras libreras de hilos.
Ms recientemente ha sido desarrollada una versin de la librera de hilos POSIX. Esta
librera, LinuxThreads, es claramente la librera preferida para ser usada bajo el modelo Todo
Compartido bajo SMP Linux. Dicha librera de hilos POSIX est bien documentada. Ahora
el principal problema es que la librera tiene muchos detalles por definir y acabar, de modo
que LinuxThreads est todava en proceso de desarrollo. Adems tenemos el problema de
2.2. UTILIDADES DE DESARROLLO 49
La verdadera posicin de los objetos en memoria compartida puede ser difcil de estable-
cer, especialmente para los objetos ubicados en una pila. Por ejemplo, puede ser nece-
sario ubicar explcitamente objetos compartidos en un segmento de memoria separado,
requiriendo de este modo rutinas de ubicacin en memoria separada e introduciendo
punteros indirectos extra en cada referencia.
Hoy da existen dos mecanismos muy parecidos para permitir a grupos de procesos de Lin-
ux tener espacios de memoria independientes, compartiendo slo un pequeo segmento de
memoria. Asumiendo que no hemos excluido el System V IPC en el momento de la con-
figuracin de nuestro sistema Linux, tendremos un mecanismo muy portable que ha venido
a denominarse System V Shared Memory. La otra alternativa es una utilidad de mapeo de
memoria cuya implementacin vara ampliamente entre distintos sistemas UNIX: la llamada
al sistema mmap().
2.2.2. MPI
MPI (Message Passing Interface, Interfaz de Paso de Mensajes) es un estndar que define
la sintaxis y la semntica de las funciones contenidas en una librera de paso de mensajes,
diseada para ser usada en programas que exploten la existencia de mltiples procesadores.
Aunque la interfaz no cambie, puede implementarse tanto en sistemas que utilicen paso de
mensajes, como sistemas de memoria compartida.
La primera versin de MPI fu desarrollada en 1993-1994 por un grupo de investigadores
al servicio de la industria, el gobierno y el sector acadmico. Debido al apoyo recibido MPI es
relativamente el nuevo estndar para la programacin de procesadores paralelos basado en el
paso de mensajes, tomando el testigo de PVM.
Sin embargo existen frecuentes dudas y discusiones por parte de los usuarios acerca de cul
es el estndar a utilizar. As pues haremos un resumen de las diferencias ms caractersticas
entre los sistemas ms utilizados, PVM y MPI:
Entorno de Ejecucin:
Simplemente PVM tiene uno definido, mientras que MPI no especifica cmo debe ser
implementado. As el inicio de la ejecucin de un programa PVM ser realizado de
manera idntica en cualquier plataforma, mientras que para MPI depende de la imple-
mentacin que estemos utilizando.
MPI_Send() MPI_Recv()
MPI MPI
SO SO
ms all del modelo de paso de mensajes, como el acceso paralelo a ficheros de E/S o el
acceso a memoria remota, entre otros muchos ejemplos.
MPI no est concebido para ser una infraestructura software aislada y autosuficiente para ser
usada en procesamiento distribuido. MPI no necesita planificacin de procesos, herramientas
de configuracin de la plataforma a usar, ni soporte para E/S. Como resultado MPI es imple-
mentado normalmente como interfaz de comunicaciones, utilizando las facilidades ofrecidas
por el sistema que vayamos a usar, tal como se indica en la figura 2.3 (comunicacin va sock-
ets, operaciones de memoria compartida, etc). ste escenario es ideal para que los programas
PVM sean portados a MPI, de manera que se aproveche el alto rendimiento de comunicacin
que ofrecen algunas compaas en sus arquitecturas.
Dado que ste es el estndar en el que nos basaremos para el desarrollo del presente doc-
umento, en el captulo 3 haremos una descripcin ms elaborada de sus caractersticas.
2.2.3. P4
El sistema p4 es una librera de macros y funciones desarrollada por el Argonne National
Laboratory 1 destinadas a la programacin de una gran variedad de mquinas paralelas. El
sistema p4 soporta tanto el modelo de memoria compartida (basado en monitores) como el
modelo de memoria distribuida (basado en paso de mensajes).
Para el modelo de memoria compartida, p4 proporciona un conjunto de monitores as
como funciones desarrolladas para crearlos y manipularlos; un monitor es un mecanismo de
sincronizacin de procesos en sistemas con memoria compartida. Para el modelo de memoria
distribuida, p4 proporciona operaciones de envo y recepcin, y un mtodo de administracin
1
Desarrollador de la implementacin MPICH, apndice A
52 CAPTULO 2. HERRAMIENTAS DESARROLLO SOFTWARE PARALELO
Dos cosas son notables en lo que se refiere al mecanismo de administracin de los procesos
en p4. Primero, existe la nocin de procesos maestros y procesos esclavos, y pueden formarse
jerarquas multinivel para implementar el denominado modelo de cluster de procesamiento.
Segundo, el principal modo de creacin de procesos es esttico, a travs del fichero de con-
figuracin; la creacin dinmica de procesos es posible slo mediante procesos creados es-
tticamente que deben invocar una funcin p4 que expande un nuevo proceso en la mquina
local. A pesar de estas restricciones una gran variedad de paradigmas de aplicacin pueden ser
implementados en el sistema p4 de una manera bastante sencilla.
El paso de mensajes es conseguido en el sistema p4 a travs del uso de primitivas send
y receive tradicionales, con casi los mismos parmetros que los dems sistemas de paso de
mensajes. Algunas variantes han sido proporcionadas por cuestiones semnticas, como el in-
tercambio heterogneo y las transferencias bloqueantes o no bloqueantes. Sin embargo una
proporcin significativa de la administracin del buffer y su carga se le deja al usuario. Aparte
del paso de mensajes bsico, p4 ofrece tambin una variedad de operaciones globales incluyen-
do broadcast, mximo y mnimo globales, y sincronizacin por barrera.
2.2.4. Express
En contraste con lo que sucede con otros sistemas de procesamiento paralelo descritos
en esta seccin, Express es una coleccin de herramientas que individualmente dirigen varios
aspectos del procesamiento concurrente. Dicho paquete software es desarrollado y comercial-
izado por Parasoft Corporation, una compaa creada por algunos miembros del proyecto de
procesamiento concurrente de Caltech.
La filosofa de Express se basa en comenzar con la versin secuencial de un algoritmo
y aplicarle un ciclo de desarrollo recomendado, para as llegar a la versin paralela de dicho
algoritmo de manera ptima. Los ciclos de desarrollo tpicos comienzan con el uso de la her-
ramienta VTOOL, una aplicacin grfica que permite mostrar por pantalla el progreso de los
algoritmos secuenciales dinmicamente. Puede mostrar actualizaciones y referencias a estruc-
turas de datos individuales, con la intencin de demostrar la estructura de los algoritmos y
proporcionar la informacin necesaria para su paralelizacin.
En relacin con este programa tenemos la herramienta FTOOL, que proporciona un anli-
sis en profundidad de los programas. Dicho anlisis incluye informacin acerca del uso de
variables, la estructura de flujo de control, etc. FTOOL opera tanto en las versiones secuen-
ciales de los algoritmos como en las paralelas. Una tercera herramienta llamada ASPAR es
2.2. UTILIDADES DE DESARROLLO 53
usada entonces; esta herramienta es un paralelizador automtico que convierte programas se-
cuenciales escritos en C o Fortran en sus versiones paralelas o distribuidas, usando los modelos
de programacin Express.
El ncleo del sistema Express es un conjunto de libreras de comunicacin, E/S y grficos
paralelos. Las primitivas de comunicacin son parecidas a las encontradas en otros sistemas de
paso de mensajes e incluyen una variedad de primitivas para realizar operaciones globales y de
distribucin de datos. Las funciones de E/S extendida permiten la E/S paralela. Un conjunto de
funciones similar es proporcionado para mostrar grficos de mltiples procesos concurrentes.
Express contiene adems la herramienta NDB, un depurador paralelo que utiliza comandos
basados en la popular interfaz dbx.
2.2.5. Linda
Linda es un modelo concurrente de programacin fruto de la evolucin de un proyecto de
investigacin de la Universidad de Yale. El concepto principal en Linda es el espacio de tuplas,
una abstracin a travs de la cual se comunican los procesos. Este tema central de Linda ha
sido propuesto como paradigma alternativo a los dos mtodos tradicionales de procesamiento
paralelo: el basado en memoria compartida, y el basado en paso de mensajes. El espacio de
tuplas es esencialmente una abstraccin de la memoria compartida/distribuida, con una difer-
encia importante: los espacios de tuplas son asociativos. Tambin existen otras distinciones
menores. Las aplicaciones utilizan el modelo Linda introduciendo en los programas secuen-
ciales estructuras que manipulan el espacio de tuplas.
Desde el punto de vista de las aplicaciones, Linda es un conjunto de extensiones para
lenguajes de programacin que facilitan la programacin paralela. Proporciona una abstrac-
cin de la memoria compartida que no requiere la existencia de hardware especfico que com-
parta memoria fsicamente.
El trmino Linda se refiere a menudo a implementaciones especficas software que sopor-
tan el modelo de programacin Linda. Este tipo de software establece y mantiene espacios de
tuplas, siendo utilizado en conjuncin con libreras que interpretan y ejecutan primitivas Lin-
da. Dependiendo del entorno (mutiprocesadores con memoria compartida, sistemas de paso
de mensajes, etc.) el macanismo de espacio de tuplas ser implementado utilizando diferentes
tcnicas con varios grados de eficiencia.
Recientemente ha sido propuesto un nuevo esquema relacionado con el proyecto Linda.
Este esquema, denominado Pirhana, propone un planteamiento revolucionario en el proce-
samiento concurrente: los recursos computacionales (vistos como agentes activos) eligen a los
procesos basndose en su disponibilidad y conveniencia. Este esquema puede ser implemen-
tado en mltiples plataformas y es conocido como Sistema Pirhana o Sistema Linda-Pirhana.
54 CAPTULO 2. HERRAMIENTAS DESARROLLO SOFTWARE PARALELO
Parte II
Gua MPI
55
Captulo 3
El Estndar MPI
MPI (Message Passing Interface, Interfaz de Paso de Mensajes) es un estndar que de-
fine la sintaxis y la semntica de las funciones contenidas en una librera de paso de mensajes
diseada para ser usada en programas que exploten la existencia de mltiples procesadores.
Dicha librera puede ser utilizada por una amplia variedad de usuarios para implementar pro-
gramas que utilicen paso de mensajes.
Desde la finalizacin de su primera versin en Junio de 1994, MPI ha sido ampliamente
aceptado y usado. Existen implementaciones muy estables y eficientes, incluyendo algunas de
dominio pblico. Adems dichas implementaciones estn disponibles para un amplia variedad
de mquinas. Gracias a ello MPI ha alcanzado uno de sus principales objetivos: darle credibil-
idad al procesamiento paralelo. Ahora las companas y los investigadores tienen una manera
sencilla y segura para desarrollar programas paralelos portables de paso de mensajes.
3.1. Origen
El paso de mensajes es un paradigma de programacin ampliamente utilizado en computa-
dores paralelos, especialmente en aquellas con memoria distribuida. Aunque existen muchas
variantes, el concepto bsico de procesos comunicndose mediante mensajes est muy consol-
idado.
Durante los aos anteriores a la aparicin del estndar MPI se perciba un progreso sustan-
cial en proyectar aplicaciones importantes en este paradigma. De hecho, cada compaa haba
implementado ya su propia variante. Ms recientemente algunos sistemas de dominio pblico
haban demostrado que el paso de mensajes poda implementarse eficientemente de manera
portable.
57
58 CAPTULO 3. EL ESTNDAR MPI
Por todo ello comprendemos que ste era el momento apropiado para definir tanto la sin-
taxis como la semntica de una librera estndar de funciones que fuera til a una amplia
variedad de usuarios y que pudiera implementarse eficientemente en una amplia gama de com-
putadores. Y de esa idea naci el estndar MPI.
Los diseadores de MPI pretendieron incorporar la mayora de las caractersticas ms
atractivas de los sistemas existentes de paso de mensajes, antes que seleccionar uno de ellos
y adoptarlo como el estndar. As, en su origen MPI estuvo muy influenciado por el trabajo
del Centro de Investigacin T.J.Watson de IBM, el sistema NX/2 de Intel, Express, Vertex de
nCUBE y PARMACS. Otras contribuciones importantes fueron las realizadas por Zipcode,
Chimp, PVM, Chameleon y PICL. Los diseadores de MPI identificaron algunos defectos
crticos de los sistemas de paso de mensajes existentes en reas como la composicin de datos
complejos, la modularidad y las comunicaciones seguras. sto permiti la introduccin de
nuevas caractersticas en MPI.
3.2. Historia
El esfuerzo de estandarizacin de MPI involucr a unas 60 personas procedentes de 40
organizaciones, principalmente de EEUU y Europa. La mayora de las principales compaas
de computadores paralelos del momento estuvieron involucradas en MPI, as como investi-
gadores provenientes de universidades, laboratorios de gobierno y la industria. El proceso de
estandarizacin comenz con el Seminario sobre Estndares de Paso de Mensajes en Entornos
de Memoria Distribuida, patrocinado por el Centro de Investigaciones sobre Procesamien-
to Paralelo, mantenido durante los das 29-30 de Abril de 1992 en Williansburg, Virginia
(EEUU). En este seminario se discutieron las caractersticas esenciales que deba tener una
interfaz estndar de paso de mensajes y se estableci un grupo de trabajo para continuar con
el proceso de estandarizacin.
Un borrador preliminar, conocido como MPI1, fu propuesto por Dongarra, Hempel, Hey
y Walker en Noviembre de 1992 y una versin revisada fu completada en Febrero de 1993.
MPI1 abarcaba las caractersticas principales que fueron identificadas en el seminario de
Williansburg como necesarias en un estndar de paso de mensajes. Dado que fu generado
para promover la discusin, este primer borrador se centr principalmente en las comuni-
caciones punto-a-punto. Aunque tocaba muchos asuntos referentes a la estandarizacin, no
inclua operaciones colectivas ni tena en cuenta la utilizacin de hilos.
En Noviembre de 1992 una reunin del grupo de trabajo de MPI tuvo lugar en Minneapo-
lis, en la cual se decidi hacer el proceso de estandarizacin de una manera ms formal, adop-
tando la organizacin y los procedimientos del High Performance Fortran Forum (Foro For-
tran de Alto Rendimiento). Fueron formados subcomits para cada una de las principales reas
que componen el estndar, y se estableci un foro de discusin va e-mail para cada una de
ellas. De esta manera qued conformado el Foro MPI (URL [8]), a cuyo cargo quedara el
proceso de estandarizacin de MPI.
En dicha reunin se propuso el objetivo de presentar un borrador del estndar MPI en
el otoo de 1993. Para conseguirlo el Foro MPI mantuvo reuniones cada 6 semanas durante
los primeros 9 meses de 1993, presentando el borrador del estndar MPI en la conferencia
Supercomputing 93 en Noviembre de 1993. Despus de un perodo de comentarios pblicos,
3.3. OBJETIVOS 59
que resultaron en algunos cambios en MPI, la versin 1.0 de MPI fu presentada en Junio de
1994.
A principios de Marzo de 1995 el Foro MPI empez a reunirse de nuevo para considerar
correcciones y extensiones al documento original del estndar MPI. El primer producto fruto
de estas deliberaciones fu la versin 1.1 de MPI, presentada en Junio de 1995.
En Julio de 1997 aparecen al mismo tiempo la versin 1.2 de MPI y la especificacin MPI-
2. La versin 1.2 de MPI contiene correcciones y clarificaciones referentes a la versin 1.1.
Sin embargo MPI-2 aade nuevos elementos al estndar MPI-1, definiendo la versin 2.0 de
MPI.
Todava hoy continan las discusiones acerca de las reas hacia las cuales podra ser til
expandir el estndar MPI; sin embargo en muchas de ellas es necesario obtener ms expe-
riencia y realizar ms discusiones. De todo ello se encarga un documento separado, el MPI
Journal Of Development (Peridico de Desarrollo), que no forma parte de la especificacin
MPI-2. Y por supuesto el Foro MPI sigue abierto a las aportaciones que puedan realizar los
usuarios del estndar, con el objetivo de mantenerlo y desarrollarlo.
3.3. Objetivos
La finalidad de MPI, de manera concisa, es desarrollar un estndar para escribir programas
de paso de mensajes que sea ampliamente utilizado. Para ello la interfaz debe establecer un
estndar prctico, portable, eficiente, escalable, formal y flexible.
Objetivos Principales
Portabilidad
El principal objetivo de MPI, como ocurre en la mayora de los estndares, es conseguir
un alto grado de portabilidad entre diferentes mquinas. Esta portabilidad sera parecida a
la que se consigue con lenguajes de programacin como Fortran. De esta manera el mismo
cdigo fuente de paso de mensajes debera poder ser ejecutado en una variedad de mquinas
tan grande como la soportada por las distintas implementaciones de MPI, aunque pueda ser
necesaria una puesta a punto para obtener la mxima ventaja de las caractersticas de cada
sistema. A pesar de que el paso de mensajes muchas veces es considerado algo propio de los
sistemas paralelos de memoria distribuida, el mismo cdigo podra ser ejecutado en un sistema
paralelo de memoria compartida. Puede ejecutarse en clusters o incluso en un conjunto de pro-
cesos ejecutndose en una misma mquina. El hecho de saber que existen implementaciones
de MPI eficientes para una amplia variedad de sistemas nos da cierto grado de flexibilidad en
el desarrollo del cdigo, la bsqueda de errores y la eleccin de la plataforma que finalmente
utilizaremos.
Heterogeneidad
Otro tipo de compatibilidad ofrecido por MPI es su capacidad para ejecutarse en sistemas
heterogneos de manera transparente. As pues, una implementacin MPI debe ser capaz de
extender una coleccin de procesos sobre un conjunto de sistemas con arquitecturas diferentes,
de manera que proporcione un modelo de computador virtual que oculte las diferencias en
60 CAPTULO 3. EL ESTNDAR MPI
las arquitecturas. De este modo el usuario no se tiene que preocupar de si el cdigo est
enviando mensajes entre procesadores de la misma o distinta arquitectura. La implementacin
MPI har automticamente cualquier conversin que sea necesaria y utilizar el protocolo
de comunicacin adecuado. Sin embargo MPI no prohibe implementaciones destinadas a un
nico y homogneo sistema, as como tampoco ordena que distintas implementaciones MPI
deban tener la capacidad de interoperar. En definitiva, los usuarios que quieran ejecutar sus
programas en sistemas heterogneos debern utilizar implementaciones MPI diseadas para
soportar heterogeneidad.
Rendimiento
Escalabilidad
La escalabilidad es otro objetivo importante del procesamiento paralelo. La escalabilidad
de un sistema es su capacidad para responder a cargas de trabajo crecientes. De este modo los
programas MPI deben mantener su nivel de rendimiento aunque incrementemos el nmero de
procesos a ejecutar.
MPI permite o soporta la escalabilidad a travs de algunas de sus caractersticas de diseo.
Por ejemplo, una aplicacin puede crear subgrupos de procesos que, en turnos, puedan ejecutar
operaciones de comunicacin colectiva para limitar el nmero de procesos involucrados.
Formalidad
MPI, como todos los buenos estndares, es valioso debido a que define el comportamiento
de las implementaciones de manera concisa. Esta caracterstica libera al programador de tener
que preocuparse de aquellos problemas que puedan aparecer. Un ejemplo de ello es la garanta
de seguridad en la transmisin de mensajes que ofrece MPI. Gracias a esta caracterstica el
usuario no necesita comprobar si los mensajes son recibidos correctamente.
Resumen de Objetivos
Disear una interfaz para la programacin de aplicaciones.
La interfaz debe ser diseada para que pueda ser implementada en la mayora de las
plataformas, sin necesidad de cambios importantes en la comunicacin o el software del
sistema.
Asumir una interfaz de comunicacin fiable: el usuario no debe preocuparse por los
fallos en la comunicacin.
3.4. Usuarios
El estndar MPI est pensado para ser utilizado por todo aquel que pretenda desarrollar
programas de paso de mensajes codificados en Fortran 77 y C. sto incluye programadores
de aplicaciones individuales, desarrolladores de software para mquinas paralelas y creadores
de entornos y herramientas. Para que esta amplia audiencia lo considere atractivo, el estndar
debe proporcionar al usuario bsico una interfaz simple y fcil de manejar, que no impida el
uso de las operaciones de alto rendimiento disponibles en mquinas avanzadas.
3.5. Plataformas
El atractivo del paradigma de paso de mensajes proviene al menos en parte de su portabil-
idad. Los programas expresados de esta manera podran ser ejecutados en multicomputadores,
multiprocesadores o combinaciones de ambos. Adems es posible realizar implementaciones
basadas en memoria compartida. El paradigma no queda obsoleto al combinar arquitecturas de
memoria distribuida con arquitecturas de memoria compartida, o al incrementar la velocidad
de la red. Debe ser a la vez posible y til implementar dicho estndar en una gran variedad de
mquinas, incluyendo dichas mquinas que se componen de colecciones de otras mquinas,
paralelas o no, conectadas por una red de comunicaciones.
La interfaz es apropiada para su uso en programas MIMD y SPMD. Aunque no propor-
ciona un soporte explcito para la ejecucin de hilos la interfaz ha sido diseada de manera
que no perjudique su uso.
MPI proporciona muchas caractersticas encaminadas a mejorar el rendimiento en com-
putadores paralelos con hardware de comunicacin especializado entre procesadores. De este
modo es posible realizar implementaciones nativas MPI de alto rendimiento para este tipo de
mquinas. Al mismo tiempo existen implementaciones MPI que utilizan los protocolos estn-
dares de comunicacin entre procesadores de Unix, las cuales proporcionan portabilidad a los
clusters y redes heterogneas.
3.6. Versiones
El estndar MPI se divide bsicamente en dos especificaciones, MPI-1 y MPI-2. La sigu-
iente clasificacin muestra el nivel de compatibilidad con MPI que posee una implementacin
dada:
En todo caso la compatibilidad hacia atrs est preservada. De esta manera un programa MPI-
1.1 vlido ser un programa MPI-1.2 vlido y un programa MPI-2 vlido; un programa MPI-
1.2 vlido ser un programa MPI-2 vlido.
3.6. VERSIONES 63
3.6.1. MPI-1
Las versiones 1.0, 1.1 y 1.2 del estndar MPI se engloban en la especificacin MPI-1.
Dicha especificacin centra su atencin en el modelo de paso de mensajes. A continuacin
mostramos una lista con los elementos contenidos en dicha especificacin, y aquellos que
quedan fuera de ella.
Elementos Incluidos
Comunicaciones punto a punto
Operaciones colectivas
Grupos de procesos
Contextos de comunicacin
Topologas de procesos
Elementos No Incluidos
Operaciones de memoria compartida
Como vemos MPI-1 est diseado para aprovechar todas las facilidades ofrecidas por el sis-
tema que vayamos a usar, tanto aquellas pertenecientes al sistema de comunicacin (opera-
ciones de memoria compartida, comunicacin va sockets, etc.) como las relativas al entorno
de programacin (herramientas para la construccin de programas, facilidades para la depu-
racin de errores, etc). Como resultado MPI es implementado normalmente como interfaz de
comunicaciones, utilizando dichas facilidades ofrecidas por el sistema.
Existen muchas caractersticas que fueron consideradas y no se incluyeron en MPI-1. s-
to ocurri por algunas razones: las restricciones de tiempo que se propuso el Foro MPI en
acabar la especificacin; el sentimiento de no tener suficiente experiencia en algunos de los
64 CAPTULO 3. EL ESTNDAR MPI
3.6.2. MPI-2
La especificacin MPI-2 es bsicamente una extensin a MPI-1 que aade nuevos elemen-
tos al estndar. La versin 2.0 de MPI pertenece a la especificacin MPI-2. Entre las nuevas
funcionalidades que se aaden destacan las siguientes:
Comunicaciones Unilaterales
E/S Paralela
La razn por la cual se cre la especificacin MPI-2 fu la demanda por parte de los usuarios
y desarrolladores de nuevas caractersticas en el estndar. De todos modos MPI-2 slo aade
nuevos elementos a MPI-1, pero no lo modifica.
3.7. Implementaciones
Desde que se complet la primera versin del estndar en 1994 un gran nmero de imple-
mentaciones MPI han sido puestas a disposicin de los usuarios. Esto incluye tanto algunas
implementaciones portables e independientes como aquellas que han sido desarrolladas y op-
timizadas por las principales compaas de computadores paralelos. La alta calidad de dichas
implementaciones ha sido un punto clave en el xito de MPI.
A continuacin destacamos las tres implementaciones de dominio pblico ms importantes
que pueden ser utilizadas en clusters de sistemas Linux:
MPICH (URL [9]) es sin duda la implementacin ms importante de MPI. Muchas im-
plementaciones comerciales desarrolladas por las grandes compaas de computadores
paralelos se basan en ella. La primera versin de MPICH fu escrita durante el proceso
de estandarizacin de MPI, siendo finalmente presentada al mismo tiempo que la versin
1.0 de MPI. De hecho las experiencias de los autores de MPICH se convirtieron en una
gran ayuda para el Foro MPI en el proceso de desarrollo del estndar. Su portabilidad es
enorme y su rendimiento elevado. Posee compatibilidad total con MPI-1 e implemen-
ta muchos elementos de MPI-2. En el apndice A se analizan de manera detenida sus
caractersticas y se informa sobre su instalacin, configuracin y manejo.
el estndar. LAM no slo consiste en la librera MPI, si no que adems contiene her-
ramientas de depuracin y monitorizacin. Ha sido optimizada para funcionar con clus-
ters heterogneos de sistemas Unix; sin embargo es muy portable, siendo utilizada en
una amplia variedad de plataformas Unix, desde estaciones de trabajo a supercomputa-
dores. LAM posee compatibilidad total con MPI-1 e implementa muchos elementos de
MPI-2.
Conceptos Bsicos
Todos los programas MPI comparten una serie de caractersticas. La inicializacin y final-
izacin del entorno de ejecucin se llevan a cabo mediante funciones que explicaremos en este
captulo. Tambin analizaremos los mtodos para identificar los procesos en ejecucin.
Por otro lado estudiaremos funciones para informarnos de dnde est ubicado cada proceso
y el momento temporal en que nos encontramos, y explicaremos el problema de la E/S en
procesadores paralelos. Para ejemplificar todo sto implementaremos un sencillo programa
que enva un mensaje de saludo e indica el nmero de procesos en ejecucin.
67
68 CAPTULO 4. CONCEPTOS BSICOS
Hola Mundo!
Numero Procesos: 4
Tiempo Procesamiento: 0.034216
Aunque los detalles de qu ocurre cuando el programa es ejecutado varan de una mquina a
otra, lo esencial es lo mismo en todos los sistemas, a condicin de que ejecutemos un proceso
en cada procesador.
1. El usuario manda una directiva al sistema operativo que crea una copia del programa
ejecutable en cada procesador.
2. Cada procesador comienza la ejecucin de su copia del ejecutable.
3. Diferentes procesos pueden ejecutar diferentes instrucciones bifurcando el programa a
travs de condicionantes. Dichos condicionantes suelen basarse, como veremos, en el
identificador del proceso.
#include mpi.h
El fichero mpi.h contiene las definiciones, macros y prototipos de funcin necesarios para
compilar los programas MPI.
Antes de que podamos llamar a cualquier otra funcin MPI debemos hacer una llamada a
MPI_Init(); esta funcin slo debe ser llamada una vez. Sus argumentos son punteros a los
parmetros de la funcin main(), argc y argv. Dicha funcin permite al sistema hacer todas
la configuraciones necesarias para que la librera MPI pueda ser usada. Despus de que el pro-
grama haya acabado de utilizar la librera MPI debemos hacer una llamada a MPI_Finalize().
Esta funcin limpia todos los trabajos no finalizados dejados por MPI (por ejemplo, envos
pendientes que no hayan sido completados, etc.). As, un programa MPI tpico tiene la sigu-
iente composicin:
.
.
.
#include mpi.h
.
.
.
main(int argc, char** argv){
.
.
.
/*Ninguna llamada a funcin MPI anterior a esta*/
MPI_Init(&argc, &argv);
.
.
.
MPI_Finalize();
/*Ninguna llamada a funcin MPI posterior a esta*/
.
.
.
}/*main*/
4.3. INFORMNDONOS DEL RESTO DEL MUNDO 69
Adems supongamos que ejecutamos el programa con dos procesos y que el usuario introduce:
10 20 30
Qu ocurre? Obtienen ambos procesos los datos? Lo hace uno slo? O lo que es peor,
obtiene el proceso 0 el nmero 10 y el 20 mientras que el proceso 1 obtiene el 30? Si todos los
procesos obtienen los datos, qu ocurre cuando escribimos un programa en el que queremos
que el proceso 0 obtenga el primer valor de entrada, el proceso 1 el segundo, etc.? Y si slo
un proceso obtiene los datos, qu le ocurre a los dems? Es razonable hacer que mltiples
procesos lean de una sola terminal?
Por otra parte, qu ocurre si varios procesos intentan escribir datos en la terminal si-
multneamente? Se imprimirn antes los datos del proceso 0, despus los del proceso 1,
y as sucesivamente? O se imprimirn dichos datos aleatoriamente? O, lo que es peor, se
70 CAPTULO 4. CONCEPTOS BSICOS
mostrarn los datos de los distintos procesos todos mezclados (una lnea del proceso 0, dos
caracteres del proceso 1, 3 caracteres del 0, 2 lneas del 2, etc.)?
Las operaciones estndar de E/S en C no proporcionan soluciones simples a dicho proble-
ma; as, la E/S sigue siendo objeto de investigacin por parte de la comunidad de procesamien-
to paralelo.
Por todo ello asumiremos que el proceso 0 puede al menos escribir en la salida estndar.
Tambin asumiremos que puede leer de la entrada estndar. En todos los casos asumiremos que
slo el proceso 0 puede interactuar con la E/S. sto podra parecer una debilidad, ya que como
mencionamos antes la mayora de las mquinas paralelas permiten que mltiples procesos
interactuen con la E/S. Sin embargo es un mtodo muy slido que nos permitir realizar un
manejo limpio de la E/S en nuestros programas.
El parmetro nombre es una cadena (vector de caracteres) cuyo tamao debe ser al menos
igual a la constante MPI_MAX_PROCESSOR_NAME. En dicho vector quedar almacena-
do el nombre del procesador. El parmetro longnombre es otro parmetro de salida que nos
informa de la longitud de la cadena obtenida.
MPI_Wtime() debido a que dicha funcin forma parte del entorno MPI, el cual debe ser fi-
nalizado antes de que el programa termine. Por lo tanto el tiempo que arrojara es incorrecto,
siempre menor al que debera; en su lugar usaremos las herramientas de monitorizacin para
determinar el tiempo de ejecucin.
Por otro lado llamamos tiempo de procesamiento al tiempo que emplea el computador en
calcular el resultado, eliminando el tiempo de inicializacin y finalizacin de los procesos, y
la comunicacin con el usuario. De esta manera si el usuario tarda diez segundos en introducir
los datos para un problema, ese tiempo no ser aadido al tiempo de procesamiento pero
s al tiempo de ejecucin. La funcin MPI_Wtime() nos ayudar a calcular el tiempo de
procesamiento de un programa para despus mostrarlo al usuario por la salida estndar.
En el caso del algoritmo Hola Mundo! el tiempo de procesamiento no es indicativo. Sin
embargo es muy til en programas donde un proceso (normalmente el proceso 0) desencadena
la ejecucin de los dems (normalmente al distribuir entre todos los procesos los datos que el
usuario introduce por la entrada estndar). ste ser el caso ms comn entre los algoritmos
expuestos en el presente documento.
1
2 /********************************************************/
3 /*Hola Mundo: CODIGO PROGRAMA QUE SALUDA */
4 /********************************************************/
5
6 # define TAMCADENA 100
7 # include " mpi . h "
8 # include < s t d i o . h>
9
10 /**************/
11 /*FUNCION MAIN*/
/**************/
LML
12
13 i n t main ( i n t argc , char argv ) {
14 int id ; /*IDENTIFICADOR DEL PROCESO*/
15 i n t numprocs ; /*NUMERO DE PROCESOS*/
16 char nombreproc [MPI_MAX_PROCESSOR_NAME] ;
17 /*NOMBRE PROCESADOR*/
18 i n t lnombreproc ; /*LONGITUD NOMBRE PROCESADOR*/
19 double t m p i n i c = 0 . 0 ; /*TIEMPO INICIO DE LA EJECUCION*/
20 double t m p f i n ; /*TIEMPO FINAL DE LA EJECUCION*/
21
72 CAPTULO 4. CONCEPTOS BSICOS
22
23 /*INICIALIZAMOS EL ENTRORNO DE EJECUCION MPI*/
24 M P I _ I n i t (& argc ,& argv ) ;
25
26 /*ALMACENAMOS EL IDENTIFICADOR DEL PROCESO*/
27 MPI_Comm_rank (MPI_COMM_WORLD,& i d ) ;
28
29 /*ALMACENAMOS EL NUMERO DE PROCESOS*/
30 MPI_Comm_size (MPI_COMM_WORLD, & numprocs ) ;
31
32 /*E/S:NOMBRE DEL PROCESADOR,PROCESO 0*/
33 MPI_Get_processor_name ( nombreproc,& lnombreproc ) ;
34 i f ( i d ==0){
35 f p r i n t f ( s t d o u t , " \ n P r o c e s o %d en %s E n c a r g a d o de l a E / S \ n \ n " ,
36 i d , nombreproc ) ;
37 }
38
39 /*TIEMPO INICIAL DE LA EJECUCION */
40 t m p i n i c=MPI_Wtime ( ) ;
41
42 /*E/S:PROCESAMIENTO*/
43 i f ( i d ==0){
44 f p r i n t f ( s t d o u t , " H o l a Mundo ! \ n \ n " ) ;
45 }
46
47 /*TIEMPO FINAL DE LA EJECUCION*/
48 t m p f i n =MPI_Wtime ( ) ;
49
50 /*E/S:INFORMACION SOBRE LA EJECUCION*/
51 i f ( i d ==0){
f p r i n t f ( s t d o u t , " Numero P r o c e s o s : %d \ n " , numprocs ) ;
N
52
53 f p r i n t f ( s t d o u t , " Tiempo P r o c e s a m i e n t o : % f \ n \ n " , t m p f i n t m p i n i c ) ;
54 }
55
56 /*FINALIZAMOS EL ENTRORNO DE EJECUCION MPI*/
57 MPI_Finalize ( ) ;
58 return 0 ;
59 }
Captulo 5
Paso de Mensajes
73
74 CAPTULO 5. PASO DE MENSAJES
V T XW U
Si la hipotenusa es mayor que el radio del crculo querr decir que el punto est fuera de
dicho crculo. Si la hipotenusa es menor que el radio, consideraremos que est dentro. Como
podemos observar en la figura, tambin podemos generar puntos en slo una cuarta parte del
cuadrado y el crculo, de manera que la proporcin no queda alterada. As lo hacemos en la
implementacin del algoritmo Clculo de reas mediante Montecarlo (seccin 5.6).
3. Una etiqueta.
4. Un comunicador.
Estos datos pueden ser usados por el proceso receptor para distinguir entre los mensajes en-
trantes. El origen puede ser usado para distinguir mensajes recibidos por distintos procesos.
5.2. EL ENTORNO DEL MENSAJE 75
(x,y)
La etiqueta es un int especificado por el usuario que puede ser usado para distinguir mensajes
recibidos por un nico proceso. Por ejemplo, supongamos que el proceso est enviando dos
mensajes al proceso Y ; ambos mensajes contienen un nmero flotante. Uno de los flotantes
se emplea en un clculo, mientras que otro debe ser impreso. Para determinar cul es cul,
puede usar etiquetas diferentes para cada mensaje. Si Y usa las mismas etiquetas que en
las recepciones correspondientes, sabr qu hacer con ellas. MPI garantiza que los enteros
dentro del intervalo 0-32767 pueden ser usados como etiquetas. La mayora de las imple-
mentaciones permiten valores mucho mayores.
Como dijimos antes un comunicador es bsicamente una coleccin de procesos que pueden
mandarse mensajes entre s. La importancia de los comunicadores se acenta cuando los
mdulos de un programa han sido escritos independientemente de los dems. Por ejemplo,
supongamos que queremos resolver un sistema de ecuaciones diferenciales y, en el transcurso
de resolverlo, tenemos que resolver un sistema de ecuaciones lineales. Mejor que escribir la
resolucin del sistema de ecuaciones lineales desde el principio, podramos usar una librera
de funciones escrita por otra persona y optimizada para el sistema que estamos usando. C-
mo evitamos que se confundan los mensajes que nosotros enviamos entre los procesos y
Y con los mensajes enviados en la librera de funciones? Sin la ventaja de los comunicadores
probablemente haramos una particin del rango de las posibles etiquetas, haciendo que parte
de ellas slo puedan ser usadas por la librera de funciones. sto es tedioso y puede causarnos
problemas si ejecutamos el programa en otro sistema: puede que la librera del otro sistema
no haga uso del mismo rango de etiquetas. Con la ventaja de los comunicadores, simple-
mente creamos un comunicador para uso exclusivo en la resolucin del sistema de ecuaciones
lineales, y se lo pasamos a la librera encargada de hacerlo como argumento en la llamada.
Comentaremos los detalles ms adelante. Por ahora continuaremos utilizando el comunicador
MPI_COMM_WORLD, el cual consiste en todos los procesos que se ejecutan cuando el
programa comienza.
76 CAPTULO 5. PASO DE MENSAJES
Notar que la cantidad de espacio reservado para el buffer de entrada no tiene porqu co-
incidir con la cantidad exacta de espacio que ocupa el mensaje que estemos recibiendo. Por
ejemplo, podra darse el caso de que el tamao del mensaje que el proceso 1 enva al proceso 0
sea de 28 caracteres (strlen(mensaje)+1), aunque el proceso 0 reciba el mensaje en un buffer
que tiene capacidad para 100 caracteres. sto tiene sentido. En general el proceso receptor no
conoce el tamao exacto del mensaje que se le est enviando. MPI permite recibir mensajes
tan largos como capacidad reservada tengamos. Si no tenemos suficiente capacidad, tendremos
un error de desbordamiento.
Los argumentos destino y origen son los identificadores del proceso receptor y del proceso
emisor, respectivamente. MPI permite que el argumento origen sea un comodn. Existe una
constante predefinida llamada MPI_ANY_SOURCE que puede ser usada si un proceso est
preparado para recibir un mensaje procedente de cualquier proceso. No existe comodn para
destino.
Como dijimos anteriormente MPI contiene dos mecanismos diseados especficamente
para particionar el espacio de los mensajes: las etiquetas y los comunicadores. Los argumen-
tos etiqueta y comunicador son, respectivamente, la etiqueta y el comunicador. El argumento
etiqueta es un int y, por ahora, nuestro nico comunicador es MPI_COMM_WORLD, el
cual, como comentamos antes, est predefinido en todos los sistemas MPI y consiste en todos
los procesos que se ejecutan cuando el programa comienza. Existe un comodn,
MPI_ANY_TAG, que puede ser usado en MPI_Recv() para la etiqueta. No existe un comod-
n para el comunicador. En otras palabras, para que el proceso mande un mensaje al proceso
Y el argumento comunicador que usa en MPI_Send() debe ser idntico al argumento que
Y usa en MPI_Recv().
El ltimo argumento de MPI_Recv(), status, retorna informacin acerca de los datos que
hemos recibido. Referencia a un registro con dos campos, uno para el origen y otro para la
etiqueta. Por ejemplo, si el origen era MPI_ANY_SOURCE en la llamada a MPI_Recv(), el
argumento status contendr el identificador del proceso que envi el mensaje.
A simple vista la diferencia entre estas funciones y sus versiones bloqueantes es la existencia
del argumento peticion en sus llamadas. Este argumento es utilizado por las funciones de
finalizacin de transmisiones bloqueantes para su ejecucin.
Las funciones de finalizacin de transmisiones bloqueantes son:
debido a que las variables que contienen el radio y el nmero de muestras no tienen porqu es-
tar alojadas en direcciones de memoria contiguas. Tampoco debemos almacenar estos datos en
un vector debido a que ello restara claridad y elegancia al cdigo. Para lograr nuestro objetivo
utilizaremos una facilidad de MPI para la agrupacin de los datos.
typedef struct{
long double radio;
long nmuestras_local;
} Tipo_Datos_Entrada;
e intentar utilizar el tipo de datos de la estructura como argumento tipo_datos en las funciones
de paso de mensajes. El problema aqu es que el tipo de datos de la estructura no es un tipo
de datos MPI; necesitamos construir un tipo de datos MPI a partir del tipo de datos de C. MPI
propone una solucin a sto permitiendo al usuario construir tipos de datos MPI en tiempo de
ejecucin. Para construir un tipo de datos MPI bsicamente se especifica la distribucin de los
datos en el tipo (los tipos de los miembros y sus direcciones relativas de memoria). Un tipo
de datos MPI construido de este modo se denomina tipo de datos derivado. Para ver cmo
funciona sto expondremos la funcin que construye dicho tipo de datos.
MPI_Datatype tipos[2];
int longitudes[2];
MPI_Aint direcc[3];
MPI_Aint desplaz[2];
desplaz[1]=direcc[2]-direcc[0];
}/*construir_tipo_derivado*/
Las primeras dos sentencias especifican los tipos de los miembros del tipo de datos deriva-
do, y las dos siguientes especifican el nmero de elementos de cada tipo. La funcin
MPI_Address() nos ayuda a calcular los desplazamientos de cada uno de los miembros con
respecto a la direccin inicial del primero. Con esta informacin ya sabemos los tipos, los
tamaos y las direcciones relativas de memoria de cada uno de los miembros del tipo de datos
de C, y por lo tanto ya podemos definir el tipo de datos MPI derivado del tipo de datos de C.
sto se hace llamando a las funciones MPI_Type_struct() y MPI_Type_Commit().
El tipo de datos MPI creado puede ser usado en cualquiera de las funciones de comuni-
cacin de MPI. Para usarlo simplemente usaremos como primer argumento de las funciones
la direccin inicial de la estructura a enviar, y el tipo de datos MPI creado en el argumento
tipo_datos.
5.5.2. Vectores
La funcin MPI_Type_vector() crea un tipo derivado consistente en contador elementos.
L
d a t o s _ e nt rada . r a d i o = p r a d i o ;
L
165
166 d a t o s _ e nt rada . n m u e s t r a s _ l o c a l = p n m u e s t r a s _ l o c al ;
167 f o r ( d e s t i n o =1; d e s t i n o <numprocs ; d e s t i n o + + ) {
168 e t i q u e t a =30;
169 MPI_Send(& d a t o s _ e nt rada , 1 , MPI_Tipo_Datos_Entrada , d e s t i n o ,
170 e t i q u e t a ,MPI_COMM_WORLD ) ;
171 }
172 }
173 else {
174 /*RECEPCION DE LOS DATOS*/
175 e t i q u e t a =30;
176 MPI_Recv(& d a t o s _ e n tra da , 1 , MPI_Tipo_Datos_Entrada , o r i g e n ,
e t i q u e t a ,MPI_COMM_WORLD,& s t a t u s ) ;
L
177
p r a d i o= d a t o s _ e ntr ada . r a d i o ;
L
178
179 p n m u e s t r a s _ l o c al= d a t o s _ e nt rada . n m u e s t r a s _ l o c a l ;
180 }
181 } /*distribuir_datos*/
182
183
184 /************************************************************************/
185 /*FUNCION MonteCarlo: RETORNA EL AREA DE LA CIRCUNFERENCIA CON RADIO */
186 /*radio UTILIZANDO EL NUM.MUESTRAS nummuestras MEDIANTE MONTECARLO */
187 /************************************************************************/
188 long double MonteCarlo ( i n t i d , long double r a d i o , long nummuestras ) {
189
190 long double p i ; /*VBLE QUE ALMACENA NUMERO PI*/
191 long double area ; /*AREA CIRCUNFERENCIA*/
192 long double x ; /*EJE ORDENADAS MUESTRA ACTUAL*/
193 long double y ; /*EJE COORDENADAS MUESTRA ACTUAL*/
194 long double h i p ; /*HIPOTENUSA MUESTRA ACTUAL*/
195 long aciertos =0; /*NUM.MUESTRAS QUE CAEN DENTRO DE LA CIRCUNFERENCIA*/
196 long fallos =1; /*NUM.MUESTRAS QUE CAEN FUERA DE LA CIRCUNFERENCIA*/
197 long i ; /*CONTADOR*/
198
199
200 /*UTILIZAMOS COMO SEMILLA EL IDENTIFICADOR DEL PROCESO*/
201 srand ( i d ) ;
202
203 /*ESTIMACION DE PI*/
204 f o r ( i =0; i ! = nummuestras ; i + + ) {
205 x =( long double ) rand ( ) / RAND_MAX;
206 y =( long double ) rand ( ) / RAND_MAX;
207 h i p = s q r t ( pow ( x , 2 ) +pow ( y , 2 ) ) ;
208 i f ( hip >1){ f a l l o s ++;}
209 else { a c i e r t o s + + ; }
}
L
210
211 p i = 4 . 0 ( ( long double ) a c i e r t o s / nummuestras ) ;
212
/*CALCULAMOS AREA*/
L
213
214 area=pow ( r a d i o , 2 ) p i ;
215
216 r e t u r n area ;
217
218 } /*MonteCarlo*/
219
5.6. IMPLEMENTACIN CLCULO DE REAS MEDIANTE MONTECARLO 85
220
221 /*********************************************************************/
222 /*FUNCION recolectar_datos:PROCESO 0 HACE LA MEDIA DE LAS */
223 /*APROXIMACIONES LOCALES */
/*********************************************************************/
L
224
void r e c o l e c t a r _ d a t o s ( i n t i d , i n t numprocs , long double p a p r o x _ l o c a l ,
L
225
226 long double p a p r o x _ g l o b a l ) {
227
228 int origen ; /*PROCESO ORIGEN MENSAJES*/
229 int destino =0; /*PROCESO DESTINO DATOS*/
230 int etiqueta ; /*ETIQUETA MENSAJES*/
231 MPI_Status s t a t u s ; /*STATUS RECEPCION MENSAJES*/
232 long double b u f f e r ; /*BUFFER RECEPCION APROXIMACIONES LOCALES*/
233
234 i f ( i d ==0){
/*RECOLECTAMOS LOS CALCULOS LOCALES Y HACEMOS LA MEDIA*/
L L
235
236 p a p r o x _ g l o b a l= p a p r o x _ l o c a l ;
237 f o r ( o r i g e n =1; o r i g e n<numprocs ; o r i g e n + + ) {
238 e t i q u e t a =30+ o r i g e n ;
239 MPI_Recv(& b u f f e r , 1 , MPI_LONG_DOUBLE, o r i g e n , e t i q u e t a ,
MPI_COMM_WORLD,& s t a t u s ) ;
L L
240
241 p a p r o x _ g l o b a l =( p a p r o x _ g l o b a l+ b u f f e r ) / 2 . 0 ;
242 }
243 }
244 else {
245 /*ENVIO DE LOS DATOS*/
246 e t i q u e t a =30+ i d ;
247 MPI_Send ( p a p r o x _ l o c a l , 1 , MPI_LONG_DOUBLE, d e s t i n o , e t i q u e t a ,
248 MPI_COMM_WORLD ) ;
249 }
250 } /*distribuir_datos*/
251
252
253 /*********************************************************************/
254 /*FUNCION construir_tipo_derivado: CONSTRUYE EL TIPO DE DATOS MPI */
255 /*NECESARIO PARA DISTRIBUIR LOS DATOS DE ENTRADA EMPAQUETADOS */
/*********************************************************************/
L
256
void c o n s t r u i r _ t i p o _ d e r i v a d o ( Tipo_Datos_Entrada pdatos ,
L
257
258 MPI_Datatype pMPI_Tipo_Datos ) {
259
260 MPI_Datatype t i p o s [ 2 ] ;
261 int longitudes [ 2 ] ;
262 MPI_Aint d i r e c c [ 3 ] ;
263 MPI_Aint desplaz [ 2 ] ;
264
265
266 /*PRIMERO ESPECIFICAMOS LOS TIPOS*/
267 t i p o s [ 0 ] =MPI_LONG_DOUBLE;
268 t i p o s [ 1 ] =MPI_LONG;
269
270 /*ESPECIFICAMOS EL NUMERO DE ELEMENTOS DE CADA TIPO*/
271 longitudes [0]=1;
272 longitudes [1]=1;
273
274 /*CALCULAMOS LOS DESPLAZAMIENTOS DE LOS MIEMBROS DE LA ESTRUCTURA
86 CAPTULO 5. PASO DE MENSAJES
1
2 /***************************************************/
3 /*Calculo de Areas: CODIGO APROXIMACION DE AREAS */
4 /*CIRCULARES MEDIANTE MONTECARLO (NO BLOQUEANTE) */
5 /***************************************************/
6
7 /*NUMERO MAXIMO DE PROCESOS EN EJECUCION */
8 # define MAX_NUM_PROCS 128
9
10 # include < s t d i o . h>
11 # include < s t d l i b . h>
12 # include < math . h>
13 # include " mpi . h "
14
15 /*DECLARACION ESTRUCTURA DATOS ENTRADA*/
16 typedef s t r u c t {
17 long double r a d i o ;
18 long n m u e s t r a s _ l o c a l ;
19 } Tipo_Datos_Entrada ;
20
21 /*DECLARACION DE LA FUNCIONES QUE VAMOS A UTILIZAR*/
long double MonteCarlo ( i n t i d , long double r a d i o , long l o c a l _ n ) ;
L L
22
void o b t e n e r _dat os ( long double p r a d i o , long pnmuestras_global ) ;
L
23
void d i s t r i b u i r _ d a t o s ( i n t i d , i n t numprocs , long double p r a d i o ,
L
24
long p n m u e s t r a s _ l oc a l ) ;
L
25
void r e c o l e c t a r _ d a t o s ( i n t i d , i n t numprocs , long double p a p r o x _ l o c a l ,
L
26
long double p a p r o x _ g l o b a l ) ;
L
27
void c o n s t r u i r _ t i p o _ d e r i v a d o ( Tipo_Datos_Entrada pdatos ,
L
28
29 MPI_Datatype pMPI_Tipo_Datos ) ;
30
31 /**************/
32 /*FUNCION MAIN*/
/**************/
L8L
33
34 i n t main ( i n t argc , char argv ) {
5.6. IMPLEMENTACIN CLCULO DE REAS MEDIANTE MONTECARLO 87
35
36 long double PI25DIGITOS=3.141592653589793238462643;
37 /*VALOR PI PARA CALCULAR EL ERROR*/
38 int id ; /*IDENTIFICADOR DEL PROCESO*/
39 i n t numprocs ; /*NUMERO DE PROCESOS*/
40 char nombreproc [MPI_MAX_PROCESSOR_NAME] ;
41 /*NOMBRE PROCESADOR*/
42 i n t lnombreproc ; /*LONGITUD NOMBRE PROCESADOR*/
43 long double r a d i o ; /*RADIO CIRCUNFERENCIA*/
44 long n m u e s t r a s _global ; /*NUMERO DE MUESTRAS*/
45 long n m u e s t r a s _ l o c a l ; /*NUMERO DE MUESTRAS DE CADA PROCESO*/
46 long double a p r o x _ l o c a l ; /*APROX LOCAL DE CADA PROCESO*/
47 long double a p r o x _ g l o b a l ; /*APROX GENERAL (MEDIA DE TODAS LAS LOCALES)*/
48 int raiz =0; /*PROCESO QUE RECIBE LAS LOCALES Y LAS SUMA*/
49 double t m p i n i c = 0 . 0 ; /*TIEMPO INICIO DE LA EJECUCION*/
50 double t m p f i n ; /*TIEMPO FINAL DE LA EJECUCION */
51
52 int etiqueta =50; /*ETIQUETA MENSAJES DE PRUEBA*/
53 MPI_Status s t a t u s ; /*STATUS RECEPCION MENSAJES DE PRUEBA*/
54 int origen ; /*PROCESO ORIGEN MENSAJES DE PRUEBA*/
55
56
57 /*INICIALIZAMOS EL ENTRORNO DE EJECUCION MPI*/
58 M P I _ I n i t (& argc ,& argv ) ;
59
60 /*ALMACENAMOS EL IDENTIFICADOR DEL PROCESO*/
61 MPI_Comm_rank (MPI_COMM_WORLD,& i d ) ;
62
63 /*ALMACENAMOS EL NUMERO DE PROCESOS*/
64 MPI_Comm_size (MPI_COMM_WORLD,& numprocs ) ;
65
66 /*E/S:NOMBRE DEL PROCESADOR,PROCESADOR 0*/
67 MPI_Get_processor_name ( nombreproc,& lnombreproc ) ;
68 i f ( i d ==0){
69 f p r i n t f ( s t d o u t , " \ n P r o c e s o %d en %s E n c a r g a d o de l a E / S \ n " ,
70 i d , nombreproc ) ;
71 }
72 /*E/S:NOMBRE DEL PROCESADOR,TODOS LOS PROCESOS (PRUEBAS)*/
73 /*if(id==0){
74 * for (origen=1;origen<numprocs;origen++){
75 * MPI_Recv(nombreproc,MPI_MAX_PROCESSOR_NAME,MPI_CHAR,origen,
76 * etiqueta,MPI_COMM_WORLD,&status);
77 * fprintf(stdout,"Proceso %d en %s\n",origen,nombreproc);
78 * }
79 *}
80 *else{
81 * MPI_Send(nombreproc,MPI_MAX_PROCESSOR_NAME,MPI_CHAR,0,
82 * etiqueta,MPI_COMM_WORLD);
83 *}
84 */
85
86 /*OBTENEMOS DATOS INTRODUCIDOS POR EL USUARIO*/
87 i f ( i d ==0){
88 o b t e n e r _dato s(& r a d i o ,& n m u e s t r a s _ global ) ;
89 /*NUMERO DE MUESTRAS PARA CADA PROCESO*/
88 CAPTULO 5. PASO DE MENSAJES
145
146 } /*obtener_datos*/
147
148
149 /**********************************************************************/
150 /*FUNCION distribuir_datos:PROCESO 0 DISTIBUYE RADIO DE LA */
151 /*CIRCUNFERENCIA Y EL NUMERO DE MUESTRAS (n) ENTRE LOS DEMAS PROCESOS */
/**********************************************************************/
L
152
void d i s t r i b u i r _ d a t o s ( i n t i d , i n t numprocs , long double p r a d i o ,
L
153
154 long p n m u e s t r a s _ l oc a l ) {
155
156 MPI_Datatype MPI_Tipo_Datos_Entrada ;
157 Tipo_Datos_Entrada d a t o s _ e n tr ada ;
158 int origen =0; /*PROCESO ORIGEN MENSAJES*/
159 int destino ; /*PROCESO DESTINO DATOS*/
160 int etiqueta ; /*ETIQUETA MENSAJES*/
161 MPI_Request r e q u e s t ; /*PETICION MENSAJES NO BLOQUEANTES*/
162 MPI_Status s t a t u s ; /*STATUS RECEPCION*/
163
164 c o n s t r u i r _ t i p o _ d e r i v a d o (& d a t o s _ e n tr ada,& MPI_Tipo_Datos_Entrada ) ;
165
166 i f ( i d ==0){
/*ENVIO DE LOS DATOS*/
L
167
d a t o s _ e n trada . r a d i o = p r a d i o ;
L
168
169 d a t o s _ e n trada . n m u e s t r a s _ l o c a l = p n m u e s t r a s _ l o c al ;
170 f o r ( d e s t i n o =1; d e s t i n o <numprocs ; d e s t i n o + + ) {
171 e t i q u e t a =30;
172 MPI_Isend(& d a t o s _ e ntr ada , 1 , MPI_Tipo_Datos_Entrada , d e s t i n o , e t i q u e t a ,
173 MPI_COMM_WORLD,& r e q u e s t ) ;
174 }
175 }
176 else {
177 /*RECEPCION DE LOS DATOS*/
178 e t i q u e t a =30;
179 MPI_Irecv (& d a t o s _ e n trada , 1 , MPI_Tipo_Datos_Entrada , o r i g e n , e t i q u e t a ,
180 MPI_COMM_WORLD,& r e q u e s t ) ;
MPI_Wait(& r e q u e s t ,& s t a t u s ) ;
L
181
p r a d i o= d a t o s _ e ntr ada . r a d i o ;
L
182
183 p n m u e s t r a s _ l o c al= d a t o s _ e n trada . n m u e s t r a s _ l o c a l ;
184 }
185 } /*distribuir_datos*/
186
187
188 /************************************************************************/
189 /*FUNCION MonteCarlo: RETORNA EL AREA DE LA CIRCUNFERENCIA CON RADIO */
190 /*radio UTILIZANDO EL NUM.MUESTRAS nummuestras MEDIANTE MONTECARLO */
191 /************************************************************************/
192 long double MonteCarlo ( i n t i d , long double r a d i o , long nummuestras ) {
193
194 long double p i ; /*VBLE QUE ALMACENA NUMERO PI*/
195 long double area ; /*AREA CIRCUNFERENCIA*/
196 long double x ; /*EJE ORDENADAS MUESTRA ACTUAL*/
197 long double y ; /*EJE COORDENADAS MUESTRA ACTUAL*/
198 long double h i p ; /*HIPOTENUSA MUESTRA ACTUAL*/
199 long aciertos =0; /*NUM.MUESTRAS QUE CAEN DENTRO DE LA CIRCUNFERENCIA*/
90 CAPTULO 5. PASO DE MENSAJES
255 }
256 else {
257 /*ENVIO DE LOS DATOS*/
258 e t i q u e t a =30+ i d ;
259 MPI_Isend ( p a p r o x _ l o c a l , 1 , MPI_LONG_DOUBLE , d e s t i n o , e t i q u e t a ,
260 MPI_COMM_WORLD,& r e q u e s t ) ;
261 }
262 } /*distribuir_datos*/
263
264
265 /*********************************************************************/
266 /*FUNCION construir_tipo_derivado: CONSTRUYE EL TIPO DE DATOS MPI */
267 /*NECESARIO PARA DISTRIBUIR LOS DATOS DE ENTRADA EMPAQUETADOS */
/*********************************************************************/
L
268
void c o n s t r u i r _ t i p o _ d e r i v a d o ( Tipo_Datos_Entrada pdatos ,
L
269
270 MPI_Datatype pMPI_Tipo_Datos ) {
271
272 MPI_Datatype t i p o s [ 2 ] ;
273 int longitudes [ 2 ] ;
274 MPI_Aint d i r e c c [ 3 ] ;
275 MPI_Aint desplaz [ 2 ] ;
276
277
278 /*PRIMERO ESPECIFICAMOS LOS TIPOS*/
279 t i p o s [ 0 ] =MPI_LONG_DOUBLE;
280 t i p o s [ 1 ] =MPI_LONG;
281
282 /*ESPECIFICAMOS EL NUMERO DE ELEMENTOS DE CADA TIPO*/
283 longitudes [0]=1;
284 longitudes [1]=1;
285
286 /*CALCULAMOS LOS DESPLAZAMIENTOS DE LOS MIEMBROS DE LA ESTRUCTURA
287 RELATIVOS AL COMIENZO DE DICHA ESTRUCTURA*/
MPI_Address ( pdatos ,& d i r e c c [ 0 ] ) ;
N
288
MPI_Address ( & ( pdatos >r a d i o ) , & d i r e c c [ 1 ] ) ;
N
289
MPI_Address ( & ( pdatos >n m u e s t r a s _ l o c a l ) , & d i r e c c [ 2 ] ) ;
N
290
desplaz [ 0 ] = d i r e c c [1] d i r e c c [ 0 ] ;
N
291
292 desplaz [ 1 ] = d i r e c c [2] d i r e c c [ 0 ] ;
293
294 /*CREACION TIPO DATOS DERIVADO*/
295 MPI_Type_struct ( 2 , l o n g i t u d e s , desplaz , t i p o s , pMPI_Tipo_Datos ) ;
296
297 /*CERTIFICARLO DE MANERA QUE PUEDA SER USADO*/
298 MPI_Type_commit ( pMPI_Tipo_Datos ) ;
299
300 } /*construir_tipo_derivado*/
92 CAPTULO 5. PASO DE MENSAJES
Captulo 6
Comunicacin Colectiva
Las operaciones de comunicacin colectiva son aquellas que se aplican al mismo tiempo
a todos los procesos pertenecientes a un comunicador. Tienen una gran importancia en el
estndar MPI, debido a la claridad de su sintaxis y a su eficiencia. Para analizar su utilidad y
conveniencia implementaremos el algoritmo Regla del Trapecio de manera que haga un uso
inteligente de dichas operaciones.
V g Wlk V k
Donde ,QJj/ 3 $& , y T , FD EBGBGBG4E .
Una manera de realizar este clculo mediante un algoritmo paralelo es dividir el interva-
lo b EcJcd entre los procesos haciendo que cada proceso calcule la integral de ^ ,.T\3 sobre su
subintervalo. Para estimar la integral completa se suman los clculos locales de cada proceso.
Supongamos que tenemos C procesos y segmentos, y, para simplificar, supongamos que
es divisible entre C . En este caso es natural que el primer proceso calcule la integral de los
primeros '$cC segmentos, el segundo proceso calcular el rea de los siguientes '$cC segmentos,
etc. Siguiendo esta regla el proceso m estimar la integral del subintervalo:
b
W m V E W ,Hm W 41 3 V d
C C
Cada proceso necesita la siguiente informacin:
El nmero de procesos C
Su identificador
El intervalo de integracin completo b cE Jcd
93
94 CAPTULO 6. COMUNICACIN COLECTIVA
El nmero de segmentos
La funcin ^ ,.T\3 a integrar
Los dos primeros datos se pueden conseguir llamando a las funciones MPI_Comm_size() y
MPI_Comm_rank(). Sin embargo tanto el intervalo b EcJcd como el nmero de segmentos
deben ser introducidos por el usuario. Por otro lado sera positivo que el usuario pudiera elegir
la funcin ^ ,.T_3 a integrar (dentro de un conjunto predefinido de funciones). Como explicamos
en la seccin 4.4 slo un proceso (normalmente el proceso 0) debe encargarse de obtener
los datos de la entrada estndar y distribuirlos entre los dems procesos. sto puede hacerse
mediante paso de mensajes o mediante comunicacin colectiva, siendo la segunda opcin ms
eficiente. En la seccin 6.2 se explica el uso de las operaciones de comunicacin colectiva con
dicho propsito.
Por otro lado una buena forma de sumar los clculos individuales de los procesos es hacer
que cada proceso enve su clculo local al proceso 0, y que el proceso 0 haga la suma final. De
nuevo podemos emplear al menos dos tcnicas: paso de mensajes y operaciones de reduccin.
Dado que las operaciones de reduccin son ms eficientes, utilizaremos la segunda opcin.
Las funciones que ofreceremos al usuario estarn codificadas en funciones de cdigo C,
por lo que tendremos que modificar el cdigo y compilarlo de nuevo para introducir nuevas
funciones. Entre las funciones ofrecidas incluiremos al menos las siguientes:
^ ,.T_3 (@T
^ ,.T_3 T
^ ,.T_3 n
^ ,.T_3 o
qp n4rs
P
Esta ltima
P
funcin nos permite realizar la bsqueda del nmero . El rea bajo la curva
U
qp n r nos proporciona un mtodo para computar :
t
WR v
R )
u y
w
x
z "
u {
SR P P
M
` T b .
, \
T
3 d , R 0
/ M
D 3
,1 T 3
Por lo tanto tenemos que para computar
P mediante la regla del trapecio utilizaremos
q
p
^ ,.T\3 o n r s , D y J 1 .
0 4
0 2 4 6
0 1 2 3 4 5 6 7
Como puede suponerse estos clculos pueden ser algo complicados, especialmente porque no
hay un ordenamiento fijo. En nuestro ejemplo elegimos:
1. 0 enva al 4
2. 0 enva al 2, 4 al 6
3. 0 enva al 1, 2 al 3, 4 al 5, 6 al 7
1. 0 enva al 1
2. 0 enva al 2, 1 al 3
3. 0 enva al 4, 1 al 5, 2 al 6, 3 al 7
De hecho, a menos que sepamos algo acerca de la topologa subyacente de nuestra mquina
no podremos decidir realmente qu esquema es mejor.
Lo ideal sera usar una funcin diseada especficamente para la mquina que estemos
usando de manera que no nos tengamos que preocupar acerca de todos los detalles, y que no
tengamos que modificar el cdigo cada vez que cambiamos de mquina. Y como habr podido
adivinar MPI proporciona dicha funcin.
La funcin enva una copia de los datos contenidos en mensaje por el proceso raiz a cada pro-
ceso perteneciente al comunicador com. Debe ser llamada por todos los procesos pertenecientes
al comunicador con los mismos argumentos para raiz y com. Por lo tanto un mensaje broad-
cast no puede ser recibido con la funcin MPI_Recv(). Los parmetros contador y tipo_datos
tienen la misma finalidad que en MPI_Send() y MPI_Recv(): especifican la extensin del
mensaje. Sin embargo, al contrario que en las funciones punto a punto, MPI insiste en que en
las operaciones de comunicacin colectiva contador y tipo_datos deben ser iguales en todos
los procesos pertenecientes al comunicador. La razn de sto es que en algunas operaciones
colectivas un nico proceso recibe datos de otros muchos procesos, y para que el programa
determine qu cantidad de datos han sido recibidos necesitara un vector de status de retorno.
6.4. OPERACIONES DE REDUCCIN 97
1. (a) 1 enva al 0, 3 al 2, 5 al 4, 7 al 6
(b) 0 suma su integral a la recibida de 1, 2 suma su integral a la recibida de 3, etc.
2. (a) 2 enva al 0, 6 al 4
(b) 0 suma, 4 suma
3. (a) 4 enva al 0
(b) 0 suma
Por supuesto caemos en la misma cuestin que cuando discutiamos la implementacin de nue-
stro propio broadcast: Hace un uso ptimo de la topologa de nuestra mquina esta estructura
en rbol? Una vez ms debemos responder que ello depende de la mquina. As que, como
antes, debemos dejar a MPI hacer dicho trabajo utilizando una funcin optimizada.
La suma global que queremos calcular es un ejemplo de una clase general de operaciones
de comunicacin colectiva llamadas operationes de reduccin. Las operaciones de reduccin
forman un subconjunto de las operaciones de comunicacin colectiva. En una operacin de re-
duccin global todos los procesos (pertenecientes a un comunicador) aportan datos, los cuales
se combinan usando una operacin binaria. Las operaciones binarias tpicas son la suma, el
mximo, el mnimo, AND lgico, etc. La funcin MPI que implementa una operacin de re-
duccin es:
La funcin MPI_Reduce combina los operandos referenciados por operando usando la op-
eracin sealada por operacion y almacena el resultado en la variable resultado perteneciente
al proceso raiz. Tanto operando como resultado referencian contador posiciones de memo-
ria del tipo tipo_datos. MPI_Reduce() debe ser llamado por todos los procesos pertenecientes
a comunicador; adems contador, tipo_datos y operacion deben ser iguales para todos los
procesos.
El argumento operacion puede adquirir uno de los valores predefinidos mostrados en el
cuadro 6.1. Tambin es posible definir operaciones adicionales.
98 CAPTULO 6. COMUNICACIN COLECTIVA
1
2 /********************************************************/
3 /*Regla del Trapecio: CODIGO APROXIMACION DE INTEGRALES */
4 /*MEDIANTE LA REGLA DEL TRAPECIO */
5 /********************************************************/
6
7 # include < s t d i o . h>
8 # include " mpi . h "
9
10 /*DECLARACION ESTRUCTURA DATOS ENTRADA*/
11 typedef s t r u c t {
12 long double a ;
13 long double b ;
14 long nsegmentos ;
15 i n t nfuncion ;
16 } Tipo_Datos_Entrada ;
17
18 /*DECLARACION DE LA FUNCIONES QUE VAMOS A UTILIZAR*/
19 long double T r a p e c i o ( long double l o c a l _ a , long double l o c a l _ b , long l o c a l _ n ,
20 long double h , i n t numfuncion ) ;
21 long double F1 ( long double x ) ;
22 long double F2 ( long double x ) ;
23 long double F3 ( long double x ) ;
6.5. IMPLEMENTACIN REGLA DEL TRAPECIO 99
79 * for (origen=1;origen<numprocs;origen++){
80 * MPI_Recv(nombreproc,MPI_MAX_PROCESSOR_NAME,MPI_CHAR,origen,
81 * etiqueta,MPI_COMM_WORLD,&status);
82 * fprintf(stdout,"Proceso %d en %s\n",origen,nombreproc);
83 * }
84 *}
85 *else{
86 * MPI_Send(nombreproc,MPI_MAX_PROCESSOR_NAME,MPI_CHAR,0,
87 * etiqueta,MPI_COMM_WORLD);
88 *}
89 */
90
91 /*OBTENEMOS DATOS INTRODUCIDOS POR EL USUARIO*/
92 o b t e n e r _d atos ( i d ,& a,& b ,& n,& numfuncion ) ;
93
94 /*TIEMPO INICIAL DE PROCESAMIENTO*/
95 i f ( i d ==0){ f p r i n t f ( stdout , " \ nProcesando . . . \ n \ n " ) ; }
96 t m p i n i c=MPI_Wtime ( ) ;
97
98 /*DISTRIBUIMOS DATOS INTRODUCIDOS POR EL USUARIO*/
99 d i s t r i b u i r _ d a t o s ( i d ,& a ,& b,& n ,& numfuncion ) ;
100
101 /*SI NUMSEGMENTOS/NUMPROCS NO ES DIVISION ENTERA NUMSEGMENTOS SE TRUNCA*/
l o c a l _ n=n / numprocs ; /*NUMERO DE SEGMENTOS PARA CADA PROCESO*/
L
102
n= l o c a l _ n numprocs ; /*NUMERO DE SEGMENTOS EN TOTAL (TRUNCADO)*/
N
103
104 h =( b a ) / n ; /*ANCHO DE SEGMENTO.SIMILAR PARA TODOS LOS PROCESOS*/
105
106 /*EL SUBINTERVALO DEL PROCESO TENDRA UN ANCHO DE local_n*h Y ESTARA
COMPRENDIDO ENTRE local_a Y local_b*/
L L
107
local_a = a + id local_n h ;
L
108
109 local_b = local_a + local_n h ;
110
111 /*CALCULAMOS LA INTEGRAL PARCIAL DEL PROCESO*/
112 p a r c i a l = T r a p e c i o ( l o c a l _ a , l o c a l _ b , l o c a l _ n , h , numfuncion ) ;
113
114 /*RECOLECTAMOS INTEGRALES CALCULADAS POR LOS PROCESOS Y LAS SUMAMOS*/
115 r e c o l e c t a r _ d a t o s ( i d , numprocs ,& p a r c i a l ,& completa ) ;
116
117 /*TIEMPO FINAL DE PROCESAMIENTO*/
118 t m p f i n =MPI_Wtime ( ) ;
119
120 /*E/S:IMPRIMIMOS RESULTADO Y TIEMPO DE PROCESAMIENTO*/
121 i f ( i d ==0){
122 f p r i n t f ( s t d o u t , " Con n= %d t r a p e c i o s , l a e s t i m a c i o n de l a i n t e g r a l \ n " , n ) ;
123 f p r i n t f ( s t d o u t , " de l a f u n c i o n s e l e c c i o n a d a d e s d e " ) ;
124 f p r i n t f ( s t d o u t , " %Lf h a s t a %Lf e s \ n %.60 Lf \ n \ n " , a , b , completa ) ;
f p r i n t f ( s t d o u t , " Numero P r o c e s o s : %d \ n " , numprocs ) ;
N
125
126 f p r i n t f ( s t d o u t , " Tiempo P r o c e s a m i e n t o : % f \ n \ n " , t m p f i n t m p i n i c ) ;
127 }
128
129 /*FINALIZAMOS EL ENTRORNO DE EJECUCION MPI*/
130 MPI_Finalize ( ) ;
131
132 } /*main*/
133
6.5. IMPLEMENTACIN REGLA DEL TRAPECIO 101
134
135 /***********************************************************************/
136 /*FUNCION obtener_datos:PROCESO 0 CONSULTA AL USUARIO COMIENZO Y FINAL */
137 /*DEL INTERVALO [a,b] Y EL NUMERO DE SEGMENTOS (n) */
/***********************************************************************/
L L
138
void o b t e n e r _dat os ( i n t i d , long double pa , long double pb ,
L L
139
140 long pn , i n t pnumfuncion ) {
141
142 /*E/S:PETICION DE DATOS*/
143
144 i f ( i d ==0){
145 f p r i n t f ( s t d o u t , " \ n I n t r o d u z c a num . de l a f u n c i o n a i n t e g r a r \ n " ) ;
146 f p r i n t f ( s t d o u t , " \ nF1 =2 x F2=x^2 F3 = 1 / x F4 = 4 / ( 1 + x ^ 2 ) \ nF " ) ;
s c a n f ( " %d " , pnumfuncion ) ;
L L
147
148 i f ( pnumfuncion < 1 | | pnumfuncion > 4 ) {
f p r i n t f ( s t d o u t , " E r r o r en l a e n t r a d a , u t i l i z a n d o f u n c i o n F1=2 x \ n " ) ;
L
149
150 pnumfuncion =1;
151 }
152 f p r i n t f ( s t d o u t , " I n t r o d u z c a un v a l o r p a r a a ( i n i c i o d e l i n t e r v a l o ) \ n " ) ;
153 s c a n f ( " %Lf " , pa ) ;
154 f p r i n t f ( s t d o u t , " I n t r o d u z c a un v a l o r p a r a b ( f i n a l d e l i n t e r v a l o ) \ n " ) ;
155 s c a n f ( " %Lf " , pb ) ;
156 f p r i n t f ( s t d o u t , " I n t r o d u z c a numero de s e g m e n t o s \ n " ) ;
157 s c a n f ( " %l d " , pn ) ;
158 }
159
160
161 /*E/S SIN PETICION:UTILIZAR EN CASO DE PRUEBAS*/
162 /*if(id==0){*pa=0;*pb=1;*pn=1000000000;*pnumfuncion=4;}*/
163
164 } /*obtener_datos*/
165
166
167 /**************************************************************************/
168 /*FUNCION distribuir_datos:PROCESO 0 DISTIBUYE COMIENZO Y FINAL DEL */
169 /*INTERVALO [a,b] Y EL NUMERO DE SEGMENTOS (n) ENTRE LOS DEMAS PROCESOS */
/**************************************************************************/
L L
170
void d i s t r i b u i r _ d a t o s ( i n t i d , long double pa , long double pb ,
L L
171
172 long pn , i n t pnumfuncion ) {
173
174 MPI_Datatype MPI_Tipo_Datos_Entrada ;
175 Tipo_Datos_Entrada d a t o s _ e n tr ada ;
176 int raiz =0; /*PROCESO QUE ENVIA LOS DATOS A LOS DEMAS PROCESOS*/
177
178
179 /*CONSTRUIMOS EL TIPO MPI PARA EMPAQUETAR LOS DATOS DE ENTRADA*/
180 c o n s t r u i r _ t i p o _ d e r i v a d o (& d a t o s _ e n tr ada,& MPI_Tipo_Datos_Entrada ) ;
181
182 i f ( i d ==0){
/*EMPAQUETADO DE DATOS*/
L
183
d a t o s _ e n trada . a= pa ;
L
184
d a t o s _ e n trada . b= pb ;
L
185
d a t o s _ e n trada . nsegmentos= pn ;
L
186
187 d a t o s _ e n trada . n f u n c i o n = pnumfuncion ;
188 }
102 CAPTULO 6. COMUNICACIN COLECTIVA
189
190 MPI_Bcast (& d a t o s _ e ntr ada , 1 , MPI_Tipo_Datos_Entrada , r a i z ,MPI_COMM_WORLD ) ;
191
192 if ( id !=0){
/*RECOGIDA DE DATOS*/
L
193
pa=d a t o s _ e n tra da . a ;
L
194
pb=d a t o s _ e n tra da . b ;
L
195
pn=d a t o s _ e n tra da . nsegmentos ;
L
196
197 pnumfuncion= d a t o s _ e nt rada . n f u n c i o n ;
198 }
199
200 } /*distribuir_datos*/
201
202
203 /************************************************************************/
204 /*FUNCION Trapecio:FUNCION QUE APLICA LA REGLA DEL TRAPECIO AL */
205 /*SUBINTERVALO COMPRENDIDO ENTRE local_a Y local_b, CON UN NUMERO DE */
206 /*SEGMENTOS local_n Y UN TAMAO DE SEGMENTO h */
207 /************************************************************************/
208 long double T r a p e c i o ( long double l o c a l _ a , long double l o c a l _ b , long l o c a l _ n ,
209 long double h , i n t numfuncion ) {
L
210
211 long double ( f ) ( long double ) ; /*VBLE QUE ALMACENA FUNCION A INTEGRAR*/
212 long double i n t e g r a l ; /*VBLE QUE ALMACENA EL RESULTADO*/
213 long double x ; /*POSICION EN EL EJE X*/
214 int i ; /*CONTADOR*/
215
216 switch ( numfuncion ) {
217 case 1 : f =F1 ; break ;
218 case 2 : f =F2 ; break ;
219 case 3 : f =F3 ; break ;
220 case 4 : f =F4 ; break ;
221 }
222 i n t e g r a l =( f ( l o c a l _ a )+ f ( l o c a l _ b ) ) / 2 . 0 ;
x= l o c a l _ a ;
N
223
224 f o r ( i =1; i <= l o c a l _ n 1; i + + ) {
225 x+=h ;
226 i n t e g r a l += f ( x ) ;
}
L
227
228 i n t e g r a l =h ;
229 return i n t e g r a l ;
230
231 } /*Trapecio*/
232
233
234 /*******************************************************************/
235 /*FUNCION recolectar_datos:PROCESO 0 SUMA LAS INTEGRALES PARCIALES */
236 /*CALCULADAS POR LOS DEMAS PROCESOS. */
/*******************************************************************/
L
237
void r e c o l e c t a r _ d a t o s ( i n t i d , i n t numprocs , long double p p a r c i a l ,
L
238
239 long double pcompleta ) {
240
241 int raiz =0; /*PROCESO QUE RECIBE LAS PARCIALES Y LAS SUMA*/
242
243 /*SUMAMOS LAS INTEGRALES PARCIALES CALCULADAS POR CADA PROCESO*/
6.5. IMPLEMENTACIN REGLA DEL TRAPECIO 103
L
254
255 v a l o r _ r e t o r n o =2 x ;
256 return valor_retorno ;
257 }
258
259
260 /*********************************/
261 /*FUNCION F2(x):FUNCION f(x)=x^2 */
262 /*********************************/
263 long double F2 ( long double x ) {
264 long double v a l o r _ r e t o r n o ;
L
265
266 v a l o r _ r e t o r n o =x x ;
267 return valor_retorno ;
268 }
269
270 /*********************************/
271 /*FUNCION F3(x):FUNCION f(x)=1/x */
272 /*********************************/
273 long double F3 ( long double x ) {
274 long double v a l o r _ r e t o r n o ;
275
276 v a l o r _ r e t o r n o =1/ x ;
277 return valor_retorno ;
278 }
279
280 /***************************************/
281 /*FUNCION F4(x):FUNCION f(x)=4/(1+x^2) */
282 /***************************************/
283 long double F4 ( long double x ) {
284 long double v a l o r _ r e t o r n o ;
L
285
286 valor_retorno =4/(1+x x ) ;
287 return valor_retorno ;
288 }
289
290
291 /*********************************************************************/
292 /*FUNCION construir_tipo_derivado: CONSTRUYE EL TIPO DE DATOS MPI */
293 /*NECESARIO PARA DISTRIBUIR LOS DATOS DE ENTRADA EMPAQUETADOS */
/*********************************************************************/
L
294
void c o n s t r u i r _ t i p o _ d e r i v a d o ( Tipo_Datos_Entrada pdatos ,
L
295
296 MPI_Datatype pMPI_Tipo_Datos ) {
297
298 MPI_Datatype t i p o s [ 4 ] ;
104 CAPTULO 6. COMUNICACIN COLECTIVA
Comunicadores y Topologas
J q 7 7 B
B
J o qp'
s 7e
7
Y .. ..
J o p'
s
a oJ ap'
s
o p'
s
c
. .
7 7e B B 7 e 7e
105
106 CAPTULO 7. COMUNICADORES Y TOPOLOGAS
0
Proceso 1
Proceso
2
Proceso
3
Proceso 4
Proceso
5
Proceso
6
Proceso 7
Proceso
8
Proceso
Por ejemplo, si C
, ,.T_3
,.T_$)ET5 53 y 9 entonces la matriz estara
particionada como se indica en el cuadro 7.1.
En el algoritmo de Fox las
submatrices
y Y , = DFE:1)EBGBGBG4Em/+1 son multiplicadas y
acumuladas por el proceso e ,.O@E3 .
Algoritmo bsico
1. Elegir una submatriz de A de cada una de las filas de procesos. La submatriz elegida
en la fila ser q
, donde
8":&
2. En cada una de las filas de procesos hacer un broadcast de la submatriz elegida hacia
los dems procesos en dicha fila.
4. En cada proceso enviar la submatriz de B al proceso que est encima de l (los proce-
sos de la primera fila enviarn la submatriz a la ltima fila).
7.2. Comunicadores
Si intentamos implementar el algoritmo de Fox, parece claro que nuestro trabajo se facil-
itara si pudiramos tratar ciertos subconjuntos de procesos como el universo de la comuni-
cacin, al menos temporalmente. Por ejemplo, en el pseudocdigo
2. En cada una de las filas de procesos hacer un broadcast de la submatriz elegida hacia
los dems procesos en dicha fila.
7.3. TRABAJANDO CON GRUPOS, CONTEXTOS Y COMUNICADORES 107
sera til tratar cada fila como el universo de la comunicacin, as como en la sentencia
4. En cada proceso enviar la submatriz de B al proceso que est encima de l (los proce-
sos de la primera fila enviarn la submatriz a la ltima fila).
Un Grupo, y
Un Contexto.
MPI_Group MPI_GROUP_WORLD;
MPI_Group grupo_primera_fila;
MPI_Comm com_primera_fila;
int tam_fila;
int* ids_procesos;
Este cdigo construye de una manera muy estricta el nuevo comunicador. Primero crea una
lista de los procesos que debern ser asignados al nuevo comunicador. Luego crea un grupo
con dichos procesos. sto requiere dos llamadas; primero se obtiene el grupo asociado a
MPI_COMM_WORLD, dado que ste es el grupo del cual se extraen los procesos para
el nuevo grupo; luego se crea el grupo con MPI_Group_incl(). Finalmente el nuevo comuni-
cador es creado con una llamada a MPI_Comm_create(). La llamada a MPI_Comm_create()
asocia implcitamente un contexto al nuevo grupo. El resultado es el comunicador
com_primera_fila. Ahora los procesos pertenecientes a com_primera_fila pueden ejecutar
a los otros procesos del grupo grupo_primera_fila:
operaciones de comunicacin colectivas. Por ejemplo, el proceso 0 (en grupo_primera_fila)
puede hacer un broadcast de su matriz
int mi_id_en_primera_fila;
float* A_00;
MPI_Bcast(A_00,n*n,MPI_FLOAT,0,com_primera_fila);
}
Los grupos y los comunicadores son objetos opacos. Desde un punto de vista prctico sto
significa que los detalles de su representacin interna dependen de la implementacin MPI
particular, y como consecuencia el usuario no puede acceder directamente a ellos. En vez
de esto el usuario accede a un manejador que referencia al objeto opaco, de manera que
dichos objetos opacos son manipulados por funciones MPI especiales, como por ejemplo
MPI_Comm_create(), MPI_Group_incl() y MPI_Comm_group().
Los contextos no son explcitamente usados en ninguna funcin MPI. En vez de ello, son
implcitamente asociados a los grupos cuando los comunicadores son creados.
La sintaxis de los comandos que hemos usado para crear com_primera_fila es bastante
sencilla. El primer comando
crea un nuevo grupo a partir de una lista de procesos pertenecientes al grupo existente an-
tiguo_grupo. El nmero de procesos en el nuevo grupo es tamano_nuevo_grupo, y los pro-
cesos que sern incluidos son listados en ids_antiguo_grupo. El proceso 0 en nuevo_grupo
tiene el identificador ids_antiguo_grupo[0] en antiguo_grupo, el proceso 1 en nuevo_grupo
es el ids_antiguo_grupo[1] en antiguo_grupo, y as sucesivamente.
El comando final
asocia el contexto al grupo nuevo_grupo, y crea el comunicador nuevo_com. Todos los pro-
cesos en nuevo_grupo pertenecen al grupo subyacente antiguo_com.
Existe una diferencia extremadamente importante entre las primeras dos funciones y la ter-
cera. MPI_Comm_group() y MPI_Group_incl() son ambas operaciones locales. Ello quiere
decir que no hay comunicacin entre los procesos implicados en dicha ejecucin. Sin embar-
go MPI_Comm_create() es una operacin colectiva. Todos los procesos en antiguo_grupo
deben llamar a MPI_Comm_create() con los mismos argumentos. El estndar MPI da tres
razones para ello:
MPI_Comm com_fila;
int fila;
/* id ES EL IDENTIFICADOR EN MPI_COMM_WORLD.
* q*q = p */
fila = id / q;
MPI_Comm_split(MPI_COMM_WORLD, fila, id, &com_fila);
Una nica llamada a MPI_Comm_split() crea m nuevos comunicadores, todos ellos con el
mismo nombre com_fila. Por ejemplo, si C
el grupo com_fila consistir en los procesos
0, 1 y 2 para los procesos 0, 1 y 2. En los procesos 3, 4 y 5 el grupo subyacente a nuevo_com
ser el formado por los procesos 3, 4 y 5; y lo mismo ocurrir con los procesos 6, 7 y 8.
La sintaxis de MPI_Comm_split() es:
La llamada crea un comunicador para cada valor de clave_particion. Los procesos con el
mismo valor en clave_particion forman un nuevo grupo. El identificador de los procesos en
el nuevo grupo estar determinado por su valor en clave_id. Si los procesos y Y llaman
ambos a la funcin MPI_Comm_split() con el mismo valor en clave_particion, y el argu-
mento clave_id pasado por el proceso es menor que el pasado por el proceso Y , entonces el
identificador de en el grupo nuevo_com ser menor que el identificador del proceso Y . Si
llaman a la funcin con el mismo valor en clave_id el sistema asignar arbitrariamente a uno
de los procesos un identificador menor.
7.5. TOPOLOGAS 111
MPI_Comm_split() es una operacin colectiva y debe ser llamada por todos los procesos
pertenecientes a antiguo_com. La funcin puede ser utilizada incluso si no deseamos asig-
narle un comunicador a todos los procesos. sto puede ser realizado pasando la constante
predefinida MPI_UNDEFINED en el argumento clave_particion. Los procesos que hagan
sto obtendrn como valor de retorno en nuevo_com el valor MPI_COMM_NULL.
7.5. Topologas
Recordemos que es posible asociar informacin adicional (ms all del grupo y del con-
texto) a un comunicador. Una de las piezas de informacin ms importantes que se pueden
adjuntar al comunicador es la topologa. En MPI una topologa no es ms que un mecanis-
mo para asociar diferentes esquemas de direccionamiento a los procesos pertenecientes a un
grupo. Notar que las topologas en MPI son topologas virtuales, lo que quiere decir que po-
dra no haber una relacin simple entre la estructura de procesos de una topologa virtual y la
estructura fsica real de la mquina paralela.
Esencialmente existen dos tipos de topologas virtuales que se pueden crear en MPI: la
topologa cartesiana o rejilla, y la topologa grfica. Conceptualmente sta ltima engloba a
la primera. De todos modos, y debido a la importancia de las rejillas en las aplicaciones, existe
una coleccin separada de funciones en MPI cuyo propsito es la manipulacin de rejillas
virtuales.
En el algoritmo de Fox queremos identificar los procesos en MPI_COMM_WORLD
mediante las coordenadas de una rejilla, y cada fila y cada columna de la rejilla necesita formar
su propio comunicador. Observemos un mtodo para construir dicha estructura.
Comenzamos asociando una estructura de rejilla a MPI_COMM_WORLD. Para hacer
esto necesitamos especificar la siguiente informacin:
MPI_Comm com_rejilla;
112 CAPTULO 7. COMUNICADORES Y TOPOLOGAS
int dimensiones[2];
int periodicidad[2];
int reordenamiento = 1;
dimensiones[0] = dimensiones[1] = q;
periodicidad[0] = periodicidad[1] = 1;
MPI_Cart_create(MPI_COMM_WORLD, 2, dimensiones,
periodicidad, reordenamiento,
&com_rejilla);
Tras ejecutar este cdigo el comunicador com_rejilla contendr los procesos pertenecientes
a MPI_COMM_WORLD (posiblemente reordenados) y tendr asociado un sistema de co-
ordenadas cartesianas de dos dimensiones. Para determinar las coordenadas de un proceso
simplemente llamaremos a la funcin MPI_Cart_coords():
int coordenadas[2];
int id_rejilla;
MPI_Comm_rank(com_rejilla, &id_rejilla);
MPI_Cart_coords(com_rejilla, id_rejilla, 2, coordenadas);
3 4 5
0 1 2
6 7 8
La funcin MPI_Cart_rank() retorna el identificador en cart_com del proceso que tiene las
coordenadas cartesianas representadas en el vector coordenadas. As, coordenadas es un vec-
tor de orden igual al nmero de dimensiones de la topologa cartesiana asociada a cart_com.
MPI_Cart_coords() es la inversa a MPI_Cart_rank(): retorna las coordenadas del proceso
que tiene como identificador id en el comunicador cartesiano cart_com. Notar que ambas
funciones son locales.
int var_coords[2];
114 CAPTULO 7. COMUNICADORES Y TOPOLOGAS
MPI_Comm com_fila;
var_coords[0]=0; var_coords[1]=1;
MPI_Cart_sub(cart_com,var_coords,&com_fila);
MPI_Com com_columna;
var_coords[0]=1; var_coords[1]=0;
MPI_Cart_sub(cart_com,var_coords,&com_columna);
1
2 /********************************************************************/
3 /*Fox:CODIGO MULTIPLICACION DE MATRICES MEDIANTE EL ALGORITMO DE FOX*/
4 /********************************************************************/
5
7.7. IMPLEMENTACIN MULTIPLICACIN DE MATRICES DE FOX 115
61 /*********************************************************************/
62 /*FUNCION MAIN: NORMALMENTE UTILIZAMOS COMUNICADOR MPI_COMM_WORLD EN */
63 /*LAS COMUNICACIONES.EMPLEAMOS COMUNICADOR TOPOLOGIA CARTESIANA SOLO */
64 /*PARA LA MULTIPLICACION DE LAS MATRICES */
/*********************************************************************/
L8L
65
66 i n t main ( i n t argc , char argv ) {
Info_cart top_cart ; /*ESTRUCTURA CON INFO SOBRE LA TOP.CARTESIANA*/
L
67
MatrizLocal localA ; /*MATRIZ LOCAL*/
L
68
MatrizLocal localB ; /*MATRIZ LOCAL*/
L
69
70 MatrizLocal localC ; /*MATRIZ LOCAL (SOLUCION)*/
71 int orden_local ; /*ORDEN MATRIZ LOCAL DE CADA PROCESO*/
72 i n t orden_global ; /*ORDEN MATRIZ GLOBAL*/
73 i n t minimo ; /*MINIMO ORDEN GLOBAL*/
74 i n t maximo ; /*MAXIMO ORDEN GLOBAL*/
75 i n t id_comm_world ; /*ID PROCESO EN MPI_COMM_WORLD*/
76 i n t numprocs_comm_world ; /*NUMERO PROCESOS EN MPI_COMM_WORLD*/
77 i n t raiz_numprocs ; /*RAIZ DE NUMERO PROCESOS*/
78 char nombreproc [MPI_MAX_PROCESSOR_NAME] ;
79 /*NOMBRE PROCESADOR*/
80 i n t lnombreproc ; /*LONGITUD NOMBRE PROCESADOR*/
81 double t m p i n i c = 0 . 0 ; /*TIEMPO INICIO DE LA EJECUCION*/
82 double t m p f i n ; /*TIEMPO FINAL DE LA EJECUCION */
83 int etiqueta =50; /*ETIQUETA MENSAJES DE PRUEBA*/
84 MPI_Status s t a t u s ; /*STATUS MENSAJES DE PRUEBA*/
85 int origen ; /*ORIGEN MENSAJES DE PRUEBA*/
86
87
88
89 /*INICIALIZAMOS EL ENTORNO DE EJECUCION MPI*/
90 M P I _ I n i t (& argc ,& argv ) ;
91
92 /*ALMACENAMOS EL IDENTIFICADOR DEL PROCESO EN MPI_COMM_WORLD*/
93 MPI_Comm_rank (MPI_COMM_WORLD,& id_comm_world ) ;
94
95 /*ALMACENAMOS EL NUMERO DE PROCESOS*/
96 MPI_Comm_size (MPI_COMM_WORLD,& numprocs_comm_world ) ;
97
98 /*FINALIZAMOS SI NUMERO DE PROCESOS NO TIENE RAIZ ENTERA*/
99 raiz_numprocs= s q r t ( numprocs_comm_world ) ;
100 i f ( pow ( raiz_numprocs , 2 ) ! = numprocs_comm_world ) {
101 i f ( id_comm_world = = 0 ) {
102 f p r i n t f ( s t d o u t , " \ n E r r o r . Numero de p r o c e s o s u t i l i z a d o " ) ;
103 f p r i n t f ( stdout , " debe t e n e r r a i z e n t e r a \ n \ n " ) ;
104 }
105 MPI_Finalize ( ) ;
106 return 0 ;
107 }
108
109 /*E/S:NOMBRE DEL PROCESADOR,PROCESADOR 0*/
110 MPI_Get_processor_name ( nombreproc,& lnombreproc ) ;
111 i f ( id_comm_world = = 0 ) {
112 f p r i n t f ( s t d o u t , " \ n P r o c e s o %d (MPI_COMM_WORLD) en %s " ,
113 id_comm_world , nombreproc ) ;
114 f p r i n t f ( s t d o u t , " E n c a r g a d o de l a E / S \ n " ) ;
115 }
7.7. IMPLEMENTACIN MULTIPLICACIN DE MATRICES DE FOX 117
171 i f ( C o n f i g _ c a r t (& t o p _ c a r t ) ) {
172 MPI_Finalize ( ) ;
173 return 0 ;
174 }
175
/*LLAMADA MULTIPLICACION DE MATRICES MEDIANTE EL ALGORITMO DE FOX*/
L L L
176
177 Fox (& t o p _ c a r t , l o c a l A , l o c a l B , l o c a l C , o r d e n _ l o c a l ) ;
178
179 /*--------------------------------------------------------------------*/
180
181
182
183 /*IMPRIMIMOS RESULTADO.UTILIZAMOS FILA Y COLUMNA DE LA TOP.CARTESIANA*/
i m p r e s i o n _ m a t r i c e s ( id_comm_world , numprocs_comm_world ,
L L L
184
185 localA , localB , localC , orden_local ,
186 t o p _ c a r t . f i l a , t o p _ c a r t . columna ) ;
187
188 /*IMPRIMIMOS TIEMPO FINAL DE PROCESAMIENTO*/
189 t m p f i n =MPI_Wtime ( ) ;
190 i f ( id_comm_world = = 0 ) {
f p r i n t f ( s t d o u t , " \ nNumero P r o c e s o s : %d \ n " , numprocs_comm_world ) ;
N
191
192 f p r i n t f ( s t d o u t , " Tiempo P r o c e s a m i e n t o : % f \ n \ n " , t m p f i n t m p i n i c ) ;
193 }
194
195 /*FINALIZAMOS EL ENTORNO DE EJECUCION MPI*/
196 MPI_Finalize ( ) ;
197 return 0 ;
198
199 } /*main*/
200
201
202 /*************************************************************/
203 /*FUNCION obtener_datos: PROCESO 0 EN MPI_COMM_WORLD OBTIENE */
204 /*LOS DATOS DE ENTRADA */
/*************************************************************/
L
205
206 void o b t e n e r _dat os ( i n t minimo , i n t maximo , i n t o r d e n _ g l o b a l ) {
207
208 i n t ok = 0 ; /*SEMAFORO PETICION DATOS*/
209
210 /*E/S:PETICION DE DATOS*/
211
212 while ( ok = = 0 ) {
213 f p r i n t f ( s t d o u t , " I n t r o d u z c a o r d e n de l a m a t r i z g l o b a l a c a l c u l a r " ) ;
214 f p r i n t f ( s t d o u t , " ( minimo= %d , maximo= %d ) \ n " , minimo , maximo ) ;
s c a n f ( " %d " , o r d e n _ g l o b a l ) ;
L L
215
216 i f ( minimo <=( o r d e n _ g l o b a l ) & & ( o r d e n _ g l o b a l )<=maximo ) { ok = 1 ; }
217 else { f p r i n t f ( s t d o u t , " Orden e r r o n e o . \ n " ) ; }
218 }
219
220
221 /*E/S SIN PETICION:UTILIZAR EN CASO DE PRUEBAS*/
222 /**orden_global=2800;*/
223
224 }
225
7.7. IMPLEMENTACIN MULTIPLICACIN DE MATRICES DE FOX 119
226 /*********************************************************************/
227 /*FUNCION distribuir_datos: UTILIZAMOS EL COMUNICACOR MPI_COMM_WORLD */
228 /*PARA DISTRIBUIR EL DATO DE ENTRADA */
/*********************************************************************/
L
229
230 void d i s t r i b u i r _ d a t o s ( i n t o r d e n _ l o c a l ) {
231
232 MPI_Bcast ( o r d e n _ l o c a l , 1 , MPI_INT , 0 ,MPI_COMM_WORLD ) ;
233
234 }
235
236 /***********************************************************/
237 /*FUNCION inicializacion_matrices:INICIALIZA LAS MATRICES */
238 /*ALEATORIAMENTE.LA MATRIZ RESULTADO SE DEJA A 0 */
239 /***********************************************************/
240 void i n i c i a l i z a c i o n _ m a t r i c e s ( M a t r i z L o c a l l o c a l A ,
241 MatrizLocal localB ,
242 MatrizLocal localC ,
243 int orden_local ,
244 int id ){
245
246 int i , j ; /*CONTADORES*/
247
248 /*UTILIZAMOS COMO SEMILLA EL IDENTIFICADOR DEL PROCESO*/
249 srand ( i d ) ;
250
251 f o r ( i =0; i < o r d e n _ l o c a l ; i + + ) {
252 f o r ( j =0; j < o r d e n _ l o c a l ; j + + ) {
/*MATRICES LOCALES,ELEMENTOS PSEUDOALEATORIOS*/
L
253
l o c a l A [ i ] [ j ] = ( i n t ) ( 1 0 0 . 0 rand ( ) / ( RAND_MAX) ) ;
L
254
255 l o c a l B [ i ] [ j ] = ( i n t ) ( 1 0 0 . 0 rand ( ) / ( RAND_MAX) ) ;
256 /*RESULTADO,ELEMENTOS=0*/
257 localC [ i ] [ j ]=0;
258 }
259 }
260 } /*inicializacion_matrices*/
261
262
263 /************************************************************************/
264 /*FUNCION Config_cart:CREA Y CONFIGURA UN COMUNICADOR CUYA TOPOLOGIA ES */
265 /*CARTESIANA. ALMACENA EN LA ESTRUCTURA Info_cart LOS DATOS NECESARIOS */
/************************************************************************/
L
266
267 int Config_cart ( Info_cart pcart ) {
268 int antigua_id ; /*ID DENTRO DEL COMUNICADOR INICIAL MPI_COMM_WORLD*/
269 i n t dims [ 2 ] ; /*VECTOR QUE CONTIENE LA EXTENSION DE CADA DIMENSION*/
270 int periods [ 2 ] ; /*VECTOR BOOLEANO.CONTIENE PERIODICIDAD DE CADA DIMENSION*/
271 i n t coords [ 2 ] ; /*VECTOR QUE CONTIENE LAS COORDENADAS DE CADA PROCESO*/
272 i n t var_coords [ 2 ] ; /*VECTOR PARA GENERAR COMUNICADORES DE FILA Y COLUMNA*/
273
/*ALMACENAMOS EL NUM DE PROCESOS PERTENECIENTES A MPI_COMM_WORLD*/
N
274
275 MPI_Comm_size (MPI_COMM_WORLD, & ( p c a r t >numprocs ) ) ;
276 /*IDENTIFICADOR DE CADA PROCESO DENTRO DE MPI_COMM_WORLD*/
277 MPI_Comm_rank (MPI_COMM_WORLD,& a n t i g u a _ i d ) ;
278
279 /*ORDEN DE LA TOPOLOGIA CARTESIANA,QUE ES LA RAIZ DEL NUM DE PROCESOS*/
280 /*SI DICHA RAIZ NO ES ENTERA,DEBEMOS DESHACERNOS DE LOS PROCESOS SOBRANTES*/
120 CAPTULO 7. COMUNICADORES Y TOPOLOGAS
281 N N
p c a r t >o r d e n _ c a r t =( i n t ) s q r t ( p c a r t >numprocs ) ;
282
283 /*PREPARAMOS LA CREACION DE LA TOPOLOGIA CARTESIANA.DEFINIMOS LA EXTENSION
Y PERIODICIDAD DE CADA UNA DE LAS DIMENSIONES,MEDIANTE SENDOS VECTORES*/
N
284
285 dims [ 0 ] = dims [ 1 ] = p c a r t >o r d e n _ c a r t ;
286 periods [0]= periods [1]=1;
/*CREACION DE LA TOPOLOGIA CARTESIANA.LA ALMACENAMOS EN pcart->comm_global*/
N
287
288 MPI_Cart_create (MPI_COMM_WORLD, 2 , dims , p e r i o d s , 1 , & ( p c a r t >comm_global ) ) ;
289
/*SI DICHO PROCESO NO ENCAJA EN LA TOPOLOGIA CARTESIANA,SALIDA ERRONEA*/
N
290
291 i f ( ! p c a r t >comm_global ) r e t u r n 1 ;
292
/*IDENTIFICADOR DE CADA PROCESO DENTRO DE LA TOPOLOGIA CARTESIANA*/
N N
293
294 MPI_Comm_rank ( p c a r t >comm_global , & ( p c a r t >i d ) ) ;
295
/*COORDENADAS ASOCIADAS AL PROCESO,SU FILA Y COLUMNA*/
N N
296
MPI_Cart_coords ( p c a r t >comm_global , p c a r t >i d , 2 , coords ) ;
N
297
p c a r t > f i l a =coords [ 0 ] ;
N
298
299 p c a r t >columna=coords [ 1 ] ;
300
301 /*CREAMOS UN COMUNICADOR ENTRE LOS PROCESOS DE LA MISMA FILA*/
var_coords [ 0 ] = 0 ; var_coords [ 1 ] = 1 ;
N N
302
303 MPI_Cart_sub ( p c a r t >comm_global , var_coords , & ( p c a r t >comm_fila ) ) ;
304 /*CREAMOS UN COMUNICADOR ENTRE LOS PROCESOS DE LA MISMA COLUMNA*/
var_coords [ 0 ] = 1 ; var_coords [ 1 ] = 0 ;
N N
305
306 MPI_Cart_sub ( p c a r t >comm_global , var_coords , & ( p c a r t >comm_columna ) ) ;
307
308 return 0 ;
309
310 } /*Config_cart*/
311
312
313 /**************************************************************************/
314 /*FUNCION Fox:MULTIPLICACION DE MATRICES MEDIANTE EL ALGORITMO DE FOX */
/**************************************************************************/
L
315
316 void Fox ( I n f o _ c a r t p c a r t ,
317 MatrizLocal matriz1 ,
318 MatrizLocal matriz2 ,
319 MatrizLocal r e s u l t ,
320 int orden_local ) {
321
322 int i ; /*CONTADOR*/
323 int bcast_raiz ; /*PROCESO ORIGEN QUE ENVIA MATRIZ LOCAL 1 HACIA
324 LOS PROCESOS DE LA MISMA FILA*/
325 int origen , destino ; /*ORIGEN Y DESTINO DE MATRIZ LOCAL 2 ENTRE
326 LOS PROCESOS DE LA MISMA COLUMNA*/
327 int etiqueta =50; /*ETIQUETA*/
MPI_Status s t a t u s ; /*STATUS RECEPCION*/
L
328
329 M a t r i z L o c a l temp1 ; /*VBLE DONDE ALMACENAMOS LA MATRIZ
330 ENVIADA POR bcast_raiz*/
331
332
/*RESERVAMOS ESPACIO PARA MATRIZ LOCAL*/
L
333
334 temp1=( M a t r i z L o c a l ) m a l l o c ( s i z e o f ( M a t r i z L o c a l ) ) ;
335
7.7. IMPLEMENTACIN MULTIPLICACIN DE MATRICES DE FOX 121
391
392 i f ( i d ==0){
393 /*APERTURA FICHERO SALIDA*/
394 /*UTILIZAR PREFERIBLEMENTE UN FICHERO LOCAL (EN LINUX
395 PODRIAMOS USAR ALGO COMO "/tmp/Result.txt")*/
396 i f ( ( s a l i d a=fopen ( " / tmp / R e s u l t . t x t " , "w" ) ) = =NULL ) {
397 f p r i n t f ( s t d e r r , " F a l l o de a p e r t u r a f i c h e r o s a l i d a . \ n " ) ;
398 return 1 ;
399 }
400 else {
401 f p r i n t f ( s t d o u t , " E s c r i b i e n d o r e s u l t a d o en f i c h e r o de s a l i d a . \ n " ) ;
402 }
403 /*IMPRESION MATRICES PROPIAS*/
404 f p r i n t f ( s a l i d a , "PROC %d : C o o r d e n a d a s( %d, %d ) . M a t r i z A\ n " , i d ,
405 f i l a , columna ) ;
406 imp_matriz ( matrizA , orden_local , s a l i d a ) ;
407 f p r i n t f ( s a l i d a , "PROC %d : C o o r d e n a d a s( %d, %d ) . M a t r i z B \ n " , i d ,
408 f i l a , columna ) ;
409 imp_matriz ( matrizB , orden_local , s a l i d a ) ;
410 f p r i n t f ( s a l i d a , "PROC %d : C o o r d e n a d a s( %d, %d ) . M a t r i z R e s u l t a d o \ n " , i d ,
411 f i l a , columna ) ;
412 imp_matriz ( matrizResult , orden_local , s a l i d a ) ;
413 /*IMPRESION OTRAS MATRICES*/
414 f o r ( o r i g e n =1; o r i g e n<numprocs ; o r i g e n + + ) {
/*MATRIZ A*/
L
415
416 MPI_Irecv (& B u f f e r F i l a , 1 , MPI_INT , o r i g e n , e t i q u e t a o r i g e n +1,
MPI_COMM_WORLD,& r e q u e s t s [ 0 ] ) ;
L
417
418 MPI_Irecv (& BufferColumna , 1 , MPI_INT , o r i g e n , e t i q u e t a o r i g e n +2,
MPI_COMM_WORLD,& r e q u e s t s [ 1 ] ) ;
L
419
420 MPI_Irecv ( B u f f e r M a t r i z , 1 , T i p o _ e n v i o _ m a t r i z , o r i g e n , e t i q u e t a o r i g e n +3,
421 MPI_COMM_WORLD,& r e q u e s t s [ 2 ] ) ;
422 MPI_Waitall ( 3 , requests , status ) ;
423 f p r i n t f ( s a l i d a , "PROC %d : C o o r d e n a d a s( %d, %d ) . M a t r i z A \ n " , o r i g e n ,
B u f f e r F i l a , BufferColumna ) ;
L
424
425 i m p _ m a t r iz ( B u f f e r M a t r i z , o r d e n _ l o c a l , s a l i d a ) ;
/*MATRIZ B*/
L
426
427 MPI_Irecv ( B u f f e r M a t r i z , 1 , T i p o _ e n v i o _ m a t r i z , o r i g e n , e t i q u e t a o r i g e n +4,
428 MPI_COMM_WORLD,& r e q u e s t s [ 0 ] ) ;
429 MPI_Wait(& r e q u e s t s [ 0 ] , & s t a t u s [ 0 ] ) ;
430 f p r i n t f ( s a l i d a , "PROC %d : C o o r d e n a d a s( %d, %d ) . M a t r i z B \ n " , o r i g e n ,
B u f f e r F i l a , BufferColumna ) ;
L
431
432 i m p _ m a t r iz ( B u f f e r M a t r i z , o r d e n _ l o c a l , s a l i d a ) ;
/*MATRIZ Result*/
L
433
434 MPI_Irecv ( B u f f e r M a t r i z , 1 , T i p o _ e n v i o _ m a t r i z , o r i g e n , e t i q u e t a o r i g e n +5,
435 MPI_COMM_WORLD,& r e q u e s t s [ 0 ] ) ;
436 MPI_Wait(& r e q u e s t s [ 0 ] , & s t a t u s [ 0 ] ) ;
437 f p r i n t f ( s a l i d a , "PROC %d : C o o r d e n a d a s( %d, %d ) . M a t r i z R e s u l t \ n " , o r i g e n ,
B u f f e r F i l a , BufferColumna ) ;
L
438
439 i m p _ m a t r iz ( B u f f e r M a t r i z , o r d e n _ l o c a l , s a l i d a ) ;
440 }
441 /*CIERRE FICHERO SALIDA*/
442 fclose ( salida ) ;
443 }
444 else {
445 /*ENVIO DE DATOS*/
7.7. IMPLEMENTACIN MULTIPLICACIN DE MATRICES DE FOX 123
125
Captulo 8
127
128 CAPTULO 8. EVALUACIN DEL SISTEMA
cualquier implementacin MPI. Las versiones ms actuales incluyen junto a mpptest una serie
de programas (stress y goptest entre otros) que estn adaptados especficamente a cierto tipo
de mediciones del rendimiento del sistema.
$ cd directorio_mpich/examples/perftest
$ make
Mpptest puede ser utilizado en otras implementaciones MPI; para realizar una instalacin
adecuada consulte la documentacin.
Para ejecutar mpptest debemos utilizar el programa de arranque de procesos que gen-
eralmente empleamos en la ejecucin de programas MPI. Normalmente utilizaremos mpirun
(seccin A.6).
De este modo utilizando la siguiente orden realizaremos un test simple de comunicacin
bloqueante entre dos procesos:
$ mpptest -help
Tambin existe un script, llamado runmpptest, que facilita la realizacin de las pruebas de
rendimiento ms generales. Para utilizarlo no es necesario emplear el programa mpirun. Pode-
mos conocer sus opciones ejecutando:
$ runmpptest -help
Sin embargo mpptest tambin puede generar datos para el programa gnuplot, utilizando la
opcin -gnuplot. De esta manera obtendremos por la salida estndar los comandos necesarios
para que el programa gnuplot utilice los datos que la misma orden almacena en el fichero
mppout.gpl. La siguiente orden guarda en el fichero out.mpl los comandos que sern
ledos por gnuplot, y agrega los datos del test al fichero mppout.gpl:
Tambin podemos utilizar la opcin -fname. Con la siguiente orden guardaremos en el fichero
nombre.mpl los comandos que sern ledos por gnuplot, agregando los datos del test al
fichero nombre.gpl:
8.1.3. Visualizacin
En la visualizacin del contenido de los tests utilizaremos el programa gnuplot. Lo primero
que debemos hacer, como se explica en el apartado anterior, es generar el fichero de comandos
.mpl y el fichero de datos .gpl asociado.
Una vez hecho sto, para ejecutar los comandos del fichero out.mpl (analizando as los
datos almacenados en el fichero .gpl asociado) utilizaremos:
$ gnuplot out.mpl
8.1.4. Grficos
Para generar grficos en formato Encapsulated Postscript tenemos dos opciones. La primera
es utilizar la opcin -gnuploteps en vez de -gnuplot para generar el fichero de comandos .mpl.
La siguiente secuencia de rdenes genera el grfico out.eps en monocromo:
Otra posibilidad sera generar el fichero de comandos .mpl con la opcin -gnuplot (como
hacamos antes):
Para luego escribir una serie de comandos dentro del programa gnuplot. De esta manera po-
dremos elegir de una manera ms precisa el formato del grfico de salida. Con la siguiente
serie de comandos conseguiremos obtener el grfico en color:
8.1.5. Operaciones
Mpptest proporciona una amplia variedad de tests. Los distintos tipos de tests son selec-
cionados normalmente a travs de los argumentos asociados a la ejecucin del programa en
la lnea de comandos, aunque tambin puede ser necesario el empleo de otros programas para
ejecutarlos. La siguiente lista resume las opciones disponibles ms interesantes:
Nmero de Procesos. Cualquier nmero de procesos puede ser empleado. Por defecto s-
lo dos de los procesos se comunican. Utilizando la opcin -bisect todos los procesos
participan en la comunicacin.
$ goptest -help
Como ocurre con mpptest, tambin existe un script que facilita el manejo del programa
goptest. Dicho script se denomina rungoptest. Podemos conocer sus opciones ejecu-
tando:
$ rungoptest -help
$ stress -help
Todas las mquinas estn conectadas a una red Ethernet (mediante una tarjeta Davicom Eth-
ernet 100/10 Mbit) y comparten el sistema de ficheros /home mediante NFS (Network File
System, Sistema de Ficheros en Red). El servidor de ficheros es un computador Compaq
DEC 3000/800S Alpha, con el sistema operativo Tru64 UNIX (Digital UNIX) V4.0E . La
implementacin MPI utilizada es MPICH Versin 1.2.4 .
A continuacin analizaremos el rendimiento y la fiabilidad de nuestro sistema al ejecutar
distintos tipos de comunicacin.
E JECUCIN
Ejecutaremos 16 procesos de los cuales dos de ellos se comunicarn. El tamao de los
mensajes variar entre 0 y 1024 bytes. Para ejecutarlo daremos la orden:
Como podemos observar el nmero de procesos lo fijamos mediante el programa mpirun. Por
defecto mpptest utiliza para las pruebas mensajes cuyo tamao vara entre 0 y 1024 bytes, con
un salto de 32 bytes entre un tamao y el siguiente.
Con esta orden el fichero ComBloq.gpl almacenar los datos para el grfico, mientras
que ComBloq.mpl contendr los comandos gnuplot para visualizarlos. Modificaremos ste
ltimo para mejorar el aspecto del resultado:
Comunicacion Bloqueante
1200
Com.Bloqueante
1000
800
Tiempo (micro-seg)
600
400
200
0
0 200 400 600 800 1000 1200
Tamano (bytes)
El grfico que obtenemos como resultado lo tenemos en la figura 8.1. El eje T mide el tamao
de los mensajes, mientras que el eje U mide el tiempo necesario para transmitirlos. La lnea
roja representa el rendimiento de la comunicacin bloqueante.
E JECUCIN
Ejecutaremos 16 procesos de los cuales dos de ellos se comunicarn. El tamao de los
mensajes variar entre 0 y 1024 bytes. Utilizaremos comunicacin no bloqueante. Para ejecu-
tarlo daremos la orden:
8.2. PRUEBAS REALIZADAS 133
El grfico que obtenemos como resultado lo tenemos en la figura 8.2. El eje T mide el tamao
de los mensajes, mientras que el eje U mide el tiempo necesario para transmitirlo. La lnea
roja representa el rendimiento de la comunicacin no bloqueante y la azul el rendimiento de
la comunicacin bloqueante.
E JECUCIN
Ejecutaremos 16 procesos de manera que todos ellos participen en la comunicacin. La
mitad de los procesos envan mensajes a la otra mitad. El tamao de los mensajes variar entre
0 y 1024 bytes. Para ejecutarlo daremos la orden:
134 CAPTULO 8. EVALUACIN DEL SISTEMA
1000
800
Tiempo (micro-seg)
600
400
200
0
0 200 400 600 800 1000 1200
Tamano (bytes)
1200
Tiempo (micro-seg)
1000
800
600
400
200
0
0 200 400 600 800 1000 1200
Tamano (bytes)
El grfico que obtenemos como resultado lo tenemos en la figura 8.3. El eje T mide el tamao
de los mensajes, mientras que el eje U mide el tiempo necesario para transmitirlos. La lnea
roja representa el rendimiento de la comunicacin participativa y la azul el rendimiento de la
comunicacin no participativa.
E JECUCIN
Ejecutaremos 16 procesos de los cuales dos de ellos se comunicarn. Al mismo tiempo el
sistema realizar un determinado procesamiento. El tamao de los mensajes quedar fijado en
136 CAPTULO 8. EVALUACIN DEL SISTEMA
La opcin -overlap realiza un simple test que mide el impacto que produce el solapamiento
entre comunicacin y procesamiento en el rendimiento del sistema. Este test se lleva a cabo
enviando mensajes no bloqueantes sin contenido a la vez que se genera una carga variable de
procesamiento.
Con esta orden el fichero Overlap.gpl almacenar los datos para el grfico, mientras
que Overlap.mpl contendr los comandos gnuplot para visualizarlos. Modificaremos ste
ltimo para comparar el rendimiento de la comunicacin solapada y el de la no solapada,
relacionndolos en el mismo grfico:
El grfico que obtenemos como resultado lo tenemos en la figura 8.4. El eje T representa la
carga de procesamiento medida en bytes, mientras que el eje U mide el tiempo necesario para
transmitir un mensaje con dicha carga. La lnea roja representa el rendimiento de la comuni-
cacin solapada.
192
190
Tiempo (micro-seg)
188
186
184
182
0 200 400 600 800 1000 1200
Carga de Procesamiento (bytes)
E JECUCIN
En el caso de las operaciones colectivas las mediciones no se deben basar slo en el tamao
de los mensajes, ya que no es la nica variable determinante; tambin debemos analizar el
nmero de procesos que intervienen en su ejecucin.
Goptest es el programa encargado de generar datos para grficos basndose en el nmero
de procesos. La dificultad que entraa este tipo de mediciones es que no pueden ser realizadas
en un solo paso; ello es debido a que el programa de arranque mpirun slo puede seleccionar
un nmero de procesos en la ejecucin cada vez. Por lo tanto debemos realizar una ejecucin
del test para cada nmero de procesos que queramos incluir en el test.
As pues realizaremos cuatro ejecuciones consecutivas para medir el comportamiento del
sistema en una comunicacin colectiva de 2, 4, 8 y 16 procesos. La operacin se comunicacin
colectiva que realizaremos ser una operacin de reduccin que sumar los valores de todos
los procesos. Dichos valores sern de tipo entero:
Como podemos observar el tipo de operacin colectiva se determina mediante una opcin. La
opcin isum indica la realizacin de una operacin de reduccin donde se suman los valores de
todos los procesos, siendo dichos valores de tipo entero. La opcin -sizelist indica los tamaos
de mensajes a utilizar en las pruebas. En todo caso vemos que la ejecucin de goptest es muy
similar a la de mpptest, coincidiendo en la mayora de las opciones disponibles.
Lo siguiente ser preparar el fichero de datos. Dado que realizamos cuatro ejecuciones,
en cada una de ellas agregamos de manera dispersa informacin al fichero Goptest.gpl.
Tendremos que preparar dicho fichero para que pueda ser utilizado por el programa gnuplot.
Con esta finalidad debemos agrupar la informacin para que el fichero quede sin lneas vacas,
dejndolo de la siguiente manera:
Ahora tenemos el fichero Goptest.gpl, que almacena los datos para el grfico, y el fichero
Goptest.mpl, que contiene los comandos gnuplot para visualizarlos. Modificaremos ste
ltimo de manera que gnuplot genere un grfico Encapsulated Postscript manteniendo un
buen aspecto:
El grfico que obtenemos como resultado lo tenemos en la figura 8.5. El eje T representa
el nmero de procesos utilizados, mientras que el eje U mide el tiempo necesario realizar la
comunicacin colectiva. La lnea roja representa el rendimiento de la comunicacin colectiva
utilizando los mensajes de 32 bytes, la azul los de 256 bytes, la morada los de 512 y la negra
los de 1024 bytes.
8.2. PRUEBAS REALIZADAS 139
120000
Tiempo (micro-seg)
100000
80000
60000
40000
20000
0
0 2 4 6 8 10 12 14 16
Num.Procesos
Una comunicacin colectiva entre 16 procesos utilizando mensajes de 1024 bytes tarda
unos 140.000 <>=@?A , mientras que con 4 procesos (una cuarta parte) tarda aproximanda-
mente 22.000 <>=&?BA . Observamos una reduccin del 85 %.
Con estos datos vemos que el nmero de procesos es una variable algo ms determinante
que el tamao de los mensajes, aunque esta ltima tambin reviste mucha importancia. Por lo
dems vemos que el crecimiento de las funciones es similar en todos los tamaos de mensajes,
y que este tipo de comunicacin en general consume ms tiempo que la comunicacin punto
a punto.
140 CAPTULO 8. EVALUACIN DEL SISTEMA
8.2.6. Fiabilidad
Este test comprueba la fiabilidad de la comunicacin en el sistema utilizando el programa
stress.
E JECUCIN
El programa stress realiza un test de fiabilidad sobre un determinado sistema. Este pro-
grama enva conjuntos de bits en mensajes de varios tamaos, y luego chequea cada bit del
mensaje recibido en el proceso receptor. Podemos utilizar el nmero de procesos que creamos
conveniente. Con la siguiente orden realizaremos un test con 4 procesos:
Por defecto el tamao de los mensajes que utiliza est comprendido entre 0 y 1024 bytes, con
un salto de 32 bytes entre un tamao y el siguiente. La comunicacin es de tipo bloqueante,
aunque sto lo podemos cambiar con la opcin -async.
A continuacin exponemos la salida que genera este programa:
Each to All
................................+
................................+
................................+
................................+
................................+
................................+
................................+
................................+
................................+
................................+
................................+
................................+
................................+
stress runs to Tue Jul 1 12:15:19 2003 (1) [0.641943 MB/s aggregate]
Stress completed 1 tests
2.108621e+08 bytes sent
La primera lnea , Each to All, indica que cada proceso enviar mensajes a todos los
dems. Cada una de las lneas de puntos representa una serie de mensajes que enviamos de
un proceso a otro. Al utilizar la opcin -verbose la lnea de puntos es sustituida por una
informacin para cada mensaje, que indica su tamao y el patrn utilizado para generar el
conjunto de bits que forma dicho mensaje; de esta manera cada lnea de puntos representa lo
siguiente:
8.2. PRUEBAS REALIZADAS 141
Los programas de utilidad incluidos en MPE son bsicamente utilidades para el manejo y
tratamiento de ficheros de recorrido, y las herramientas grficas se utilizan en su visualizacin.
Todo ello se analiza con ms detalle en la siguiente seccin.
143
144 CAPTULO 9. EVALUACIN DE LOS ALGORITMOS
9.1.1.1. Creacin
Generalmente el mtodo ms sencillo y seguro para la utilizacin de las libreras MPE es
mediante el enlace del cdigo MPI con las libreras MPE adecuadas. Para ello slo debemos
proporcionar un argumento (-mpilog) al comando de compilacin que usemos normalmente
(seccin A.5). En realidad sto slo debe hacerse en el momento de enlazar el cdigo.
Por ejemplo, para crear una versin del programa RTrap (algoritmo Regla del Trapecio)
que genere un fichero de recorrido, compilaremos y enlazaremos dando las siguientes rdenes:
$ mpicc -c RTrap.c
$ mpicc -o RTrap -mpilog RTrap.o
Aunque tambin podemos compilar directamente:
$ mpicc -o RTrap -mpilog RTrap.c
Dado que el formato por defecto de salida es CLOG, el fichero de recorrido que obtendremos
al ejecutar RTrap se llamar RTrap.clog.
Si queremos que el fichero tenga otro formato de salida debemos utilizar la variable de
entorno MPE_LOG_FORMAT. Dicha variable determina el formato de salida de los ficheros
de recorrido. Los valores permitidos para MPE_LOG_FORMAT son CLOG, SLOG y ALOG.
Cuando la variable MPE_LOG_FORMAT no est establecida se asume CLOG.
As pues, para generar el fichero de recorrido de RTrap en formato SLOG ejecutaremos
lo siguiente:
$ MPE_LOG_FORMAT=SLOG
$ export MPE_LOG_FORMAT
$ mpicc -c RTrap.c
$ mpicc -o RTrap -mpilog RTrap.o
De esta manera el fichero de recorrido que obtendremos al ejecutar RTrap ser RTrap.slog.
9.1. HERRAMIENTAS DE MONITORIZACIN 145
9.1.1.2. Visualizacin
Para visualizar el contenido de los ficheros de recorrido, lo ms recomendable es ejecu-
tar el programa logviewer. Este script emplea el visualizador adecuado para tratar el fichero
basndose en su extensin. Dependiendo del formato que tenga el fichero, logviewer emplear
un visualizador u otro. Si queremos informacin acerca de sus opciones ejecutaremos:
$ logviewer -help
Si lo que queremos es visualizar un fichero de recorrido ejecutaremos:
$ logviewer nombrefichero.extension
El programa logviewer utiliza los siguientes visualizadores para mostrar el contenido de los
ficheros de recorrido:
upshot Utilizado para visualizar ficheros con el formato ALOG. Analiza eventos asociados
a etiquetas temporales que representan el momento en que se produjeron, almacenados
en formato de texto ASCII.
jumpshot-2 Utilizado para visualizar ficheros con el formato CLOG. Este visualizador es una
evolucin de nupshot, el cual a su vez es una versin ms rpida de upshot. Analiza los
ficheros en formato binario y est escrito en Java. Su inconveniente radica en el impacto
que tiene sobre su rendimiento el tamao del fichero a analizar. Cuando el fichero CLOG
sobrepasa los 4MB su rendimiento se deteriora de manera significativa.
jumpshot-3 Utilizado para visualizar ficheros con el formato SLOG. Es la evolucin natural
de jumpshot-2 y tambin est escrito en Java. Este visualizador es fruto del esfuer-
zo de investigacin desarrollado para solucionar los problemas de rendimiento de su
antecesor. De este modo visualiza programas de una manera ms escalable. Debido al
formato de los ficheros que trata, este visualizador no analiza eventos convencionales
si no estados (esencialmente eventos con una duracin) en un formato binario especial,
diseado para permitir el tratamiento de ficheros de recorrido muy grandes (del tamao
de varios Gigas).
9.1.1.3. Conversin
Para convertir los ficheros de recorrido de un formato a otro, tenemos las siguientes her-
ramientas:
clog2slog Conversor de ficheros CLOG a SLOG. Es muy til en aquellos casos en los que
la generacin directa del fichero SLOG no funciona debido mal comportamiento del
programa MPI. Adems este conversor nos permite ajustar ciertos parmetros del fichero
de recorrido, como el segmento del fichero a mostrar, etc. Para obtener ms informacin
ejecutaremos:
$ clog2slog -h
slog_print Programa que imprime ficheros SLOG en modo texto por la salida estndar. Sirve
para chequear el contenido del fichero de recorrido. Si el fichero SLOG es demasiado
grande, puede no ser til usar slog_print. Adems cuando el fichero SLOG no est
completo slog_print no funcionar. Por lo tanto servir como un simple test para saber
si el fichero SLOG est generado completamente.
clog_print Programa que imprime ficheros CLOG en modo texto por la salida estndar.
$ mpicc -c HolaMundo.c
$ mpicc -o HolaMundo -mpitrace HolaMundo.o
Starting MPI_Init...
Starting MPI_Init...
[0] Ending MPI_Init
[0] Starting MPI_Comm_rank...
9.1. HERRAMIENTAS DE MONITORIZACIN 147
Hola Mundo!
Numero Procesos: 2
Tiempo Procesamiento: 0.000087
$ mpicc -c RTrap.c
$ mpicc -o RTrap -L/usr/X11R6/lib -lX11 -lm
-mpianim RTrap.o
148 CAPTULO 9. EVALUACIN DE LOS ALGORITMOS
Debido a que dicha librera utiliza operaciones del sistema XWindow, puede que tengamos
problemas con los permisos de acceso al servidor X. En ese caso utilizaremos la orden xhost
para permitir el acceso al servidor X. Si tiene problemas con la configuracin de seguridad
consulte al administrador del sistema.
Al ejecutar la siguiente orden:
9.2.3. Coste
El coste de un algoritmo se obtiene de la multiplicacin de las dos medidas anteriores; de
esta manera
El cuadro 9.1 contiene para cada nmero de procesadores empleado el tiempo de ejecu-
cin medido en segundos y el coste obtenido. En el grfico de la figura 9.3 exponemos la
relacin entre tiempo de ejecucin y nmero de procesadores. La figura 9.4 contiene la curva
de crecimiento del coste con respecto al nmero de procesadores.
140
120
100
Tiempo (seg)
80
60
40
20
0
0 2 4 6 8 10 12 14 16
Numero de Procesadores
175
170
165
160
Coste
155
150
145
140
135
0 2 4 6 8 10 12 14 16
Numero de Procesadores
En la figura 9.5 observamos el modelo de ejecucin del algoritmo regla del trapecio con 8
procesos.
El cuadro 9.2 contiene para cada nmero de procesadores empleado el tiempo de ejecu-
cin medido en segundos y el coste obtenido. En el grfico de la figura 9.6 exponemos la
relacin entre tiempo de ejecucin y nmero de procesadores. La figura 9.7 contiene la curva
de crecimiento del coste con respecto al nmero de procesadores.
120
100
Tiempo (seg)
80
60
40
20
0
0 2 4 6 8 10 12 14 16
Numero de Procesadores
170
165
160
Coste
155
150
145
140
135
0 2 4 6 8 10 12 14 16
Numero de Procesadores
El segundo asunto es que necesitamos realizar bajo las mismas condiciones todas las eje-
cuciones. Los datos de entrada deben ser fijados siempre a los mismos valores. De este modo
intentaremos buscar el nmero PI a travs de la regla del trapecio. Para este propsito, y como
ya explicamos en la seccin 6.1, utilizaremos la funcin ^ ,.T\3
o
qp n4rs y el intervalo b DFE:1d .
Para computarlo utilizaremos el nmero de segmentos
1.000.000.000 .
En la figura 9.8 observamos el modelo de ejecucin del algoritmo regla del trapecio con 8
procesos.
El cuadro 9.3 contiene para cada nmero de procesadores empleado el tiempo de ejecucin
medido en segundos y el coste obtenido. En el grfico de la figura 9.9 exponemos la relacin
entre tiempo de ejecucin y nmero de procesadores. La figura 9.10 contiene la curva de
crecimiento del coste con respecto al nmero de procesadores.
120
100
Tiempo (seg)
80
60
40
20
0
0 2 4 6 8 10 12 14 16
Numero de Procesadores
136
134
132
Coste
130
128
126
124
122
0 2 4 6 8 10 12 14 16
Numero de Procesadores
Orden \ Num.Procs. 1 4 9 16
700 19,0 / 19,1 10,3 / 14,9 10,0 / 15,37 19,1 / 23,2
1400 172,0 / 172,2 59,8 / 78,4 50,1 / 70,9 57,3 / 78,9
2100 2237,2 / 2252,8 190,9 / 232,7 135,1 / 183,6 134,0 / 183,3
2800 - 430,1 / 504,3 274,9 / 362,3 261,1 / 344,8
3500 - 2074,1 / 2202,5 491,3 / 626,8 458,5 / 599,9
4200 - - 833,1 / 1032,6 726,7 / 930,2
4900 - - 1257,1 / 1527,3 1016,4 / 1291,9
2000
1500
Tiempo (seg)
1000
500
0
500 1000 1500 2000 2500 3000 3500 4000 4500 5000
Orden Matriz
16
18000 9
4
1
16000
14000
12000
Coste
10000
8000
6000
4000
2000
0
500 1000 1500 2000 2500 3000 3500 4000 4500 5000
Orden Matriz
MPICH es una implementacin del estndar MPI desarrollada por el Argonne National
Laboratory que funciona en una amplia variedad de sistemas. MPICH contiene, adems de la
librera MPI, un entorno de programacin para trabajar con programas MPI. El entorno de pro-
gramacin incluye un programa de arranque de procesos portable, libreras de monitorizacin
destinadas a analizar el rendimiento de los programas, y una interfaz grfica para X Window.
Las caractersticas principales de MPICH son las siguientes:
Los enlaces con C++ incluidos en la especificacin MPI-2 estn disponibles para las
funciones MPI-1.
Una versin de cdigo abierto est disponible para Windows NT. La instalacin, con-
figuracin y manejo de esta versin son diferentes a las explicadas en este apndice, el
cual cubre slo la versin Unix de MPICH.
Soporte para una amplia variedad de entornos, incluyendo MPPs y clusters de SMPs.
163
164 APNDICE A. INSTALACIN, CONFIGURACIN Y MANEJO DE MPICH
A.1. Dispositivos
La portabilidad de MPICH proviene de su diseo en dos capas. La mayor parte del cdigo
de MPICH es independiente del hardware y est implementado por encima de una ADI (Ab-
stract Device Interface, Interfaz de Dispositivo Abstracto). La interfaz ADI, llamada tambin
dispositivo, oculta la mayora de los detalles especficos del hardware permitiendo que MPICH
sea portado fcilmente a nuevas arquitecturas. La interfaz ADI (o dispositivo) se encarga de
facilitar el acceso al hardware de una manera eficiente, mientras que el resto del cdigo por
encima de la ADI se encarga de la sintaxis y la semntica de MPI.
A continuacin mostramos una lista con los dispositivos (ADIs) disponibles en MPICH.
Topologas de tipo Rejilla. El dispositivo globus2 utiliza Globus (URL 19) para proporcionar
una implementacin diseada para topologas de tipo rejilla. Este dispositivo es apropi-
ado para sistemas en los que est instalado Globus.
Procesadores Paralelos Masivos (MPPs). MPICH fue desarrollado originalmente para pro-
porcionar una implementacin MPI a la mayora de los MPPs existentes, cada uno de
los cuales tiene su propio sistema de paso de mensajes. De este modo se incluyen los
dispositivos ch_meiko, ch_nx y ch_mpl en las distribuciones de MPICH.
Otros. MPICH ha sido diseado para permitir que otros grupos lo usen cuando desarrollen
sus propias implementaciones MPI. Tanto las compaas privadas como los grupos de
investigacin han usado MPICH como base para sus implementaciones. Una imple-
mentacin importante desarrollada de esta manera es MPICH-GM, la cual se emplea en
clusters Myrinet conectados mediante hubs dedicados.
A.2. OBTENCIN 165
A.2. Obtencin
El primer paso para poder utilizar MPICH ser descargarlo e instalar los parches necesar-
ios:
$ cd /tmp
$ gunzip mpich.tar.gz
$ tar -xvf mpich.tar
3. Aplicar los parches. Visite la seccin de parches de la pgina web de MPICH (URL [11])
para verificar la existencia de parches que pueda necesitar. Normalmente las versiones
disponibles de MPICH tienen ya aplicados dichos parches; sto queda indicado por
cuatro nmeros en el nombre de la versin (p.ej. 1.2.2.3). En otros casos el parche
aislado se pone a disposicin antes que la versin parcheada. Para aplicar estos parches
siga las instrucciones expuestas en la pgina indicada y en la documentacin.
1. Decida dnde quiere instalar MPICH. Este paso no es estrictamente necesario (excep-
to en el caso del dispositivo ch_p4mpd); sin embargo la instalacin de MPICH (que
puede realizarse sin necesidad de privilegios en un directorio de usuario) hace ms f-
cil la aplicacin de actualizaciones y permite una reduccin del espacio en disco que
MPICH necesita, ya que la versin instalada slo contiene libreras, cabeceras, docu-
mentacin y algunos programas de soporte. Se recomienda una ruta de instalacin que
contenga el nmero de versin de MPICH. Para instalar MPICH de manera que puedan
usarlo otros usuarios podramos escoger el directorio /usr/local/mpich-1.2.4/, aunque
debemos tener en cuenta los permisos necesarios para hacerlo. Si estamos instalando
slo para uso propio, podramos usar algo como /home/me/software/mpich-1.2.4.
Este comando hace que MPICH utilice el dispositivo ch_p4 por defecto ; sta es nor-
malmente la eleccin adecuada. La salida de configure es encauzada hacia tee; este pro-
grama escribe la salida tanto en el fichero especificado en su argumento (aqu c.log)
como en la salida estndar . Si tenemos problemas en la configuracin o la compilacin
el fichero c.log nos servir de ayuda para identificar los posibles problemas.
En la seccin A.4.3 se explica cmo utilizar el programa ssh en vez de rsh para el
arranque de procesos remotos.
3. Compilar MPICH:
4. (Opcional) Si queremos instalar MPICH en un lugar pblico de manera que los dems
usuarios puedan usarlo, ejecutaremos:
$ make install
A.4. Configuracin
A.4.1. El Fichero de Mquinas
Cuando utilizamos el dispositivo ch_p4 el programa mpirun utiliza un fichero llamado
fichero de mquinas, el cual lista las mquinas o nodos que estn disponibles para ejecutar
programas MPICH.
La manera ms fcil de crear un fichero de mquinas consiste en editar el fichero mpich/u-
til/machines/machines.xxxx, el cual contiene los nombres de las mquinas pertenecientes a
la arquitectura xxxx. Cuando mpirun es ejecutado, el nmero de hosts requerido por dicho co-
mando es seleccionado del fichero de mquinas para su ejecucin. No existe una planificacin
compleja para elegir qu mquina usar; las mquinas son seleccionadas desde el principio del
fichero. Para ejecutar todos los procesos en una sola mquina, simplemente pondremos en
todas las lneas del fichero la misma mquina.
Debemos advertir que el fichero de mquinas no puede contener lneas en blanco. En caso
de querer darle cierta estructura y para aadir comentarios utilizaremos el carcter #. Un
ejemplo del fichero machines.LINUX podra ser:
A.4. CONFIGURACIN 167
Los nombres deben ser proporcionados con el mismo formato que la salida del comando
hostname. Por ejemplo, si el resultado de hostname en galba fuera galba.aulas y lo mis-
mo sucediera para los dems nombres, el fichero de mquinas sera entonces:
En el caso de que tengamos nodos con mltiples procesadores, debemos indicar su nmero
de procesadores tras su nombre y dos puntos. Por ejemplo, si en el ejemplo anterior vitelio
tuviera dos procesadores el fichero de mquinas sera:
A.4.2. RSH
El programa rsh (Remote SHell, Shell Remoto) es utilizado para iniciar procesos re-
motos en general. Si pretendemos usar rsh con el dispositivo ch_p4 necesitaremos configurar
168 APNDICE A. INSTALACIN, CONFIGURACIN Y MANEJO DE MPICH
nuestra mquina para permitir el uso de rsh. Por motivos de seguridad slo debemos hacer
sto si somos un administrador del sistema y entendemos lo que estamos haciedo, o en el caso
de que utilicemos una red aislada. Por ejemplo, si estamos utilizando una red Linux en nuestra
casa o en el trabajo, y estas mquinas no estn conectadas a una red ms grande, debemos
seguir las siguientes instrucciones. Si por el contrario alguna de nuestras mquinas est conec-
tada a otra red, debemos preguntarle a nuestro administrador del sistema acerca de la poltica
de utilizacin de rsh. Como alternativa podemos usar ssh.
Lo siguiente explica cmo configurar una mquina de manera que pueda usar rsh para
iniciar un proceso en ella misma. Para ello debemos asegurarnos de que exista un fichero
/etc/hosts.equiv que contenga al menos las siguientes lneas:
localhost
nombre_maquina
A.4.3. SSH
El mecanismo habitual para el arranque de procesos remotos al utilizar el dispositivo
ch_p4 en redes es rsh. El uso de rsh requiere ciertos permisos en las mquinas implicadas. Sin
embargo en algunas redes no conviene establecer los permisos de esta manera. La alternativa
ms simple a rsh es el uso de ssh (Secure Shell, Shell Seguro). ste puede ser utilizado como
mecanismo seguro de procesamiento distribuido. Requiere cierta configuracin que describire-
mos seguidamente, aunque su utilizacin es muy sencilla. Dicha configuracin depende de la
versin de ssh que vayamos a utilizar.
Exponemos a continuacin el conjunto de pasos necesarios para que ssh funcione correc-
tamente con MPICH.
1. Debemos asegurarnos de que ssh est instalado en nuestra red y, en caso de estarlo,
compruebaremos su versin. Si no est instalado podemos obtenerlo nosotros mismos
(URL [12]).
$ ssh-keygen -t dsa
Si no lo hacemos as, generaremos una clave rsa1 que no podr ser usada con SSH
Versin 2. Dicha orden crear el par clave privada/pblica. La clave privada se
almacenar en
~/.ssh/id_dsa
y la clave pblica se guardar en
~/.ssh/id_dsa.pub
$ cp ~/.ssh/identity.pub ~/.ssh/authorized_keys
Una vez hechos estos cuatro pasos ya podremos utilizar ssh en nuestro sistema. Ahora ten-
dremos que indicar a MPICH que haga uso de dicho programa; sto puede hacerse de dos
formas:
Ejecutar configure con la opcin -rsh=ssh para que el dispositivo ch_p4 utilice ssh en
vez de rsh. De esta manera tambin los scripts sern modificados para hacer uso de ssh.
Si MPICH ya haba sido compilado antes debemos reconfigurar y recompilar utilizando
los siguientes comandos:
$ configure -rsh=ssh
$ make
$ P4_RSHCOMMAND=ssh
$ export P4_RSHCOMMAND
Asegrese de que las mquinas listadas en nuestro fichero de mquinas estn tambin
listadas en el fichero /etc/ssh_known_hosts de la red o en el fichero
~/.ssh/known_hosts en el directorio de casa.
Es importante que el directorio /tmp tenga los permisos establecidos a 03777, con
root como dueo y grupo 0.
Openssh tiene el argumento -v, el cual es muy til para identificar posibles problemas.
1. Para ejecutarlo de manera remota en otras mquinas necesitamos tener conexin rsh,
ssh o similar con ellas.
2. El servidor seguro utiliza el mismo procedimiento que rsh para comprobar los permisos
de ejecucin de los usuarios remotos.
Por lo tanto la manera ms cmoda de utilizarlo es empleando rsh como programa de arranque
de procesos remotos. Por otro lado tambin podemos usar ssh para ejecutar el servidor de
manera remota, y establecer la configuracin adecuada para poder ejecutar procesos mediante
el servidor seguro (aunque ni siquiera est instalado rsh). En este caso debemos tener en cuenta
que los scripts generados por MPICH utilizan por defecto rsh para su ejecucin; si queremos
que dichos scripts hagan uso de ssh, tendremos que modificarlos o configurar MPICH con la
opcin -rsh=ssh.
A.5. COMPILACIN Y ENLACE DE PROGRAMAS 171
Debemos aclarar que tanto el fichero serv_p4 como chp4_servs se encuentran en di-
rectorios pertenecientes a la instalacin de MPICH, generados por la ejecucin del comando
make install (seccin A.3).
Antes de arrancar el servidor debemos comprobar si el servidor seguro ha sido inicializado
en nuestro sistema para uso general; si es as, el mismo servidor puede ser utilizado por todos
los usuarios. Para realizarlo de esta manera necesitamos acceder al sistema como root. Si
el servidor seguro no ha sido inicializado, entonces podemos inicializarlo para nuestro uso
personal sin necesisdad de privilegios especiales con la orden:
$ chp4_servs -port=1234
Esta orden inicializa el servidor seguro en todas las mquinas listadas en el fichero de mquinas
(seccin A.4.1). El nmero de puerto proporcionado por la opcin -port (por defecto 1234)
debe ser diferente del resto de puertos utilizados en las estaciones de trabajo.
Para hacer uso del servidor seguro con el dispositivo ch_p4 debemos establecer las sigu-
ientes variables de entorno:
$ MPI_USEP4SSPORT=yes
$ export MPI_USEP4SSPORT
$ MPI_P4SSPORT=1234
$ export MPI_P4SSPORT
mpicc -c foo.c
mpif77 -c foo.f
mpiCC -c foo.C
mpif90 -c foo.f
Las rdenes para enlazar cdigo pueden requerir la inclusin de libreras adicionales. Por
ejemplo, para utilizar la librera de funciones matemticas de C usaramos la siguiente orden:
Tambin podemos combinar la compilacin y el enlace en una sola orden, como exponemos a
continuacin:
Notar que mientras los sufijos .c para los programas en C y .f para los programas en Fortran-77
son estndar, no existe concenso para los sufijos de los programas escritos en C++ y Fortran-
90. Los sufijos mostrados en los ejemplos expuestos son aceptados por la mayora de los
sistemas, aunque no todos. MPICH intenta determinar los sufijos aceptados, pero no es capaz
siempre.
Podemos modificar la eleccin del compilador a utilizar por MPICH especificando las vari-
ables de entorno MPICH_CC, MPICH_F77, MPICH_CCC y MPICH_F90. Sin embargo sto
slo funcionar si el compilador alternativo es compatible con el compilador por defecto (esto
quiere decir que utilice los mismos tamaos para los tipos de datos y sus composiciones, y que
genere un cdigo objeto que sea compatible con el utilizado en las libreras MPICH). Si lo que
queremos es modificar el enlazador, utilizaremos las variables de entorno MPICH_CLINKER,
MPICH_F77LINKER, MPICH_CCLINKER y MPICH_F90LINKER.
Si lo que queremos es ver los comandos que utilizara la orden de compilacin sin ejecu-
tarlos realmente emplearemos el argumento -show.
Las siguientes opciones nos ayudan a acceder a las libreras de monitorizacin del entorno
MPE:
para ejecutar el programa a.out en 4 procesadores. La orden mpirun -help nos ofrece una
lista completa de las opciones que tiene este programa.
Como salida mpirun retorna el status de uno de los procesos, usualmente el proceso con
identificador 0 en MPI_COMM_WORLD.
Manual de Referencia
Este apndice describe de manera resumida las funciones MPI utilizadas en los algoritmos
implementados. Pretendemos que sea una gua til como manual de consulta. Para mayor
comodidad las funciones estn expuestas en orden alfabtico.
Para cada una de las funciones definimos su funcionalidad y su sintaxis, especificando
cules son los parmetros de entrada y los de salida. Por ltimo, en algunos casos haremos un
breve comentario acerca de su funcionamiento.
175
176 APNDICE B. MANUAL DE REFERENCIA
B.1. MPI_Bcast
F UNCIONALIDAD
Enva un mismo mensaje desde un proceso a todos los dems. Es una operacin de comu-
nicacin colectiva.
S INTAXIS
int MPI_Bcast(void* mensaje, int contador,
MPI_Datatype tipo_datos, int raiz,
MPI_Comm com);
tipo_datos Tipo de datos MPI de cada elemento del mensaje (Cuadro 5.1)
C OMENTARIOS
Si el soporte hardware se hace responsable de la ejecucin de esta funcin, generalmente
se implementa mediante un algoritmo que estructura un modelo de comunicacin en rbol
entre los procesos. Para ms informacin, lase la seccin ??.
B.2. MPI_CART_COORDS 177
B.2. MPI_Cart_coords
F UNCIONALIDAD
Retorna las coordenadas de un proceso en un comunicador de topologa cartesiana, dado
su identificador.
S INTAXIS
int MPI_Cart_coords(MPI_Comm cart_com, int id,
int numero_dimensiones,
int* coordenadas)
PARMETROS E NTRADA
cart_com Comunicador de topologa cartesiana
PARMETROS S ALIDA
coordenadas Vector de enteros (de tamao numero_dimensiones) que contiene las coorde-
nadas cartesianas del proceso
178 APNDICE B. MANUAL DE REFERENCIA
B.3. MPI_Cart_create
F UNCIONALIDAD
Crea un nuevo comunicador de topologa cartesiana (tipo rejilla).
S INTAXIS
int MPI_Cart_create(MPI_Comm antiguo_com,
int numero_dimensiones,
int* tam_dimensiones,
int* periodicidades,
int reordenamiento,
MPI_Comm* com_cartesiano)
PARMETROS E NTRADA
antiguo_com Comunicador original a partir del cual creamos el nuevo comunicador de topologa
cartesiana
reordenamiento Booleano que especifica si pueden ser reordenados los identificadores de los
procesos (verdadero) o no (falso). En muchos casos es apropiado para la optimizacin
del sistema, en otros no es significante.
PARMETROS S ALIDA
com_cartesiano Nuevo comunicador de topologa cartesiana
B.4. MPI_CART_RANK 179
B.4. MPI_Cart_rank
F UNCIONALIDAD
Retorna el identificador de un proceso en un comunicador de topologa cartesiana, dadas
sus coordenadas.
S INTAXIS
PARMETROS E NTRADA
cart_com Comunicador de topologa cartesiana
coordenadas Vector de enteros (de tamao numero_dimensiones, vase funcin B.3) que
especifica las coordenadas cartesianas del proceso
PARMETROS S ALIDA
id Identificador del proceso especificado
180 APNDICE B. MANUAL DE REFERENCIA
B.5. MPI_Cart_sub
F UNCIONALIDAD
Divide un comunicador de tipo rejilla (topologa cartesiana) en rejillas de menores dimen-
siones.
S INTAXIS
int MPI_Cart_sub(MPI_Comm cart_com, int* var_coords,
MPI_Comm nuevo_com)
PARMETROS E NTRADA
cart_com Comunicador de topologa cartesiana
var_coords Vector de booleanos que especifica para cada dimensin de cart_com si pertenece
a nuevo_com, dejando que la coordenada vare (verdadero) o no (falso)
PARMETROS S ALIDA
nuevo_com Nuevo comunicador de topologa cartesiana con igual o menor nmero de di-
mensiones que cart_com
B.6. MPI_COMM_CREATE 181
B.6. MPI_Comm_create
F UNCIONALIDAD
Crea un nuevo comunicador a partir de otro.
S INTAXIS
int MPI_Comm_create(MPI_Comm antiguo_com,
MPI_Group nuevo_grupo,
MPI_Comm* nuevo_com)
PARMETROS E NTRADA
antiguo_com Comunicador original a partir del cual generamos el nuevo comunicador
nuevo_com Grupo que contiene los procesos que formarn parte del nuevo comunicador.
Debe ser un subconjunto del grupo asociado al comunicador original (antiguo_com).
PARMETROS S ALIDA
nuevo_com Nuevo comunicador
182 APNDICE B. MANUAL DE REFERENCIA
B.7. MPI_Comm_group
F UNCIONALIDAD
Retorna el grupo asociado a un comunicador determinado.
S INTAXIS
int MPI_Comm_group(MPI_Comm com, MPI_Group* grupo)
PARMETROS E NTRADA
com Comunicador
PARMETROS S ALIDA
grupo Grupo asociado al comunicador
B.8. MPI_COMM_RANK 183
B.8. MPI_Comm_rank
F UNCIONALIDAD
Retorna el identificador de un proceso dentro de un comunicador.
S INTAXIS
int MPI_Comm_rank(MPI_Comm com, int* id)
PARMETROS E NTRADA
com Comunicador dentro del cual el proceso tiene asociado el identificador
PARMETROS S ALIDA
id Identificador del proceso dentro del comunicador com
184 APNDICE B. MANUAL DE REFERENCIA
B.9. MPI_Comm_size
F UNCIONALIDAD
Determina el nmero de procesos pertenecientes al grupo asociado a un comunicador.
S INTAXIS
int MPI_Comm_size(MPI_Comm com, int* numprocs)
PARMETROS E NTRADA
com Comunicador al cual est asociado el grupo cuyo tamao queremos conocer
PARMETROS S ALIDA
numprocs Nmero de procesos en el grupo del comunicador (entero)
B.10. MPI_COMM_SPLIT 185
B.10. MPI_Comm_split
F UNCIONALIDAD
Particiona un comunicador en varios subconjuntos de procesos y crea un nuevo comuni-
cador para cada uno de ellos.
S INTAXIS
int MPI_Comm_split(MPI_Comm antiguo_com,
int clave_particion,
int clave_id, MPI_Comm* nuevo_com)
PARMETROS E NTRADA
antiguo_com Comunicador original a partir del cual creamos los nuevos comunicadores
PARMETROS S ALIDA
nuevo_com Nuevo comunicador (leer comentarios)
C OMENTARIOS
La llamada crea un comunicador para cada valor de clave_particion. Los procesos con el
mismo valor en clave_particion quedan englobados en el mismo comunicador.
Sin embargo los comunicadores creados tendrn el mismo nombre para todos los proce-
sos. Imaginemos que dividimos de manera escalonada un comunicador con 9 procesos en tres
comunicadores con 3 procesos, llamados todos nuevo_com. De esta manera, el grupo nue-
vo_com consistir en los procesos 0, 1 y 2 para los procesos 0, 1 y 2. En los procesos 3, 4
y 5 el grupo subyacente a nuevo_com ser el formado por los procesos 3, 4 y 5; y lo mismo
ocurrir con los procesos 6, 7 y 8.
186 APNDICE B. MANUAL DE REFERENCIA
B.11. MPI_Finalize
F UNCIONALIDAD
Finaliza el entorno de ejecucin MPI. Despus de que el programa haya acabado de utilizar
la librera MPI, se debe hacer una llamada a MPI_Finalize. Esta funcin limpia todos los
trabajos no finalizados dejados por MPI (por ejemplo, envos pendientes que no hayan sido
completados, etc.).
S INTAXIS
int MPI_Finalize()
B.12. MPI_Get_processor_name
F UNCIONALIDAD
Retorna el nombre del procesador donde est ubicado el proceso.
S INTAXIS
PARMETROS S ALIDA
nombre Vector de caracteres cuyo tamao debe ser al menos igual a la constante
MPI_MAX_PROCESSOR_NAME destinado a contener el nombre del procesador
C OMENTARIOS
El nombre retornado debe identificar un elemento hardware especfico; el formato exacto
estar definido por la implementacin.
188 APNDICE B. MANUAL DE REFERENCIA
B.13. MPI_Group_incl
F UNCIONALIDAD
Crea un nuevo grupo a partir de una lista de procesos pertenecientes a un grupo existente.
S INTAXIS
int MPI_Group_incl(MPI_Group antiguo_grupo,
int tamano_nuevo_grupo,
int* ids_antiguo_grupo,
MPI_Group* nuevo_grupo)
PARMETROS E NTRADA
antiguo_grupo Grupo original a partir del cual generamos el nuevo grupo
ids_antiguo_grupo Identificadores de los procesos que formarn parte del nuevo grupo (vec-
tor de enteros)
PARMETROS S ALIDA
nuevo_grupo Nuevo grupo derivado del existente, reordenado segn el vector ids_antiguo_grupo.
B.14. MPI_INIT 189
B.14. MPI_Init
F UNCIONALIDAD
Inicializa el entorno de ejecucin MPI. Antes de que podamos llamar a cualquier otra
funcin MPI, debemos hacer una llamada a MPI_Init; esta funcin slo debe ser llamada
una vez. Permite al sistema hacer todas la configuraciones necesarias para que la librera MPI
pueda ser usada.
S INTAXIS
int MPI_Init(int *argc, char ***argv);
PARMETROS E NTRADA
argc Puntero al nmero de argumentos
B.15. MPI_Irecv
F UNCIONALIDAD
Inicializa la recepcin de un mensaje no bloqueante.
S INTAXIS
int MPI_Recv(void* mensaje, int contador,
MPI_Datatype tipo_datos, int origen,
int etiqueta, MPI_Comm com,
MPI_Request* peticion)
PARMETROS E NTRADA
contador Nmero de elementos del tipo tipo_datos que componen el mensaje a recibir
tipo_datos Tipo de datos MPI de cada elemento del mensaje a recibir (Cuadro 5.1)
PARMETROS S ALIDA
mensaje Direccin inicial de memoria del mensaje a recibir
C OMENTARIOS
Esta funcin recibe mensajes de tipo no bloqueante. Ello quiere decir que la ejecucin del
programa no se bloquea con la llamada a esta funcin.
B.16. MPI_ISEND 191
B.16. MPI_Isend
F UNCIONALIDAD
Inicializa el envo de un mensaje no bloqueante a un proceso determinado.
S INTAXIS
int MPI_Isend(void* mensaje, int contador,
MPI_Datatype tipo_datos, int destino,
int etiq, MPI_Comm com,
MPI_Request* peticion)
PARMETROS E NTRADA
mensaje Direccin inicial de memoria del mensaje a enviar
contador Nmero de elementos del tipo tipo_datos que componen el mensaje a enviar
tipo_datos Tipo de datos MPI de cada elemento del mensaje a enviar (Cuadro 5.1)
PARMETROS S ALIDA
peticion Manejador de la peticin
C OMENTARIOS
Esta funcin enva mensajes de tipo no bloqueante. Ello quiere decir que la ejecucin del
programa no se bloquea con la ejecucin de la llamada.
192 APNDICE B. MANUAL DE REFERENCIA
B.17. MPI_Recv
F UNCIONALIDAD
Recibe un mensaje bsico de un proceso.
S INTAXIS
int MPI_Recv(void* mensaje, int contador,
MPI_Datatype tipo_datos, int origen,
int etiqueta, MPI_Comm com,
MPI_Status* status)
PARMETROS E NTRADA
contador Nmero de elementos del tipo tipo_datos que componen el mensaje a recibir
tipo_datos Tipo de datos MPI de cada elemento del mensaje a recibir (Cuadro 5.1)
PARMETROS S ALIDA
mensaje Direccin inicial de memoria del mensaje a recibir
C OMENTARIOS
Esta funcin recibe mensajes de tipo bloqueante. Ello quiere decir que la ejecucin del
programa se bloquea hasta que el mensaje ha sido recibido.
B.18. MPI_REDUCE 193
B.18. MPI_Reduce
F UNCIONALIDAD
Reduce valores en todos los procesos a un solo valor. Realiza una operacin de reduccin.
S INTAXIS
int MPI_Reduce(void* operando, void* resultado,
int contador, MPI_Datatype tipo_datos,
MPI_Op operacion, int raiz,
MPI_Comm com);
PARMETROS E NTRADA
operando Direccin inicial de memoria de los valores a operar
contador Nmero de elementos del tipo tipo_datos que componen cada uno de los operandos
y el resultado
PARMETROS S ALIDA
resultado Direccin inicial de memoria del valor calculado a recibir (significante slo en el
proceso raiz)
194 APNDICE B. MANUAL DE REFERENCIA
B.19. MPI_Send
F UNCIONALIDAD
Enva un mensaje bsico a un proceso determinado.
S INTAXIS
int MPI_Send(void* mensaje, int contador,
MPI_Datatype tipo_datos, int destino,
int etiq, MPI_Comm com)
PARMETROS E NTRADA
mensaje Direccin inicial de memoria del mensaje a enviar
contador Nmero de elementos del tipo tipo_datos que componen el mensaje a enviar
tipo_datos Tipo de datos MPI de cada elemento del mensaje a enviar (Cuadro 5.1)
C OMENTARIOS
Esta funcin enva mensajes de tipo bloqueante. Ello quiere decir que la ejecucin del
programa se bloquea hasta que el mensaje ha sido enviado.
B.20. MPI_SENDRECV_REPLACE 195
B.20. MPI_Sendrecv_replace
F UNCIONALIDAD
Enva y recibe un mensaje bsico utilizando un slo buffer.
S INTAXIS
int MPI_Sendrecv_replace(void* mensaje, int contador,
MPI_Datatype tipo_datos,
int destino, int etiqdestino,
int origen, int etiqorigen,
MPI_Comm com, MPI_Status* status)
PARMETROS E NTRADA
mensaje Direccin inicial de memoria del mensaje a enviar y en la cual recibiremos el nuevo
mensaje
contador Nmero de elementos del tipo tipo_datos que componen el mensaje a enviar/recibir
tipo_datos Tipo de datos MPI de cada elemento del mensaje a enviar/recibir (Cuadro 5.1)
C OMENTARIOS
Esta funcin enva/recibe mensajes de tipo bloqueante. Ello quiere decir que la ejecucin
del programa se bloquea hasta que el mensaje ha sido enviado/recibido.
196 APNDICE B. MANUAL DE REFERENCIA
B.21. MPI_Type_commit
F UNCIONALIDAD
Acomete un tipo de datos MPI.
S INTAXIS
int MPI_Type_commit(MPI_Datatype* tipo_datos_MPI)
PARMETROS E NTRADA
tipo_datos_MPI Tipo de datos MPI
B.22. MPI_TYPE_STRUCT 197
B.22. MPI_Type_struct
F UNCIONALIDAD
Crea un tipo de datos MPI para estructuras.
S INTAXIS
int MPI_Type_struct(int contador,
int longitudes_bloque[],
MPI_Aint indices[],
MPI_Datatype antiguos_tipos_datos,
MPI_Datatype* nuevo_tipo)
PARMETROS E NTRADA
contador Nmero de bloques
PARMETROS S ALIDA
nuevo_tipo Nuevo tipo de datos MPI
198 APNDICE B. MANUAL DE REFERENCIA
B.23. MPI_Type_vector
F UNCIONALIDAD
Crea un tipo de datos MPI para vectores.
S INTAXIS
int MPI_Type_vector(int contador, int longitud_bloque,
int salto, MPI_Datatype tipo_datos_elem,
MPI_Datatype* nuevo_tipo)
PARMETROS E NTRADA
contador Nmero de bloques
salto Nmero de elementos de tipo tipo_datos_elem que hay entre los sucesivos elementos
de nuevo_tipo.
PARMETROS S ALIDA
nuevo_tipo Nuevo tipo de datos MPI
B.24. MPI_WAIT 199
B.24. MPI_Wait
F UNCIONALIDAD
Espera a que se complete un envo o una recepcin de un mensaje.
S INTAXIS
int MPI_Wait(MPI_Request* peticion,
MPI_Status* status)
PARMETROS E NTRADA
peticion Manejador de la peticin
PARMETROS S ALIDA
status Objeto que representa el estado del envo/recepcin del mensaje
200 APNDICE B. MANUAL DE REFERENCIA
B.25. MPI_Waitall
F UNCIONALIDAD
Espera a que se completen todas las peticiones especificadas en un vector.
S INTAXIS
int MPI_Waitall(int contador,
MPI_Request* vector_peticiones,
MPI_Status* status)
PARMETROS E NTRADA
contador Longitud del vector de peticiones
PARMETROS S ALIDA
status Objeto que representa el estado del envo/recepcin del mensaje
B.26. MPI_WAITANY 201
B.26. MPI_Waitany
F UNCIONALIDAD
Espera a que se complete cualquiera de las peticiones especificadas en un vector.
S INTAXIS
int MPI_Waitany(int contador,
MPI_Request* vector_peticiones,
int* indice,
MPI_Status* status)
PARMETROS E NTRADA
contador Longitud del vector de peticiones
PARMETROS S ALIDA
indice Posicin de la peticin satisfecha en el vector de peticiones
B.27. MPI_Wtime
F UNCIONALIDAD
Retorna el tiempo transcurrido para un proceso.
S INTAXIS
double MPI_Wtime()
VALOR DE R ETORNO
Tiempo en segundos desde que comenz la ejecucin del proceso.
Conclusiones
Para llegar a ciertas conclusiones en el estudio realizado lo primero que debemos hacer es
analizar los resultados obtenidos en las ejecuciones de los algoritmos paralelos. Slo de este
modo podremos demostrar la utilidad y potencialidad del procesamiento paralelo ejecutado en
redes bajo Linux.
Sumario de Resultados
Comenzaremos el anlisis observando algunos grficos ciertamente determinantes. La
figura 1 muestra un grfico que representa el tiempo de ejecucin del algoritmo Clculo de
reas mediante Montecarlo utilizando paso de mensajes no bloqueantes.
120
100
Tiempo (seg)
80
60
40
20
0
0 2 4 6 8 10 12 14 16
Numero de Procesadores
203
204 CONCLUSIONES
120
100
Tiempo (seg)
80
60
40
20
0
0 2 4 6 8 10 12 14 16
Numero de Procesadores
Por otro lado el algoritmo Multiplicacin de Matrices de Fox tiene una serie de carac-
tersticas que lo diferencian del resto. Una de ellas es la exactitud; aqu no tratamos de hacer
aproximaciones precisas, a diferencia de los algoritmos anteriormente expuestos. En este al-
goritmo multiplicamos matrices cuadradas particionndolas en submatrices. Cada proceso en
este caso se encargar de calcular una submatriz de la matriz resultado.
La principal dificultad en este caso es la sobrecarga en la comunicacin. El hecho de tener
que transmitir submatrices enteras entre los procesadores dificulta mucho el clculo fluido.
205
2000
1500
Tiempo (seg)
1000
500
0
500 1000 1500 2000 2500 3000 3500 4000 4500 5000
Orden Matriz
Orden \ Num.Procs. 1 4 9 16
700 19,0 / 19,1 10,3 / 14,9 10,0 / 15,37 19,1 / 23,2
1400 172,0 / 172,2 59,8 / 78,4 50,1 / 70,9 57,3 / 78,9
2100 2237,2 / 2252,8 190,9 / 232,7 135,1 / 183,6 134,0 / 183,3
2800 - 430,1 / 504,3 274,9 / 362,3 261,1 / 344,8
3500 - 2074,1 / 2202,5 491,3 / 626,8 458,5 / 599,9
4200 - - 833,1 / 1032,6 726,7 / 930,2
4900 - - 1257,1 / 1527,3 1016,4 / 1291,9
Cuadro 1: Evaluacin Multiplicacin de Matrices de Fox
Contiene para cada cantidad de procesadores empleados los tiempos obtenidos en la mul-
tiplicacin de matrices de distintos rdenes; los dos tiempos separados por el carcter / rep-
resentan el tiempo requerido para multiplicar las matrices por un lado, y por otro el tiempo
requerido para multiplicarlas y mostrar el resultado. Dichos tiempos se miden en segundos.
206 CONCLUSIONES
170
165
160
Coste
155
150
145
140
135
0 2 4 6 8 10 12 14 16
Numero de Procesadores
Sin embargo en la comparacin de costes del algoritmo de Fox (figura 6) observamos que
el coste depende tanto del nmero de procesos empleados como del tamao de las matrices
a multiplicar. De hecho vemos que para matrices de orden mayor a 2000 la utilizacin de 1
slo procesador es la ms costosa. Con este planteamiento podemos prever que para tamaos
de matrices superiores a los empleados en las pruebas la utilizacin de 16 procesadores ser la
ms rentable.
207
136
134
132
Coste
130
128
126
124
122
0 2 4 6 8 10 12 14 16
Numero de Procesadores
16
18000 9
4
1
16000
14000
12000
Coste
10000
8000
6000
4000
2000
0
500 1000 1500 2000 2500 3000 3500 4000 4500 5000
Orden Matriz
Corolario
Las demostraciones de la seccin anterior nos permiten argumentar que el procesamien-
to paralelo es una tcnica que arroja resultados muy satisfactorios para cierto tipo de com-
putaciones. Ciertamente en todos los algoritmos desarrollados obtenemos una mejora del
rendimiento al aumentar el nmero de procesadores utilizados.
Sin embargo debemos advertir de que no slo debemos tener en cuenta el tiempo de ejecu-
cin de los algoritmos para evaluarlos. En muchos ambientes la incorporacin de una mayor
cantidad de procesadores a la ejecucin de un algoritmo realmente cuesta dinero. En estos ca-
sos la variable coste nos permitir medir la rentabilidad de la inclusin de nuevos procesadores
en la ejecucin. Por lo tanto deberamos emplear ms o menos procesadores dependiendo de
la necesidad que tengamos de acelerar el procesamiento y de los recursos que podamos utilizar
(o adquirir), intentando llegar a un compromiso entre rendimiento y coste que sea ptimo para
nuestras necesidades.
Debemos insistir en que el paralelismo es un campo realmente extenso en el cual convergen
una amplia variedad de tcnicas y tecnologas, como vimos en la primera parte del presente
documento. Nosotros slo hemos investigado sobre el paralelismo llevado a cabo mediante la
utilizacin de clusters; no obstante el hacerlo conlleva el obtener una cierta perspectiva del
amplio abanico de posibilidades que existen por explorar.
En este panorama cabe destacar la importancia de la existencia de herramientas de de-
sarrollo de software paralelo que hacen del paralelismo una tcnica al alcance de todos. Los
estndares como MPI no slo ofrecen este tipo de facilidades, si no que adems aaden porta-
bilidad a los algoritmos implementados mediante su utilizacin.
Con todo lo expuesto anteriormente debemos darnos cuenta de que slo necesitamos un
grupo de ordenadores convencionales conectados en red bajo Linux para poder ejecutar aplica-
ciones paralelas de manera eficiente. De este modo podemos disponer por muy poco dinero (o
incluso nada) de todo un computador paralelo con una potencia relativamente alta. As pues...
por qu no aprovecharlo?.
Direcciones URL
1. CHIMP Download
<ftp://ftp.epcc.ed.ac.uk/pub/chimp/release/>
2. FireWire
<http://www.apple.com/firewire/>
4. Intel Compilers
<http://www.intel.com/software/products/compilers/>
7. MMX Emulator
<http://www-sop.inria.fr/prisme/personnel/pion/progs/mmx-emu/>
8. MPI Forum
<http://www.mpi-forum.org/>
209
210 DIRECCIONES URL