View/Open - Tesis Institucionales

Anuncio
INSTITUTO POLITÉCNICO NACIONAL
UNIDAD PROFESIONAL INTERDISCIPLINARIA DE
INGENIERIA Y CIENCIAS SOCIALES Y
ADMINISTRATIVAS
Sección de Estudios de Posgrado e investigación
CONSTRUCCIÓN DE UNA MÁQUINA
PARALELA PARA CENTROS DE
INVESTIGACIÓN.
TESIS
QUE PARA OBTENER EL GRADO DE
MAESTRO EN CIENCIAS EN
INFORMÁTICA
PRESENTA
JESÚS ANTONIO ALVAREZ CEDILLO
MÉXICO D.F.
2006
1
2
INSTITUTO POLITECNICO NACIONAL
COORDINACION GENERAL DE POSGRADO E INVESTIGACION
CARTA CESION DE DERECHOS
En la Ciudad de México, D.F. el día 23 del mes de Marzo del año 2006, el que suscribe Jesús Antonio
Álvarez Cedillo alumno del Programa de Maestría en Ciencias en Informática con número de registro
A010396, adscrito a la Sección de Estudios de Posgrado e Investigación de la UPIICSA-IPN,
manifiesta que es autor intelectual del presente trabajo de Tesis bajo la dirección de Dr. Miguel Lindig
Bos y cede los derechos del trabajo intitulado CONSTRUCCIÓN DE UNA MÁQUINA PARALELA
PARA CENTROS DE INVESTIGACIÓN, al Instituto Politécnico Nacional para su difusión, con fines
académicos y de investigación.
Los usuarios de la información no deben reproducir el contenido textual, gráficas o datos del trabajo sin
el permiso expreso del autor y/o director del trabajo. Este puede ser obtenido escribiendo a la siguiente
dirección [email protected]. Si el permiso se otorga, el usuario deberá dar el agradecimiento
correspondiente y citar la fuente del mismo.
3
A Dios:
Por su infinita gracia, por haberme dado
una vida hermosa y plena, una familia
maravillosa y por dejarme encontrar una
esposa inteligente y comprensiva y por
darme sólo el poco de entendimiento y
sabiduría que me han permitido llegar a
este punto.
4
A Mi Esposa:
Como una pequeña muestra de
agradecimiento por todo lo que me ha
dado y enseñado.
5
A mis Hermanos:
Por el gran apoyo que siempre me han
brindado, por su gran nobleza y por la
fuerza que cada uno me ha inspirado para
seguir adelante en momentos difíciles
6
A mis Padres:
Como reconocimiento a su apoyo
incondicional y comprensión y como
muestra de un esfuerzo conjunto para
alcanzar una meta más.
Los Amo.
7
A mis profesores y compañeros:
Especialmente a mi director de tesis Dr.
Miguel Lindig Bos por sus consejos,
apoyo y por creer en mí, así como por su
orientación magnífica para terminar este
trabajo, y al M. En C. Eduardo René
Rodríguez Ávila por su atinadas
correcciones
8
“CONSTRUCCIÓN DE UNA MÁQUINA PARALELA
PARA CENTROS DE INVESTIGACIÓN “
RESUMEN.
Debido a la situación económica actual de nuestro país y ante la imposibilidad de que los
centros de investigación cuenten con los recursos adecuados y herramientas para desarrollar proyectos
no teóricos, se hace prioritario aplicar nuevas técnicas y desarrollar nuevas herramientas que debido a
su bajo costo, puedan ser implementadas y no necesiten de largos procesos para su adquisición.
Es en este marco de referencia donde se ubica la creación de una computadora diseñada
especialmente para la investigación, que explote él cómputo distribuido y el procesamiento paralelo y
que pueda ser operada bajo una instrucción mínima por investigadores de cualquier parte y de cualquier
rama de la ciencia, que busquen explotar el procesamiento paralelo con un desempeño alto o
considerable.
Es necesario considerar que en México el tema del súper cómputo no ha sido explotado
adecuadamente, ya que por lo general un equipo con estas características sólo lo tienen las grandes
empresas comerciales por su alto costo, por la misma razón, es casi imposible que un centro de
investigación pueda adquirir este recurso cuando el equipo cuesta millones de dólares.
Un investigador que cuente con este tipo de herramientas podrá auxiliar sus
investigaciones aplicando el procesamiento recursivo y paralelo, para realizar pruebas prácticas de los
modelos que genere, podrá realizar simulaciones y proponer ambientes de prueba.
Por otro lado, contar con una máquina paralela que soporte los estándares de programación
de facto de la industria, permitirá a los centros de investigación, crear programas de aplicación real
inclusive para otras plataformas que soporten el estándar sobre súper computadoras comerciales de
marca. Estos programas contribuirán al desarrollo de nuevos investigadores que a su vez aportarán con
sus descubrimientos al desarrollo tecnológico y económico del país.
Es necesario destacar que el software libre en el mundo ha comenzado a ganar terreno a
partir de la creación del sistema operativo Linux , hecho que ha permitido a millones de programadores
y científicos del mundo poder generar nuevas aplicaciones gracias a un ambiente común y de acceso
total sobre los códigos de programación.
9
“CONSTRUCTION OF A PARALELL MACHINE FOR
RESEARCH CENTERS”
ABSTRACT.
Due to the current economic situation of our country and the imposibility for research
centers to get adecuate resources and tools to develop non-theoretical projects, it becomes a priority to
apply new techniques and to develop new tools that they may be readily implemented, due to their low
cost and short adquisition times.
It is under this frame of reference where the design of a high-performance computer
becomes desirable, specifically oriented toward research problems, based on distributed and parallel
processing concepts and requiring a minimum of instruction in its use for researchers of any specialty
that wish to exploit recursive processing with high levels of performance.
It is necessary to recall that in Mexico the subject of supercomputing has not been
explored in depth since, in general, this type of equipment is only available to very large corporations
due to its high cost of many thousands of dollars. For the same reason, is almost impossible to be
aquired by a public or government research center.
A researcher that counts with this tools is able to improve his work by applying recursive
and parallel processing, to apply tests to the models that its generates, to run detailed simulations and
to develop test environments.
On the other hand, the availability of a parallel machine that runs de facto industrystandard software would allow research centers to develop new application software compatible with
other platforms, including commercially availlable high-performance machines. These application
programs would aid in the education of new researchers which, in turn, due to the results of their work
would contribute to the technological and economic growth of the country.
It is necessary to highlight that the importance of free software has been steadyly growing
since the introduction of the Linux operating system. This fact has permitted that millions of
programmers and scientists in the whole world can generate and share new applications, thanks to a
common environment and total access to source code.
10
GLOSARIO DE TÉRMINOS
ACCESO DEDICADO. Servicio que proporciona conectividad, en la misma localidad, entre los
inmuebles del cliente y un punto de presencia de un Operador, de forma tal que el cliente pueda utilizar
los servicios proporcionados por dicho Operador.
ADDRESS. (Vea Dirección).
ALGORITMO: Conjunto finito de pasos estructurados en el tiempo, acorde a un conjunto finito de
reglas que proveen la solución a un problema o indica la falta de ésta.
ANCHO DE BANDA. Medida de capacidad de comunicación o velocidad de transmisión de datos de
un circuito o canal analógico. Cuando se trata de transmisiones analógicas, el ancho de banda es la
diferencia entre las frecuencias superior e inferior en un rango dado. Se mide en ciclos por segundo o
hertzios (Hz). En las transmisiones digitales, el ancho de banda se mide en bits por segundo (bps) y
cuanto más grande sea este número, más rápida será la transmisión. La velocidad es importante para los
dispositivos de entrada/salida ya que un bus con un ancho de banda escaso puede limitar sus
capacidades.
ARP. Address Resolution Protocol. Protocolo que se utiliza para averiguar la dirección del enlace
correspondiente a la dirección IP.
ARPANET.
Advanced Research Projects Agency Network [Red de la Agencia de Proyectos
Avanzados de Investigación]. Red desarrollada en 1969 por parte del Departamento de Defensa de los
Estados Unidos en la experimentación de una amplia red que funcionara a pesar de que parte de la red
quedara fuera de servicio. Desapareció en 1990 propiciando la aparición de la tecnología de
conmutación de paquetes y del protocolo TCP/IP. Dio origen a Internet.
ASCII. American Standard Code for Information Interchange [Codificación Americana Normalizada
para el intercambio de Información]. Norma mundial para la codificación usada en las computadoras a
fin de representar los caracteres requeridos para la comunicación entre máquinas. Hay 128 códigos
normalizados ASCII, cada uno de los cuales se puede representar con un número binario de 7 dígitos.
Este código le asigna 8 bits a cada carácter.
ASÍNCRONO. Tipo de comunicación que envía datos usando control del flujo sin necesidad de
sincronizar entre una terminal origen y un terminal destino.
AUTENTICACIÓN. Proceso de validación de la conexión del usuario que determina el permiso de
acceso a los recursos del servidor.
11
BAJA LATENCIA. Un periodo de tiempo muy corto, el cual está destinado a la transmisión y
recepción de los datos desde que son emitidos por el puerto transmisor y hasta que alcanzan al puerto
receptor.
BANDA AMPLIA. Ruta/circuito de comunicaciones de capacidad media. Suele indicar una velocidad
de 64 kbps a 1.544 Mbps.
BANDA ANCHA. Ruta/circuito de comunicaciones de gran capacidad. Normalmente implica una
velocidad superior a 1.544 Mbps.
BANDA BASE. Método de transmisión de datos en una red que utiliza el ancho de banda completo
para una transmisión individual. Ejemplo: Ethernet, realiza una única transmisión en cada momento.
BANDWIDTH. (Ver Ancho de Banda).
BIND. Berkeley Internet Name Domain. [ Nombre de dominio internet Berkeley]. Una de las
primeras implementaciones del sistema de nombres de dominio de Internet.
BIOS. Basic Input Output System. [ Sistema Básico de Entrada/Salida ]. Programa que se encuentra
en la mayoría de los ordenadores y que controla el proceso de arranque de la máquina y otras funciones
básicas como el funcionamiento del teclado o las unidades de disco. Los ordenadores antiguos
almacenaban el BIOS en un chip que no se podía borrar, mientras que en los más modernos, el
programa se puede actualizar, ya que se guarda en un chip que se puede borrar y reprogramar.
BIT. Binary digit. [Dígito binario]. Unidad elemental de la información. Puede ser 0 ó 1. Físicamente,
el bit se puede representar como un transistor en una célula de memoria, un punto magnetizado en la
superficie de un disco o como un pulso enviado a través de un circuito. Cuando se combinan formando
varios bytes, también llamados palabras, pueden representar grandes cantidades de información. En la
mayoría de los sistemas, ocho bits consecutivos forman un byte, que es equivalente a un carácter
alfanumérico. Las transmisiones se suelen medir en bits por segundo (bps), lo que indica el número de
bits que pasan por un determinado punto en un segundo.
BOOTP. Boot Protocol. Protocolo usado para arrancar estaciones de la red de forma remota.
BROWSER. [ Navegador ]. Programa que permite visitar sitios en Internet.
BYTE. Conjunto de 8 bits (por estandar de úso). Es la mínima cantidad requerida para representar
cada símbolo alfanumérico.
12
CLUSTER. [Lit. racimo]. Es un grupo de sectores de un disco (normalmente de dos a ocho) que se
trata como una entidad por el sistema operativo o la controladora de disco. Este término se refiere a
veces a un grupo de terminales informáticos conectados a un sistema.
DAEMON (Demonio). Programa que se ejecuta de modo independiente al navegador. Los Demonios
pueden realizar varias tareas administrativas como las de construir índices, resúmenes y retroenlaces.
En Unix se utiliza el término por el de servidor debido a que los servidores operan de modo
independiente.
DATAGRAMA. Paquete individual de datos que es enviado a un equipo receptor sin ninguna
información que lo relacione con ningún otro posible paquete.
DHCP. Dynamic Host Configuration Protocol. [ Protocolo de configuración de equipo dinámico].
Método que asigna automáticamente direcciones IP a clientes de una red.
DIRECCIÓN IP. Dirección de 32 bits del protocolo Internet asignada a un ordenador conectado a
Internet. La dirección IP tiene un componente del propio ordenador y un componente de la red. Este
número tiene el formato de cuatro grupos de hasta tres dígitos binarios, cada uno con valores de cero a
doscientos cincuenta y cinco, separados por un punto.
DNS. Domain Name System. [Sistema de Nombres de Dominio]. Base de datos distribuida que
gestiona la conversión de direcciones de Internet expresadas en lenguaje natural a una dirección
numérica IP.
ETHERNET. Tipo de red local que usa la configuración en BUS, que no puede sobrepasar los 2000
metros de longitud.
FAST ETHERNET. Versión de Ethernet que permite transferencias de datos entre 10 y 100 Mbps u
usa protocolo CSMA/CD.
FTP. File Transfer Protocol. [Protocolo de transferencia de archivos]. Es el método común de enviar
archivos entre computadoras en Internet.
GUI. Graphical User Interface. [ Interfaz gráfica de usuario ]. Se trata de una interfaz que utiliza
símbolos gráficos, llamados íconos, y menús para gestionar los recursos de un ordenador. Se puede
trabajar por medio de un ratón o un teclado y está diseñada para resultar más fácil de usar y más
intuitivo que una interfaz basada en caracteres (texto), como el MS-DOS, que requiere que se
introduzcan órdenes escritas a través del teclado. Actualmente, los dos sistemas operativos más
13
utilizados que operan mediante una interfaz gráfica de usuario son Windows , X11 y MacOS. Unix es
un sistema basado en caracteres que también permite la incorporación de una interfaz gráfica de
usuario, entre otros.
HOST. [Anfitrión]. Es una computadora en una red. Antes se denominaba con el término "nodo" que
se utiliza en el lenguaje de definición de documentos. Muchas veces se usa como sinónimo de servidor.
HTTP. Hipertext Transfer Protocol. [ Protocolo de transferencia de hipertexto ]. Es un conjunto de
estándares que permite a los usuarios de la Web intercambiar información. Es el método que se utiliza
para transferir documentos desde el sistema donde se almacenan las páginas hasta los usuarios
individuales.
IP . (Ver DIRECCIÓN IP ).
ISO. International Standard Organization. [ Organización Internacional de Estándares ]. Fundada en
1947 reúne asociaciones de unos 90 países y su objetivo es establecer los estándares internacionales,
incluidos para la comunicación de datos
LINUX.
Es un sistema operativo multitarea y multiusuario de 32 bits para PC desarrollado
inicialmente por Linus Toorvald, modificado y mejorado por programadores de todo el mundo. Su
distribución es gratuita.
NFS. Protocolo desarrollado por Sun Microsystems para permitir que una computadora pueda acceder
a los archivos de otro equipo como si éstos fueran propios.
NODO. Su definición original es la de punto donde convergen de dos líneas. En informática, el
término se refiere muchas veces a una máquina conectada a Internet, aunque lo normal es que se hable
de un punto de confluencia en una red.
NFTS. NT File System. Sistema de archivos propio de Windows NT, que permite nombres largos,
reduce la fragmentación de archivos, proporciona tolerancia a fallos e incrementa el sistema de
seguridad.
OSI. Open Systems Interconnection. [ Interconexion de Sistemas Abiertos ]. Modelo de referencia de
interconexión de sistemas abiertos propuesto por la organización de normalización ISO. Divide las
tareas de la red en siete niveles.
PING. Packet Internet Grouper. [ Buscador de Paquetes Internet ]. Programa utilizado para comprobar
si un servidor está disponible. Envía paquetes de control para comprobar si el servidor esta activo y los
14
devuelve.
PLATAFORMA. Conjunto de tecnologías que obedecen a un estándar sobre las cuales los procesos
corren en forma natural independientemente de su arquitectura
PROTOCOLO. Conjunto de reglas y normas que determinan cómo se realiza un intercambio de datos,
asegurando que los datos recibidos son idénticos a los datos enviados.
PUERTO. Dispositivo físico o lógico que forma parte de la infraestructura de una red y que funge
como interfase entre el equipo de datos del Usuario y la red .
RARP. Reverse Address Resolution Protocol. [ Protocolo de Resolución de Dirección inversa ].
Protocolo de bajo nivel para la asignación de direcciones IP a maquinas simples desde un servidor en
una red física.
RED. Sistema de elementos interrelacionados que se conectan mediante un vínculo dedicado o
conmutado para proporcionar una comunicación local o remota (de voz, vídeo, datos, etc.) y facilitar el
intercambio de información entre usuarios con intereses comunes.
SERVIDOR. En una red, es un ordenador que proporciona servicios a otros equipos (estaciones) .
TCP/IP.
Transfer Control Protocol/Internet Protocol. [ Protocolo de control de transmisiones /
Protocolo Internet ]. Es el protocolo estándar de comunicaciones en red y transporte del modelo OSI,
utilizado para conectar sistemas informáticos a través de Internet ( Vea también DIRECCIÓN IP ).
TELNET. TELe NETwork. [ Tele Red ]. Programa de red que ofrece una forma de conectarse y
trabajar desde otro equipo. Utiliza una conexión a un servidor por medio de la cual el ordenador cliente
del usuario emula una terminal virtual.
UNIX. Sistema operativo multitarea y multiusuario de gran importancia en el desarrollo y evolución
de Internet.
WAN. Wide Area Network. [ Red de Área Amplia ]. Red de ordenadores conectados entre sí,
dispersos geográficamente, localizados a gran distancia.
15
ÍNDICE
INTRODUCCIÓN.....................................................................................................................................1
1.1 Antecedentes Teóricos Básicos ...........................................................................................................6
1.2 Posix (Portable Operating System Interface) ....................................................................................8
1.3 El Sistema Operativo Linux................................................................................................................9
1.4 El Paradigma Cliente Servidor.........................................................................................................11
1.5 Direcciones IP ...................................................................................................................................12
1.6 Taxonomía de arquitecturas.............................................................................................................15
1.6.1 Clasificación de Flynn ...................................................................................................................... 15
1.6.2 Sistema único flujo de instrucciones sobre un único flujo de datos................................................ 15
1.6.3 Sistemas SIMD (Single Instruction stream, Multiple Data stream) ............................................... 16
1.6.4 SIMD con CPU particionada ........................................................................................................... 16
1.6.5 SIMD con múltiples ALU................................................................................................................ 17
1.6.6 Sistemas MISD (Multiple Instruction stream, Single Data stream). .............................................. 18
1.6.7 Sistemas con un flujo de múltiples instrucciones que operan sobre múltiples datos MIMD
(Multiple Instruction stream, Multiple Data stream) .............................................................................. 18
1.7 Categorías de Computadoras Paralelas ...........................................................................................19
1.7.1 Multiprocesadores ............................................................................................................................ 19
1.7.2 UMA (Uniform Memory Access) ..................................................................................................... 20
1.7.3 Sistema de Multiprocesador NUMA (Non Uniform Memory Access) ........................................... 21
1.7.4 Sistema COMA (Cache Only Memory Access) ............................................................................... 21
1.7.5 Multicomputadoras .......................................................................................................................... 22
2.1. La conjetura de Minsky ...................................................................................................................25
2.2. Ley De Amdahl.................................................................................................................................26
2.3. Granularidad....................................................................................................................................29
2.3.1 Paralelismo de grano fino................................................................................................................. 30
2.3.2 El paralelismo de grano medio......................................................................................................... 30
2.3.3 Paralelismo de grano grueso y muy grueso ..................................................................................... 30
2.3.4 Paralelismo independiente .............................................................................................................. 30
2.4. Redes específicas ..............................................................................................................................34
2.4.1 Red Crossbar .................................................................................................................................... 34
2.4.2 Memorias Multipuerto ..................................................................................................................... 35
2.5 Estrategias de software de los MIMD. .............................................................................................37
2.5.1 Técnicas de compilación................................................................................................................... 37
16
2.5.2 Arquitecturas paralelas de granularidad fina................................................................................. 42
2.5.3 Estrategia Doacross scheduling........................................................................................................ 43
2.5.4 Estrategia Doall loop scheduling...................................................................................................... 44
2.5.5 Estrategia de balance de carga......................................................................................................... 44
2.5.6 MPI (Messaging passing interface) Intercambio de paso deMensajes .......................................... 45
2.5.7 PVM(Paralell Virtual Machine) Maquina Virtual Paralela........................................................... 49
2.6 El estudio del rendimiento. ...............................................................................................................53
2.6.1 Factores que influyen en el rendimiento.......................................................................................... 53
2.6.2 Tiempo de respuesta (Turnaround Time) ....................................................................................... 54
2.7 Algoritmos paralelos. ........................................................................................................................56
2.7.1 Método De Diferencias Finitas......................................................................................................... 56
2.7.2 Método de expansión de Taylor ....................................................................................................... 57
2.7.3 Aproximación De Diferencia Para Derivadas Parciales. ................................................................ 60
3.1 Pensamiento y la filosofía de construcción......................................................................................61
3.2 Aspectos generales de la programación en paralelo........................................................................63
3.2.1 Tipo de Hardware ........................................................................................................................... 63
3.2.2 Tipo de red de Comunicación .......................................................................................................... 67
3.2.3 El sistema operativo. ........................................................................................................................ 68
3.3 Elección de componentes para la construcción de la maquina paralela........................................70
3.3.1 Tipo de carga del sistema operativo para la máquina paralela. ..................................................... 71
3.3.2. Aplicaciones y Programas. .............................................................................................................. 72
3.3.2.1 Servicios requeridos ...........................................................................................................................................72
3.3.2.1.1 El servidor RPL. .........................................................................................................................................72
3.3.2.1.2 El servidor DHCP (dynamic host configuration protocol). ........................................................................73
3.3.2.1.3 El servidor TFTP (trivial ftp). ....................................................................................................................74
3.3.2.1.4 El servidor NFS ..........................................................................................................................................74
3.3.2.1.5 El servidor RSH..........................................................................................................................................75
3.4 Proceso de construcción ...................................................................................................................75
3.4.1 Construcción física ........................................................................................................................... 75
3.4.2 Construcción Lógica......................................................................................................................... 80
3.4.3 Instalación del nodo principal.......................................................................................................... 82
3.4.4 Diseño e implementación de la máquina paralela ........................................................................... 86
3.4.4.1 Intercambio de mensajes ...................................................................................................................................89
3.4.4.2 Sincronización....................................................................................................................................................89
3.4.5 Experimentos y optimización. ...................................................................................................... 96
3.4.5.1 Performance de Red .........................................................................................................................................96
3.4.5.2 Transmisión de información (throughput) de MPICH .....................................................................................99
3.4.5.3 Benchmark Time ..............................................................................................................................................101
17
DESCRIPCIÓN
LISTA DE FIGURAS Y TABLAS
Página
_________________________________________________________________
Figura 2.- Sistema SIMD. Fuente: Organización de computadoras Andrew S. Tanenbaum ............16
Figura 3.- Sistemas MISD Fuente: Organización de computadoras Andrew S. Tanenbaum ............18
Figura 4.- Sistema MIMD Fuente: Organización de computadoras Andrew S. Tanenbaum. ...........19
Figura 5.- Sistemas UMA Fuente: Organización de computadoras Andrew S. Tanenbaum ............20
Figura 6.- Cluster Jerárquico Fuente: Organización de computadoras Andrew S. Tanenbaum.......21
Figura 7.- Sistema Coma. Fuente: Organización de computadoras Andrew S. Tanenbaum .............22
Figura 8.- Ejemplo de incremento de velocidad obtenido con la ley de Amdahl usando varios
procesadores ............................................................................................................................................28
Figura 9.- Gráfico generado con Upshot donde expresa el nivel de computación, de comunicación y
en espera para 8 procesadores................................................................................................................29
Figura 10.- La interconexión de red usando memoria de puertas múltiples . .....................................32
Figura 11.- Sistema de memoria compartida con un elemento de proceso con memoria local ..........32
Figura 12.- Esquema de un módulo de procesamiento.........................................................................33
Figura 13.- Interconexión a través de un bus común. ..........................................................................34
Figura 14.- Red Crossbar .......................................................................................................................34
Figura 15.- Comunicación entre procesadores usando una memoria de 4 puertos ............................35
Figura 16.- Red multietapa....................................................................................................................35
Figura 17.- Red Multietapa estrictamente no bloqueante.....................................................................36
Figura 18.- Red Multietapa estrictamente no bloqueante reconfigurable. ..........................................37
Figura 19.- Grafo de dependencia. Los arcos están rotulados con (Tk,Ck) ........................................40
Figura 20.- Arquitectura de Multiprocesador de memoria compartida. ..............................................43
Figura 21.- Comunicaciones en PVM. ..................................................................................................51
Figura 22.- Ejemplo del Proceso de Carga Remota ..............................................................................72
Figura 23.- Esquema de Hardware de un beowulf. ..............................................................................76
Figura 24.- Diagrama a bloques de un cluster tipo beowulf.................................................................76
Figura 25.- El nodo Integral. .................................................................................................................78
Figura 26.- Esquema principal de la máquina paralela propuesta......................................................79
Figura 27.- El modelo en hardware propuesto final de la máquina paralela......................................80
Figura 28.- Diagrama de flujo de la carga de los nodos integrales en el sistema operativo (parte 1)
..................................................................................................................................................................84
Figura 29.- Diagrama de flujo de la carga de los nodos integrales en el sistema operativo (parte 2).
..................................................................................................................................................................85
Figura 30.- Se muestra hasta el momento de como se establece la comunicación de los procesos en
18
la máquina paralela simulando un broadcast. ......................................................................................94
Figura 31.- Throughput para tamaño de sockets por default sobre TCP , donde (F)ast, (E)thernet,
(B)onding, M(PICH), (G)igabit. ...........................................................................................................98
Figura 32.- Gráfico de saturación..........................................................................................................99
Figura 33.- Gráfico de firma ethernet..................................................................................................100
Figura 34.- Se muestra el tiempo de ejecución de los comandos de lectura rm -f, du -sk, ls -R, grep -r
y find -name...........................................................................................................................................102
19
LISTA DE TABLAS
DESCRIPCIÓN
Página
__________________________________________________________________
Tabla 1. Procesos y granularidad de la sincronización .......................................................................................................29
Tabla 2. - Muestra la relación entre la granularidad del algoritmo.......................................................................................31
Tabla 3. - Cadena para el ciclo representado. ........................................................................................................................40
Tabla 4. Segundo ciclo. ..........................................................................................................................................................41
Tabla 5. Tercer Ciclo..............................................................................................................................................................41
Tabla 7 .Relación entre factores de rendimiento y atributos del sistema ................................................................................56
Tabla I. Argumentos de funciones MPI. .................................................................................................................................. VI
Tabla II. Correspondencia entre tipos de datos en MPI, Fortran y C. ..................................................................................VII
20
INTRODUCCIÓN
Las súpercomputadoras son máquinas de gran tamaño físico que tienen la capacidad de
realizar millones de operaciones por segundo, pero al igual que cualquier computadora, está limitada a
hacer lo que se le ordene. Las órdenes que les damos a las computadoras son los programas. Los
programas tradicionalmente le ordenan a la computadora que realice una secuencia de operaciones en
un orden determinado, y no puede realizar una operación hasta haber terminado la anterior. Ejecutar un
programa escrito con un enfoque tradicional en una súper computadora es un desperdicio, ya que un
sólo programa no puede aprovechar la existencia de múltiples procesadores. Esto se debe a que la
mayoría de los programas se desarrollan pensando que serán ejecutados en una computadora personal
con un sólo procesador, tradicionalmente la secuencialidad de los programas y la estructura básica de
los lenguajes de programación.
Para aprovechar las capacidades multiprocesador de las supercomputadoras, es necesario
dividir las tareas en bloques que puedan ser ejecutados simultáneamente. Esto es conocido como
programación de multihilos(multithreads). Los hilos van a realizar distintas tareas necesarias en un
programa. Por ejemplo una parte del programa (hilo) puede dedicarse a producir algún objeto y otra
parte del programa puede dedicarse a consumir esos objetos. Para hacer que los programas funcionen
de esta manera, se utilizan distintas técnicas que le indican a las máquinas cuales son las partes del
programa que pueden ejecutarse simultáneamente.
Para que exista la comunicación entre procesos por medio de paso de mensajes, existe un
estándar llamado MPI (Message Passing Interface). Existen diferentes implementaciones de MPI, como
por ejemplo MPICH, que es una implementación abierta de MPI. MPI permite la paralelización de
programas tanto para máquinas con múltiples procesadores como para clusters. Las aplicaciones
desarrolladas utilizando MPI pueden ser transportadas de una máquina paralela a un cluster sin que
MPI cause algún tipo de conflicto.
El súper cómputo tiene múltiples aplicaciones de carácter puramente científico, otras en la
industria del entretenimiento, en el gobierno, y también dentro de las empresas. La computadora más
poderosa del mundo es la BlueGene de IBM1 actualmente es utilizada para realizar análisis molecular,
modelado económico, investigaciones en química y genética. Esta máquina se encuentra en Estados
unidos y puede alcanzar un desempeño de hasta 183.5 TFLOPS.
Una de las industrias que ha acercado más al súpercómputo al público en general, es la
industria de los efectos especiales. Como un ejemplo, Pixar studios que utiliza computadoras Silicon
Graphics y Sun para la realización de sus excelentes animaciones. A últimas fechas, Pixar también ha
estado utilizando clusters Linux para el desarrollo de sus animaciones.
Sin embargo la capacidad que da el súper cómputo es aplicado también a áreas como la
medicina, la física, la química y muchísimas especialidades más.
Con el fin de dar respuesta al propósito institucional antes mencionado y apoyar a la investigación en
el IPN por medio de la oferta de una infraestructura de cómputo de alto rendimiento, surgió Marc1
(Máquina de esfuerzo final hecha en cluster), de este proyecto se genera esta tesis de titulación de la
1 Fuente: www.top500.org, lista de junio del 2005.
1
maestría en Informática de UPIICSA bajo el nombre de "Construcción de una máquina paralela para
centros de investigación " y es respaldada por el CIDETEC bajo el proyecto "Construcción de una
computadora paralela del TIPO cc-numa", proyecto que en la actualidad esta trabajando sin problemas
y dando servicio a investigadores del instituto.
Ahí se desarrollo un prototipo de una máquina paralela del tipo “cluster” con las siguientes
características:
- 8 nodos de cómputo interconectados por enlaces de 1000 Mb/s
- 2 procesadores Pentium III operando a 1.2 GHz en cada nodo
- 256 MB de RAM y disco duro de 80 GB por nodo
- Sistema operativo LINUX (Mandrake 10.1 rc2)
- Servicios de servidor http, ftp y telnet, accesibles por Internet
Adicionalmente, se revisa y en su caso se desarrollan los programas necesarios para su
funcionamiento y administración así como se adapta a los lenguajes de programación de “facto”
para el área. Así entonces, esta tesis de grado busca el siguiente objetivo:
a) Diseñar y construir una máquina de procesamiento paralelo utilizando material de cómputo en
desuso, o viejo, en buenas condiciones.
Para facilitar el logro de este objetivo general, se establecen metas parciales, desagregadas
en tres objetivos específicos.
1.- Diseñar y construir un prototipo de una máquina paralela tipo cluster.
2.- Establecer y afinar la máquina paralela para su óptimo rendimiento.
3.- Adaptar el prototipo para que responda a los estándares de programación y que busque ser
compatible a otros sistemas.
El presente documento es la memoria de los trabajos desarrollados en cumplimiento de los
objetivos señalados; en esta INTRODUCCIÓN, se da la información general del proyecto.
En el capítulo ANTECEDENTES GENERALES, se delimita el marco de referencia en el
que se desarrolla este trabajo partiendo de la situación actual, así como el entorno que tienen que
presentar los investigadores y las alternativas que toman.
En el capítulo PRINCIPIOS DE PROCESAMIENTO PARALELO, se delimita el marco
teórico en el cual se basa el presente trabajo y bajo el cual se establecen las reglas para el diseño y la
construcción, así como hago referencia a los procesos, características y entorno en los cuales son
válidas esas condiciones teóricas y son clasificadas desde lo más general a lo más particular.
En el capítulo CONSTRUCCIÓN DE LA MÁQUINA PARALELA, que es el que
2
contiene la descripción detallada del trabajo técnico y de desarrollo tecnológico, se contemplan cuatro
partes:
•
Filosofía de Construcción, incluye que es lo que se quiere llegar a hacer y por que debe de
construirse.
•
Aspectos de Hardware, que comprende todo lo relacionado al diseño de los elementos que
permitirán la construcción y el alto desempeño.
•
Aspectos del Software, comprenden la elección correcta del sistema operativo, los programas y
servicios que deberá de tener la máquina para responder con alto desempeño.
•
Procesos de ensamble, incluyen los comentarios propios del diseño, así como el desarrollo,
ensamble, problemas y pruebas realizadas a la máquina paralela
Al final se integran las CONCLUSIONES Y RECOMENDACIONES. Adicionalmente,
incluye también un GLOSARIO DE TÉRMINOS y la BIBLIOGRAFÍA utilizada en el trabajo junto
con un apartado de ANEXOS que incluye algunos datos técnicos referentes a los tipos de conexión y
aspectos básicos de las pruebas y de programación.
3
CAPÍTULO 1. ANTECEDENTES GENERALES
En México, la educación en general y la investigación se encuentran definidas en sus características
por la dinámica de la estructura socioeconómica de nuestro país en la que se insertan tales actividades.
De esta forma se asigna a la investigación los recursos económicos sobre la base de un presupuesto
fijo. Los subejercicios en el gasto público y los recortes a los presupuestos federales dañan a
organismos como el Instituto Politécnico Nacional, que carecen del margen de maniobra que tienen las
universidades autónomas y que dependen de las políticas del gobierno federal.
Por otro lado, la interrelación que existe entre educación e investigación es esencial para la
comprensión de la práctica de la investigación. La evolución de los distintos paradigmas que alumbran
el camino de la investigación en las diferentes ramas de la ciencia constituye, desde luego, otro
referente vital en la comprensión de los logros y obstáculos que cada ciencia particular enfrenta en su
desarrollo, así como atender a las características del individuo cuyas capacidades se construyen
histórica y genéticamente. Estas características actúan a su vez en la práctica de la investigación
impulsándola o frenando su desarrollo. Es decir, para una comprensión cabal de la práctica de
investigación es necesario engarzar dialécticamente los procesos macro y micro que la determinan.
La comprensión cabal de la actividad de investigación que requiere desde luego incorporar el
planteamiento general arriba señalado y extraer en cada situación histórica la interrelación con otros
ámbitos como el político, el cultural y el económico. El discernimiento de las interrelaciones complejas
que históricamente se van construyendo entre los diferentes ámbitos y factores mencionados constituye
un ejercicio de difícil ejecución, necesario sin embargo para entender la dinámica de la actividad de
investigación en nuestro país. El acercamiento a este conocimiento integral permitirá entender las
particularidades de la investigación en el ámbito urbano y regional.
A partir de esta conceptualización se desarrollan las siguientes reflexiones, cuyo objetivo terminal
es la comprensión de los problemas y exigencias que se presentan en el proceso de investigación de la
problemática arquitectónica, urbana y regional.
En México la preocupación central de obtener el desarrollo económico y la industrialización que en
general ha caracterizado las diferentes estrategias de desarrollo implementadas desde la instauración del
grupo hegemónico, surgido de la revolución, en el poder, no ha traído, como ocurrió en los orígenes de
la industrialización, un desarrollo acelerado de la ciencia. Este aspecto es determinado por las
condiciones estructurales de dependencia y subdesarrollo en que se mueve nuestro país, situación aún
prevaleciente pese a los reiterados discursos que nos tratan de ubicar como un país desarrollado.
Tal situación estructural se ha traducido en el ámbito científico y técnico en un proceso permanente
de transferencia, generalmente mecánica, de los adelantos técnicos y científicos logrados en otros países
y que la industrialización de nuestro país requiere para su fortalecimiento. Las consecuencias de esta
transferencia, tradicionalmente denunciadas por académicos e investigadores desde diversas disciplinas
y enfoques, han sido puntualizadas actualmente a la luz de la perspectiva del desarrollo sustentable.
La corriente de pensamiento del desarrollo sustentable incorpora una nueva concepción del
desarrollo basada en tres planteamientos centrales: que se oriente a la satisfacción de las necesidades
4
sociales, empezando por la eliminación de la miseria; que sea autógeno e independiente, esto es, basado
en las propias fuerzas de la sociedad que lo emprende, y que esté en armonía con el medio ambiente.
Esta corriente ha construido sus planteamientos a partir de una crítica permanente a las consecuencias
de la transferencia tecnológica derivadas de una concepción de desarrollo tradicional, basado en la
maximización de las ganancias y el excedente económico. Son recurrentes los señalamientos en torno a
la expoliación de nuestros recursos, el deterioro del medio ambiente, la crisis de energéticos y
alimentos, la destrucción de la cultura local de las comunidades, etc.
La aplicación de tecnología que bajo esta concepción tradicional de desarrollo se efectúa en nuestro
país, tiene pautas que van desde la transferencia de los rezagos tecnológicos que, por ejemplo, en el
campo han tenido resultados atroces para la agricultura, suelos, agua y aire, con la utilización de
sustancias y métodos de fumigación ya desechados en los países que los exportan, hasta la utilización
de ciertas técnicas por parte del Estado mismo en la implementación de sus planes globales. La
aplicación de técnicas inadecuadas para resolver cualquier tipo de problemática en nuestro país llega
incluso a la transferencia de los técnicos mismos, como puede constatarse actualmente en la
elaboración de planes y programas de desarrollo.
El patrón de distribución de la inversión pública federal se mantiene sin alteraciones fundamentales
para años más recientes. En este caso se encuentra especificada la asignación al sector educativo que
recibe en general montos mucho menores que los destinados a los dos sectores priorizados: industria y
comunicaciones y transportes. Destacan ligeros incrementos en dos momentos, el primero al iniciar su
administración Echeverría Álvarez, y el otro a inicios del sexenio de López Portillo.
La atención a la ciencia, la educación y el arte queda por lo tanto relegada en la medida en que no
impactan de inmediato el proceso de desarrollo que, a juicio de sus dirigentes, requiere el país. Esta
situación se ha agravado con el recorte del presupuesto en materia social que la implementación del
modelo neoliberal ha establecido como base para salir de la crisis.
La escasez de recursos tanto en el ámbito científico como en la educación en general alimenta la
existencia de condiciones precarias que se combinan con el escaso desarrollo alcanzado en ambos
campos, configurando al parecer un círculo vicioso de precariedad. La estructura educativa en general
se orienta a la formación de individuos capacitados técnicamente para incorporarse a las actividades
productivas, en cualquiera de sus niveles, por lo que prevalece la debilidad o franca ausencia de
espacios para la adquisición de conocimientos acerca del proceso de la investigación. Los resultados:
un nulo o precario conocimiento teórico y metodológico tanto de parte de los egresados del nivel de
licenciatura de las diversas disciplinas como de los propios profesores. La abundancia de trabajos que
difícilmente podrían considerarse tesis, es una muestra de las deficiencias señaladas.
El descuido de la investigación como función relevante de la educación, en México se explica
además por las propias características de la actividad que requiere para su realización de una
preparación que sólo se adquiere a través de largos procesos de formación teórica y de práctica de la
investigación; además de otras cualidades más escasas aún como son la imaginación, la creatividad, la
disciplina, la perseverancia.
En tales condiciones la investigación que se realiza en nuestro país, por los pocos individuos
comprometidos en una actividad de poca redistribución económica, presenta como rasgos endémicos: la
5
dispersión, el individualismo y la factura artesanal. Tales rasgos no se presentan desde luego de la
misma manera y con la misma intensidad.
La parcelación de la ciencia actúa en ello en razón de dos factores: El primero, recurrentemente
señalado, es la forma cerrada de pensamiento que nos ha heredado la división de la ciencia en estancos
del conocimiento. Sin dejar de reconocer el papel de este fenómeno en un momento histórico en la
aceleración del desarrollo científico, podemos afirmar que actualmente sólo reproduce la fragmentación
y el aislamiento en que se mueven los investigadores.
Un segundo factor, derivado del primero, es la situación que guardan las ciencias sociales respecto a
las naturales. Ambas se encuentran en la actualidad inmersa en un proceso de diversificación que
resulta de mayor magnitud en las ciencias sociales, y que se expresa en la generación de subdivisiones
menores con estructura y desarrollo diferentes. El desarrollo y características peculiares de cada
disciplina científica marcan también a la investigación, de tal forma que en algunas los rasgos anotados
son más acentuados que en otras.
1.1 Antecedentes Teóricos Básicos
En el mercado de las empresas mundiales, existen grandes monopolios de software
propietario los cuales cobran derechos de uso por una cantidad monetaria que en algunos casos es fija
y se denomina licenciamiento” [ 2 ], esta práctica es muy utilizada actualmente en programas
comerciales, tales como una hoja de cálculo, hasta programas de administración de recursos
empresariales (ERP, por sus siglas en ingles).
La ley de Copyright (Derechos de autor), concede a los productores de software el poder
para elegir las reglas que se impondrán sobre su producto a todos los demás consumidores, cómo
utilizarlo, con qué recursos, bajo que condiciones e inclusive bajo que fallas deberá de trabajar éste,
esté o no de acuerdo. La bandera de la globalización y la alta tecnología han impuesto modas que
distan de ser las más productivas y las mejores opciones que permitan explotar la tecnología de la
información.
Cuando los usuarios de los programas carecen de las libertades que definen al Software,
este no podrá saber qué está haciendo, no pueden comprobar si hay puertas traseras, no pueden vigilar
si sé está expuesto a posibles virus y gusanos, no se puede saber qué información personal está siendo
manipulada. Y si este software está mal, no se podrá reparar y se tendrá que esperar a que el productor
ejerza su poder para hacerlo.
Las discusiones sobre derechos y reglas para el software a menudo se han concentrado
solamente en los intereses de los programadores, si consideramos que pocas personas en el mundo
programan comercialmente y aún menos los que son dueños de empresas de software propietario. Y
si consideramos que el mundo actual necesita utilizar software, entonces los productores de software
controlan el modo en que el mundo trabaja, hace negocios, se comunica y se entretiene.
Afortunadamente existen varias asociaciones mundiales que permiten que un usuario
decida qué hacer con el software que se utiliza, un ejemplo de esto es el GNU. Este proyecto ha
desarrollado un sistema completo de software libre llamado GNU (GNU Not Unix) que es compatible
con Unix (surge con relación a un documento inicial de Richard Stallman al cuál se le llama
2 Esta práctica es muy común en el mundo del software propietario.
6
Manifiesto GNU), y ha sido traducido a otros idiomas. Se escogió como nombre "GNU" porque
cumplía algunos requisitos; primero, era un acrónimo recursivo de "GNU No es Unix"; segundo, ya
existía esa palabra en inglés donde Gnu significa Ñu, y tercero, porque era divertido decirla (o
cantarla).
Otra asociacion mundial es GPL(), cuya política principal es él darle al usuario el control del uso del
software, al tiempo que lo protege de otros que quisieran controlar sus decisiones y manipular sus
acciones.
La palabra free "libre" se refiere a libertad de elección y no a su precio, en inglés se usa
la misma palabra para libre y gratuito sin embargo no son la misma cosa, de manera que es posible
pagar o no, un precio por obtener software GNU pero la diferencia radica en que una vez que se
obtiene el software, se podrán ejercer tres libertades específicas para usarlo:
a) Se tendrá la libertad de copiar el programa y distribuirlo.
b) Se tendrá la libertad de modificar el programa como se desee, por tener acceso completo al código
fuente y librerías
c) Se tendrá la libertad de distribuir una versión mejorada ayudando así a construir la comunidad.
Este proyecto fue concebido en 1983 como una forma de devolver el espíritu cooperativo
que prevalecía en la comunidad computacional en días pasados, al eliminar los obstáculos impuestos
por los dueños de software propietario.
En 1971, cuando Richard Stallman[ 3 ] comenzó su carrera en el MIT (Instituto de
Tecnología de Massachusetts), trabajó en un grupo que usaba software libre exclusivamente. Incluso
compañías informáticas frecuentemente distribuían software libre. Los programadores eran libres de
cooperar unos con otros, y frecuentemente lo hacían. En los 80, casi todo el software era propietario, lo
cual significa que tenía dueños que prohibían e impedían la cooperación entre usuarios y surgieron
grandes monopolios.
Cada usuario de computadoras necesita para que su computadora funcione de un sistema
operativo; si no existe éste entonces no es posible ni siquiera comenzar a usar una computadora sin
recurrir a un software propietario. Así que el primer elemento en la agenda del software libre es un
sistema operativo libre. Un sistema operativo no es sólo opcionalmente el núcleo; si no que también
incluye compiladores, editores de texto, software de correo y muchas otras cosas. Por todo esto, escribir
un sistema operativo completo es un trabajo bastante grande. Se necesitaron muchos años. Se decidió
hacer el sistema operativo compatible con UNIX porque el diseño en general ya estaba probado y era
portable, y porque la compatibilidad hacía fácil para los usuarios de UNIX cambiar de UNIX a GNU.
El objetivo inicial de buscar un sistema operativo libre parecido al UNIX fue alcanzado
para el inicio de los 90s y se tenían los componentes principales completos, excepto uno: el núcleo.
Linux surgió entonces como un núcleo libre, desarrollado por Linus Torvalds. La combinación de
Linux con el ya casi completo sistema GNU permitió un sistema operativo completo, actualmente se
estima que hay cientos de miles de personas que ahora usan proyectos GNU basados en Linux,
incluyendo Slackware, Debian, Red Hat y otros.
3Richard Matthew Stallman: nació el 16/marzo/1953 y es la figura central del movimiento del software libre, fundador del
proyecto GNU y la fundación para el software libre. Inventor del concepto copyleft y precursor de la licencia GLP de GNU
(General Public License).
7
Sin embargo, el proyecto GNU no se limita a sistemas operativos ya que se aplicó también
a todo el amplio espectro de software incluyendo el software de aplicación, también proporciona
software para usuarios que no son expertos en computadoras, además de ofrecer juegos y otras
recreaciones.
¿Hasta dónde puede llegar el software libre? No hay límites, excepto cuando las leyes
como el sistema de patentes prohíben el software libre completamente. El objetivo final es el de
proporcionar software libre para hacer todos los trabajos que los usuarios de computadoras quieran
hacer y por lo tanto hacer el software propietario obsoleto.
1.2 Posix (Portable Operating System Interface)
Posix está formado por un conjunto de interfaces estándar de sistema operativo basadas
en el sistema operativo UNIX y desarrolladas bajo la supervisión de la IEEE. [4]. La necesidad de tener
un estándar en común es muy importante ya que las compañías que usaban computadoras querían ser
capaces de desarrollar programas que pudieran ser transportados entre diferentes sistemas de cómputo
de varias manufacturas o plataformas, sin tener que volver a reprogramar. UNIX fue seleccionado
como la base para un sistema de una Interfase estándar en parte porque era neutral en cuanto a la
manufactura y era necesario desarrollar un sistema de común denominador.
Esto hace posible que al aprender un sistema operativo UNIX [5], cualquiera que este sea,
permitirá utilizar cualquier otro sistema UNIX distinto, sin muchos problemas y únicamente se deberá
de aprender las particularidades.
La estructura del estándar de POSIX está definida por la palabra POSIX y un decimal a
continuación del nombre, a continuación se muestran los más importantes:
• POSIX.1 es el estándar para una Interfase de programa de aplicación en el lenguaje C.
• POSIX.2 es el shell estándar y Interfase de utilidades (es decir, la Interfase de comandos del usuario
con el SO).
• POSIX.3 es el estándar para la Interfase de PERL apegada a la norma IEEE 1003.1
• POSIX.4 para la administración de hilos (threads).
Recientemente, las interfaces POSIX.1 y POSIX.2 fueron incluidas dentro de una Interfase
aún más grande conocida como X/Open Programming Guide 4.2, también conocida como la
especificación UNIX Simple (Single UNIX Specification" y "UNIX 95").
El grupo de estándares abiertos, llamado en ingles “Open Group”, un grupo para
4 El IEEE (Institute of Electrical and Electronics Engineers), es una organización profesional técnica sin ánimo de lucro
que incluye a más de 377,000 socios en 150 países. A través de sus socios el IEEE se ha convertido en una autoridad en
varias áreas técnicas, desde ingeniería en informática hasta ingeniería en telecomunicaciones, pasando por otras como
ingeniería biomédica o ingeniería eléctrica.
Fuente http://www.ieee.org/.
5 Unix fue creado en los Laboratorios Bell de AT&T a comienzos de la década de 1970, el éxito del sistema operativo Unix
ha dado lugar a una gran cantidad de versiones diferentes: los que recibieron el (en ese tiempo gratis) código del sistema
Unix. Actualmente Unix® es marca registrada de X/Open.
8
estándares industriales y es el propietario de la marca registrada UNIX y puede por lo tanto, registrar
sistemas operativos que formen parte o complementen mejoras a la Interfase de su sistema. El IBM
OS/390 es un ejemplo de un sistema operativo que incluye una Interfase UNIX registrada.
1.3 El Sistema Operativo Linux
Linux es una versión de UNIX libremente distribuible e independiente, para plataformas
con máquinas x86, Motorola 68k, Digital Alpha, Sparc, Mips y Motorola Power PC. En la actualidad,
este sistema operativo es utilizado por miles de usuarios para desarrollo de software, redes y para
plataformas de usuarios finales. Entre los muchos sistemas operativos alternos que existen, se ha
convertido en una opción interesante, independientemente de que estas vengan de UNIX o de las más
conocidas donde se encuentra Windows y NT.
Linux es una implantación de la especificación POSIX con la cual cumplen todas las
verdaderas versiones de UNIX, el núcleo de Linux no usa código de AT&T o de cualquier otra fuente
propietaria, la mayoría de los programas disponibles para Linux es desarrollado por el proyecto GNU
de la Free Software Foundation. Este soporta un amplio espectro de aplicaciones o paquetes de
programación tales como X Window, Emacs, redes de datos bajo protocolos TCP/IP (incluyendo SLIP,
PPP, ISDN), está disponible en Internet en cientos de servidores FTP y el núcleo del Linux está
legalmente protegido por la licencia pública GNU (GPL).
Linux incluye compiladores, ensambladores, editores de texto, paquetes de correo
electrónico, lectores de Noticias, navegadores, servidores y programas para la creación y edición
gráfica, además maneja los archivos de forma jerárquica, de la misma forma que el sistema operativo
DOS, con la diferencia que el DOS está diseñado para procesadores x86.
Linux fue creado originalmente por Linus Benedict Torvalds [6] en la Universidad de
Helsinki en Finlandia, sin embargo Linux ha sido desarrollado con la ayuda de muchos programadores
a través de Internet, originalmente inició la creación del núcleo como su proyecto favorito, inspirado
por su interés en MINIX, un pequeño sistema UNIX. El se propuso a crear lo que en sus propias
palabras seria un mejor Minix que el Minix. El 5 de octubre de 1991, Linus anunció su primera versión
"oficial" de Linux, la versión 0.02. Desde entonces, muchos programadores han respondido a su
llamado, y han ayudado a construir Linux como el sistema operativo completamente funcional que es
hoy.
La última versión estable es la versión 2.2, que soporta muchos más periféricos, desde
procesadores hasta joysticks, sintonizadores de televisión y reconoce buena cantidad de tarjetas de
sonido. Incluye también soporte para tipos de archivos para Macintosh HFS, UNIX UFS y en modo de
lectura, HPFS de OS/2 y NTFS, de NT.
Linux como producto final presenta las siguientes ventajas [7]:
6 Torvalds consideró el crear un sistema operativo para usarlo en forma alterna en su computadora. Cuando él terminó su
sistema, colocó un mensaje en la Internet para alertar a otros usuarios del nuevo sistema. El creo un software libre para que
otros pudieran modificarlo este se llamo Linux.
7 Fuente: Linux Kernel 2.6: the Future of Embedded Computing, Aseem R. Deshpande, Linux journal 23 mayo de 2004
9
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
Precio bajo en distribución completa de venta (aproximadamente 100 Dólares Americanos) o gratis
por medio de Internet.
Estabilidad
Seguridad, es mucho más segura que otros servidores comerciales.
Compatibilidad, reconoce la mayoría de los otros sistemas operativos en una red.
Velocidad, es mucho más veloz para realizar las tareas.
Posee el apoyo de miles de programadores en el ámbito Mundial.
El paquete incluye el código fuente, lo que permite modificarlo de acuerdo a las necesidades del
usuario.
Ideal para la programación, ya que se puede programar en Linux para distintas plataformas, como
para Windows.
Un sistema escalable.
Se puede usar en casi cualquier computadora, desde una computadora con tarjeta madre 386.
Multitareas real.
Puede manejar múltiples procesadores. Incluso hasta 16 procesadores.
Maneja discos duros de hasta 16 TeraBytes.
Los fabricantes de Hardware le están dando su apoyo, como IBM y COMPAQ.
Vendedores y desarrolladores implementan un sistema de certificación para Linux.
Sin embargo cuenta también con las siguientes desventajas:
•
•
Linux no cuenta con una empresa que lo respalde, por lo que no existe un verdadero soporte como
el de otros sistemas operativos.
Linux corre el riesgo de llegar a fragmentarse como fue el caso de UNIX.
Linux cuenta con las siguientes características técnicas
•
•
•
•
•
•
•
•
Multitarea[8]:permite que varios programas o en su caso procesos reales puedan ejecutarse al
mismo tiempo.
Multiusuario: permite que varios usuarios estén utilizando la misma máquina al mismo tiempo.
Multiplataforma: corre en muchas CPU’s distintas tal es el caso de Intel, Mac y Alpha.
Bajo la plataforma Intel trabaja en modo protegido 386 [9].
Tiene protección de la memoria entre procesos, de manera que uno de ellos no pueda colgar el
sistema.
Permite la carga de ejecutables por demanda: La lectura del disco es sólo de aquellas partes de un
programa que están siendo usadas actualmente.
Permite la política de copia en escritura que permite compartir las páginas entre ejecutables: Varios
procesos pueden usar la misma zona de memoria para ejecutarse y cuando alguno intenta escribir en
esa memoria, la página (4Kb de memoria) se copia a otro lugar. Este método tiene dos beneficios:
aumenta la velocidad y reduce el uso de memoria.
Permite la memoria virtual usando paginación, lo cual involucra el no tener intercambio de procesos
8 Gracias a la multitarea, el rendimiento de las CPUs puede aumentar entre un 20 y un 25%. La multitarea tiene la misión de
que la CPU realice varios trabajos simultáneamente vía hardware y no por simulación.
9 Dentro del modo protegido, el software puede realizar un cambio de tarea para entrar en tareas en modo 8086 virtual (V86
mode). Cada una de estas tareas se comporta como si fuera un 8086 el que lo está ejecutando, lo que permite ejecutar
software de 8086 (un programa de aplicación o un sistema operativo).
10
•
•
•
•
•
•
•
completos a disco: una partición o un archivo en el sistema de archivos, o ambos, con la posibilidad
de añadir más áreas de intercambio sobre la marcha.
Un total de 16 zonas de intercambio de 128Mb de tamaño máximo pueden ser usadas en un
momento dado con un límite teórico de 2Gb para intercambio.
La memoria se administra como un recurso unificado para los Programas del usuario y para él caché
de disco, de tal forma que toda la memoria libre puede ser usada para él caché y éste puede a su vez
ser reducido cuando se ejecuten grandes programas.
Utiliza las librerías compartidas de carga dinámica [10] y librerías estáticas.
Permite realizar los volcados del estado (core dumps) para posibilitar los análisis post-mortem,
permitiendo el uso de depuradores sobre los programas no sólo en ejecución sino también tras
abortar éstos por cualquier motivo.
Es casi totalmente compatible con POSIX, System V y BSD a nivel fuente.
Utiliza un módulo de emulación de iBCS2, casi completamente compatible con SCO, SVR3 y
SVR4 a nivel binario.
Permite la edición del código fuente, incluyendo el núcleo completo y todos los manejadores
(drivers), las herramientas de desarrollo y todos los programas de usuario; además todo ello se
puede distribuir libremente.
Hay algunos programas comerciales que están siendo ofrecidos para Linux actualmente sin código
fuente pero todo lo que ha sido gratuito sigue siendo gratuito.
1.4 El Paradigma Cliente Servidor
Desde el punto de vista de una aplicación, el TCP/IP (Ver anexo A), al igual que muchos
otros protocolos de comunicación, implementa un mecanismo fiable para la transmisión de datos entre
computadoras. En concreto, el protocolo TCP/IP permite que un programador pueda establecer
comunicación de datos entre dos programas de aplicación, tanto si ambos se están ejecutando en la
misma máquina, como en máquinas distintas unidas por algún camino físico (una red local, conexión
telefónica directa entre computadoras, computadoras conectadas a Internet, etc.).
Hay que tener presente que el protocolo TCP/IP especifica los detalles y mecanismos para
la transmisión de datos entre dos aplicaciones que se comunican pero no dictamina cuando ni por qué
deben interactuar ambas aplicaciones, ni siquiera especifica como debería estar organizada una
aplicación que se va a ejecutar en un entorno distribuido. Es tarea del diseñador de la aplicación
distribuida el establecer un protocolo de comunicación y sincronización adecuado.
El esquema de programación más utilizado en la práctica para la implementación de
aplicaciones distribuidas es el paradigma cliente - servidor. La motivación fundamental para el empleo
del paradigma cliente - servidor surge cuando se presentan dos situaciones:
•
Se hace referencia al mismo recurso y se presentan colisiones.
10 Un archivo DLL (sigla de Dynamic Link Library) es un pequeño programa que ejecuta alguna función. Estos archivos
son muy útiles pero también suelen ser una causa de errores en Windows. Los archivos DLL ejecutan acciones o rutinas de
uso frecuente en Windows, y un mismo archivo DLL puede ser usado por varios programas al mismo tiempo.
11
•
Cuando se agotan los recursos físicos de un sistema.
Para entender dichos problema, imaginemos un programador de computadoras que inicia la ejecución
de dos programas en máquinas distintas y que tiene la intención de que dichos programas se puedan
comunicar entre sí. Una vez iniciado el primer programa; éste envía un mensaje. La conexión con la
máquina a la cual va dirigido el mensaje se puede establecer en un intervalo de unos pocos
milisegundos, por lo que el proceso recién enviado determina que su destino todavía no existe, con lo
cual emite un mensaje de error y finaliza su ejecución. Mientras tanto, el programador inicia la
ejecución del segundo proceso. Desafortunadamente, el segundo proceso no se puede comunicar con el
primero ya que éste ha concluido su ejecución. Incluso si los dos procesos intentan establecer la
comunicación continuamente éstos pueden ejecutarse tan rápidamente que la probabilidad de colisión
es muy alta.
Muchos administradores hacen que ciertos programas de comunicaciones se inicien
automáticamente cuando el sistema arranca, de este modo se aseguran que la computadora estará
preparada para aceptar ciertas solicitudes de servicio. Después de iniciar su ejecución, cada uno de
estos programas se queda en espera de la siguiente petición para el servicio que se espera dar. En el
paradigma cliente - servidor se divide las aplicaciones en dos categorías, dependiendo de si la
aplicación se queda en espera de conexiones o las inicia.
En general, una aplicación que inicia una comunicación con otra se le califica como
cliente. Los usuarios finales invocan aplicaciones cliente cuando utilizan un servicio de red. Cada vez
que se ejecuta una aplicación cliente, ésta contacta con el servidor, le envía una solicitud de servicio y
espera la respuesta o resultados del servicio. El proceso cliente es el encargado de llevar a cabo la
interacción con el usuario y de mostrar los resultados de las peticiones de servicio.
En la mayoría de las ocasiones los clientes son más fáciles de diseñar que los servidores, y
no suelen precisar privilegios especiales del sistema para poder funcionar. Un servidor es un programa
que espera peticiones de servicio por parte de un cliente. El servidor recibe la petición del cliente,
ejecuta el servicio solicitado y retorna los resultados al cliente. No existe una interacción directa entre
el usuario y el servidor, de esto ya se encarga la aplicación cliente.
1.5 Direcciones IP
El concepto de números o direcciones IP se puede entender mejor si se establece una
analogía entre las computadoras y teléfonos. Del mismo modo que cada teléfono posee un único
número a nivel mundial, cada computadora conectada directamente a la red Internet tendrá asignado un
único número IP a nivel mundial. Por lo tanto, cualquier computadora del planeta puede conectar con
cualquier otra computadora, siempre y cuando conozca su número IP y, además, exista un camino físico
(formado en líneas telefónicas conmutadas, enlaces vía satélite, líneas de fibra óptica, etc.) que una a
ambas computadoras para que puedan intercambiar información.
La comunicación entre computadoras se lleva a cabo mediante el intercambio de paquetes.
La semántica de los conjuntos de bytes que recibe una computadora viene dictada por la aplicación a la
cual van destinados. Los paquetes de información que se difunden a través de una red de computadoras
son encaminados hacia un equipo o host concreto y dentro de dicho host a un puerto concreto.
12
Se puede pensar en un puerto como un canal de comunicación. Cada computadora dispone
de un total de 65536 canales o puertos, los cuales pueden estar reservados o no estar activos. Para que
un puerto esté activo es necesaria una aplicación que tome el control del mismo y sea capaz de
administrar los paquetes de bytes que llegan por dicho puerto. Cuando un host recibe un paquete
examina su cabecera o sección de información para averiguar a que puerto va destinado, si existe una
aplicación escuchando dicho puerto, entonces se le pasan los bytes del paquete para que ésta los
interprete y actúe consecuentemente. El host no responderá a peticiones de conexión encaminadas hacia
un puerto para el cual no existe ninguna aplicación escuchando o esperando. Es decir, de los paquetes
de bytes remitidos hacia una computadora en concreto, sólo se va a atender aquellos paquetes para los
cuales existe una aplicación escuchando en el puerto al cual van encaminados.
Existe una serie de puertos estándares utilizados universalmente para varios servicios.
Algunos de ellos son:
Servicio
FTP
Puerto
21
Telnet
23
SMTP
POP3
25
110
HTTP
80
NNTP
GOPHER
119
70
Descripción
Protocolo de transferencia de
archivos.
Permite el acceso a una cuenta en
un equipo remoto.
Para enviar correo electrónico.
Protocolo para obtener correo
electrónico.
Protocolo
para
publicación
estándar en la Internet.
Grupos de noticias de Internet
Antiguo Servicio de acceso a
información en modo texto.
Los programas de los servidores deben contener código que maneje situaciones de:
•
•
•
•
•
Autenticación - Verificar la identidad del cliente.
Autorización - Determinar si un cliente dado posee permisos para acceder al servicio que
suministra.
Seguridad de datos - Garantizar que la información no es revelada, de manera no intencionada, a
clientes sin autorización.
Privacidad - Preservar la información de un usuario de accesos no autorizados.
Protección - Garantizar que las aplicaciones de red no puedan abusar de los recursos del sistema.
La distinción entre servicios estándares y no-estándares es importante únicamente cuando la
comunicación se lleva más allá del entorno local. Dentro de un entorno dado, los administradores del
sistema suelen definir los nombres de servicio de tal modo que el usuario final no puede distinguir entre
servicios locales y servicios estándares. Los programadores que construyen aplicaciones en red que
13
serán empleadas por otros lugares repartidos a lo largo de todo el planeta deben entender en cuenta la
distinción y tener cuidado para evitar la dependencia sobre servicios que están únicamente disponibles
en el entorno local.
Aunque TCP/IP define muchos protocolos de aplicación estándares, la mayoría de los
distribuidores de computadoras suministran solamente una parte de los programas cliente con su
software TCP/IP. Muchas organizaciones diseñan aplicaciones personalizadas que emplean el protocolo
TCP/IP para comunicarse entre sí. Las aplicaciones personalizadas no-estándares incluyen diversos
servicios como puede ser la transmisión de imágenes y de vídeo para teleconferencia, transmisión de
voz, todo tipo de servicios en línea, acceso a bases de datos distribuidas, control remoto de sistemas,
etc.
Cuando los programadores diseñan software cliente - servidor, deben de escoger entre dos
tipos de interacción: orientada a conexión o no orientada a conexión. Si el cliente y el servidor utilizan
UDP (User datagram Protocol), la iteración es sin conexión; por el contrario, si emplean TCP (Transfer
Control Protocol), la iteración es orientada a conexión. Desde el punto de vista del programador de
aplicaciones, la distinción entre el estilo sin conexión y orientado a conexión es crítica ya que
determina el nivel de funcionalidad proporciona el sistema. TCP proporciona toda la funcionalidad
necesaria para establecer una comunicación entre computadoras a través de Internet. Verifica que los
datos lleguen al destinatario, y automáticamente retransmite paquetes que por cualquier motivo no
llegan al destinatario o le llegan con errores. Comprueba la integridad de los datos para garantizar que
no se corrompan durante su transmisión. Emplea secuencias de números para asegurar que los paquetes
de datos llegan al destinatario en el orden correcto, los paquetes duplicados son eliminados
automáticamente por el protocolo TCP. Proporciona un control de flujo para asegurar que el emisor no
transmita datos más rápido de lo que pueden ser consumidos por el receptor. Finalmente, TCP informa
tanto al cliente como al servidor si la red deja de estar operativa por algún motivo.
Por contraste, los clientes y servidores que emplean UDP no tienen garantías de que la
información enviada a la red vaya a llegar realmente a su destinatario. Cuando un cliente envía una
petición, esta puede perderse, ser duplicada, retardada o los paquetes de datos pueden llegar al
destinatario fuera de orden. Del mismo modo, la respuesta del servidor puede perderse, duplicarse,
retardarse o llegar desordenada. Los programas de aplicación cliente - servidor deben llevar a cabo las
acciones oportunas para detectar y corregir tales situaciones de error.
Sin embargo, el empleo del protocolo UDP puede ser una alternativa interesante ya que
permite un transporte de información más eficaz. UDP no introduce errores, únicamente se fundamenta
en la red IP para transportar paquetes. Por el contrario, IP depende del hardware de red sobre el que se
asienta y los gateways intermedios. Desde el punto de vista del programador, la consecuencia de
emplear UDP es que este trabaja bien si la red sobre la que se asienta funciona bien. Por ejemplo, UDP
funciona bien en un entorno local porque los posibles errores raramente se producen. Los errores se
suelen producir cuando la comunicación se expande a una red de área extendida(WAN).
Los programadores a veces cometen el error de elegir un protocolo sin conexión (UDP), construyendo
una aplicación que hace uso del mismo, pero verificando el funcionamiento de la aplicación en una red
de área local. Debido a que una red de área local raramente o nunca retrasa los paquetes, los pierde o
los entrega fuera de orden, la aplicación da la sensación de que funciona correctamente. Sin embargo, si
se hace una prueba en una red de área extensa, puede darse el caso de que el programa falle o genere
resultados incorrectos.
Los principiantes, del mismo modo que los profesionales experimentados, prefieren
emplear una comunicación orientada a conexión a la hora de diseñar sus aplicaciones de red. Un
14
protocolo orientado a conexión hace que la programación resulte más simple, y releva al programador
de la responsabilidad de detectar y corregir errores de comunicación.
Por norma general, los programas de aplicación sólo utilizaran el UDP sí el protocolo de
aplicación a implementar especifica que se debe de emplear el UDP (puede ser que el protocolo de
aplicación haya sido diseñado para manejar errores que se puedan producir durante la comunicación).El
protocolo de aplicación relega la seguridad de comunicación al hardware y no importa la pérdida de
algunos paquetes de información. La aplicación no puede tolerar la sobrecarga (overhead) o retraso
(delay) requerido por los circuitos virtuales TCP.
1.6 Taxonomía de arquitecturas
1.6.1 Clasificación de Flynn
Esta clasificación es clásica para definir la arquitectura de las computadoras con base en su
flujo de instrucciones y datos. Flynn publicó su taxonomía por primera vez en 1966.
Se define como flujo de instrucciones al conjunto de instrucciones secuénciales que son
ejecutadas por un único procesador y como flujo de datos al flujo secuencial de datos requeridos por el
flujo de instrucciones. Con estas consideraciones, Flynn clasifica los sistemas en cuatro categorías:
1.6.2 Sistema único flujo de instrucciones sobre un único flujo de datos
SISD (Single Instruction stream, Single Data stream)
Los sistemas de SISD se caracterizan por tener un único flujo de instrucciones sobre un
único flujo de datos, es decir, se ejecuta una instrucción detrás de otra. Este es el concepto de
arquitectura serie de Von Neumann donde, en cualquier momento, sólo se ejecuta una única instrucción.
Ver figura 1.
Figura 1.- Sistema SISD. Fuente: Organización de computadoras Andrew S. Tanenbaum
15
1.6.3 Sistemas SIMD (Single Instruction stream, Multiple Data stream)
Figura 2.- Sistema SIMD. Fuente: Organización de computadoras Andrew S. Tanenbaum
Los sistemas SIMD tienen un único flujo de instrucciones que operan sobre múltiples
flujos de datos. Ejemplos de estos sistemas los tenemos en las máquinas vectoriales con hardware
escalar y vectorial (ver figura 2).
El procesamiento es síncrono, la ejecución de las instrucciones sigue siendo secuencial
como en el caso anterior, todos los elementos realizan una misma instrucción pero sobre una gran
cantidad de datos. Por este motivo existirá concurrencia de operación, es decir, esta clasificación es el
origen de la máquina paralela.
El funcionamiento de este tipo de sistemas es el siguiente. La Unidad de Control manda
una misma instrucción a todas las unidades de proceso (ALUs). Las unidades de proceso operan sobre
datos diferentes pero con la misma instrucción recibida.
Existen dos alternativas distintas que aparecen después de realizarse esta clasificación:
•
•
Arquitectura Vectorial con segmentación: Una CPU única particionada en unidades
funcionales independientes trabajando sobre flujos de datos concretos.
Arquitectura Matricial (matriz de procesadores): Varias ALU idénticas a las que el
procesador de instrucciones asigna una única instrucción pero trabajando sobre diferentes
partes del programa.
1.6.4 SIMD con CPU particionada
16
En los sistemas SIMD con CPU particionada, la CPU se diseña como un conjunto de
unidades funcionales independientes que ejecutan simultáneamente varias operaciones
aritmético/lógicas.
La CPU contiene un único procesador que procesa un único flujo de instrucciones
liberando cada instante una. Debido a que las unidades funcionales operan independientemente, es
posible liberar nuevas instrucciones antes de que finalice la ejecución de las instrucciones previas.
Ejemplos de este tipo de sistemas los encontramos en las computadoras CRAY
monoprocesador, CYBER 205, FUJITSU, HITACHI, NEC SUPERCOMPUTERS, IBM 390 VF, IBM
9000 VF, ALLIANT FX/1 Y CONVEX C-1.
1.6.5 SIMD con múltiples ALU
En los sistemas SIMD con multiples ALU, es común en su funcionamiento utilizar el
modo bloqueado, donde es ejecutada o ignorada una misma instrucción para todas las ALU. Existe un
único procesador que maneja el flujo de instrucciones del programa y que transfiere todas las
instrucciones a las diferentes unidades aritmético/lógicas. Sus características principales son las
siguientes:
•
Cada ALU opera sobre un segmento diferente de datos del programa.
Ejemplo de funcionamiento del sistema con el siguiente bucle:
DO 2000 I=1,N
A(I) = B(I) + C(I)
2000 CONTINUE
•
El procesador asigna a cada ALU la operación de suma de B(I) con C(I) y siendo el almacenamiento
del resultado en A(I) pero pasando a cada ALU un valor diferente de I.
En el caso de que haya menos ALU que iteraciones del bucle, el procesador ordenará la ejecución
hasta que estén procesados todos los valores de I.
En el caso de que haya más ALU que iteraciones, existirá un número de estas que no estén
operativas durante la ejecución de las instrucciones del bucle. Una ALU inactiva o en OFF significa
que:
•
La ALU recibe instrucciones pero las ignora
•
La ALU ejecuta cálculos pero no almacena ningún resultado.
17
1.6.6 Sistemas MISD (Multiple Instruction stream, Single Data stream).
Sistemas con múltiples instrucciones que operan sobre un único flujo de datos. Este tipo
de sistemas no ha tenido implementación hasta hace poco tiempo. En la figura 3 se muestra este
sistema.
Figura 3.- Sistemas
Organización de computadoras Andrew S. Tanenbaum
MISD Fuente:
Los sistemas MISD se contemplan de dos maneras distintas:
1. Varias instrucciones operando simultáneamente sobre un único dato.
2. Varias instrucciones operando sobre un dato que se va convirtiendo en un resultado que será
la entrada para la siguiente etapa. Se trabaja de forma segmentada, todas las unidades de
proceso pueden trabajar de forma concurrente.
Ejemplos de estos tipos de sistemas son los arreglos sistólicos o arreglos de procesadores.
También podemos encontrar aplicaciones de redes neuronales en máquinas masivamente paralelas.
1.6.7 Sistemas con un flujo de múltiples instrucciones que operan sobre múltiples
datos MIMD (Multiple Instruction stream, Multiple Data stream)
Los sistemas con un flujo de múltiples instrucciones que operan sobre múltiples datos,
empezaron a utilizarse a principios de los 80 y consiste en sistemas con memoria compartida que
permiten ejecutar varios procesos simultáneamente (sistema multiprocesador).Ver figura 4.
Cuando las unidades de proceso reciben datos de una memoria no compartida estos
sistemas reciben el nombre de MULTIPLE SISD (MSISD). En arquitecturas con varias unidades de
control (MISD Y MIMD), existe otro nivel superior con una unidad de control que se encarga de
controlar todas las unidades de control del sistema.
18
Figura 4.- Sistema MIMD Fuente: Organización de computadoras Andrew S. Tanenbaum.
1.7 Categorías de Computadoras Paralelas
Clasificación moderna que hace alusión única y exclusivamente a los sistemas que tienen
más de un procesador (Por ejemplo las máquinas paralelas).
Existen dos tipos de sistemas teniendo en cuenta su acoplamiento.
•
Los sistemas fuertemente acoplados son aquellos en los que los procesadores dependen unos de
otros.
•
Los sistemas débilmente acoplados son aquellos en los que existe poca interacción entre los
diferentes procesadores que forman el sistema.
Atendiendo a esta y a otras características, la clasificación moderna divide a los sistemas en dos
tipos:
•
•
Sistemas multiprocesador (fuertemente acoplados)
Sistemas multicomputadora (débilmente acoplados).
1.7.1 Multiprocesadores
Un multiprocesador puede verse como una computadora paralela compuesta por varios
procesadores inter conectados que comparten un mismo sistema de memoria. Los sistemas
multiprocesadores son arquitecturas MIMD con memoria compartida. Tienen un único espacio de
direcciones para todos los procesadores y los mecanismos de comunicación se basan en el paso de
mensajes desde el punto de vista del programador.
Dado que los multiprocesadores comparten diferentes módulos de memoria, pudiendo
acceder a un mismo módulo varios procesadores, a los multiprocesadores también se les llama sistemas
de memoria compartida. Dependiendo de la forma en que los procesadores comparten la memoria, se
clasifican en sistemas multiprocesador UMA, NUMA y COMA.
19
1.7.2 UMA (Uniform Memory Access)
UMA se refiere como un sistema multiprocesador con acceso uniforme a la memoria. La
memoria física es uniformemente compartida por todos los procesadores, esto quiere decir que todos
los procesadores tienen el mismo tiempo de acceso a todas las palabras de la memoria. Cada procesador
tiene su propia caché privada y también se comparten los periféricos. Ver figura 5.
Figura 5.- Sistemas UMA Fuente: Organización de computadoras Andrew S. Tanenbaum
Los multiprocesadores son sistemas fuertemente acoplados (tightly-coupled), dado el alto
grado en que se comparten los recursos (hardware o software) y el alto nivel de interacción entre
procesadores, lo que hace que un procesador dependa de lo que hace otro.
El sistema de interconexión debe ser rápido y puede ser de uno de los siguientes tipos:
•
•
•
Bus común
Red crossbar
Red multietapa
Este modelo es conveniente para aplicaciones de propósito general y de tiempo compartido por varios
usuarios.
Existen varias categorías de sistemas UMA de las cuales se mencionan las siguientes.
•
Sistema Simétrico: Cuando todos los procesadores tienen el mismo tiempo de acceso a todos los
componentes del sistema (incluidos los periféricos), reciben el nombre de sistemas multiprocesador
simétrico.Los procesadores tienen el mismo dominio (prioridad) sobre los periféricos y cada
procesador tienen la misma capacidad para procesar.
•
Sistema Asimétrico: Los sistemas multiprocesador asimétrico, son sistemas con procesadores
maestros y procesadores esclavos, en donde sólo los segundos pueden ejecutar aplicaciones y dónde
en tiempo de acceso para diferentes procesadores no es el mismo. Los procesadores esclavos
(attached) ejecutan código usuario bajo la supervisión del maestro, por lo tanto cuando una
20
aplicación es ejecutada en un procesador maestro dispondrá de una cierta prioridad.
1.7.3 Sistema de Multiprocesador NUMA (Non Uniform Memory Access)
Un sistema multiprocesador NUMA es un sistema de memoria compartida donde el
tiempo de acceso varía según donde se encuentre localizado el acceso.
El acceso a memoria, por tanto, no es uniforme para diferentes procesadores. Existen
memorias locales asociadas a cada procesador y estos pueden acceder a datos de su memoria local de
una manera más rápida que a las memorias de otros procesadores, debido a que primero debe aceptarse
dicho acceso por el procesador del que depende el módulo de memoria local.
Todas las memorias locales conforman la memoria global compartida y físicamente
distribuida y accesible por todos los procesadores.
Figura 6.- Cluster Jerárquico Fuente: Organización de computadoras Andrew S. Tanenbaum
Otro modelo NUMA que nace como la mezcla del modelo UMA explicado anteriormente
y el modelo NUMA anterior, es el cluster jerárquico, ver figura 6, en el que se combinan las memorias
locales y las globales obteniendo una cierta escalabilidad del sistema. Los procesadores aparecen
distribuidos en clusters (1 sistema UMA o un 1 sistema NUMA). Estos clusters están conectados a la
memoria global compartida. El sistema en su totalidad es un sistema NUMA, ya que el acceso a
memoria es no uniforme por parte de los clusters. La ventaja de estos sistemas con respecto a los
sistemas UMA, es que el acceso a memoria local es mucho más rápido.
1.7.4 Sistema COMA (Cache Only Memory Access)
Los sistemas COMA son un caso especial de los sistemas NUMA. Este tipo de sistemas
21
no ha tenido mucha trascendencia, al igual que los sistemas SIMD. Las memorias distribuidas son
memorias caches, por este motivo es un sistema muy restringido en cuanto a la capacidad de memoria
global. No hay jerarquía de memoria en cada módulo procesador. Todas las caches forman un mismo
espacio global de direcciones. El acceso a las caches remotas se realiza a través de los directorios
distribuidos de las caches. Ver figura 7.
Figura 7.- Sistema Coma. Fuente: Organización de computadoras Andrew S. Tanenbaum
Dependiendo de la red de interconexión utilizada, se pueden utilizar jerarquías en los
directorios para ayudar a la localización de copias de bloques de caché.
1.7.5 Multicomputadoras
Los sistemas llamados multicomputadoras se pueden ver como una computadora paralela
en el cual cada procesador tiene su propia memoria local. En estos sistemas la memoria se encuentra
distribuida y no compartida como en los sistemas multiprocesador. Las computadoras se comunican a
través de paso de mensajes, ya que éstos sólo tienen acceso directo a su memoria local y no a las
memorias del resto de procesadores.
El diagrama de bloques de un sistema de multi computadora que coincide con el visto
para los sistemas UMA, la diferencia viene dada porque la red de interconexión no permite un acceso
directo entre memorias, sino que la comunicación se realiza por paso de mensajes.
La transferencia de los datos se realiza a través de la red de interconexión que conecta un
subconjunto de procesadores con otro subconjunto. La transferencia de unos procesadores a otros se
realiza por tanto por múltiples transferencias entre procesadores conectados dependiendo del
establecimiento de dicha red.
Dado que la memoria está distribuida entre los diferentes elementos de proceso, estos
sistemas reciben el nombre de distribuidos. Por otra parte, estos sistemas son débilmente acoplados, ya
que los módulos funcionan de forma casi independiente unos de otros.
CAPÍTULO 2. PRINCIPIOS DEL PROCESAMIENTO EN
PARALELO
Las súpercomputadoras son herramientas para la creación y el desarrollo de simulaciones y
22
modelos de estados y procesos. Los usos y el aprovechamiento del rendimiento de estas potentes
herramientas dependen fundamentalmente de la habilidad, la imaginación y esfuerzo de los
investigadores. El uso de programas que explotan el diseño 3D por computadora de una gran variedad
de sistemas físicos ha alcanzado el punto donde la realidad puede ahora ser simulada con un alto grado
de fiabilidad. (Ver anexo 2).
Los modelos físicos de sistemas reales, ya sea la atmósfera, la turbulencia, el caos, la
combustión en sistemas químicos, mecánicos, los vehículos automotores y aerospaciales, las máquinas,
las moléculas de proteínas, los procesos industriales o económicos, etcétera., pueden ser
suficientemente detallados para utilizarse para predicciones verídicas. De esta manera la computación
avanzada es más y más un instrumento para el desarrollo de la sociedad y para la competitividad
industrial a todos los niveles, y no está limitada a un sector industrial específico. El impacto en la
sociedad de las súpercomputadoras no está limitado a sus beneficios en la industria, el comercio y los
servicios.
Incluye al estudio de la propagación de enfermedades, el reconocimiento y traducción de
lenguajes naturales, los cambios globales de clima o la compleja dinámica de los sistemas económicos.
Es bien conocido que los principales problemas que afectan a nuestra sociedad son de naturaleza
mundial y necesitan estudiarse y resolverse a esta escala. En muchos casos, la ausencia de datos
completos, como los referentes a la atmósfera y la biosfera, o a la población mundial, hace que se
desarrollen criterios subjetivos para realizar predicciones. Esto requiere la comprensión de sistemas
muy complejos, cuyo comportamiento solamente puede ser totalmente asimilado y predecible con más
precisión por medio de una modelización detallada empleando computadoras de altas capacidades.
Si el siglo XIX marcó el comienzo de la era moderna con la Revolución Industrial, ahora
nos encontramos inmersos en otra revolución, la denominada revolución del conocimiento, que se
centra en las denominadas tecnologías de la información. La máquina de vapor de entonces es
“sustituida” por la computadora. El nombre de James Watt deja paso a otros como Charles Babbage,
John von Neumann (considerado el padre de las computadoras modernas), Seymour Cray (fundador de
le empresa Cray y padre de las súpercomputadoras) o el controversial Bill Gates. En pocos años la
computadora ha ganado rapidez, habilidad, capacidad de almacenamiento de información, interfaces
más amigables para el usuario, precios más baratos, pero estos pequeños avances no son suficientes
cuando se trata de realizar tareas de investigación, control y análisis, por el volumen y complejidad de
la información a tratar. Subimos entonces al escalón más alto, a la informática de alto rendimiento,
donde se encuentran las potentes súpercomputadoras.
La evolución de las súpercomputadoras A principios de los años setenta, la aplicación
predominante de la computadora era el procesamiento de datos administrativos. Los banqueros, los
administradores de universidades y los ejecutivos publicitarios se sorprendían ante la velocidad
sensacional con que las grandes computadoras de millones de dólares procesaban datos. Los ingenieros
y científicos se mostraban agradecidos por este tremendo logro tecnológico, pero distaban de estar
satisfechos.
23
Cuando los ejecutivos empresariales hablaban acerca de la capacidad ilimitada, los
ingenieros y científicos sabían que deberían esperar avances futuros antes de que pudieran usar las
computadoras para manejar problemas complicados. Los ingenieros automotores aún no podían
construir prototipos tridimensionales de automóviles en una computadora. Los físicos no podían
investigar las actividades de un átomo durante una explosión nuclear. Las comunidades de ingenieros y
científicos tenían una necesidad apremiante de computadoras más potentes.
En respuesta a esa necesidad, los diseñadores de computadoras empezaron a trabajar en lo
que ahora se conoce como súpercomputadoras. Fundamentalmente, las súpercomputadoras manejan
aplicaciones del tipo limitado al procesador.
Las aplicaciones limitadas a procesador, que son útiles para los ingenieros y científicos,
requieren relativamente poco en lo que se refiere a entrada o salida. En las aplicaciones limitadas al
procesador; la cantidad de trabajo que el sistema de computación puede realizar está limitada
principalmente por la arquitectura de la computadora. Una tarea científica involucra el manejo de un
modelo matemático complejo que, a menudo, requiere para su resolución de billones de operaciones.
A principios de la década de 1970, algunos de los trabajos científicos complejos de tipo
limitado a procesador ocupaban durante días las grandes computadoras de las universidades más
importantes. Por lo contrario, las macrocomputadoras, se orientan a aplicaciones limitadas de entradas y
salidas; es decir, la cantidad de trabajo que el sistema de computación puede realizar está limitada
principalmente por la velocidad de los dispositivos de entrada y salida.
Las supercomputadoras también utilizan técnicas especiales para evitar el calor en los
circuitos y prevenir que se quemen debido a su proximidad. El conjunto de instrucciones de las
supercomputadoras contiene las instrucciones de transferencias de datos, manipulación de datos y
transferencia de control del programa de las computadoras convencionales. Esto se aumenta mediante
instrucciones que procesan valores y combinaciones de escalares y vectores. Una súper computadora es
un sistema de computación que se reconoce por su alta velocidad de cálculo, sus sistemas de memoria
grandes y rápidos y un uso amplio de procesamiento paralelo. Está equipada con unidades funcionales
múltiples y cada unidad tiene su propia configuración de arquitectura paralela. Aunque la súper
computadora maneja aplicaciones de propósito general que se encuentran en todas las otras
computadoras, está optimizada específicamente para el tipo de cálculos numéricos que involucran
vectores y matrices de números de punto flotante.
Las supercomputadoras no son convenientes para procesamiento cotidiano normal de una
instalación de computadora típica. La parámetro mas común es la velocidad de una supercomputadora,
ésta se mide sobre la base de la cantidad de operaciones matemáticas que hace por segundo. El término
técnico para esta velocidad es FLOPS. Una de las primeras tareas asignadas a la computadora de los
años cuarenta, la ENIAC, no fue para un uso muy humano, ya que se utilizó en los cálculos de diseño
de la primera bomba atómica (Proyecto Manhattan), en concreto, para calcular las ondas de choque de
24
las explosiones de prueba. Sin la rapidez y la capacidad de cálculo de las computadoras, algunas
disciplinas se habrían quedado en sus planteamientos teóricos, tal es el caso de la física de alta energía.
Hay experimentos en el CERN que hacen colisionar electrones y positrones y que
producen tal cantidad de información que sin la ayuda de una súper computadora que sepa discriminar
entre todos los sucesos no se habría podido comprobar experimentalmente las ideas teóricas. En la
investigación espacial, la utilización de computadoras se convirtió en esencial. La nave Voyager 2, que
fue lanzada el 20 de agosto de 1977 con la misión para explorar los planetas exteriores al sistema solar,
iba equipada con seis computadoras diferentes, con capacidad de 540 Megas, algo portentoso para la
época. Hoy en día, la existencia de las supercomputadoras que, naturalmente, trabajen en tiempo real,
se ha convertido en una necesidad. Por ejemplo, son imprescindibles en las industrias del automóvil y
la aeronáutica. En este caso los estudios de aerodinámica son una pieza fundamental para optimizar la
forma del fuselaje o de las alas.
También se emplea en simulación de vuelos para el entrenamiento de los pilotos, etc. El
análisis de la estructura del avión Boeing 777 se realizó completamente por una supercomputadora y
también el diseño del avión invisible F-117. Otras aplicaciones son el diseño de nuevos productos
farmacéuticos, componentes electrónicos, simulación de terremotos, estudio de la evolución de la
contaminación en áreas extensas, predicción meteorológica y estudios del cambio climático o
simulación de órganos corporales con el objetivo de reproducir su funcionamiento con representaciones
en 3D de alta precisión a partir de métodos de resonancia magnética.
De esta forma, llamaremos computación paralela a las técnicas que descomponen un
problema en subtareas y partes de estas tareas que pueden ser procesadas en diferentes máquinas o
elementos de proceso al mismo tiempo. En la metáfora del cerebro como computadora, puede ser
válido imaginar cierta similitud entre dicho órgano y la computadora.
2.1. La conjetura de Minsky
En cualquier sistema paralelo existe una norma aceptada para medir el incremento de la
velocidad (speedup) de una aplicación cuya aplicación cae entre dos límites: (ln2N) y (Nln2N), donde
N está definido por el número de procesadores. La primera de ellas, es conocida como la conjetura de
Minsky, y la otra se ha considerado un límite superior general para las curvas maximas del incremento
de la velocidad.
Es necesario establecer la aplicación en paralelo que deseamos medir, es necesario
conocer que en su calculo aparecerán componentes seriales y paralelos de diversa complejidad. La
complejidad que nos estamos refiriendo aquí es la medida algorítmica de la variación del tiempo de
ejecución del programa en función del tamaño de los datos y del número de procesadores. Los
componentes seriales pueden tener una complejidad, por ejemplo, de O (N2), donde N determina el
tamaño del problema. Este componente serial tomará muy probablemente la misma cantidad de tiempo
cuando está funcionado en un procesador o en varios de ellos. En relación a los componentes en
paralelo, sin embargo, esto será una historia diferente, ya que al asumir que un procesador opera
pedazos de N datos consumiendo un tiempo proporcional a O(N3), pero cuando los mismos pedazos
de N datos se procesan en una red del N-procesadores, la complejidad es O (N2) , la cual es factible en
su recostrcción práctica.
25
Es posible entonces encontrar una relación que muestre el grado de incremento de
velocidad, la siguiente formula muestra esta relación:
Speedup = O(N)+ O(N³) O(N)
O(N)+ O(N²)
Lo anterior determina que un programa serial se encuentra compuesto por un componente
serial y una serie de componentes en paralelo formados en tantos pedazos como numero de
procesadores existentes por lo que su complejidad sera mayor. La complejidad del componente en
paralelo disminuye, cuando los procesos están ejecutandose en una máquina paralela, por lo que
algoritmo paralelo divide el tamaño de los datos procesados entre el número de procesadores y el
componente serial se puede hacer insignificante en la ecuación del incremento de velocidad.
Lo anterior nos indica que si existen algoritmos eficientes para procesar grandes
cantidades de datos, entonces él vale la pena construir computadoras más grandes que puedan tratar
problemas grandes, porque como aumentamos el tamaño de los datos y el tamaño de la máquina,
podemos esperar que el speedup aumente.
2.2. Ley De Amdahl.
Esta ley es utilizada para poder evaluar el rendimiento de una computadora por medio de
la evaluación de sus tareas con base en sus tiempos de computación, de espera o inactividad y la
latencia de la red.
En cualquier programa paralelizado existen dos tipos de código: el código paralelizado y
el código secuencial. Como es sabido existen ciertas secciones de código que ya sea por dependencias,
por acceso a recursos únicos o por requerimientos del problema no pueden ser paralelizadas.
Estas secciones conforman el código secuencial, que debe ser ejecutado por un solo
elemento procesador. Es pues lógico afirmar que la mejora de rendimiento (R) de un programa
dependerá completamente de:
El tiempo en el que se ejecuta el código serie.
El tiempo en el que se ejecuta el código paralelizable.
26
Donde Rh representa el rendimiento mas Alto de un proceso y RL el rendimiento mas
bajo.
Esto genera la siguiente ecuación:
Esta es la llamada ley de Amdahl y fue descrita por Gene Amdahl en 1967. Las
implicaciones que trae esta ecuación son, a pesar de que no tenga en cuenta las características de cada
sistema en concreto:
A) El rendimiento no depende completamente del número de procesadores que posea el sistema: en
la mayoría de los casos dependerá del número de procesadores máximo que se aprovecharán
simultáneamente para ejecutar un programa.
B) Cuanto mejor paralelizado esté un programa más susceptible será de aumentar su velocidad y
por tanto explotar el rendimiento del sistema paralelo que lo ejecute.
Supongamos ahora que tenemos un programa que inicialmente no hemos paralelizado,
cuyos tiempos de ejecución son 12% y 88%, en serie y en paralelo respectivamente (observe la figura 8)
27
Figura 8.- Ejemplo de incremento de velocidad obtenido con la ley de Amdahl usando varios procesadores
Como se puede ver en la figura anterior, la parte no paralelizable del código impide que se
pueda escalar de forma lineal, llegará un momento que añadir nuevos procesadores no añadirá una
ventaja real al sistema, porque todo lo que estará en ejecución será código secuencial. Por lo tanto para
maximizar el aprovechamiento de los sistemas paralelos debe tenerse mucho cuidado con la forma de
paralelizar las aplicaciones: cuanto más código secuencial tengan, más problemas de escalabilidad.
En relación al tiempo de ejecución de una tarea dentro de una máquina paralela el
tiempo de ejecución total de nuestro programa viene dado por
Donde Tcomp = Tiempo de computación
Tcomm = Tiempo de comunicaciones
Tidle= Tiempo de espera o inactivo
P=Numero de procesadores
Como el procesamiento de cada tarea, en la maquina paralela, es muy rapido,
generalmente en el orden de los milisegundos o microsegundos, es necesario recurrir a herramientas
graficas que analizen el proceso al ejecutarse, en el caso de mpich, éste cuenta con aplicaciones como el
upshot que genera los siguientes gráficos, obsérvese la figura 9.
28
Figura 9.- Gráfico generado con Upshot donde expresa el nivel de computación, de comunicación y en espera para 8
procesadores
2.3. Granularidad
La granularidad de sincronización, o frecuencia, entre procesos en el sistema, es una buena manera de
caracterizar multiprocesadores y ubicarlos en un contexto con otras arquitecturas. Se pueden distinguir
cinco categorías de paralelismo que difieren en el grado de granularidad. Estas categorías se encuentran
listadas en la Tabla 1.
Tamaño del Grano
Fino
Medio
Descripción
Paralelismo inherente en el único flujo de instrucciones
Procesamiento paralelo o multitarea dentro de una
aplicación individual
Grueso
Multiprocesamiento de procesos concurrentes en un
entorno multiprogramado
Muy Grueso
Proceso distribuido por los nodos de una red para formar
un entorno de computación
Independiente
Varios procesos no relacionados
Tabla 1. Procesos y granularidad de la sincronización
Intervalo de
sincronizaciones de
instrucciones con base
en el numero de
procesos
<20
20-200
200-2000
2000 – 1 000000
No aplica
29
2.3.1 Paralelismo de grano fino
El paralelismo de grado fino representa un uso mucho más complejo del paralelismo que
es encontrado en el uso de hilos. Aunque muchos trabajos han sido hechos en aplicaciones altamente
paralelas, es un área especializada y fragmentada, con muchos enfoques diferentes.
2.3.2 El paralelismo de grano medio
En el paralelismote grano medio , una aplicación puede ser efectivamente implementada como una
colección de hilos con un paralelismo simple. En este caso, el paralelismo potencial de una aplicación
debe ser explícitamente especificado por el programador. Generalmente se necesitará un alto grado de
coordinación e interacción entre los hilos de una aplicación, llevando a un nivel medio de
sincronización.
2.3.3 Paralelismo de grano grueso y muy grueso
En el paralelismo de grano grueso, existe sincronización entre procesos pero a nivel muy
grotesco. Esta clase de situación es fácilmente entendible como un grupo de procesos concurrentes
ejecutándose en un monoprocesador multiprogramado y puede ser soportado en un multiprocesador con
un pequeño o no cambio al software del usuario. En general, cualquier conjunto de procesos
concurrentes que necesiten comunicarse o sincronizarse puede aprovechar el uso de las arquitecturas
de los multiprocesadores. Un sistema distribuido puede ofrecer un soporte adecuado en caso de
interacciones poco frecuentes entre los procesos. Sin embargo, si la interacción es algo más frecuente,
la sobrecarga de comunicaciones a través de la red puede anular parte de la posible aceleración. En este
caso, la organización del multiprocesador ofrece el soporte más efectivo.
2.3.4 Paralelismo independiente
Entre los procesos de paralelismo independiente, no existe una sincronización explícita.
Cada uno representa una separación, una aplicación independiente. El uso típico de este tipo de
paralelismo es en los sistemas de tiempo compartido. Cada usuario está ejecutando una aplicación en
particular, como un procesador de textos o una hoja de cálculo. El multiprocesador ofrece el mismo
servicio que un procesador multiprogramado. Como hay más de un procesador disponible, el tiempo
medio de respuesta a los usuarios será menor. Es posible alcanzar un aumento similar de rendimiento
proporcionado a cada usuario una computadora personal o una estación de trabajo. Si van a compartirse
archivos o alguna información, entonces se deben conectar los sistemas individuales en un sistema
distribuido soportado por una red. Por otro lado, un único sistema multiprocesador ofrece, en muchos
casos, un costo mejor que un sistema distribuido, pudiendo así mejorar los elementos físicos que lo
conforman.
30
La tabla 2 muestra la relación entre la granularidad del algoritmo, el grado de
acoplamiento del hardware y el modo de comunicación, y la diferencia entre procesamiento paralelo y
distribuido. El procesamiento distribuido ocurre cuando los recursos de hardware cooperan pobremente
en el proceso de un trabajo. Ejemplos de sistemas distribuidos son las redes de computadoras y algunas
computadoras múltiples. Cuando los componentes de hardware cooperan fuertemente para procesar las
tareas simultáneamente, estamos en presencia de un procesamiento paralelo.
Nivel de trabajo
Distribuido
Nivel de tarea
Nivel de proceso
Nivel de instrucción
Nivel de variable
Nivel de bit
Redes de computadoras
Paso de mensajes
Paralelo
Multicomputadoras
Memoria
compartida
Multiprocesadores
Granularidad del
algoritmo
Grado de acoplamiento
Modo de comunicación
Tabla 2. - Muestra la relación entre la granularidad del algoritmo.
Existe una diferencia importante entre multiprocesadores y computadoras múltiples. Una
computadora múltiple consiste de varias computadoras, cada una de ellas conformadas por su propio
procesador, memoria, dispositivos de entrada, salida y sistema operativo. Mientras que un sistema
multiprocesador tiene un único sistema operativo y sus procesadores comparten la memoria y los
dispositivos de entrada y salida. Existen dos grandes conjuntos de modelos de arquitecturas basadas en
multiprocesadores: una está basada en una arquitectura de procesadores fuertemente acoplados y la otra
en procesadores débilmente acoplados.
Las diferencias entre ambas arquitecturas son las siguientes: en las estructuras fuertemente
acopladas los procesadores se comunican a través de memoria central (lo que llamábamos memoria
centralizada o compartida) por lo tanto la velocidad de comunicación estará acotada por el ancho de
banda (bits/seg.) de la memoria. La interconexión puede realizarse a través de una red que comunique a
los procesadores con la memoria o usando memoria de puertas múltiples. Ver figura 10.
31
Figura 10.- La interconexión de red usando memoria de puertas múltiples .
Un factor que limita la expansión de estos sistemas está dado por la degradación de
rendimiento global motivada por el aumento de colisiones al intentar acceder a la memoria cuando se
aumenta el número de procesadores.
Una alternativa que intenta mejorar este conflicto es proveer a cada procesador de una
memoria de trabajo local mapeada en la memoria global de manera que la mayoría de los accesos a
datos y código sean locales a cada procesador. Esto disminuye los conflictos causados por colisiones al
acceder a la memoria global, pero aumenta el riesgo de pérdida de consistencia de datos replicados en
más de una memoria local.
Por otro lado están los sistemas débilmente acoplados, en los cuales los procesadores se
comunican entre sí a través del uso de redes de comunicación mediante el paso de mensajes entre
procesos (lo que llamábamos memoria distribuida). En este esquema cada procesador tiene su propio
conjunto de puertas de entrada y de salida y su propia memoria local, formando entre los tres un
módulo de procesamiento. De este modo, los procesos en distintos módulos de procesamiento pueden
comunicarse entre sí mediante el intercambio de mensajes a través de un sistema de transferencia de
mensajes (STM) Ver figura 11.
Figura 11.- Sistema de memoria compartida con un elemento de proceso con memoria local
32
El factor determinante del grado de acoplamiento está dado por la topología del
correspondiente sistema de transferencia de mensajes. En caso de colisión de dos o más procesadores al
intentar acceder al bus de mensajes, el STM será el responsable de arbitrar el orden de los pedidos
respondiendo a alguna disciplina de atención determinada. Esto determina que el STM deberá poseer
una memoria de alta velocidad para almacenar los mensajes que le pase el procesador hasta que estos
puedan ser enviados satisfactoriamente por la red.
En este tipo de arquitecturas el rendimiento global de la computadora estará dado por la
confiabilidad esperable del sistema de mensajes, el cual deberá proveer un vínculo de comunicación de
alta velocidad y además garantizar un tiempo de espera mínimo para mensajes en caso de conflictos.
El primero de los factores está íntimamente ligado al diseño propio del STM y a la tecnología
electrónica utilizada, aunque algunos factores son deseables a la hora de implementar un STM real;
como son el ancho de banda del canal de transferencia (bits/seg.) y la capacidad y velocidad de la
memoria (buffer) de cada STM. El segundo factor está más relacionado con la distribución física de la
red de intercomunicación, los casos más utilizados son los siguientes:
a) Bus compartido.- Esta organización es la menos compleja y fácilmente reconfigurable. Los STM son
pasivos y su función principal es la de arbitrar prioridades de acceso al recurso compartido (bus). En
caso de colisiones los mecanismos de gestión determinarán el orden de atención de los mensajes
colisionados. Algunos de estos mecanismos pueden ser colas tipo FIFO o encadenamiento, ver figura
12.
bus de transferencia de mensajes
Figura 12.- Esquema de un módulo de procesamiento.
b) Desdoblamiento del bus de comunicación. Esta configuración alivia algunos de los problemas
mencionados anteriormente, sin un apreciable incremento en la complejidad del sistema ni decremento
en la confiabilidad del mismo. No obstante, una simple operación de transferencia, generalmente
requiere el uso de los dos buses, por lo tanto no es mucho lo que se gana.Ver figura 13.
33
Figura 13.- Interconexión a través de un bus común.
2.4. Redes específicas
2.4.1 Red Crossbar
La red crossbar mostrada en la figura 14 se utiliza comúnmente en sistemas de memoria
compartida; genera accesos simultáneos no bloqueantes a memoria y comunicación entre unidades
funcionales. El switch (S) para proveer un máximo de transferencias simultáneas en cada punto del
conmutador debe ser capaz de cambiar las transmisiones en paralelo y resolver posibles conflictos entre
requerimientos de las unidades funcionales. Este tipo de conexión se usa generalmente con pocos
procesadores ya que el número de switches es proporcional a O(N2), siendo N el número de
procesadores.
M1
M2
M3
P1
S
S
S
P2
S
S
S
P2
S
S
S
Figura 14.- Red Crossbar
34
2.4.2 Memorias Multipuerto
La disponibilidad de memorias multipuerto hace posible la construcción de redes de
interconexión en las cuales los procesadores se comunican a través de las memorias en lugar de buses.
La única restricción es que los procesadores deben esperar en caso de acceder a la misma localidad de
memoria, la cual es protegida a través de algún mecanismo de prioridades interno al sistema de
memoria. La ventaja de este esquema es que los protocolos de comunicación entre unidades funcionales
se reducen debido a que los datos pueden almacenarse temporalmente en la memoria ver figura 15.
Figura 15.- Comunicación entre procesadores usando una memoria de 4 puertos
Las redes multietapa son las más indicadas para la interconexión de muchos procesadores.
Permiten la comunicación de una manera más general de procesador a procesador como de procesador
a memoria. Ver figura 16.
……
……
1
2
N
1
2
N
Etapa 1
Etapa k
Etapa 2
Figura 16.- Red multietapa
35
En general se distinguen cuatro tipos de redes multietapa
a. Estrictamente no bloqueantes: conecta cualquier entrada libre a cualquier salida libre (sin
importar otras conexiones, ver figura 17.
4x2
1
n
1
2x4
3x3
1
1
n
1
12
inputs
12
outputs
m
1
n
r
nxm
rxr
r
1
n
mxn
Figura 17.- Red Multietapa estrictamente no bloqueante.
36
b.
No bloqueantes re configurables: pueden realizar todas las conexiones posibles reconfigurando
conexiones existentes (si m >= n) .Ver figura 18.
0
1
0
1
2
3
2
3
4
5
4
5
6
7
6
7
Figura 18.- Red Multietapa estrictamente no bloqueante reconfigurable.
c.
No bloqueantes de amplio espectro: pueden realizar todas las conexiones posibles sin bloqueo
dependiendo de las reglas de ruteo usadas (en el caso anterior sí m >= 3n/2).
d.
Interconexión Bloqueante. Pueden realizar algunas pero no todas las interconexiones entre
entradas y salidas.
2.5 Estrategias de software de los MIMD.
2.5.1 Técnicas de compilación
La técnicas de Compilación , se refieren a aquellas técnicas usadas por las
implementaciones como recursos del procesador, que permiten explotar lo más posible el paralelismo
en un programa de usuario. Generalmente en este tipo de estudios no se considerarán los recursos
generales del sistema tales como cantidad de procesadores, disposición física de la memoria, presencia
de memoria cache, etcétera, aunque debe tenerse en cuenta que estos parámetros realmente influyen
fuertemente en el desempeño final del sistema. Conceptualmente, un compilador para MIMD debe
analizar un programa para hallar porciones o bloques de código que puedan ejecutarse
concurrentemente, para lo cual deben cumplirse al menos dos condiciones primordiales: que el sistema
disponga de los recursos necesarios para la ejecución en paralelo de más de una tarea (disposición de
varios procesadores, unidades de cálculo, etcétera) y que los bloques elegidos sean no dependientes
entre sí.
37
Llamaremos bloque a toda secuencia de instrucciones sin saltos hacia afuera o hacia
adentro del mismo, aunque en algunos casos sobrepasaremos los límites de un bloque y consideraremos
el análisis al nivel de instrucciones particulares.El paralelismo real disponible en un programa está
limitado por sus dependencias. Una dependencia entre dos sentencias de un programa es algún tipo de
conflicto que evita que las sentencias puedan ejecutarse concurrentemente. Las dependencias pueden
clasificarse en tres tipos: dependencias de recursos, de datos y de control.
Una dependencia de recursos entre dos instrucciones es consecuencia de las limitaciones
de hardware disponible en un sistema de computación. Este tipo de dependencia ocurre cuando dos
sentencias intentan simultáneamente usar el mismo recurso, tal como dos operaciones de multiplicar
compitiendo por un único multiplicador o dos operaciones de referencia a memoria intentando acceder
a un mismo puerto de memoria física.
Una dependencia de datos existe entre dos instrucciones cuando ambas apuntan a la misma
posición de memoria o acceden a un mismo registro. Por ejemplo, una dependencia de flujo (read after
write hazard) se da de la instrucción S1 a S2 en el siguiente fragmento de programa, ya que S2 necesita
el valor de A producido por S1 antes de poder ejecutarse.
S1 : A = B + C
S2 : D = A - E
Dos instrucciones escribiendo en la misma localidad de memoria crean una dependencia
de salida, como se ve a continuación:
S1 : X = Y + Z
S2 : C = X * 22
S3 : X = A - B
El proceso S1 debe ejecutarse antes que S3 puesto que S2 usa el resultado producido por
S1 (una dependencia de flujo de S1 a S2).
En este ejemplo se da también una dependencia entre S2 y S3, puesto que S2 lee el valor de X que es
escrito por S3, en consecuencia S2 debe ejecutarse antes que S3.
Las dependencias de flujo son las únicas dependencias verdaderas en las que el resultado
producido por la primera instrucción es usado como valor por la segunda instrucción. Por otro lado, las
no dependencias y las dependencias de salida ocurren cuando el programador o el compilador rehúsan
espacio de almacenamiento. En estos casos, renombrar variables es una buena política para eliminar
estas dependencias. Por ejemplo, en lugar de usar un mismo arreglo para dos operaciones
independientes en diferentes partes de un programa, el programador podría definir dos arreglos
separados. Esto, por supuesto, incrementa el paralelismo a costa de un mayor gasto de memoria.
Una dependencia de control de la sentencia Si a Sj existe cuando la sentencia Sj debiera
ser ejecutada sólo si Si produce un cierto resultado. Esta dependencia ocurre, por ejemplo, si Si es una
sentencia condicional y Sj va a ser ejecutada al verificarse la condición verdadera de Si.
38
Al limitar la extracción de paralelismo a un bloque básico se limitará la aceleración
máxima de un problema al proceso en paralelo de dos o cuatro bloques solamente (dadas las
limitaciones de hardware). Sin embargo, si se traspasan los límites del bloque el paralelismo del
programa entero resulta disponible para su explotación. Simulaciones realizadas en casos ideales
muestran que programas de ingeniería o científicos tienen un alto grado de paralelismo, en cambio, la
generalidad de los programas comunes tiene una tasa bastante baja.
Una aproximación eficiente para extraer este paralelismo potencial de los programas es
concentrarse en el paralelismo disponible en los ciclos. Puesto que el cuerpo de un ciclo puede
ejecutarse varias veces, es fácil a menudo encontrar grandes porciones de paralelismo en ellos. Una
gran variedad de computadoras con arquitecturas paralelas y técnicas de compilación han sido
propuestas para explotar el paralelismo a diferentes granularidades.
Antes de analizar las técnicas para explotar el paralelismo en un ciclo es útil analizar el
máximo paralelismo existente en un ciclo independientemente de las restricciones de recursos del
sistema de computadora en que se trabaja. De este modo podremos analizar el rendimiento máximo de
cada técnica y compararlas entre sí sin optar por una arquitectura en particular. Por simplicidad de
análisis supondremos que no existen dependencias de control dentro del ciclo que puedan ocasionar una
bifurcación temprana fuera de él.
Sin embargo se pueden considerar operaciones condicionales enteramente contenidas
dentro del ciclo. El máximo grado de paralelismo existente en un ciclo se encontrará limitado por la
dependencia de sus datos y por la dependencia de recursos de la máquina en la que se ejecute. Las
dependencias del programa pueden representarse con grafos orientados, donde cada nodo es una
operación y los arcos representan dependencias entre operaciones. Asociaremos dos valores al arco k
que va desde la instrucción Si a Sj de un ciclo. El primer valor del tiempoTk será el tiempo que la
sentencia, el segundo valor expresado por Ck, será la cantidad de iteraciones luego de la ejecución de
Si, en que se ejecutará Sj.
Las figuras siguientes numero 19, muestra su correspondiente grafo de dependencias.
For (i=1; i<=N ; y++) {
S1
S2
S3
S4
S5
:
:
:
:
:
A(i)
B(i)
C(i)
D(i)
E(i)
=
=
=
=
=
E(i-1) + 6
A(i) * Z
B(i-1) + X
C(i) + Y
B(i) * D(i)
}
39
Figura 19.- Grafo de dependencia. Los arcos están rotulados con (Tk,Ck) .
Los arcos punteados muestran dependencias que van de una iteración del ciclo a otra. Esas
dependencias cruzadas en las iteraciones limitan el paralelismo máximo del ciclo, puesto que
iteraciones posteriores dependen de resultados generados en iteraciones anteriores. De este modo,
algunas iteraciones deben ser ejecutadas secuencialmente. Cuando una dependencia apunta hacia atrás
relativa al orden en que aparecen las sentencias, un ciclo puede aparecer en el grafo de dependencia.
Por ejemplo, el grafo de dependencia de la figura anterior posee dos ciclos. El primero
consiste de las sentencias
S1(i) - S2(i) - S5(i) - S1(i+1).
Desenrollando completamente el ciclo, se puede convertir cualquier ciclo del grafo en una
cadena lineal de dependencias. La tabla 3 muestra esta cadena para el ciclo presentado:
Tiempo
Sentencia
1
S1(1)
2
S2(1)
3
4
5
S5(1)
6
7
8
S1(2)
9
S2(2)
10
11
12
S5(2)
13
14
15
S1(3)
...
Tabla 3. - Cadena para el ciclo representado.
40
Las tres sentencias en el ciclo van a ser ejecutadas N veces, donde N es el número de
iteraciones del ciclo. Cada repetición del ciclo requiere Tc = Σ Tk = 7 unidades de tiempo, donde Tc es
la suma de las correspondientes Tk mostradas en los arcos del grafo para este ciclo. El tiempo total para
ejecutar el total de las sentencias del ciclo será entonces Tt1 = N * Tc = N * 7 unidades de tiempo.
Similarmente, el segundo ciclo en el grafo es S3(i) - S4(i) - S5(i) - S1(i+1) - S2(i+1) - S3(i+2), como se
ve en la tabla 4.
Tiempo
Sentencia
1
S3(1)
2
S4(1)
3
S5(1)
4
5
6
S1(2)
7
S2(2)
8
9
10
S3(3)
11
S4(3)
12
S5(3)
13
14
15
S1(4)
16
S2(4)
17
18
19
S3(5)
Tabla 4. Segundo ciclo.
Una ejecución de todas las sentencias de este ciclo requiere Tc = ΣTk = 9 unidades de
tiempo. Puesto que el patrón se repite cada dos iteraciones, la versión desenrollada del ciclo se
ejecutará N/2 veces. Notar que dos copias pueden ser ejecutadas simultáneamente. Una copia puede
empezar en i = 1 y la otra en i = 2. Ver tabla 5.
Procesador 1
S1(1)
S2(1)
S3(1)
S4(1)
S5(1)
S1(3)
S2(3)
S3(3)
S4(3)
S5(3)
procesador 2
S1(2)
S2(2)
S3(2)
S4(2)
S5(2)
S1(4)
S2(4)
S3(4)
S4(4)
S5(4)
Tabla 5. Tercer Ciclo.
41
De este modo, el tiempo total de ejecución para este ciclo es
Tt2 = Tc * (N/2) = 9N/2 unidades de tiempo.
La cadena de dependencia más larga producida al desenrollar los ciclos es llamada
trayectoria crítica (critical path), y su tiempo de ejecución se denota como Tcrit. Puesto que puede
haber varios ciclos en un recorrido, el mínimo tiempo para ejecutarlo es el tiempo requerido para
ejecutar la cadena de dependencia más larga. Entonces, para el ejemplo desarrollado
Tcrit = max(Tti) = max(7N,9N/2) = 7N unidades de tiempo.
La máxima aceleración de este recorrido será el cociente entre el tiempo de la versión
secuencial original y el tiempo de ejecución de la trayectoria crítica.
Para el ejemplo dado es fácil comprobar que el tiempo de ejecución secuencial, TL, es 9
unidades de tiempo. Entonces, el tiempo total de ejecución para la versión secuencial es
NTl = 9N unidades de tiempo
Dando una aceleración máxima de :
Smax = (NTl)/Tcrit = 9N/7N = 9/7
Aproximadamente 1,28; lo que representa un 28% de aceleración respecto de la versión
secuencial.Se puede demostrar la validez de esta ecuación para un caso general de un recorrido con uno
o más ciclos en su grafo de dependencia.
2.5.2 Arquitecturas paralelas de granularidad fina
Las arquitecturas paralelas de granularidad fina explotan el paralelismo a nivel del juego
de instrucciones realizando varias instrucciones u operaciones en un sólo ciclo. Las dependencias deben
ser verificadas en tiempo de compilación o dinámicamente por el hardware para asegurar que sólo
operaciones independientes son ejecutadas simultáneamente. Para asegurar un máximo de paralelismo
la técnica de verificación de dependencia debe mirar más allá de los límites de un bloque para encontrar
operaciones independientes dentro del cuerpo de una iteración simple e incluso entre varias iteraciones
diferentes.
Los esquemas para verificar las dependencias dinámicas usan hardware complejo para
buscar operaciones independientes en tiempo de ejecución pero un número de factores tales como el
tamaño del buffer, desarrollo incompleto de ciclos y predicción de bifurcaciones incompletas que
restringen el número de bloques que pueden ser buscados dinámicamente. En consecuencia, las técnicas
de compilación, anteriormente referenciadas, han sido desarrolladas para completar y perfeccionar la
verificación dinámica de dependencias.
42
Mientras que las arquitecturas de granularidad fina explotan el paralelismo a nivel de
instrucciones, las arquitecturas de granularidad gruesa lo explotan distribuyendo iteraciones enteras en
diferentes procesadores. En el multiprocesador de memoria compartida de la figura siguiente, por
ejemplo, la tarea del scheduler es distribuir distintas iteraciones en los diferentes procesadores del
sistema, cada una con un índice distinto. Las estrategias de organización, entonces, tienen la tarea de
determinar que iteraciones serán ejecutadas por cual procesador y en que momento. Ver figura 20.
Figura 20.- Arquitectura de Multiprocesador de memoria compartida.
2.5.3 Estrategia Doacross scheduling
En ciclos con dependencias de datos entre iteraciones, esta estrategia puede ser usada para
distribuir iteraciones consecutivas del ciclo en procesadores separados. Para prevenir violaciones de
dependencia, esquemas de sincronización explícita fuerzan a cada iteración a comenzar al menos d
ciclos después que la iteración previa. La ejecución de un ciclo con esta estrategia puede ser modelada
como sigue:
Do I = 1, N
delay d * (I - 1)
ejecutar iteración con índice I.
Enddo
Con recursos infinitos, cada iteración se ejecuta en un procesador separado dando un
tiempo de ejecución
Tp = (N - 1) * d + TL.
Para esta estrategia con valores grandes de N, la dependencia de datos limita la aceleración
máxima a:
Smax(doacross) = (N * TL) / [(N - 1) * d + TL] aprox. = TL/d
Las limitaciones de recursos limitan fuertemente la aceleración máxima a menos o igual
que el número de procesadores, p. El valor d es análogo al intervalo de iniciación del pipeliningschedule con la diferencia de que el parámetro d fuerza sincronización explícita entre todos los
procesadores. Es fácil ver que, todos los casos, d >= TL. con lo cual, ignorando dependencias de
recursos, la máxima aceleración ideal que se obtenga será similar a la obtenida por un procesador
usando software pipelining.
43
Una diferencia entre doacross scheduling y software pipelining es que el primero no saca
ventajas del paralelismo a nivel de instrucciones dentro de cada iteración. Sin embargo, el hecho de
poseer contadores de programa individuales en cada procesador permite a doacross scheduling tolerar
operaciones condicionales muy complejas que son bastante problemáticas con software pipelining.
2.5.4 Estrategia Doall loop scheduling
Esta estrategia, aplicable a ciclos que no tengan dependencia cruzada entre iteraciones,
sugiere la ejecución de todas las iteraciones simultáneamente. La tarea del scheduling para determinar
que iteraciones deben ser ejecutadas por cuales procesadores y en que momento, pueden clasificarse en
estáticas y dinámicas dependiendo del momento en que se realiza la decisión de la asignación de tareas.
La asignación estática o pre scheduling, asigna iteraciones a procesadores específicos en tiempo de
compilación o de carga del programa. Cada procesador determina que tareas va a ejecutar basado en su
número de procesador. Por ejemplo, el ciclo en el código siguiente ejecutará las iteraciones 1, p+1,
2p+1... en el procesador 0; las iteraciones 2, p+2, 2p+2... en el procesador 1; y así sucesivamente,
donde p es el número de procesador.
Fork(p)
do i = (minum + 1), N, step p
A(i) = B(i) * C(i)
enddo
join(p)
2.5.5 Estrategia de balance de carga
Esta estrategia distribuye las iteraciones entre los procesadores en un intento de balancear
la carga computacional. Puesto que cada procesador conoce su número (minum), y que los
identificadores de tarea (índice y del ciclo) son locales, cada procesador puede determinar rápidamente
que tarea debe ejecutar, con lo que virtualmente no hay sobrecarga de ejecución (runtime overhead).
Si un compilador pudiese predecir acertadamente todos los tiempos de ejecución, la carga
computacional podría ser perfectamente balanceada para minimizar el tiempo total de ejecución.
Desafortunadamente, una variedad de eventos hacen imposible calcular el tiempo exacto que durará una
iteración determinada. Por ejemplo, dos iteraciones pueden producir diferentes resultados en una
sentencia condicional. Si el número de sentencias a ejecutar en cada una de las ramas de la condición es
diferente, entonces el tiempo de ejecución de las dos iteraciones también será distinto. Otros eventos
tales como fallos de cache o de página o demoras en la comunicación entre procesadores pueden
aumentar aún más esa diferencia. Todo esto hace que sea bastante difícil para el pre- scheduling
mantener un balance de carga aceptable.
El siguiente fragmento del programa muestra este problema para una máquina de dos
procesadores:
doall i = 1,N
if odd(i)
a(i) = b(i)
else
a(i) = b(i) * c(i)
enddo
44
Asumiendo el mismo esquema de distribución de ejemplo anterior, el procesador 1
ejecutará todas las iteraciones donde el índice i sea impar y el procesador 2, todas aquellas con índice i
par. Por lo tanto uno de los procesadores siempre ejecutará la sentencia a(i) = b(i) y el otro procesador
la sentencia a(i) = b(i) * c(i).
La asignación dinámica, también llamada self scheduling, es usada para llevar las
decisiones desde el tiempo de compilación a de ejecución haciendo a cada procesador responsable de
asignarse su propia tarea. El código siguiente muestra que cada procesador se asigna iteraciones el
mismo en tiempo de ejecución accediendo a una variable compartida (next_iter) que representa el
índice a la siguiente iteración a ser ejecutada por el próximo procesador libre. Para prevenir que más de
un procesador acceda a esta variable, se insertan en el código sentencias de sincronización apropiadas.
Next_iter = 1
fork(p)
/* obtener primera iteración */
lock(next_iter)
mi_iter = next_iter
next_iter ++
unlock(next_iter)
/* repetir mientras haya trabajo para realizar */
while (mi_iter <= N)
a(mi_iter) = b(mi_iter) * c(mi_iter)
/* obtener la siguiente iteración */
lock(next_iter)
mi_iter = next_iter
next_iter ++
unlock(next_iter)
end while
join(p)
El tiempo necesario para acceder la variable compartida y para sacar las tareas del spool de
tareas agrega un overhead a la ejecución, pero este se compensa satisfactoriamente con la mejora en el
balance de cargas, ya que en este caso, el tiempo ocioso de un procesador será igual a TL.
2.5.6 MPI (Messaging passing interface) Intercambio de paso deMensajes
El envío de un mensaje de un proceso a otro involucra el movimiento de información de
un espacio de direccionamiento a otro.
proceso 1
movimiento de datos
proceso 2
send(&x,2); ------------------------------------> recv(&y,1);
El envío de un mensaje involucra además:
•
a)El uso de los buffers.
•
b)Identificación de los mensajes, lo cual se hace por medio de una selección por medio de
etiquetas, además necesita del uso de comodines (wildcards)para seleccionar cualquier tipo de
mensaje.
45
•
c)Nombramiento de procesos.
•
d)Sincronización .
Existen dos términos básicos utilizados en el MPI, estos términos son:
•
Síncrono que se utiliza en aquellas rutinas que regresan cuando la transferencia del mensaje ha
terminado.
•
Bloqueo (blocking) ,que se usa para describir funciones que no regresan hasta que termina la
transferencia.
Las funciones de no bloqueo (non blocking)inician la solicitud de transferencia y regresa el control
sin esperar que la Transferencia concluya
El paso de mensajes es una tarea ampliamente usada en ciertas clases de máquinas paralelas,
especialmente aquellas que cuentan con memoria distribuida. Aunque existen muchas variaciones, el
concepto básico en el proceso de comunicación mediante mensajes es bien entendido. En los últimos 10
años, se ha logrado un progreso substancial en convertir aplicaciones significativas hacia este tipo de
tareas. Más recientemente diferentes sistemas han demostrado que un sistema de paso de mensajes
puede ser implementado eficientemente y con un alto grado de portabilidad.
Al diseñar el lenguaje estándar por facto llamado MPI, se tomaron en cuenta las características más
atractivas de los sistemas existentes para el paso de mensajes, en vez de seleccionar uno sólo de ellos y
adoptarlo como el estándar. Resultando así, en una fuerte influencia para en la construcción de MPI los
trabajos hechos por IBM, INTEL NX/2, Express, nCUBE's Vernex, p4 y PARMACS. Otras
contribuciones importantes provienen de Zipcode, Chimp, PVM, Chameleon y PICL.
La meta de MPI fue la de desarrollar un estándar para escribir programas que implementen el paso
de mensajes. Por lo cual el Interfase intenta establecer para esto un estándar práctico, portable, eficiente
y flexible. El esfuerzo para estandarizar MPI involucra cerca de 60 personas de 40 organizaciones
diferentes principalmente de U.S.A. y Europa. La mayoría de los vendedores de computadoras
concurrentes estaban involucrados con MPI, así como con investigadores de diferentes universidades,
laboratorios del gobierno e industrias. Se llegó a una propuesta preliminar conocida como MPI1,
enfocada principalmente en comunicaciones punto a punto sin incluir rutinas para Comunicación
colectiva y no presentaba tareas seguras. El estándar final par el MPI fue presentado en la conferencia
de supercomputación en Noviembre de 1993, constituyéndose así el foro para el MPI.
En un ambiente de comunicación con memoria distribuida en la cual las rutinas de nivel más alto
y/o las abstracciones son construidas sobre rutinas de paso de mensajes de nivel bajo, los beneficios de
la estandarización son muy notorios. La principal ventaja al establecer un estándar para el paso de
mensajes es la portabilidad y el ser fácil de utilizar. MPI es un sistema complejo, el cual comprende
129 funciones, de las cuales la mayoría tienen muchos parámetros y variantes.
46
Con esto alcanzarón las siguientes características en el diseño de estándar:
•
Diseñar una Interfase de programación aplicable.
•
Permite una Comunicación eficiente: Evitando el copiar de memoria a memoria y permitiendo
la sobreposición de computación y comunicación, además de aligerar la comunicación con el
procesador.
•
Permite implementaciones que puedan ser utilizadas en un ambiente heterogéneo.
•
Permite enlaces convenientes en C y Fortran 77 para la interfase.
•
Asume una interfase de comunicación segura.
•
Define una interfase que no sea muy diferente a los sistemas actuales, tales como PVM, NX,
Express, p4, etc., y provee de diversas extensiones que permitan mayor flexibilidad.
•
Define una interfase que pueda ser implementada en diferentes plataformas, sin cambios
significativos en el software y las funciones internas de comunicación.
•
La semántica de la interfase debe ser independiente del lenguaje.
•
La Interfase debe ser diseñada para producir tareas seguras.
En el modelo de programación MPI, un cómputo comprende de uno o más procesos comunicados a
través de llamadas a rutinas de librería para mandar (send) y recibir (receive) mensajes a otros procesos.
En la mayoría de las implementaciones de MPI, se crea un conjunto fijo de procesos al inicializar el
programa, y un proceso es creado por cada tarea. Sin embargo, estos procesos pueden ejecutar
diferentes programas.
De ahí que, el modelo de programación MPI es algunas veces referido como MIMD (múltiple
program múltiple data) para distinguirlo del modelo SIMD, en el cual cada procesador ejecuta el mismo
programa.
Debido a que el número de procesos en un sistema de cómputo de MPI es normalmente fijo, se
puede enfatizar en el uso de los mecanismos para comunicar datos entre procesos. Los procesos pueden
utilizar operaciones de Comunicación punto a punto para mandar mensajes de un proceso a otro, estas
operaciones pueden ser usadas para implementar comunicaciones locales y no estructuradas. Un grupo
de procesos puede llamar colectivamente operaciones de Comunicación para realizar tareas globales
tales como broadcast, etc. La habilidad de MPI para probar mensajes da como resultado el soportar
comunicaciones asíncronas. Probablemente una de las características más importantes del MPI es el
soporte para la programación modular. Un mecanismo llamado comunicador permite al programador
del MPI definir módulos que encapsulan estructuras internas de comunicación (estos módulos pueden
ser combinados secuencialmente y paralelamente).
47
Aunque MPI es un sistema complejo, es posible resolver un amplio rango de problemas usando
seis de sus funciones, estas funciones inician y terminan un cómputo, identifican procesos, además de
mandar y recibir mensajes.
•
•
•
•
•
•
MPI_INIT: Este proceso Inicia el entorno de MPI.
MPI_FINALIZE: Termina el MPI.
MPI_COMM_SIZE: Determina el número de procesos en un cómputo.
MPI_COMM_RANK: Determina el identificador del proceso actual "mi proceso".
MPI_SEND: Manda un mensaje.
MPI_RECV: Recibe un mensaje.
Todas las funciones con excepción de las dos primeras, toman un manejador "comunicador" como
argumento. El comunicador identifica el grupo de procesos y el contexto en el cual la operación se debe
realizar. Los comunicadores proveen un mecanismo para identificar sub conjuntos de procesos durante
el desarrollo de programas modulares y para garantizar que los mensajes provistos con diferentes
propósitos no sean confundidos. El valor por default es llamado MPI_COMM_WORLD, el cual
identifica todos los procesos.
Las funciones MPI_INIT y MPI_FINALIZE son usadas para iniciar y terminar
MPI,
respectivamente MPI_INIT debe ser llamada antes que cualquier otra función MPI y debe ser llamada
solamente una vez por proceso. Ninguna función MPI puede ser llamada después de MPI_FINALIZE.
Las funciones MPI_COMM_SIZE y MPI_COMM_RANK determinan el número de procesos en él
cómputo actual y el identificador (entero) asignado al proceso actual, respectivamente. (Los procesos en
un grupo de procesos son identificados con un único y continuo número (entero) empezado en 0).
La necesidad por tener una comunicación asíncrona puede presentarse cuando un cómputo necesita
acceder a los elementos de un dato estructurado compartido en una manera no estructurada. Una
implementación aproximada es el encapsular los datos estructurados en un conjunto de tareas de datos
especializados, en la cual las peticiones de lectura y escritura pueden ser ejecutadas. Este método no es
eficiente en MPI debido a su modelo de programación MPMD.
Una implementación alternativa con MPI, es el distribuir las estructuras de datos compartidas entre
los procesos existentes, los cuales deben solicitar periódicamente las solicitudes pendientes de lectura y
escritura. Para esto MPI presenta tres funciones MPI_IPROBE, MPI_PROBE, MPI_GET_COUNT.
MPI_IPROBE checa la existencia de mensajes pendientes sin recibirlos, permitiéndonos escribir
programas que generan cómputos locales con el procesamiento de mensajes sin previo aviso. El
mensaje puede ser recibido usando MPI_RECV.
MPI_PROBE es utilizado para recibir mensajes de los cuales se tiene información incompleta.
48
MPI soporta la programación modular a través de su mecanismo de comunicador (comm,
el cual provee la información oculta necesaria al construir un programa modular), al permitir la
especificación de componentes de un programa, los cuales encapsulan las operaciones internas de
Comunicación y proveen un espacio para el nombre local de los procesos.
Una operación de Comunicación MPI siempre especifica un comunicador. Este identifica
el grupo de procesos que están comprometidos en el proceso de comunicación y el contexto en el cual
la comunicación ocurre. El grupo de procesos permite a un sub conjunto de procesos el comunicarse
entre ellos mismos usando identificadores locales de procesos y el ejecutar operaciones de
comunicación colectivas sin meter a otros procesos. El contexto forma parte del paquete asociado con
el mensaje. Una operación receive puede recibir un mensaje sólo si éste fue enviado en el mismo
contexto. Si dos rutinas usan diferentes contextos para su Comunicación interna, no puede existir
peligro alguno en confundir sus comunicaciones.
Con MPI_COMM_DUP: Un programa puede crear un nuevo comunicador, conteniendo el
mismo grupo de procesos pero con un nuevo contexto para asegurar que las comunicaciones generadas
para diferentes propósitos no sean confundidas, Este mecanismo soporta la composición secuencial.
Usando MPI_COMM_SPLIT: Un programa puede crear un nuevo comunicador,
conteniendo sólo un subconjunto del grupo de procesos. Estos procesos pueden comunicarse entre ellos
sin riesgo de tener conflictos con otros cómputos concurrentes. Este mecanismo soporta la composición
paralela.
Aplicando MPI_INTERCOMM_CREATE: Un programa puede construir
intercomunicador, el cual enlaza procesos en dos grupos. Soporta la composición paralela.
un
La función MPI_COMM_FREE: Puede ser utilizada para liberar el comunicador creado al
usar las funciones anteriores.
2.5.7 PVM(Paralell Virtual Machine) Maquina Virtual Paralela
Por otro lado existe otro estándar que permite construir y aplicar una máquina virtual o
máquina paralela, este estándar es llamado PVM (Parallel Virtual Machine). PVM es un conjunto de
herramientas y librerías que emulan un entorno de propósito general compuesto de nodos
interconectados de distintas arquitecturas. El objetivo es conseguir que ese conjunto de nodos pueda ser
usado de forma colaborativa para el procesamiento paralelo.
El modelo en el que se basa PVM es dividir las aplicaciones en distintas tareas. Son los
procesos los que se dividen por las máquinas para aprovechar todos los recursos. Cada tarea es
responsable de una parte de la carga que conlleva esa aplicación. PVM soporta tanto paralelismo en
datos, como funcional o una mezcla de ambos. PVM permite que las tareas se comuniquen y
sincronicen con las demás tareas de la máquina virtual, enviando y recibiendo mensajes, muchas tareas
de una aplicación pueden cooperar para resolver un problema en paralelo. Cada tarea puede enviar un
mensaje a cualquiera de las otras tareas, sin límite de tamaño ni de número de mensajes.
49
El sistema PVM se compone de dos partes. La primera es un demonio, llamado pvmd que
residen en todas los nodos que forman parte de la máquina virtual. Cuando un usuario quiere ejecutar
una aplicación PVM, primero crea una máquina virtual para arrancar PVM. Entonces se puede ejecutar
la aplicación PVM en cualquiera de los nodos. Muchos usuarios pueden configurar varias máquinas
virtuales aunque se mezclen unas con las otras y se pueden ejecutar varias aplicaciones PVM
simultáneamente. Cada demonio es responsable de todas las aplicaciones que se ejecutan en su nodo.
Así el control está totalmente distribuido excepto por un demonio maestro, que es el primero que se
ejecutó a mano por el usuario, los demás nodos fueron iniciados por el maestro y son esclavos. En todo
momento siempre hay un pvmd maestro. Por tanto la máquina virtual mínima es de un miembro, el
maestro.
La segunda parte del sistema es la librería de PVM. Contiene un repertorio de primitivas
que son necesarias para la cooperación entre los procesos o threads de una aplicación. Esta librería
contiene rutinas para iniciación y terminación de tareas, envío y recepción de mensajes, coordinar y
sincronizar tareas, broadcast, modificar la máquina virtual. Cuando un usuario define un conjunto de
nodos, PVM abstrae toda la complejidad que tenga el sistema y toda esa complejidad se ve como una
gran computadora de memoria distribuida llamada máquina virtual. Esta máquina virtual es creada por
el usuario cuando se comienza la operación. Es un conjunto de nodos elegidos por el usuario. En
cualquier momento durante la operación puede elegir nuevos nodos para la máquina virtual. Esto puede
ser de gran ayuda para mejorar la tolerancia a fallos pues se tiene unos cuantos nodos de reserva (PVM
no tiene migración) por sí alguno de los nodos fallara. O si se ve que un conjunto de nodos de una
determinada red están fallando se pueden habilitar nodos de otra red para solucionarlo.
Para conseguir abstraer toda la complejidad de las diferentes configuraciones, soporta la
heterogeneidad de un sistema a tres niveles:
•
-Aplicaciones: las subtareas pueden estar hechas para aprovechar la arquitectura sobre la que
funcionan. Por tanto como se puede elegir en que conjunto de nodos se ejecutarán unas tareas
específicas, podemos hacer nuestras aplicaciones con la arquitectura al máximo por lo que se
puede optimizar y hacer que funcionen aplicaciones hechas para arquitecturas específicas con
PVM.
•
-Máquinas: nodos con distintos formatos de datos están soportados, incluyendo arquitecturas
secuenciales, vectoriales, SMP.
•
-Redes: la máquina virtual puede ser interconectada gracias a distintas tecnologías de red. Para
PVM existe una red punto a punto, no fiable y no secuencial. Utiliza UDP e implementa toda la
confiabilidad y todas las operaciones básicas de difusión como el broadcast.
Las librerias de PVM, consisten en un conjunto de interfaces que está basado en la
observación de las necesidades de la mayoría de las aplicaciones, que están escritas en C y Fortran. Los
enlaces para C y C++ para la librería PVM están implementados como funciones, siguiendo las reglas
usadas por la mayoría de los sistemas que usan C, incluyendo los sistemas operativos tipo UNIX. Los
enlaces para Fortran están implementados como subrutinas más que funciones.
50
Todas las tareas están identificadas con un único identificador de tarea TID (Task
IDentifier). Los mensajes son enviados y recibidos por TIDs. Son únicos en toda la máquina virtual y
están determinados por el pvmd local y no se pueden elegir por el usuario. Varias funciones devuelven
estos TIDs (pvm_mytid(), pvm_parent(), etc.)para permitir que las aplicaciones de los usuarios
conozcan datos de las otras tareas. Existen grupos nombrados por los usuarios, que son agrupaciones
lógicas de tareas. Cuando una tarea se une al grupo, a ésta se le asigna un único número dentro de ese
grupo. Estos números empiezan en 0 y hasta el número de tareas que disponga el grupo. Cualquier tarea
puede unirse o dejar cualquier grupo en cualquier momento sin tener que informar a ninguna otra tarea
del grupo. Los grupos se pueden superponer y las tareas pueden enviar mensajes multicast a grupos de
los que no son miembro.
Cuando una tarea se quiere comunicar con otra ocurren una serie de cosas, los datos que la tarea ha
enviado con una operación send, son transferidos a su demonio local quien decodifica el nodo de
destino y transfiere los datos al demonio destino. Este demonio decodifica la tarea destino y le entrega
los datos. Este protocolo necesita 3 transferencias de datos de las cuales solamente una es sobre la red.
También se puede elegir una política de encaminado directo (dependiente de los recursos disponibles).
En esta política tras la primera comunicación entre dos tareas los datos sobre el camino a seguir por los
datos son guardados en una caché local. Las siguientes llamadas son hechas directamente gracias a esta
información. De esta manera las transferencias se reducen a una transferencia sobre la red. Para
comunicarse entre sí, el demonio pvmd, usa UDP ya que es un protocolo más sencillo, sólo consume
un descriptor de archivo, y con un simple socket UDP se puede comunicar a todos los demás demonios.
Además es muy sencillo colocar temporizadores sobre UDP para detectar fallos de nodo, pvmd o red.
La comunicación entre las tareas y los pvmd es mediante TCP puesto que se necesita tener la seguridad
de que los datos llegarán. En el caso de que sólo se haga una transferencia ésta es TCP por lo que hay
que establecer la conexión primero por lo que realmente tampoco es tan beneficioso. En la figura 21 se
puede observar como los distintos métodos de comunicación de PVM.
Figura 21.- Comunicaciones en PVM.
51
Cada nodo tiene una estructura llamada host table. Esta tabla tiene una entrada (host
descriptor) por cada nodo de la máquina virtual. El descriptor del nodo mantiene la información de la
configuración del host, las colas de paquetes y los buffer de mensajes. Inicialmente la tabla sólo tiene la
entrada del nodo maestro. Cuando un nuevo esclavo es incluido a la máquina virtual, la tabla del nodo
maestro es actualizado para añadir al nuevo esclavo. Entonces esta nueva información es enviada por
broadcast a todos los nodos que pertenezcan a la máquina virtual. De esta manera se actualizan todas
las tablas y se mantienen consistentes.
Las aplicaciones pueden ver el hardware como una colección de elementos de proceso
virtuales sin atributos que pueden explotar las capacidades de máquinas específicas, buscando
posicionar ciertas tareas en los nodos más apropiados para ejecutarlas.
En PVM una vez que un proceso empieza en una determinada máquina seguirá en ella
hasta que se muera. Esto tiene graves inconvenientes y de debe tener en cuenta que las cargas suelen
variar , y que, a no ser que todos los procesos que se estén ejecutando sean muy homogéneos entre sí, se
está descompensando el cluster. Por lo tanto tenemos unos nodos más cargados que otros y
seguramente unos nodos terminen su ejecución antes que otros, con lo que se podrían tener nodos muy
cargados mientras otros nodos están libres. Esto lleva a una pérdida de rendimiento general.
Otro problema que presenta PVM, es su implementación a nivel de usuario, donde el tipo
de operaciones de bajo nivel es alto sobre la capa UDP. Esto añade complejidad y aumenta la latencia a
las comunicaciones producidas sobre el núcleo del sistema (kernel).
Se necesita un conocimiento amplio del sistema, tanto los programadores como los
administradores tienen que conocer el sistema para sacar el máximo rendimiento de él. No existe un
programa que se ejecute de forma ideal en cualquier arquitectura ni configuración de cluster. Por lo
tanto para paralelizar correcta y eficazmente se necesita que los programadores y administradores
conozcan a fondo el sistema en la etapa de implementación, aunque será necesario conocer
detalladamente el problema a resolver para buscar la técnica adecuada para su solución.
El paralelismo es explícito, esto quiere decir que se programa de forma especial para poder
usar las características especiales de PVM. Los programas deben ser reescrito y si a esto agregamos
que, es necesario que los desarrolladores conozcan perfectamente PVM, se puede decir que migrar una
aplicación a un sistema PVM es un proceso complejo y que consume gran tiempo.
52
2.6 El estudio del rendimiento.
2.6.1 Factores que influyen en el rendimiento
Existen Factores que influyen en el rendimiento de un trabajo o de un proceso, estos factores son
importantes vistos desde el punto de vista del tiempo de procesamiento y el número de procesos que
deben ejecutarse. El rendimiento de un trabajo depende de los siguientes factores:
1)
2)
3)
4)
Hardware
Software
Contenido del Trabajo
Diseño de la aplicación
El hardware condiciona de manera muy importante en rendimiento escalar y vectorial.
Este rendimiento, en general, va a depender del número de procesadores escalares o vectoriales y de la
potencia del conjunto de instrucciones de la máquina.
Un procesador escalar cuenta con suficientes recursos de hardware para que este pueda
realizar más de una instrucción simultáneamente. Un procesador vectorial es diseñado específicamente
para realizar de forma eficiente operaciones en las que se ven involucrados elementos de matrices,
denominados vectores. Estos procesadores resultan especialmente útiles para ser utilizados en el cálculo
científico de alto rendimiento (high performance computing), donde las operaciones con vectores y con
matrices son ampliamente utilizadas
El software es también un factor muy importante del rendimiento de un trabajo. Este
rendimiento dependerá básicamente de la capacidad de los compiladores vectorizantes y de la
biblioteca de subrutinas de que se disponga. El compilador es el encargado de definir la diferencia entre
el paralelismo con software y con hardware. Algunas tareas de paralelización las realizarán las librerias
y se apoyarán con el compilador y otras las realizará el propio usuario utilizando sus conocimientos de
programación.
El contenido del trabajo también es un factor importante que influye en su rendimiento. La
cantidad de operaciones en punto flotante que se realicen es importante, ya que éstas son muy costosas
debido a que emplean mucho más tiempo de la ALU que las operaciones en punto fijo y se determinan
por :
•
El tanto por ciento de código vectorizable
•
El tanto por ciento de código paralelo
53
Para hacer un modelo de rendimiento aceptable se tienen que revisar muchos parámetros,
pero esto no es rentable. Por consiguiente nos conformamos con modelos simplificados para la medida
del rendimiento de un sistema. Para obtener un alto rendimiento del sistema es necesario que haya una
sintonía entre la capacidad de la máquina y el comportamiento del programa. La capacidad de
procesamiento de la máquina es susceptible de mejora con las nuevas tecnologías en hardware y
software, además de el auxilio de una administración eficiente de los recursos.
El comportamiento del programa depende básicamente de los siguiente factores:
•
•
•
•
•
a)Diseño del algoritmo
b)Estructuras de datos
c)Eficiencia de los lenguajes
d)Conocimientos del programador
e)Tecnología de los compiladores
Las estructuras de datos proporcionan un alto grado de paralelismo y le condicionan. Así
mismo, los lenguajes y los compiladores son muy importantes ya que la eficiencia de los primeros y la
inteligencia de los segundos son de gran importancia para detectar dentro del código aquellas partes
que pueden ser paralelizables. Los conocimientos del programador también son muy importantes ya
que junto con el diseño del algoritmo, los desarrollos pueden adaptarse mucho mejor al hardware del
sistema. El rendimiento de un sistema varía según el programa.
El rendimiento de un sistema, es posible medirlo, utilizando características intrínsecas de la
relación entre el sistema y el programa, conociendo:
•
•
La imposibilidad de alcanzar un rendimiento máximo.
Programas y técnicas de BENCHMARKING (Pruebas de desempeño y laboratorio) ligados a la
composición del programa.
Los indicadores del rendimiento de una computadora son una serie de parámetros que
conforma un modelo simplificado de la medida del rendimiento de un sistema y son utilizados por los
arquitectos de sistemas, los programadores y los constructores de compiladores, para la optimización
del código y obtención de una ejecución más eficiente. Dentro de este modelo, estos son los indicadores
de rendimiento más utilizados:
2.6.2 Tiempo de respuesta (Turnaround Time)
El tiempo de respuesta desde la entrada hasta la salida, lo que incluye accesos a disco,
memoria y tiempos de CPU. Es la medida más simple del rendimiento.
En sistemas multiprogramados no aplica la medida del rendimiento anterior, ya que la máquina
comparte el tiempo, se produce solapamiento de entrada y salida del programa con tiempo de
procesador en otros programas.
54
Es por eso que se emplea la siguiente medida que es el TIEMPO CPU USUARIO.
Los parámetros mas empleados son los siguientes:
•
Tiempo de cada ciclo (τ). El tiempo empleado por cada ciclo. Es la constante de reloj del
procesador. (segundos).
Frecuencia de reloj (f) .Es el inverso del tiempo de ciclo. f = 1/τ. (hertz).
•
Total de Instrucciones (Ic).Es el número de instrucciones a ejecutardentro de un programa.
•
Ciclos por instrucción (CPI) .Es el número de ciclos computacionales que requiere cada
instrucción.
•
Total de ciclos de reloj en la ejecución de un programa C = Ic * CPI
•
Tiempo de ejecución de programa (Tp). Es el tiempo que tarda un programa en ejecutarse.
•
Tp = Ic * CPI * τ = Ic * CPI/f = C/f
•
Ciclo de memoria (mc).Tiempo que se tarda en completar una referencia a memoria.
mc = k * τ
klatencia >1
Donde k=número de instrucciones.
•
Apartir de las definiciones anteriores, las fórmulas del Ciclo por instrucción (CPI) y del tiempo
de ejecución (Tp) se pueden utilizar de la siguiente forma:
CPI = p + mr * k (ciclos/instrucción)
Donde el total de ciclos del procesador (p), referencias a memoria por ciclo (mr).
Tp = Ic * CPI * τ = Ic * (p + mr * k) * τ (nanosegundos)
En la tabla 7 se muestra la relación entre factores de rendimiento y atributos del sistema
Ic
X
p
mr
Tecnología
X
compilador
Implantación y
control CPU
Jerarquía
memoria
X
X
Arquitectura
K
X
τ
X
X
X
55
Tabla 7 .Relación entre factores de rendimiento y atributos del sistema
En la tabla anterior se muestra la relación entre los factores del rendimiento (Ic, p, mr, k y τ) y
algunas características del sistema (arquitectura, tecnología del compilador, implantación y control
CPU y jerarquía de la memoria caché).
a) Relación MIPS (millones de instrucciones por segundo). Podemos utilizar un nuevo modelo del
rendimiento deducido a partir del parámetro MIPS. Es una medida de la velocidad de la computadora,
que depende de la frecuencia del reloj (f), del total de instrucciones (Ic), y de los ciclos por instrucción
(CPI).
MIPS = Ic (Tp * 106) = (Ic * f) / (Ic * CPI * 106) = f / (CPI * 106)
MIPS = f / (C/Ic * 106) = (f * Ic) / (C * 106) [ instrucciones / segundo]
A partir de la definición de MIPS se puede utilizar la siguiente fórmula para el tiempo de CPU:
Tiempo CPU
=
Tp
=
(Ic * 10-6)/MIPS (segundos)
b) THROUGHPUT del sistema (Ws).Es la cantidad de trabajo por unidad de tiempo que realiza el
sistema. Total de programas (resultados) ejecutados por el sistema en unidad de tiempo.
Ws (programas / segundo)
c) THROUGHPUT de CPU (Wp).Es la cantidad de trabajo de la CPU.
Wp = f / (Ic * CPI) = (MIPS * CPI * 106)/(Ic * CPI) = (MIPS * 106)/Ic (programas/segundo)
2.7 Algoritmos paralelos.
2.7.1 Método De Diferencias Finitas
El método de diferencias finitas es una clásica aproximación para encontrar la solución
numérica de las ecuaciones que gobiernan el modelo matemático de un sistema continuo. Es valioso
familiarizarse con esta aproximación porque tal conocimiento reforzará la comprensión de los
procedimientos de elementos finitos.
Básicamente, en una solución por diferencias finitas, las derivadas son reemplazadas por
aproximaciones en diferencias finitas, convirtiendo entonces un problema de ecuaciones diferenciales
en un problema algebraico fácilmente resoluble por medios comunes (especialmente matriciales).
56
2.7.2 Método de expansión de Taylor
El método de expansión de Taylor es una forma alternativa de obtener aproximaciones de
diferencia. Este método no sólo deduce las fórmulas de diferencia sistemáticamente, sino que también
deduce los términos de error.
Para una derivada de p-ésimo orden, el número mínimo de puntos de datos requeridos para deducir
una aproximación de diferencia es p+1, así por ejemplo una aproximación de diferencia para la primera
derivada de una función necesita por lo menos de dos puntos de datos.
Para la deducción de la aproximación de diferencia para fi´=f´(xi) en términos fi= f(xi) ^ fi+1 = f(xi+1). La
expansión de Taylor de fi+1 alrededor de xi es:
[1]
Resolviendo la ecuación anterior para la primera derivada, tenemos:
f i′ =
f i +1 − f i h
h2
′
′
− ⋅ fi −
⋅ f i′′′− Κ
h
2
6
[2].
Si ignoramos todos los términos con excepción del primero del miembro derecho de la ecuación 2,
obtendremos la aproximación por diferencia hacia adelante. Los términos que se ignoran constituyen el
error de truncado, representado por el término inicial, -(h/2).fi´´. Los demás términos desaparecen más
rápidamente que el inicial cuando h disminuye. La aproximación de diferencia hacia adelante, con el
error de truncado incluido, se expresa como:
f i′ =
f i +1 − f i
h
+E
E ≈ − ⋅ f i′′
h
2
[3], dónde
El término E indica que el error es aproximadamente proporcional al intervalo de la retícula h. El error
también es proporcional a la segunda derivada .fi´´.
De la misma manera podemos expandir fi-1 alrededor de xi en la forma:
[4]
Resolviendo nuevamente para la primera derivada, tenemos:
f i′ =
f i − f i −1 h
f − f i −1
h2
h
+ ⋅ f i′′−
⋅ f i′′′− Κ
f i′ = i
+E
E ≈ ⋅ f i′′
h
2
6
h
2
y
[5] dónde
57
La aproximación anterior se denomina de diferencia hacia atrás.
Tomemos ahora ambas aproximaciones y restemos 4 de 1:
1
f i +1 − f i −1 = 2 ⋅ h ⋅ f i′ + ⋅ h 3 ⋅ f i′′′+ Κ
3
[6]
De la anterior expresión se ha eliminado el término fi´´. Resolviendo para fi´, obtenemos
f − f i −1 1 2
f i′ = i +1
− ⋅ h ⋅ f i′′′+ Κ
2⋅h
6
[7].
Con el término de error incluido, la aproximación de diferencia central se expresa como
f − f i −1
1
f i′ = i +1
+E
E ≈ − ⋅ h 2 ⋅ f i′′′
2⋅h
6
[8], dónde
.
Resulta interesante observar que gracias a la cancelación del término fi´´, el error de la
aproximación es proporcional al cuadrado de h y no a h. Entonces, reduciendo h reducimos el error con
mayor rapidez que con las otras aproximaciones.
De forma similar podemos obtener aproximaciones de diferencia para derivadas
superiores, pero la deducción se hace cada vez más laboriosa al aumentar tanto el número de términos
como el orden de la derivada.
Sería útil por lo tanto el desarrollo de algoritmos de cómputo que permitan hallar automáticamente la
aproximación de diferencia para un conjunto dado de datos.
No obstante, a continuación muestro las expresiones de diferencias, cuyo uso es frecuente.
a) Primera derivada.
Aproximaciones de diferencia hacia adelante
f − fi
1
f i′ = i +1
+ E ; E ≈ − ⋅ h ⋅ f i′′
h
2
− f i + 2 + 4 ⋅ f i +1 − 3 ⋅ f i
1
f i′ =
+ E ; E ≈ ⋅ h 2 ⋅ f i′′′
2⋅h
3
2 ⋅ f i +3 − 9 ⋅ f i + 2 − 18 ⋅ f i +1 − 11 ⋅ f i
1
f i′ =
+ E ; E ≈ − ⋅ h 3 ⋅ f i IV
6⋅h
4
Aproximaciones de diferencia hacia atrás
f − f i −1
1
f i′ = i
+ E ; E ≈ ⋅ h ⋅ f i′′
h
2
+ f i − 2 − 4 ⋅ f i −1 + 3 ⋅ f i
1
f i′ =
+ E ; E ≈ ⋅ h 2 ⋅ f i′′′
2⋅h
3
− 2 ⋅ f i −3 + 9 ⋅ f i −2 − 18 ⋅ f i −1 + 11 ⋅ f i
1
f i′ =
+ E ; E ≈ ⋅ h 3 ⋅ f i IV
6⋅h
4
Aproximaciones de diferencia centrales
58
f i +1 − f i −1
1
+ E ; E ≈ − ⋅ h 2 ⋅ f i′′′
2⋅h
6
− f i + 2 + 8 ⋅ f i +1 − 8 ⋅ f i −1 + f i −2
1 4 V
f i′ =
+E ; E≈
⋅ h ⋅ fi
12 ⋅ h
30
f i′ =
b) Segunda derivada.
Aproximaciones de diferencias hacia adelante
f − 2 ⋅ f i +1 + f i
f i′′= i + 2
+ E ; E ≈ h ⋅ f i′′′
h2
− f i +3 + 4 ⋅ f i + 2 − 5 ⋅ f i +1 + 2 ⋅ f i
11
f i′′=
+ E ; E ≈ ⋅ h 2 ⋅ f i IV
2
12
h
Aproximaciones de diferencia hacia atrás
f − 2 ⋅ f i −1 + f i
f i′′= i + 2
+ E ; E ≈ h ⋅ f i′′′
h2
− f i −3 + 4 ⋅ f i −1 − 5 ⋅ f i − 2 + 2 ⋅ f i
11
f i′′=
+ E ; E ≈ ⋅ h 2 ⋅ f i IV
2
12
h
Aproximaciones de diferencia centrales
f − 2 ⋅ f i + f i −1
1
f i′′= i +1
+ E ; E ≈ h 2 ⋅ f i IV
2
12
h
− f i + 2 + 16 ⋅ f i +1 − 30 ⋅ f i + 16 ⋅ f i −1 − f i −2
1 4 VI
f i′′=
+E ; E≈
⋅ h ⋅ fi
2
90
12 ⋅ h
c) Tercera derivada.
Aproximaciones de diferencia hacia adelante
f − 3 ⋅ f i + 2 + 3 ⋅ f i +1 − f i
3
f i′′′= i +3
+ E ; E ≈ − h 2 ⋅ f i IV
3
2
h
Aproximaciones de diferencia hacia atrás
f − 3 ⋅ f i −1 + 3 ⋅ f i −2 − f i −3
3
f i′′′= i
+ E ; E ≈ h 2 ⋅ f i IV
3
2
h
Aproximaciones de diferencia centrales
f − 2 ⋅ f i +1 + 2 ⋅ f i −1 − 2 ⋅ f i −2
1
f i′′′= i + 2
+ E ; E ≈ − h 2 ⋅ f iV
3
4
2⋅h
59
2.7.3 Aproximación De Diferencia Para Derivadas Parciales.
Las fórmulas de aproximación de diferencia para derivadas parciales de funciones
multidimensionales son esencialmente iguales a las de diferenciación de funciones unidimensionales.
Consideremos una función bidimensional f(x,y). La aproximación de diferencia para la derivada parcial
con respecto a x, por ejemplo, puede deducirse fijando y en un valor constante y0 y considerando f(x,y0)
como una función unidimensional. Por tanto, las aproximaciones de diferencia hacia adelante, central y
hacia atrás para éstas derivadas parciales se pueden escribir, respectivamente:
f ( x0 + ∆x, y 0 ) − f ( x0 , y 0 )
∂f
→ E ∝ ∆x
≈
∆x
∂x
f ( x0 + ∆x, y 0 ) − f ( x0 − ∆x, y 0 )
∂f
2
fx =
≈
→ E ∝ (∆x )
∂x
2 ⋅ ∆x
(
)
f x0 , y 0 − f ( x0 − ∆x, y 0 )
∂f
fx =
≈
→ E ∝ ∆x
∂x
∆x
[9].
fx =
Las aproximaciones de diferencia central para las segundas derivadas de f ( x, y ) en
(x0 , y0 ) están dadas por:
f ( x0 + ∆x, y 0 ) − 2 ⋅ f ( x0 , y 0 ) + f ( x0 − ∆x, y 0 )
∂2 f
f xx = 2 ≈
∂x
(∆x )2
f ( x0 , y 0 + ∆y ) − 2 ⋅ f ( x0 , y 0 ) + f ( x0 , y 0 − ∆y )
∂2 f
f yy = 2 ≈
∂y
(∆y )2
f ( x0 + ∆x, y 0 + ∆y ) − f ( x0 − ∆x, y 0 + ∆y )
∂2 f
≈
∂x ⋅ ∂y
∆x ⋅ ∆y
− f ( x0 + ∆x, y 0 − ∆y ) − f ( x0 − ∆x, y 0 − ∆y )
+
∆x ⋅ ∆y
→ E ∝ (∆x )
2
f xy =
[10].
60
CAPÍTULO 3. DISEÑO
MÁQUINA PARALELA.
Y
CONSTRUCCIÓN
DE
LA
3.1 Pensamiento y la filosofía de construcción
El pensamiento inicial en la construcción de una máquina paralela se basa en la
mentalidad de hacer mucho a través de trabajos pequeños.Existe un cuento que puede indicarnos el
comportamiento de una máquina paralela, el famoso cuento de la sopa de piedras de Marcia Brown
donde es posible realizar una sopa de piedras con la cooperación de un pueblo, la moraleja de este
cuento es inmediata: Con la cooperación se alcanzan resultados notables, aun cuando se parta de
contribuciones pequeñas, que a simple vista parecen o son insignificantes.
La frase “Divide y vencerás”[11] nos indica que para llegar a un objetivo complicado
deberemos de partir de diferentes objetivos más pequeños los cuales harán que podremos alcanzar ese
objetivo o fin. La construcción de la máquina paralela deberá de seguir esta filosofía para poder
realizar miles de millones de cálculos por segundo. Para lograr esto deberemos de explotar el
procesamiento en paralelo con numerosos microprocesadores que trabajan en conjunto para resolver
problemas de la complejidad de un objetivo en común.
Es posible construir una máquina paralela de una manera muy económica, en la cual se
sea posible hacer una interconexión de computadoras personales utilizando algún programa que
permita resolver problemas científicos de procesamiento paralelo.
La idea de la interconexión de computadoras no constituía, en sí misma, ninguna novedad.
En los años cincuenta y sesenta, la fuerza área norteamericana tendió la red SAGE, una red de
computadoras de válvulas de vacío (bulbos) para protegerse de un inesperado ataque nuclear soviético.
A mediados de los ochenta, Digital Equipment Corporation acuñó el término "cluster" (agrupación) al
integrar sus minicomputadoras de gama media VAX para formar un sistema mayor.
A principios de los noventa, los científicos empezaron a plantearse la creación de
agrupaciones de computadoras inducidas en parte por el bajo costo asociado a la producción en masa
de sus microprocesadores. Pero, lo que reforzó el atractivo de esa idea fue la caída del precio de
Ethernet, la técnica dominante en la interconexión de computadoras en redes de área local.
Los avances en la programación facilitaron también el apoyo para formar diversas
agrupaciones de varias computadoras. En los años ochenta, UNIX se consolidó como el sistema
operativo dominante para la computación científica y técnica. Por desgracia, los sistemas operativos
instalados en las computadoras comerciales carecían de la potencia y de la flexibilidad, pero en 1991 un
universitario finlandés, Linus Torvalds, creó Linux, un sistema operativo similar a UNIX y que
funcionaba en las computadoras personales; Torvalds permitió que su sistema operativo fuera accesible
de manera gratuita en Internet.
11 La vieja frase atribuida a Julio Cesar, “Divide et impera” , usada por Napoleón Bonaparte
61
La primera agrupación de computadoras en arreglo (cluster) nació en 1994 en el Centro
Goddard de Vuelos Espaciales. La NASA, a la que pertenece dicha entidad, andaba buscando una
solución para los complicados problemas computacionales asociados a las ciencias de la Tierra y del
espacio. Necesitaba una máquina capaz de alcanzar un Gigaflop, es decir, realizar mil millones de
operaciones de punto flotante por segundo. En aquel entonces, una supercomputadora comercial capaz
de alcanzar esta velocidad venía a costar un millón de dólares, y dedicarlo a un sólo grupo de
investigadores resultaba un gasto imposible.
Sterling, investigador del centro Goddard de la NASA decidió adentrarse en el sistema de
agrupaciones de computadoras y Con Donald J. Becker, compañero suyo, conectó 16 computadoras,
cada una de las cuales contenía un microprocesador Intel 486. Emplearon el sistema Linux y una red
Ethernet estándar. Para aplicaciones científicas, esta agrupación de computadoras alcanzaba los 70
Megaflops, o sea, 70 millones de operaciones de punto flotante por segundo. Aunque nos parezca poco
de acuerdo con los estándares actuales, esa velocidad no era mucho menor que la de algunas
supercomputadoras comerciales de aquel momento. La agrupación se construyó, además, con 40.000
dólares, la décima parte del precio de una máquina comercial con características similares en 1994.
Los investigadores de la NASA lo llamaron "Beowulf", en referencia al joven héroe de la
leyenda medieval que derrotó al gigante Grendel arrancándole uno de sus brazos. Con ese nombre se
designa ahora toda agrupación económica e integrada por computadoras comerciales.
El algoritmo principal con el que se rige la computación en paralelo es el principio del
“divide y vencerás”. Un sistema de procesadores en paralelo secciona un problema complejo en
múltiples tareas de componentes menores. Estas tareas se asignan a los diferentes nodos del sistema
que realizan sus tareas de manera simultánea. De acuerdo a la naturaleza del problema la
programación y el desempeño dependerán del rendimiento del procesamiento en paralelo ya que
depende su alto rendimiento de factores como los tiempos de retardo entre la información que viaja de
una computadora a otra, la velocidad de la red y estilo de programación utilizado. Uno de los factores
de gran importancia es la frecuencia que tendrán los nodos para comunicarse entre sí y de esta
manera coordinar su trabajo y compartir resultados parciales.
Hay problemas que requieren dividirse en un número pequeño de tareas minúsculas las
cuales necesitan un intercambio frecuente de información, este tipo de tareas no son adecuados para
procesado paralelo. Pero los problemas menos sutiles sí pueden repartirse en porciones mayores. Y al
no pedir tanta interconexión entre nodos, permiten un procesamiento correcto y con el mínimo de
errores.
A la hora de crear una máquina paralela se deberá de decidir entre varios aspectos
esenciales que afectan el diseño del sistema. Un factor importante es el que podamos usar cualquier tipo
de red para conectar las computadoras.
62
3.2 Aspectos generales de la programación en paralelo
La programación en paralelo requiere habilidad e ingenio para determinar un tiempo único
de disparo (tiempo temporal cero) de donde parten todos los procesos iniciales. Puede constituir un reto
mayor que la propia conexión de las computadoras para crear el sistema Beowulf. Por modelo de
programación es acostumbrado recurrir a aplicaciones del tipo cliente servidor. En él, un nodo, que
actúa como cliente, dirige el procesado desarrollado por otro o varios más nodos servidores. Es posible
que se ejecute el mismo software en todos los nodos que integran la máquina paralela y se asignarán
secciones diferentes del código a los nodos cliente, el servidor y cada microprocesador de la
agrupación. Por lo que sólo se ejecuta la sección apropiada para su tarea. Los errores de programación
pueden tener consecuencias importantes y provocar un descontrol general en la cadena general y en
cada nodo, cuando la falla se presenta en un nodo, ésta se transmite a los demás. La búsqueda del error
en el código puede resultar una tarea muy complicada y muy frustrante.
Antes de poder realizar cualquier tipo de consideración inicial para la construcción de la
máquina paralela considerada en este documento, es preciso determinar cuales son los aspectos
escenciales para su correcta construcción. Sobre estos aspectos hablaremois a continuación.
3.2.1 Tipo de Hardware
Una agrupación homogénea de computadoras en la que todas las computadoras tienen los
mismos componentes y microprocesadores permite simplificar la programación y la administración de
los nodos mas no deberá de ser requisito imprescindible.
La máquina paralela para cumplir con los objetivos del presente trabajo, deberá soportar
una mezcla de microprocesadores de tipos y velocidades diferentes Ya que se utilizará el equipo que
no se encuentre activo y sea posible conseguir por estar en desuso o que nos proporcionen.
El tipo de hardware utilizado, representa un aspecto complicado en el diseño, ya que el fin
es el de buscar la distribución del trabajo para su procesamiento en paralelo en las computadoras que
conforman el sistema. Dado que la máquina paralela puede tener procesadores de diferentes
arquitecturas y de velocidades muy distintas, no podemos repartir de una forma homogénea la carga de
trabajo entre los nodos: si actuáramos así, las máquinas más rápidas estarían ociosas durante largos
períodos de tiempo a la espera de que las computadoras más lentas, acaben su procesamiento. Por esto
el uso de programas de código abierto es muy importante, ya que nos permite modificar el origen del
código para adaptarlo a lo que sea más apropiado en cada caso en particular.
En este tipo de organización es importante hacer la distribución de la carga, las
computadoras más rápidas realizan la mayor parte del trabajo, aunque las máquinas lentas contribuyen
al funcionamiento del sistema.
El microprocesador es uno de los componentes más importantes, ya que en su velocidad y
capacidad es posible determinar la calidad del resto de los elementos. El Microprocesador, para
entendernos, y de una manera simple, es el cerebro de la computadora. Es definido como un chip en
cuyo interior se encuentran millones de transistores que, combinándose entre ellos, permiten al chip
realizar la tarea que tenga encomendada.
63
La unidad de medida que se emplea para expresar la velocidad del microprocesador es el
hertz (Hz), aunque la velocidad real de un procesador depende de otros factores, también nos indica
más o menos la cantidad de instrucciones que el microprocesador puede realizar en un segundo.
Cada computadora, cuenta con una unidad aritmética, una unidad lógica y una unidad de
control. Todas estas unidades en conjunto trabajan sincronizadamente controladas por los pulsos de un
reloj maestro que coordina la ejecución de todas las operaciones que se realizan por parte del
microprocesador. Cuenta además con una antememoria (memoria cache), la cual es una memoria de gran
velocidad que sirve al microprocesador para tener los datos recientes que previsiblemente se utilizarán
en próximas operaciones sin tener que acudir a la memoria RAM, reduciendo así el tiempo de espera.
La computadora en algunos casos podría contar con un coprocesador matemático, este
componente es la parte del microprocesador especializado en los cálculos matemáticos, aunque también
formar parte de otro circuito.
Acontinuación menciono algunos años clave importantes en la historia de los
microprocesadores. El 17 de octubre Intel anunciaba la aparición del procesador 80386 DX, el primero
en poseer una arquitectura de 32 bits, lo que suponía una velocidad a la hora de procesar las
instrucciones realmente importantes con respecto a su predecesor. Dicho procesador contenía en su
interior alrededor de los 275000 transistores, más de cien veces los que tenía el primer 4004 después de
tan solo 14 años. El reloj llegaba a un máximo de 33 MHz, y era capaz de direccionar 4 GB de
memoria.
En 1988, Intel desarrollaba un poco tarde un sistema sencillo de actualizar los antiguos
80286, gracias a la aparición del 80386 SX, que sacrificaba el bus de datos para dejarlo en uno de 16
bits, pero a menor coste. Estos procesadores irrumpieron, con la explosión del entorno gráfico
Windows desarrollado por Microsoft unos años antes pero que no había tenido la suficiente aceptación
por parte de los usuarios.
El 10 de Abril de 1989, aparecía el Intel 80486 DX, de nuevo con tecnología de 32 bits, y
como novedades principales la incorporación del caché de primer nivel (L1), en el propio chip, lo que
aceleraba enormemente la transferencia de datos de este caché al procesador, así como la aparición de
coprocesador matemático también integrado en el procesador, dejando por tanto de ser una opción
como lo era en los anteriores 80386. Dos cambios que unidos al hecho de que por primera vez se
sobrepasaban el millón de transistores usando la tecnología de una micra (aunque en la versión de este
procesador que iba a 25 MHz, se usó ya la tecnología de 0,8 micras), hacían posible la aparición de
programas de calidad sorprendente, entre los cuales destacaron los juegos.
Con una arquitectura real de 32 bits, se usaba de nuevo la tecnología de 0.8 micras, con lo
que se lograba construir más unidades en el menor espacio. Los resultados no se hicieron esperar y las
compañías empezaron aunque de forma tímida a lanzar programas y juegos exclusivamente para el
Pentium.
64
La aparición, el 27 de marzo de 1995, del procesador Pentium Pro, supuso para los
servidores de la red y las estaciones de trabajos un aire nuevo, tal y como ocurriera con el Pentium en
el ámbito doméstico. La potencia de este nuevo procesador no tenía comparación hasta entonces,
gracias a la arquitectura de 64 bits y el empleo de una tecnología revolucionaria como es la de 0.32
micras, lo que permitía la inclusión de 5,500.000 transistores en su interior. El procesador contaba con
un segundo chip en el mismo encapsulado que se encargaba de mejorar la velocidad de la memoria
caché, lo que resultaba en un incremento del rendimiento sustancioso. Las frecuencias de reloj se
mantenían como límite por arriba de 200 MHz, partiendo de un mínimo de 150 MHz. Un procesador
que en principio no tenía muchos avisos de saltar al mercado doméstico, puesto que los procesadores
Pentium MMX, parecían cubrir de momento todas las necesidades de este campo. El Pentium II, fue
simplemente un nuevo ingenio que se sumó a las tecnologías del Pentium Pro con el MMX. Como
resultado, el Pentium II fue el procesador más rápido de cuantos a comerciado Intel, hasta principios de
1999. El Pentium II cuenta con 256 KB de caché secundaria integrados en el núcleo del micro su
rendimiento mejora en todo tipo de aplicaciones.
La última apuesta de Intel, que representa todo un cambio de arquitectura; pese a su
nombre, internamente poco o nada tiene que ver con otros miembros de la familia Pentium.Se trata de
un microprocesador peculiar: su diseño permite alcanzar mayores velocidades, con menos potencia
por cada MHz que los micros anteriores; es decir, que un Pentium 4 a 1,3 GHz puede ser mucho más
lento que un Pentium III a "sólo" 1 GHz. Para ser competitivo, el Pentium 4 debe funcionar a 1,7 GHz o
más.
Ha habido muchos cambios en el campo de los discos duros. De más antiguos del tamaño
de una caja de zapatos y de capacidades ridículas (vistas desde hoy) hasta discos duros compactos y
reducidos con capacidades 400 veces mayores. El tiempo de acceso es el parámetro más usado para
medir la velocidad de un disco duro, y lo forman la suma de dos factores: el tiempo medio de búsqueda
y la latencia; el primero es lo que tarde el cabezal en desplazarse a una pista determinada, y el segundo
es el tiempo que emplean los datos en pasar por el cabezal.
Si se aumenta la velocidad de rotación, el tiempo de latencia se reduce; en antiguas
unidades era de 3.600 rpm (revoluciones por minuto), lo que daba un tiempo de latencia de 8,3
milisegundos. La mayoría de los discos duros actuales giran ya a 7.200 rpm, con lo que se obtienen
4,17 micro segundos de tiempo de latencia. Y actualmente, existen discos de alta gama aún más
rápidos, hasta 10.000 rpm.
El controlador del Disco duro, es un componente electrónico que maneja el flujo de datos
entre el sistema y el disco, es directamente responsable de factores como el formato en que se
almacenan los datos, su tasa de transferencia y su velocidad. Los primeros discos duros eran
administrados por controladores ST506, un estándar creado por la empresa Seagate. Dentro de esta
norma se implementaron los modos MFM (Modified Frequency Modulation) y RLL (Run Length
Limited), dos sistemas para el almacenamiento de datos que, si bien diferentes en su funcionamiento, a
nivel físico y externo del disco presentaban la misma apariencia.
65
La Interfase ESDI (Enhanced Small Devices Interfase) (interfaz mejorada para dispositivos
pequeños), permitió elevar el radio de transferencia a 10 Mbits por segundo. Asimismo, se incluyó un
pequeño buffer de sectores que permitía transferir pistas completas en un único giro o revolución del
disco, se trató de una tecnología de transición, ya que comercialmente no fue muy bien aceptada.
El estándar IDE (Integrated Drive Electronics), fue creado por la firma Western Digital,
curiosamente por encargo de Compaq para una nueva gama de computadoras personales. Su
característica más representativa era la implementación de la controladora en el propio disco duro, de
ahí su denominación. Desde ese momento, únicamente se necesita una conexión entre el cable IDE y el
Bus del sistema, siendo posible implementarla en la placa. Se eliminó la necesidad de disponer de dos
cables separados para control y datos, bastando con un cable de 40 hilos desde el bus al disco duro. Se
estableció también el término ATA (AT Attachment) que define una serie de normas a las que deben
acogerse los fabricantes de unidades de este tipo.
IDE permite transferencias de 4 Mb por segundo. La interfaz IDE supuso la simplificación
en el proceso de instalación y configuración de discos duros, y estuvo durante un tiempo a la altura de
las exigencias del mercado. La interfaz EIDE o IDE mejorado, propuesto también por Western Digital,
aumenta su capacidad, hasta 8,4 Gb, y la tasa de transferencia empieza a subir a partir de los 10 Mb. por
segundo, según el modo de transferencia usado. Además, se implementaron dos sistemas de traducción
de los parámetros físicos de la unidad, de forma que se pudiera acceder a superiores capacidades. Estos
sistemas, denominados CHS y LBA aportaron ventajas, ya que con mínimas modificaciones se podían
acceder a las máximas capacidades permitidas.
El número de unidades que podían ser instaladas al mismo tiempo aumentó a cuatro, para
esto se obligó a los fabricantes de sistemas y de BIOS (Basic input output system.- Sistema basico de
entrada y salida) a soportar los controladores secundarios, se habilitó la posibilidad de instalar unidades
CD-ROM y de cinta.
Prácticamente todos los discos duros incluyen una memoria de paso (buffer), en la que
almacenan los últimos sectores leídos ésta que puede ser desde 2 Kb hasta 512 Kb, es un factor muy
importante que afecta al rendimiento. Se le llama caché cuando incluyen ciertas características de
velocidad; concretamente, los procesos se optimizan cuando el sistema vuelve de una operación de
copiado de datos a la unidad sin esperar a que ésta haya finalizado. También utilizan otra técnica
diferente donde la unidad informa de la finalización de una operación de escritura en el momento de
recibir los datos, antes de comenzar a grabarlos en el disco.
La interfaz SCSI (Small Computer System Interfase) ha sido tradicionalmente relegada a
tareas y entornos de ámbito profesional, en los que priva más el rendimiento, la flexibilidad y la
fiabilidad. Para empezar, SCSI es una estructura de bus separada del bus del sistema. De esta forma,
evita las limitaciones propias del bus del PC. Además, en su versión más sencilla permite conectar
hasta 7 dispositivos SCSI (serían 8 pero uno de ellos ha de ser la propia controladora) en el equipo. Las
ventajas no están limitadas al número de periféricos sino también a su tipo: se puede conectar
prácticamente cualquier dispositivo (escáner, impresoras, CD-ROM, unidades removibles, etc.) siempre
que cumplan con esta norma.
Otra enorme ventaja de SCSI es su portabilidad; esto quiere decir que podemos conectar
nuestro disco duro o CD-ROM a computadoras Macintosh, Amiga, etc., que empleen también la norma
SCSI. Un detalle a resaltar que todos los periféricos SCSI son inteligentes, es decir, cada uno posee su
66
propia ROM donde almacena sus parámetros de funcionamiento. En especial, es la controladora el
dispositivo más importante de la cadena SCSI, que al poseer su propia BIOS puede sobrepasar
limitaciones de la ROM BIOS del sistema.
Posiblemente lo que hace destacar a SCSI en su rendimiento, bastante superior a IDE , es
no depender del bus del sistema. No obstante, no todo iba a ser ventajas: SCSI es más caro que IDE, y
en la mayoría de las ocasiones, más complejo de configurar.
Considerando construir una maquina paralela formada con 8 computadoras proporcionadas por el
CIDETEC-IPN, me es posible establecer el siguiente hardware:
•
•
•
•
•
•
•
•
•
•
8 tarjetas madre 486 con un procesador
8 procesadores de velocidad variable
8 módulos de memoria tamaño variable
8 Discos duros de mínimo 1 GB.
8 gabinetes.
8 fuente de poder tipo XT
8 Cables IDE.
8 tarjetas de video.
1 teclado
Monitor Samsung 14 pulgadas.
3.2.2 Tipo de red de Comunicación
El tipo de red que deberá de selecionarsetiene mucho que ver con las características en
precios , eficiencia y operación y velocidad. Ethernet tiene un rendimiento de 10 Mbps y usa un
método de acceso por detección de portadora (CSMA/CD). El IEEE 802.3 también define un estándar
similar con una ligera diferencia en el formato de las tramas. Todas las adaptaciones del estándar 802.3
tienen una velocidad de transmisión de 10 Mbps con la excepción de 1Base-5, el cual transmite a 1
Mbps pero permite usar grandes tramos de par trenzado. Las topologías más usuales son: 10Base-5;
10Base-2 y 10Base-T, donde el primer número del nombre señala la velocidad en Mbps y el número
final a los metros por segmento (multiplicandose por 100). Base viene de banda base (baseband) y
Broad de banda ancha (broadband).
Ethernet e IEEE 802.3 especifican tecnologías muy similares, ambas utilizan el método de
acceso al medio CSMA/CD, el cual requiere que antes de que cualquier estación pueda transmitir, debe
escuchar la red para determinar si actualmente está en uso. Si es así, la estación que desea transmitir
espera y si la red no está en uso, la estación transmite.
En CSMA/CD todos los nodos tienen acceso a la red en cualquier momento, una colisión
ocurrirá cuando dos estaciones detectaron silencio dentro de la red y enviaron datos al mismo tiempo,
en este caso ambas transmisiones se dañan y las estaciones deben transmitir algún tiempo después
(acceso aleatorio).
67
Como ya lo hemos dicho Ethernet utiliza el método de acceso al medio CSMA/CD (Carrier
Es CSMA ya que múltiples computadoras pueden acceder
simultáneamente al cable Ethernet y determinar si se encuentra activo o no, simplemente escuchando si
la señal está presente, por otro lado CD “detección de colisión” se refiere a que cada transceptor
monitorea el cable mientras está transfiriendo para verificar que una señal externa no interfiera con la
suya.
Sense Multiple Access with Collision Detection).
El estándar 10Base-T ofrece muchas de las ventajas del Ethernet sin la necesidad de usar
el caro cable coaxial. Además permite una topología en estrella o distribuida para grupos de estaciones
en departamentos u otras áreas. Parte de la especificación 10Base-T busca la compatibilidad con otros
estándares 802.3 del IEEE. Esto facilita la transición de un medio a otro; las placas Ethernet ya
instaladas se pueden aprovechar si pasamos de coaxial a par trenzado. La siguiente figura muestra una
red simple 10Base-T.
La especificación 10Base-T incluye una característica de comprobación del cable llamada
comprobación de integridad del enlace. Con esta prestación, el sistema comprueba constantemente la
conducción del par trenzado para detectar circuitos abiertos y cortocircuitos. El control se mantiene
desde un punto central.
Cuenta con las siguientes ventajas:
1. Tolerante a fallas.
2. Fácil ubicación de fallas.
3. Fácil de trasladar o cambiar.
4. Uso de cable de par trenzado blindado.
Desventajas:
1. Limitación de distancias.
2. Sensible al ruido.
3.2.3 El sistema operativo.
El programa base fundamental de todos los programas de sistema, es el Sistema Operativo,
que controla todos los recursos de la computadora y proporciona la base sobre la cual pueden escribirse
los programas de aplicación.
Con las primeras computadoras, era algo muy complicado ser programador, no sólo
porque los lenguajes de programación no habían evolucionado sino porque se debía manejar la
computadora desde la consola y la consola en aquellos tiempos significaba un gran sistema de
interruptores. Afortunadamente, esto ha ido cambiando y se lo debemos, en parte, a que han nacido y
evolucionado los Sistemas Operativos. Como también lo han hecho las máquinas, los lenguajes de
programación e incluso las ideas.
68
Un Sistema Operativo es un programa que actúa como intermediario entre el usuario y el
hardware de una computadora, es el instrumento indispensable para hacer de la computadora un objeto
útil. Su propósito es proporcionar un entorno en el cual el usuario pueda ejecutar programas. El
objetivo principal de un Sistema Operativo es, lograr que el sistema de computación se emplee de
manera eficiente y se administren los recursos eficientemente.
Entre las principales funciones del sistema operativo están:
1. Administración de recursos de la computadora. Su función es la de administrar los dispositivos
de hardware en la computadora.
2. Control de lo que hace la computadora y de cómo lo hace. Las actividades principales que se
realizan van enfocadas a controlar los datos y los programas, administrar y mantener los
sistemas de archivo de disco.
3. Permitir la comunicación usuario máquina. Permite proporcionar ya sea una interfaz de línea de
comando o una interfaz gráfica al usuario, para que este último se pueda comunicar con la
computadora.
Con el paso del tiempo, los Sistemas Operativos fueron clasificándose de diferentes maneras,
dependiendo del uso o de la aplicación que se les daba. A continuación se mostrarán diversos tipos de
Sistemas Operativos que existen en la actualidad, con algunas de sus características.
•
Sistemas operativos por lotes. Se reúnen todos los trabajos comunes para realizarlos al mismo
tiempo, evitando la espera de dos o más trabajos como sucede en el procesamiento en serie.
Estos sistemas son de los más tradicionales y antiguos, y fueron introducidos alrededor de 1956
para aumentar la capacidad de procesamiento de los programas.
•
Sistemas operativos de tiempo real. Son aquellos en los cuales no tiene importancia el usuario
sino los procesos. Por lo general, están sub utilizados sus recursos con la finalidad de prestar
atención a los procesos en el momento que lo requieran. Se utilizan en entornos donde el tiempo
de respuesta es critico.
•
Sistemas operativos de multiprogramación o multitarea. Se distinguen por sus habilidades para
poder soportar la ejecución de dos o más trabajos activos (que se están ejecutado) al mismo
tiempo. Esto trae como resultado que la Unidad Central de Procesamiento (CPU) siempre tenga
alguna tarea que ejecutar, aprovechando al máximo su utilización.
•
Sistemas operativos de tiempo compartido. Permiten la simulación de que el sistema y sus
recursos son todos para cada usuario. El usuario hace una petición a la computadora y ésta la
procesa tan pronto como le es posible. La respuesta aparecerá en la terminal del usuario.
•
Sistemas operativos paralelos. En estos tipos de Sistemas Operativos se pretende que cuando
existan dos o más procesos que compitan por algún recurso se puedan realizar o ejecutar al
mismo tiempo.
69
•
Sistemas operativos distribuidos. Permiten distribuir trabajos, tareas o procesos entre un
conjunto de procesadores. Puede ser que este conjunto de procesadores esté en un equipo o en
diferentes, (en este caso es transparente para el usuario). Los sistemas distribuidos deben de ser
muy confiables, ya que si un componente del sistema se descompone otro componente debe de
ser capaz de reemplazarlo.
•
Sistemas operativos de red. Son aquellos sistemas que mantienen a dos o más computadoras
unidas a través de algún medio de comunicación (físico o no) con el objetivo primordial de
poder compartir los diferentes recursos y la información del sistema.
3.3 Elección de componentes para la construcción de la maquina paralela
El sistema operativo considerado para la construcción de la máquina paralela es LINUX
Mandrake versión 9.2 ya que es de costo limitado o bien casi ningún costo, de no pagar licencias y ser
de libre distribución, además de tener múltiples ventajas relacionadas a un excelente desempeño y
fortaleza en servicios e interfaz gráfica simple.
Estas ventajas son las siguientes:
El sistema operativo Linux Mandrake versión 9.2 (codename: Bamboo) es un sistema más avanzados
y potente con relación a los sistemas Linux disponibles hoy en día, con características de vanguardia
como Apache 2, redimensionado de particiones NTFS de disco duro, control de energía ACPI, soporte
de red zeroconf, soporte WI-FI. Linux Mandrake 9.2 da a los usuarios un nivel de comodidad sin igual
con un instalador gráfico simplificado, un tema de escritorio Mandrake Galaxy completamente nuevo,
impresionantes fuentes anti-alias por supuesto, los nuevos escritorios gráficos KDE 3.1 y GNOME 2.2.
Mandrake Linux 9.2 incluye el siguiente software necesario para el proyecto:
1.
2.
3.
4.
5.
6.
7.
8.
9.
Kernel 2.4.21: Núcleo de Linux configurable
XFree 4.3: Servidor X para acceso remoto
Glibc 2.3.1: Librerias de Lenguaje c
GCC 3.2.2 : Compilador GNU C estándar
Apache 2: Servidor WEB.
OpenSSH 3.5: Servidor de conexión remota.
KDE 3.1: Escritorio tipo Windows.
GNOME 2.2:Escritorio tipo Windows
Mozilla 1.3
Linux Mandrake 9.2 está optimizado para procesadores 486 y superiores (y compatibles), por lo que
no funcionará en procesadores x86 antiguos. Cuenta con una configuración mejorada y mayor cantidad
de hardware soportado. Mantenimiento del sistema simplificado y Amplia selección de aplicaciones
de oficina.
70
Cuenta con multimedia y juegos, servicios de servidores, Internet e Intranet, seguridad de alto
nivel, todo el software necesario para el desarrollo de aplicaciones, esta disponible en 60 idiomas y
Esta regido por los estándares de Linux y Software Libre.
El sistema básico de Linux Mandrake está disponible como descarga gratuita en muchos lugares de
Internet. Linux Mandrake 9.2 está diseñado especialmente para el uso personal. Incluye 2 CDS con
miles de las mejores aplicaciones multimedia, gráficas y de productividad.
Linux Mandrake nos permitirá configurar servicios adicionales e incluye todo lo necesario para
instalar y desplegar fácilmente servicios de red profesionales, como Apache 2 y Advanced Extranet
Server. El kerner de Linux 2.4.21 proporciona soporte nativo para gran cantidad de memoria mayor a
1024 MB y MultiProceso Simétrico.
3.3.1 Tipo de carga del sistema operativo para la máquina paralela.
Existen dos métodos para poder realizar la carga del sistema operativo utilizando Linux, estas formas
de acceso se refieren a la manera de como cada nodo realiza la petición de carga. Las dos formas de
carga son las siguientes:
a) Carga Local. En este tipo de carga el sistema operativo es instalado en forma local en el disco
duro. Por lo que la instalación deberá de ser considerada de acuerdo a las características del
cliente que vaya a utilizarse.
b) Carga Remota. Éste se divide a su vez en tres formas:
1. Arranque vía protocolo. Desde el momento en que la computadora es encendida, ésta deberá ser
capaz de reconocer los dispositivos locales e intentar dar de alta los servicios de arranque a
través de su tarjeta de red.
2. Identificación DHCP. Los clientes no pueden almacenar el kernel con el que deben arrancar.
Este se encontrará en el servidor y ser deberá de ser trasferido cada vez que el cliente lo
solicite. Es necesario un disco de carga que le de una dirección IP a la máquina y un nombre.
3. Descarga de la imagen del kernel vía protocolo TFTP. Igualmente los clientes no pueden
almacenar el kernel con el que deben arrancar. Este protocolo primitivo de ftp crea una pequeña
cache donde se va cargando un kernel especial que da de alta el nodo.
4. Por último, vía protocolo NFS, se le asigna su directorio de trabajo.
Para realizar lo anterior es necesario crear un disco de arranque con una imagen de craga. La
imagen de carga no es mas que los archivos basicos de carga del sistema operativo , el el proceso
completo puede observarse en la figura 22.
71
Figura 22.- Ejemplo del Proceso de Carga Remota
3.3.2. Aplicaciones y Programas.
3.3.2.1 Servicios requeridos
Existen servicios básicos los cuales deberán de configurarse en el nodo principal y van relacionados
a tipo de carga del sistema operativo que se seleccione.
Sin embargo para dar una generalidad de servicios las cuales puedan servir a cualquier esquema
antes mencionado bastarán con configurar los siguientes:
a) Servidor RPL.
b) Servidor DHCP.
c) Servidor TFTP.
d) Servidor de NFS.
e) Servidor RSH.
3.3.2.1.1 El servidor RPL.
El protocolo RPL (remote protocol load, Carga por protocolo remoto), ha sido diseñado para
el arranque desde tarjetas de red y le da al servidor la posibilidad de hacer peticiones por DHCP
(Dynamic Host Configuration Protocol-Protocolo de configuración de localidades dinamicas), servicio
que no posee debido a su falta de disco duro.
Al instalar una tarjeta de red con este soporte permitirá interrumpir a la BIOS del
servidor, en este caso un nodo cliente, con la interrupción del BIOS-ROM, INT 19H para administrar el
arranque desde este dispositivo. Es necesario que la tarjeta madre de este nodo cliente cuente con esta
característica, algo común en las tarjetas actuales. La estructura de datos en que se basa RPL es una
pequeña imagen llamada ROM, que deberá ser transferida al Nic. Esta ROM puede ubicarse en 2
localidades:
72
a. Integrarse directamente en el hardware del Nic. Esta posibilidad sólo viene contemplada
en las tarjetas más caras puesto ya que requiere un chip llamado boot ROM específico
para cada modelo, tiene una capacidad de unos 32KB.
b. La segunda que es más económica, consiste en montar un servidor de Roms, para que
los clientes obtengan la suya desde él. Esta posibilidad ofrece ventajas tanto a nivel de
flexibilidad y ya no será necesario el chip. Las imágenes en ROM ocupan 16KB.
3.3.2.1.2 El servidor DHCP (dynamic host configuration protocol).
DHCP es un superconjunto de las operaciones que puede realizar una llamada especial de
carga llamada bootstrap o BOOTP, la cual es una mejora sobre el antiguo protocolo de arranque RARP
(ARP remoto). Se utiliza DHCP para conseguir la dirección IP. El funcionamiento de BOOTP y DHCP,
es simple cuenta de los siguientes procesos:
1. Realizar intercambios de un sólo paquete con el mismo formato tanto para peticiones
como respuestas. Este paquete o datagrama es de tipo IP/UDP y utiliza el tiempo
muerto del sistema (timeout) para retransmitir, mientras no se reciba respuesta a una
petición.
2. Solicita un BOOTREQUEST. Existe un código de control llamado BOOTREQUEST, el
cual usa el puerto 68, las peticiones BOOTREQUEST contienen el nombre de la
máquina que las solicitó y si ésta es conocida.
3. Solicita un BOOTREPLY. Existe un código de control llamado BOOTREPLY el cual
usa el puerto 67 para solicitar peticiones del archivo que debe de descargarse. Los
servidores se comportan como compuertas, permitiendo peticiones BOOTP entre varias
redes.
En breve el funcionamiento se resume a lo siguiente:
•
El cliente rellena un paquete con todos los campos que conoce y con el código de petición, y lo
difunde a la dirección 255.255.255.255 de broadcast.
•
A continuación contesta el servidor, moldeando el paquete de manera especifica para que el
cliente reciba el paquete y lo procese para establecer los parámetros de su dirección IP.
•
El servidor de DHCP se inicia como proceso residente (llamado demonio), utilizando un
servicio de red llamado inetd o xinetd.
73
3.3.2.1.3 El servidor TFTP (trivial ftp).
Este protocolo es un FTP especial mucho más simple. Para empezar, la capa de transporte
utiliza UDP en lugar de TCP y transferencia por bloques para el envío de los archivos, lo que hace más
sencilla la transferencia. El otro motivo por el que se utiliza UDP y un mecanismo tan simple de control
de paquetes es porque se necesita que el programa y lo mínimo de pila IP ocupen poco en memoria para
que este pueda grabarse en ROM, que inherentemente disponen de poca capacidad, máximo 32 KBytes.
El servidor también es controlado por un servicio de red llamado inetd (demonio de
configuración de servicios de red). Su configuración se centrará en el servidor, puesto que el cliente lo
adopta de forma explícito. Existen dos tipos técnicas de configuración para este protocolo y éstas son:
a. Simple. No se establecer normas de seguridad.
b. Seguro. Basa su seguridad en una llamada a un proceso llamado chroot, (una función del sistema
operativo). De este modo, en la ejecución de la rutina de aceptación de peticiones, el directorio
exportado se convierte en directorio raíz. Consecuentemente el acceso a otros archivos es más
difícil.
El protocolo TFTP es un servicio inseguro, ya que el propio protocolo es simple e inseguro, por lo
que es recomendable que el servidor que posea este servicio esté aislado de cualquier red que no
garantice medidas serias de seguridad. En casi contrario, cualquiera podría sustituir los archivos que
descargan los clientes e incluir en ellos alguna rutina no deseada.
3.3.2.1.4 El servidor NFS
NFS es el sistema de almacenamiento ingeniado por Sun Microsystems y que utiliza RPC
(Remote Procedure Call-Procedimiento de llamadas remotas). Es un modelo de servidores sin estado, es
decir, los servidores NFS no guardan en ningún momento los archivos a los que se están accediendo.
El funcionamiento se basa en dos secciones: cliente y servidor. El cliente monta el sistema
de archivos exportado por el servidor y a partir de este momento accede a los archivos remotos como si
fuesen propios. Este sistema es utilizado desde hace tiempo en casi todos los sistemas UNIX como
método de compartir archivos en red. La función NFSroot designa el método que sigue el kernel
cuando en lugar de tomar el clásico sistema de archivos ext2 o reiserfs.
El sistema de archivos que debemos exportar en el servidor debe contener todos los
archivos necesarios para que la distribución pueda funcionar. Este factor es muy variable, dentro de
cada distribución. En principio debe de establecerse una política que nos indique que directorios deben
ser necesariamente de lectura y escritura o solamente de lectura. Una buena forma de ahorrar espacio en
el servidor sería exportando para todos los clientes los mismos directorios para sólo lectura y
particularizando para cada uno los de escritura y lectura.
74
3.3.2.1.5 El servidor RSH
El servidor RSH forma parte de un programa de comunicación llamado SSH (Secure
Shell). SSH es un programa que permite realizar conexiones entre máquinas a través de una red abierta
de forma segura y ejecutar comandos.
El programa SSH provee fuerte autenticación y comunicación segura sobre un canal
inseguro y nace como un reemplazo a los comandos telnet, ftp y rlogin, los cuales proporcionan gran
flexibilidad en la administración de una red, pero sin embargo, presenta grandes riesgos en la seguridad
de un sistema.
Rsh es configurado con los servicios de red llamados inetd.
3.4 Proceso de construcción
Una vez que ya tenemos todas las características que debe llevar nuestra máquina paralela
procederemos a la construcción en dos fases esenciales:
1. Construcción Física. Aquí se realizará la planeación en cuanto como deben de conectarse los
dispositivos para el funcionamiento correcto, también le podríamos llamar acoplamiento de
hardware.
2. Construcción lógica. Aquí se realizará el análisis de los procesos queme permitan explotar el
hardware ya previamente construido y se refiere al funcionamiento del sistema operativo y sus
aplicaciones.
3.4.1 Construcción física
Nuestro proyecto deberá de ser una máquina paralela que permita lograr gran desempeño, a bajo
costo, por lo que tomaremos la base de construcción básica de un cluster lo que en Linux es llamado
Beowulf para adaptarla a un modelo que permita ser.
El Beowulf consiste en varios nodos o computadoras completas conectadas mediante un bus de
comunicación común bajo un sistema operativo abierto. El esquema de hardware muestra en la figura
23.
75
Figura 23.- Esquema de Hardware de un beowulf.
Como es posible ver en la figura cada computadora que dentro del esquema es llamado
nodo va conectado a un canal de comunicación, existe una máquina la cual actúa como servidor y se le
llama como nodo principal. La eficiencia de este beowulf dependerá de la velocidad entre las
conexiones de cana nodo sobre el bus de comunicación, así como de cada nodo con su dispositivo de
almacenamiento.
En este esquema se aprecia que es requerido un disco duro para cada nodo, una tarjeta de
red o una interfaz de comunicación y un bus común para todos los nodos. En la figura 24 se muestra el
diagrama a bloques de un cluster tipo beowulf.
Figura 24.- Diagrama a bloques de un cluster tipo beowulf.
76
Como se puede observar en la figura anterior la estructura del cluster considera su
construcción con base en el bus de comunicaciones, la interfaz y la infraestructura intermedia del
cluster para crear un ambiente de programación paralela montada sobre un dispositivo de
almacenamiento local.
La infraestructura intermedia del cluster se refiere al entorno de lectura de procesos que
permiten hacer la redirección a la memoria y al dispositivo de almacenamiento de cada nodo. Cada
proceso deberá de correr en forma local de los propios recursos de la máquina. Como es de esperarse la
homogeneidad de los recursos de cada nodo es importante para balancear la carga de cálculo en cada
uno de los procesadores ya que estos consumirán sus recursos locales, como su memoria y su espacio
en almacenamiento de disco y como se espera también un nodo mas actualizado y de mejor velocidad
responderá con mejor desempeño que uno antiguo.
El esquema de un beowulf considera nodos locales con su memoria y su disco de
almacenamiento, también considera contar con el sistema operativo completo y funcional corriendo, lo
cual incrementa el costo de construcción, que sin embargo comparado con el costo de una
supercomputadora comercial está muy por debajo, pero el objetivo que se persigue en el presente
trabajo es no solo alcanzar niveles óptimos de cálculo en la máquina paralela sino además generar un
esquema económico.
Para poder realizar lo anterior al sistema Beowulf se le harán algunas modificaciones en
las que los discos duros son inexistentes o de capacidad de almacenamiento aproximado a 500 MB o
más para los nodos de que realizan llamadas a sistema operativo en forma remota y sólo existirá un
dispositivo de almacenamiento para el nodo maestro.
Por otro llamaremos nodo cliente a aquel nodo que realiza llamadas a sistema operativo en
forma remota y que estará formado tan sólo por sus unidades mínimas de funcionamiento. Estas
unidades mínimas que permiten crear un nodo integral son las siguientes:
a.
b.
c.
d.
e.
f.
Tarjeta Madre.
Memoria
Fuente de poder
Microprocesador
Tarjeta de red
Unidad de carga.
La unidad de carga podrá establecerse de manera que pueda ser un lector de CDROM para
leer un disco de arranque, una unidad de cinta, un floppy disk o bien un dispositivo de almacenamiento
USB. Todo en conjunto crea el concepto de nodo integral.(Ver figura 25).
Una consideración que se debe tomar en cuenta antes de comprar o utilizar una tarjeta
madre para un nodo integral es que esta deberá de tener la capacidad de utilizar un teclado tipo USB o
bien que el BIOS no necesite del teclado para encender. Las tarjetas madre en la actualidad son muy
económicas y ya tienen las dos características anteriores, podría comprarse tarjetas madre que permitan
el autoinicio vía red y eso permitirá eliminar del nodo la sección de unidad de carga. Desgraciadamente
estas tarjetas son más caras y poco comunes.
77
Como se puede apreciar en el listado, es posible preguntar donde está el teclado, el ratón
(mouse) o el monitor, cabe mencionar que cada nodo integral no necesita de esto para su
funcionamiento correcto pero sí se utilizará para la su configuración, la cual depende del dispositivo de
carga que se utilice lo cual no es lo mismo para un floppy disk que para un CDROM o bien algún
dispositivo USB.
Figura 25.- El nodo Integral.
Se consideró además de cada nodo integral, un nodo maestro al cual llamaremos nodo principal que es
el que contendrá en su totalidad el sistema operativo y él o los dispósitivos de almacenamiento que
serán utilizados por los nodos integrales, por lo que este nodo contara con los mismos elementos de un
nodo integral más un teclado, un ratón o mouse y un monitor.
La máquina paralela tendrá entonces dadas las modificaciones indicadas en la figura 26.
En este nuevo esquema cada nodo integral depende del dispositivo de carga para poder configurarse
dentro del sistema operativo del nodo principal y configurar el entorno, así como los procesos que
estarán involucrados en el funcionamiento. El dispositivo de almacenamiento principal se encuentra en
el nodo principal y de aquí en un mismo directorio, se tomará el mismo archivo a procesar por cada uno
de los nodos integrales de manera que existirá un sólo entorno para cada nodo integral. Este sistema
permite garantizar la escalabilidad y el integrar n-nodos integrales al proyecto con el mínimo de
problemas.
78
Figura 26.- Esquema principal de la máquina paralela propuesta.
Indudablemente el bus de comunicaciones es primordial para que la máquina logre un desempeño
correcto y óptimo por lo que analizando los diferentes tipos de topologías de red, fue más factible el
tener una red de tipo ethernet 10/100 mb/s por su bajo precio12. Además de que las tarjetas de red
conseguidas también soportan esta tecnología (aunque la interfaz para el bus de comunicaciones puede
ser diversa), lo único que se requiere es un canal de comunicación simple, así que para la construcción
de cualquier otra máquina paralela es posible utilizar cualquier esquema de comunicación vía un
análisis de tiempos para ver la factibilidad de éste.
El modelo propuesto final en hardware de la máquina paralela dadas las consideraciones anteriores es el
mostrado por la figura 27. La correcta configuración del software, en este caso el sistema operativo es
muy importante ya que aquí es donde el proyecto cobrará forma
12 Precio de 12 Dlls. Americanos cotizados el dia 12 de febrero de 2006.
79
Figura 27.- El modelo en hardware propuesto final de la máquina paralela.
3.4.2 Construcción Lógica.
El procedimiento general que debe de hacer un nodo integral , es más compleja ya que
este no cuenta con todos los elementos para darse de alta en la red y no tiene tampoco la capacidad de
disco para guardar información.
La idea fundamental para configurar los dispositivos de carga es la siguiente: el nodo
integral buscará su dirección IP en el servidor de arranque vía protocolo BOOTP, usando la dirección IP
inicial como “0.0.0.0” y recibiendo su núcleo vía el protocolo TFTP. El arrancar un sistema a través de
pequeños segmentos no es simple, es necesario instalar el paquete nfsboot.
80
Este paquete contiene la imagen de una EPROM de arranque para diferentes tarjetas de red
que puede ser grabada directamente pero existen varias vías alternativas para preparar el nodo integral.
Si la máquina cuenta con un disco duro, entonces es posible utilizar un pequeño programa tipo DOS, o
la imagen binaria del un disquete creado con el comando dd de la siguiente forma:
#dd if=imagen of=/dev/fd0H1440
Esta imagen contiene un cliente BOOTP y TFTP. Es necesario configurar un núcleo de
Linux, para que tenga la opción nfsroot habilitada. Es necesario poner al día el núcleo con un parche
incluido en el paquete nfsboot. Es necesario configurar el soporte para dispositivos de sistemas de
archivo ya sea por disquetes o discos duros, pero es obligatorio habilitar soporte TCP/IP, el soporte
para tarjeta ethernet y el soporte de sistema de archivos nfs. Y, una vez realizado esto, recompilar el
núcleo y reconstruir los módulos de configuración.
BOOTPD puede encontrarse en el paquete comprimido bootpd-2.4.tar.gz o bien en su versión
compilada binaria. Después de obtener el paquete, es necesario compilarlo e instalarlo, con el fin de
que los archivos generados puedan encontrase como servicios en la carpeta /sbin. Al tratarse de un
servicio, éste deberá de iniciarse para que esté corriendo como demonio en el sistema, esto es
permanentemente y para esto se utiliza el comando;
# bootpd –s
En el caso de Linux mandrake existe un servicio llamo Xinetd el cual se encarga de la
configuración y carga de este servicio por lo que sólo será necesario darlo de alta con la instrucción:
#/sbin/chkconfig bootpd on
Por ultimo se iniciará el servicio con el siguiente comando:
#/etc/rc.d/init.d/xinetd restart
El protocolo BOOTP tiene un archivo de configuración llamado bootptab el cual se encuentra
en /etc. Este deberá modificarse insertando la dirección IP, su dirección de compuerta (gateway), el
servidor de nombres y las direcciones ethernet de las máquinas remotas. En el caso de cada nodo
integral se tiene una configuración semejante a la siguiente:
global.prof:\
:sm=255.255.255.0:\
:ds=192.168.1.5:\
:gw=192.168.1.19:\
:ht=ethernet:\
:bf=linux:
nodo1:hd=/export/root/nodo1:tc=global.prof:ha=0000c0863d7a:ip=193.1.0.1.
nodo2:hd=/export/root/nodo2:tc=global.prof:ha=0800110244e1:ip=192.1.0.2
nodo3:hd=/export/root/nodo3:tc=global.prof:ha=0800110244e1:ip=192.1.0.3
nodo4:hd=/export/root/nodo4:tc=global.prof:ha=0800110244e1:ip=192.1.0.4
nodo5:hd=/export/root/nodo5:tc=global.prof:ha=0800110244e1:ip=192.1.0.5
nodo6:hd=/export/root/nodo6:tc=global.prof:ha=0800110244e1:ip=192.1,0.6
nodo7:hd=/export/root/nodo7:tc=global.prof:ha=0800110244e1:ip=192.1.0.7
nodo8:hd=/export/root/nodo8:tc=global.prof:ha=0800110244e1:ip=192.1.0.8
81
Aquí encontraremos las siguientes claves de configuración:
1. sm: Corresponde a la máscara de subred
2. ds: Dirección del servidor de nombres (DNS)
3. gw: Dirección de la pasarela por defecto
4. ht: Tipo de hardware de red
5. bf: Nombre del archivo de arranque
Después de esto, cada máquina debe tener una línea donde se tiene el siguiente esquema:
1. El primer campo contiene el nombre de la máquina
2. hd contiene el directorio del archivo de arranque
3. El archivo de esquema general debe ser incluido en el campo tc
4. ha contiene la dirección de hardware de la tarjeta de red
5. ip contiene la dirección ip que se asigna
3.4.3 Instalación del nodo principal
Para la instalación del nodo principal bastará con tener instalados los servicios básicos
antes mencionados. Es necesario un sistema Linux completo, además de espacio en disco para
exportarlo para lectura y escritura en el nodo integral. Es necesario montar el directorio exportado en
algún lugar común sobre el sistema de archivos de la máquina Linux.
Es posible crear los subdirectorios para los nodos integrales utilizando el siguiente script ,
se establece que los nodos integrales son llamados nodo1,nodo2:
cd /export/linux
for x in [nodo2 nodo3 nodo4 nodo5 nodo6 nodo7] ; do
mkdir $x; cd $x
(cd ../nodo1; tar cf - *) | tar xvf –
done
Una vez hecho esto, es necesario realizar las siguientes exportaciones:
/export/linux/usr: Sólo lectura para todo el mundo
/export/linux/nodo1: Solamente para nodo1 con permisos rw,root
/export/linux/nodo2: Solamente para nodo1 con permisos rw,root
/export/linux/nodo3: Solamente para nodo1 con permisos rw,root
/export/linux/nodo4: Solamente para nodo1 con permisos rw,root
82
/export/linux/nodo5: Solamente para nodo1 con permisos rw,root
/export/linux/nodo6: Solamente para nodo1 con permisos rw,root
/export/linux/nodo7: Solamente para nodo1 con permisos rw,root
Como se indica a continuación el archivo /etc/export quedaria así:
# Este archivo es /etc/export
# La siguiente línea es una única:
/etc/root/usr
-access=linuxnet
# Las siguientes líneas corresponden a una por cada máquina
/export/root/nodo1
rw=machine1,root=nodo1
/export/root/nodo2
rw=machine1,root=nodo2
/export/root/nodo3
rw=machine1,root=nodo3
/export/root/nodo4
rw=machine1,root=nodo4
/export/root/nodo5
rw=machine1,root=nodo5
/export/root/nodo6
rw=machine1,root=nodo6
/export/root/nodo7
rw=machine1,root=nodo7
Por último es necesario ejecutar el siguiente comando para actualizar las exportaciones:
#exportfs -a
Con lo anterior quedara configurado el servidor TFTP, ya que los nodos integrales
arrancarán desde el directorio /export. Por ultimo se realiza un enlace que permita montar los directorios
al momento en el que el servidor es encendido:
#/sbin/mount server://export/linux/usr /usr
Como la primera línea de:
/export/linux/nodo1X/etc/rc.d/rc.S
Hasta este momento los nodos integrales son dados de alta en el sistema operativo como
máquinas individuales. La figuras 28 y 29 muestran el diagrama de flujo de la carga de los nodos
integrales.
83
Figura 28.- Diagrama de flujo de la carga de los nodos integrales en el sistema operativo (parte 1)
84
Figura 29.- Diagrama de flujo de la carga de los nodos integrales en el sistema operativo (parte 2).
Es posible que cada terminal pueda tener acceso a un entorno grafico, así como a
diferentes aplicaciones, sin embargo para este proyecto no es necesario, ya que el entorno grafico se
encuentra en el nodo principal. Hasta este momento existe conexión entre cada nodo integral y el nodo
principal, pero aun no funciona como una máquina paralela.
85
3.4.4 Diseño e implementación de la máquina paralela
Para poder crear ahora la máquina paralela es necesario saber como funciona en sus
procesos el procesamiento distribuido, que consiste en la administración de varios procesos,
ejecutándose en sistemas de computadoras múltiples y distribuidas. La concurrencia es fundamental en
todas las áreas que necesitan cómputo paralelo y fundamental para el diseño del sistema operativo. La
concurrencia comprende un gran número de características de diseño, donde son incluidos aspectos
como la comunicación entre procesos, administración de los recursos, la sincronización en la
ejecución de varios procesos y la asignación del tiempo de procesador para cada proceso. Estas
características son comunes para sistemas con multiprocesadores y proceso distribuido, e inclusive con
sistemas programados con un sólo procesador.
La concurrencia puede presentarse en tres contextos diferentes:
a) Múltiples aplicaciones: la multiprogramación se creó para permitir que el tiempo de
procesador de la máquina fuese compartido dinámicamente entre varias aplicaciones
activas.
b) Aplicaciones estructuradas: como ampliación de los principios del diseño modular y la
programación estructurada, algunas aplicaciones pueden implementarse eficazmente
como un conjunto de procesos concurrentes.
c) Estructura del sistema operativo: las ventajas de estructuración son aplicables en
algunos sistemas operativos y el uso de conjunto de procesos o hilos son aprovechados
por los programadores para aprovechar la concurrencia.
En un sistema multiprogramado con un único procesador, los procesos se intercalan en el
tiempo aparentando una ejecución simultánea. Aunque no se logra un procesamiento paralelo y produce
una sobrecarga en los intercambios de procesos, la ejecución intercalada produce beneficios en la
eficiencia del procesamiento y en la estructuración de los programas.
La intercalación y la superposición pueden contemplarse como ejemplos de procesamiento
concurrente en un sistema monoprocesador, los problemas son consecuencia de la velocidad de
ejecución de los procesos que no pueden predecirse y depende de las actividades de otros procesos. De
la forma en que el sistema operativo trata las interrupciones surgen las siguientes dificultades:
1. Compartir recursos globales implica riesgos de seguridad
2. Para el sistema operativo es difícil administrar en forma óptima los recursos.
Dentro de las labores que realiza el sistema operativo se encuentran las siguientes actividades:
1) El sistema operativo debe seguir a los distintos procesos activos
2) El sistema operativo debe asignar y retirar los distintos recursos a cada proceso activo,
entre estos se incluyen:
86
i.
ii.
iii.
iv.
Tiempo de procesador
Memoria
Archivos
Dispositivos de entrada y salida
3) El sistema operativo debe proteger los datos y los recursos físicos de cada proceso contra
los accesos o influencias no intencionadas de otros procesos.
4) Los resultados de un proceso son independientes de la velocidad a la que se realiza la
ejecución de otros procesos concurrentes.
Para abordar la independencia de la velocidad debemos ver las formas en las que los
procesos interactúan. Se puede clasificar la manera como interactúan los procesos en función al nivel
de conocimiento que cada proceso tiene de la existencia de los demás. Existen tres niveles de
conocimiento:
1) Los procesos no tienen conocimiento de los demás: son procesos independientes que no
operan juntos.
2) Los procesos tienen un conocimiento indirecto de los otros: los procesos no conocen a
los otros por sus identificadores de proceso pero muestran cooperación el objeto común.
3) Los procesos tienen conocimiento directo de los otros: los procesos se comunican por el
identificador de proceso y pueden trabajar conjuntamente.
Los procesos concurrentes entran en conflicto cuando compiten por el uso del mismo
recurso. Dos o más procesos necesitan acceder a un recurso durante su ejecución y es de alta prioridad
que cada proceso deje tal y como esté el estado del recurso que utilice. La ejecución de un proceso
puede influir en el comportamiento de los procesos que por él compiten.
Cuando existen procesos en competencia, se deben solucionar tres problemas de control:
La necesidad de exclusión mutua. Hacer que se cumpla la
exclusión mutua provoca un interbloqueo.
b) La inanición. Si tres procesos necesitan acceder a un recurso,
donde P1 posee al recurso, luego lo abandona y le concede el
acceso al siguiente proceso P2, P1 solicita acceso de nuevo y el
sistema operativo concede el acceso a P1 Y P2 alternativamente,
se puede negar indefinidamente a P3 el acceso al recurso.
c) Cooperación entre procesos compartidos. Comprende los
procesos que interactúan con otros sin tener conocimiento siquiera
de ellos
a)
87
Para solucionar problemas de procesos concurrentes, se diseñaron los sistemas operativos
actuales, como un conjunto de procesos secuenciales, eficientes y fiables para dar soporte a la
cooperación de recursos y de procesos. Los procesos de usuario podrían utilizar estos mecanismos si el
procesador y el sistema operativo los hacían disponible. El principio fundamental es el siguiente, los
procesos pueden interactuar entre si por medio de simples señales, con esto son obligados a detenerse
en una posición determinada hasta que reciba una señal específica.
Para controlar esta situación se usan variables especiales llamadas semáforos, los
procesos ejecutan funciones primitivas llamadas wait, y si la señal aun no se ha transmitido, el proceso
se suspende hasta que tiene lugar la transmisión. Los semáforos son variables que tienen un número
entero sobre el que se definen las siguientes operaciones:
a. Valor negativo: la operación wait disminuye el valor del semáforo y si el valor no es positivo el
proceso que ejecuta se bloquea.
b. Operaciones signal: incrementan el número del semáforo. Si el valor es positivo se desbloquea
el proceso bloqueado por una operación wait.
No hay forma de examinar o manipular los semáforos aparte de estas operaciones. Las funciones
primitivas wait y signal se suponen atómicas, es decir no pueden ser interrumpidas y cada rutina puede
considerarse como un peso indivisible. Un semáforo solo puede tomar los valores 0 y 1.
Los semáforos son más sencillos de implantar y puede demostrarse que tienen la misma potencia de
expresión que los semáforos del sistema. Ambos semáforos emplean una cola para mantener los
procesos en espera, la cuestión reside en el orden en que se retiran los procesos de la cola. Los
semáforos robustos garantizan la inexistencia de inanición en el algoritmo de exclusión mutua, pero no
es así en los semáforos débiles, se supone que los semáforos del sistema son siempre robustos ya que
son los más adecuados y porque son los tipos de semáforos que más incluyen los sistemas operativos.
Adicional a los semáforos existen los monitores. Estos son estructuras de un lenguaje de
programación que ofrecen una funcionalidad equivalente a las de los semáforos pero son más fáciles de
controlar. La estructura de monitor se ha implementado en varios lenguajes de programación como:
Pascal concurrente, Modula-2, Java, etcetera. Para una lista enlazada se puede necesitar un proceso de
cierre que bloquee todas las listas enlazadas o bien un cierre por cada elemento de una lista.
Un monitor es un módulo de software que consta de uno o más procedimientos, una secuencia de
inicio y uno datos locales. Sus características son las siguientes:
a. Sólo los procedimientos del monitor acceden a variables de datos locales.
b. Un proceso entra en el monitor invocando a uno de sus procedimientos.
c. En el monitor sólo un proceso puede ser ejecutado en un momento dado; cualquier otro proceso
quedará suspendido esperando la disponibilidad del monitor.
d. Al ser un proceso por vez, el monitor puede ofrecer un servicio de exclusión mutua fácilmente.
El monitor proporciona variables de condición que son accesibles sólo desde dentro del monitor.
Hay dos funciones para operar variables de condición:
88
a. cwait : suspende la ejecución del proceso que llama bajo la condición "c". El monitor está ahora
disponible para otro proceso.
b. csignal : retorna la ejecución de un proceso suspendido después de un cwait, bajo la misma
condición. Si hay varios procesos elige uno de ellos.
Si un proceso de monitor ejecuta un csignal y no hay tareas esperando entonces el csignal de pierde.
Aunque un proceso puede entrar al monitor llamando a cualquiera de sus procedimientos, se puede
decir que el monitor tiene un sólo punto de acceso, custodiado para que sólo un proceso esté en el
monitor en un instante dado. Si existen otros procesos tratando de entrar al monitor, estos se colocan en
una cola de procesos suspendidos esperando la disponibilidad del monitor.
Un proceso dentro de un monitor puede suspenderse a sí mismo, temporalmente, bajo la condición
X ejecutando cwait(x), entonces se coloca en una cola de procesos que esperan que cambie la condición
X entonces ejecuta un csignal(x) que avisa a la cola de condición correspondiente de que la condición a
cambiado.}
3.4.4.1 Intercambio de mensajes
Existen dos requisitos básicos que deben satisfacerse cuando los procesos interactúan entre
sí y que conforman el intercambio de mensajes. Estos son:
1. La sincronización
2.
La comunicación
Los procesos tienen que sincronizarse para cumplir la exclusión mutua, los procesos
cooperantes pueden necesitar intercambiar información. El intercambio de mensajes es un método que
permite que se realice ambas funciones. Este método tiene la ventaja de que es de fácil implementación
en sistemas distribuidos y también en sistemas de multiprocesador y monoprocesador de memoria
compartida. La funcionalidad real del intercambio de mensajes, generalmente, se da por medio de un
par de funciones primitivas:
a. Send: Enviar información.
b. Receive:Recibir información
3.4.4.2 Sincronización
La comunicación de un mensaje implica cierto nivel de sincronización. El receptor no puede recibir
un mensaje hasta que sea enviado por otro proceso. Cuando se ejecuta una primitiva send en un
proceso, existen dos posibilidades:
a. El proceso emisor se bloquea hasta que recibe el mensaje
b. El proceso emisor no se bloquea
89
Igualmente cuando un proceso ejecuta una primitiva receive, existen dos alternativas:
a. Si previamente se ha enviado algún mensaje, éste es recibido y continua la ejecución.
b. Si no hay ningún mensaje esperando entonces:
i. El proceso se bloquea hasta que llega un mensaje
ii. El proceso continúa ejecutando, abandonando el intento de recepción.
El emisor y el receptor pueden ser bloqueantes o no bloqueantes. Existen 3 tipos de
combinaciones pero un sistema sólo implementa uno o dos.
I.
II.
III.
Envío bloqueante, recepción bloqueante: tanto el emisor como el
receptor se bloquean hasta que llega el mensaje; esta técnica se
conoce como rendezvous.
Envío no bloqueante, recepción bloqueante: aunque el emisor puede
continuar, el receptor se bloquea hasta que llega el mensaje solicitado.
Es la combinación más útil.
Envío no bloqueante, recepción no bloqueante: nadie debe esperar.
El send no bloqueante es la forma más natural para muchas tareas de programación
concurrente. Un posible riesgo del send no bloqueante es que por error puede llevar a una situación en la
que el proceso genere mensajes repetidamente. Para el receive, la versión bloqueante es la más natural
para muchas tareas de programación concurrente. En general, un proceso que solicita un mensaje
necesitará la información esperada antes de continuar.
Es importante disponer de alguna forma de especificar en la primitiva send que proceso
va a recibir el mensaje. La mayoría de las implementaciones permiten a los procesos receptores indicar
el origen del mensaje que se va a recibir. Los distintos esquemas para hacer referencia a los procesos en
las primitivas send y receive se encuadran dentro de 2 categorías:
Direccionamiento directo: la primitiva send incluye una identificación específica del proceso de
destino.
i. La primitiva receive se puede manejar de dos formas:
1. Requiere que el proceso designe explícitamente un proceso emisor.
2. El proceso debe conocer de antemano de que proceso espera un mensaje.
En otros casos es imposible especificar el proceso de origen por
anticipado.
2. Direccionamiento indirecto: los mensajes no se envían directamente del emisor al
receptor, sino a una estructura de datos compartidos formada por colas, que pueden
guardar los mensajes temporalmente, que se denominan buzones. Para que los dos
procesos se comuniquen, uno envía mensajes al buzón apropiado y el otro los retira. La
ventaja principal de este tipo de direccionamiento está en que se desacopla a emisor y
receptor, asegurando mayor flexibilidad en el uso de mensajes.
90
Por último existe una clasificación basada en la relación entre emisores y receptores y se encuentra
dada de la siguiente forma:
1. Uno a uno: Llamada también punto a punto, permite que se establezca un
enlace privado entre dos procesos.
2. Muchos a uno: resulta útil para interacciones cliente-servidor. En este
caso el buzón se llama puerto.
3. Uno a muchos: permite un emisor y varios receptores.
La asociación de procesos a buzones puede ser estática o dinámica. Los puertos suelen
estar asociados estáticamente con algún proceso en particular. El puerto se crea y se asigna al proceso
permanentemente. Una relación de uno a uno se define de forma estática y permanentemente. Cuando
hay varios emisores, la asociación a un buzón puede realizarse dinámicamente. Se pueden utilizar
primitivas como conectar o desconectar.
Con base en lo anterior la máquina paralela requerirá que cada buzón se encuentre en
forma local, escuchando las llamadas de los buzones de otros nodos integrales e inclusive del nodo
principal. El control de los procesos deberá de realizarse de manera remota y cada buzón deberá de
tener interacción con los demás buzones.
Para poder tener el control de cada nodo con cada uno de los demás es requerido un
servicio que permita lograr esta interacción de procesos sin que se vea lastimada la seguridad del
proyecto. Este servicio será el RSH que permitirá acceder como determinado usuario a los demás nodos,
cabe mencionar que el estándar MPICH es un entorno de programación que permite explotar la
configuración de la máquina paralela realizando algunas configuraciones adicionales.
Los detalles de como preparar e instalar MPICH incluyen en las secciones siguientes:
a.
El primer paso es descargar MPICH e instalarlo: La vía más fácil para
conseguir el programa es ingresando a
la página Web:
www.mcs.anl.gov/mpi/mpich/download.html.
b.
Se adquiere por la vía anterior el archivo mpich.tar.gz , por lo que se deberá
de des comprimir usando el siguiente comando:
#tar –zxvf mpich.tar.gz
Es necesario pre-compilar el código que se obtuvo al hacer la descompresión de MPICH,
esto se realiza con el la instrucción siguiente:
#./configure -- with-device=ch_p4mpd -- prefix=/usr/local/mpich-1.2.6
91
El proceso de configuración analiza el sistema operativo y determina las opciones y las
direcciones de los archivos; esto también crea el archivo makefile el cual permite crear los archivos
ejecutables. Es necesario decidir donde se instalará MPICH. Este paso no es estrictamente necesario.
A continuación deberemos de compilar el código usando las librerías de GNU gcc las
cuales deberán de estar incluidas en el sistema operativo del nodo principal. Estos ejecutables o
binarios se crean con la siguiente instrucción:
#make
Esto puede tomar algún tiempo en crear los archivos definitivos, por último después de
concluida esta fase será necesario ejecutar la siguiente orden:
#make install
Esto sitúa los archivos en el lugar definitivo para su uso.
Es necesario que el directorio completamente compilado sea copiado a los recursos
compartidos de los nodos integrales, para que el nodo integral pueda ejecutar los demonios
correspondientes. Los archivos en su totalidad del directorio BIN deberán de ser copiados al directorio
/usr/bin de cada nodo integral y del nodo principal.
El método de acceso rsh es más sencillo de utilizar que otros servicios de acceso como el
(secure shell) y consume menos recursos , es necesario incluir rlogin como otro servicio de xinetd, el
cual será útil para probar el funcionamiento del nodo integral y se configura igual que el servicio rsh y
pertenece al demonio xinetd. Este servidor es instalado en defecto, pero por default estos servicios de
son inhabilitados. Para habilitarlos se deberá de correr el siguiente comando:
ssh
#/sbin/chkconfig rlogin on
#/sbin/chkconfig rsh on
Y deberemos reiniciar el servidor xinetd con el siguiente comando:
#/etc/rc.d/init.d/xinetd restart
Hasta este momento no es posible establecer comunicación alguna ya que el servicio esta
denegado Para permitir a los usuarios de rsh ingresar sin contraseña es necesario editar el archivo
/etc/hosts.equiv. Este archivo debe tener los nombres de los nodos integrales y del nodo principal.
92
En el directorio raíz de cada nodo deberá de estar un archivo llamado .rhost en el cual se
encuentran todos los nodos, aceptados. Un ejemplo de este archivo es el siguiente:
Server # Este es el nodo principal
Nodo1
Nodo2
Nodo3
Nodo4
Nodo5
Nodo6
Nodo7
Para permitir el control de las terminales será necesario editar el archivo /etc/securetty
Con el fin de añadir la instrucción:
Pts/1
Con el fin de que acepte terminales remotas. Esto será muy útil porque por medio de estas
terminales podremos administrar algunos procesos de los nodos integrales. La seguridad del acceso es
controlada por el archivo /etc/pam.d/rsh el cual contiene la siguiente información:
auth
auth
auth
auth
account
session
required /lib/security/pam_nologin.so
required /lib/security/pam_securetty.so
required /lib/security/pam_env.so
sufficient /lib/security/pam_rhosts_auth.so
required /lib/security/pam_stack.so service=system-auth
required /lib/security/pam_stack.so service=system-auth
Como se puede observar las claves de autentificación para el sistema se encuentran
establecidas con el comando required o sufficien”. Un comando sufficient le dice al sistema que no es
requerido un password.
La comunicación entre los procesos de MPICH emplean los mecanismos de los puertos
estándares de UNIX generalmente utilizan los puertos en el rango de 1024 y 65535.
La prueba que indica que cada nodo integral está correctamente configurado para aceptar
órdenes remotas se comprueba con la orden:
#Rsh [nombre del nodo] ls.
Con este procedimiento el compilador mpich deberá de encontrarse en funcionamiento y
por lo tanto la máquina paralela deberá de funcionar, pero será necesario hacer las pruebas
correspondientes para asegurarnos que realmente existe la paralelizacion de los procesos y lo más
importante es que puede ejecutar programas paralelos.
La figura 30 muestra hasta el momento en que se establece la comunicación de los
procesos en la máquina paralela en una distribución de mensajes a todos los nodos (broadcast).
93
Figura 30.- Se muestra hasta el momento de como se establece la comunicación de los procesos en la
máquina paralela simulando un broadcast.
94
Para crear un programa en paralelo es necesario conocer cual es la manera como funciona
el compilador paralelo, en este caso el MPICH. Existen tres fases necesarias para crear un código el cual
pueda responder al procesamiento paralelo. Estas fases son:
1.
Escribir la aplicación utilizando el lenguaje C y el compilador gcc,
utilizando las librerías de MPICH. Bastará tan solo con incluir la librería
mpi.h.
2.
Compilar la aplicación utilizando el comando mpicc con la siguiente
sintaxis.
#mpicc –o archivo de salida archivo.c
3.
Ejecutar la aplicación : Es necesario antes que nada cambiar los permisos
para que puedan ser utilizados por todos los nodos en escritura, lectura y
ejecución con los siguientes comandos:
#chmod 777 [ archivo de salida]( generado por mpicc)
#mpirun –np [numero de procesos] archivo (generado por mpicc)
Por ejemplo supongamos un programa simple para identificar un nodo con su nombre.
#include <stdio.h>
#include "mpi.h"
int main(int argc, char* argv[])
{
int numProcs;
int myRank;
// Inicializo MPI
MPI_Init(&argc,&argv);
// Determino el numero de procesos
MPI_Comm_size( MPI_COMM_WORLD, 2);
// Determino el numero de proceso con el que estoy ejecutado
MPI_Comm_rank( MPI_COMM_WORLD, &myRank);
// Muestro el numero de procesos
if(myRank==0)
printf("Numero de procesos : %d\n",numProcs);
fflush(NULL);
// Muestro quien soy
printf("Hola Mundo, soy el proceso : %d\n",myRank);
fflush(NULL);
// Finalizo MPI
MPI_Finalize();
return 0;
}
Como podemos ver el código fuente es similar al estándar de c, en el caso del compilador
95
de C se utiliza GNU GCC, el cual es importante para ingresar las librerias de MPI. La iniciación del
entorno en paralelo es establecida por el comando:
#MPI_Init(&argc,&argv);
El cual tiene esa configuración ya que acepta valores de inicialización al momento de
correr el programa el parámetro mas importante que es pasado a esta función de mpi es el parámetro np
o numero de procesos que es utilizada por mpirun.
El entorno de mpi está configurado por el número de nodos en el archivo machines.linux en el
cual se establece el nodo y el número de procesadores que involucra, para este proyecto tenemos:
Servidor:2
Nodo1:2
Nodo2:2
Nodo3:2
Nodo4:2
Nodo5:2
Nodo6:2
Nodo7:2
Por lo que para hacer referencia a este listado y a estos nodos se utiliza el comando
MPI_COMM_WORLD:
// Determina él numero de procesos
MPI_Comm_size( MPI_COMM_WORLD, &np);
// Determino el numero de proceso con el que estoy ejecutado
MPI_Comm_rank( MPI_COMM_WORLD, &myRank);
Al final del programa el entorno deberá de terminar con el siguiente comando, este
comando solo es ocupado una vez en el código y es obligatorio escribirlo.
// Finalizo MPI
MPI_Finalize();
La librería de MPICH cuenta además de estas funciones las dos primitivas principales de el
intercambio de mensajes como lo es MPI_SEND y MPI_RECEIVE, además de 105 funciones adicionales,
esta librería es un estándar por lo que los programas que funcionan en otro tipo de supercomputadoras
funcionarán correctamente sobre esta máquina paralela. De esta forma garantizo la compatibilidad y se
podrá integrar como nodo integral cualquier computadora o súper computadora que permita el acceso
rsh y MPICH bajo cualquier sistema operativo. Logrando con esto que permita la multiplataforma. En el
anexo 3 se muestran las principales funciones de la librería MPICH.
3.4.5 Experimentos y optimización.
3.4.5.1 Performance de Red
El diseño, la construcción y la utilización de un sistema de alto desempeño requiere de una
medición apropiada y una optimización en la configuración de la red.
96
Para llevar a cabo estos experimentos se realizaron las pruebas con la siguiente configuración:
1. Una Tarjeta de 100 Mbps fast ethernet comercial por nodo conectadas mediante un switch
fast ethernet marca 3com.
2. Una tarjeta de red 1000 Mbps gigabit Ethernet marca 3com por nodo conectadas con un switch
gigabit Ethernet.
Para materializar los dos escenarios en el cluster construido cuyo hardware es heterogéneo,
se tomaron dos nodos de iguales caracteríısticas, en este caso fueron seleccionados por proximidad al
nodo principal.
La primera prueba o benchmark que se realizó fue el llamado Throughput de TCP, que consiste en
evaluar el desempeño del canal de comunicación del cluster a nivel de protocolo TCP. Para esto se
utilizo el modulo TCP del benchmark NetPIPE.(Ver anexo 4.)
Con los resultados obtenidos se realizaron los gráficos de throughput según el tamaño de bloque
transferido, de saturación de la red y de firma ethernet. Estos últimos permiten analizar el tamaño
máximo del paquete para el cual se logra un incremento en el throughput y la latencia de la red
respectivamente.
Obteniendo los siguientes resultados:
a. En fast ethernet (FE) el buffer de envió fue de 16 KB.
b. En gigabit ethernet (GE) el buffer de envío fue de 64 KB
En ambos casos el buffer de recepción es de 85 KB. El buffer de envío para GE se configuró
cambiando las variables del socket TCP del sistema operativo Linux. Utilizando el comando de linux
ifconfig se configuraron los distintos tamaños de MTU, por ejemplo para 3000 bytes se ejecutó:
#ifconfig eth0 mtu 3000
La Figura 31 muestra el throughput en función del tamaño de bloque transferido. A
simple vista, se pueden observar las mejoras resultantes al incrementar la capacidad del medio
de comunicación entre los nodos. Sin embargo, pese a utilizar tarjetas y un switch gigabit ethernet, el
mejor resultado no alcanza los 350 Mbps, esto como resultado de tener una red de orden 1 (red lan). Es
factible incrementar el resultado utilizando una configuración de red indirecta, sin embargo el costo de
esta implementación es muy costoso y mas difícil de implementar.
Con respecto a gigabit ethernet y a la variación en el tamaño del MTU, si se
aumenta a 3000 bytes se logra una mejora pareja de 20 Mbps comparada con 1500 bytes.
También se logra una mejora similar con 9000 bytes, pero su comportamiento es
un poco inestable y por debajo del caso de 3000 bytes. Es posible que el procesador no sea lo
suficientemente rápido para realizar los cálculos que requiere TCP/IP para poder utilizar la capacidad
de ancho de banda que provee gigabit ethernet.
En todos los casos se utilizan paquetes de tamaño menor o igual a 8 bytes, esto se debe a
que para paquetes tan pequeños el benchmark envía un sólo paquete TCP muchas veces y devuelve el
97
promedio de la latencia obtenida. Estos casos no son útiles para analizar el throughput. También
se observa que para cada caso la función crece abruptamente en cierto intervalo de tiempo, es allí
es, donde se obtiene un throughput mayor al incrementar el tamaño del bloque.
El gráfico de saturación de la red, figura 32, se obtiene de graficar el tamaño de bloque
contra el tiempo ambos en escala logarítmica. Se define como punto de saturación a partir del cual al
incrementar el tamaño del bloque el tiempo crece linealmente.
Figura 31.- Throughput para tamaño de sockets por default sobre TCP , donde (F)ast, (E)thernet, (B)onding, M(PICH),
(G)igabit.
98
Figura 32.- Gráfico de saturación.
3.4.5.2 Transmisión de información (throughput) de MPICH
Para realizar la medición del troughput de MPICH, se utilizó de nuevo él modulo MPI del
Los resultados obtenidos se muestran a partir de los gráficos de throughput el cual
depende del bloque transferido, de saturación de la red (figura 32) y de firma ethernet . Figura 33.
En la figura 31, se muestra el throughput contra el tamaño de bloque transferido. Sé graficaron los
resultados para MPICH en fast ethernet y gigabit ethernet con MTU=1500 bytes. Se modificó la
variable SOCKBUFSIZE, y se ejecutó el benchmark para buffers de 32 KB y 128 KB.
benchmark NetPIPE.
99
Figura 33.- Gráfico de firma ethernet.
Para las pruebas de las funciones de MPICH a primera vista se observa que el
desempeño se ve afectado en comparación con los resultados obtenidos para TCP. Esto se debe a la
sobrecarga (overhead) que se agrega sobre el protocolo TCP al implementar funciones de paso de
mensajes más simples para el programador.
En las pruebas de MPICH con su configuración de buffers de envío y se recibieron
mensajes por de 32 KB, lo que ocasiono que el throughput disminuyera en promedio:
a.
18 % para gigabit ethernet
b. 11 % para fast Ethernet.
En el gráfico de saturación de la red, Figura 32, se observa que los puntos de saturación de
MPICH coinciden con los de TCP. Siendo de 4 KB para gigabit ethernet, y para fast ethernet
de 2 KB.
100
Finalmente, en la figura 33, se observa la latencia de MPICH donde es mayor la latencia para el
caso de fast ethernet con 70 µs y en gigabit ethernet con MTU igual a 1500 bytes con 47 µs.
3.4.5.3 Benchmark Time
Esta prueba de desempeño es utilizada para tomar los tiempos de acceso de los distintos comandos
UNIX. Se midieron los tiempos en los siguientes eventos, esto se hace con el comando time que
permite mostrar cualquier comando remoto o local:
1.
2.
3.
4.
Lectura local (ext3)
Lectura remota (NFS)
Lectura local escritura local.
Lectura local escritura remota
Parámetros de prueba:
Para la transferencia de archivos en su categoría de transferencia remota se utilizo las
fuentes del kernel comprimido con un tamaño de 36,7 MB y se selecciono para realizar las pruebas
dos nodos al azar.
La sintaxis básica de este comando es simple y se encuentra representada de la siguiente
forma:
#Time comando
Ejemplo #time rsh nodo1 ls.
Para analizar los gráficos se debe tomar en cuenta la influencia el tamaño de bloque de
cada comando y del archivo de prueba , 8 KB para NFS .En la Figura 34, se muestra el tiempo de
ejecución de los comandos de lectura rm -f, du -sk, ls -R, grep -r y find -name.
101
Figura 34.- Se muestra el tiempo de ejecución de los comandos de lectura rm -f, du -sk, ls -R, grep -r y find -name.
102
CONCLUSIONES Y RECOMENDACIONES
Se realizaron exitosamente pruebas de desempeño, generadas por los benchmarks y se
ejecuto el programa pi para el calculo de la constante pi, en la maquina paralela alcanzando una
capacidad de procesamiento de 1 Gflops, la compatibilidad del sistema se comprobo en este mismo
ejercicio, ya que el programa fue escrito para la origin 2000.
Además se han establecido recomendaciones y especificaciones acerca de la instalación,
configuración y construcción de cada nodo, con énfasis en el hardware de los nodos y la tecnología de
red utilizada. La máquina descrita constituye el primer paso de un programa de desarrollo tecnológico
en materia de supercómputo. Para fines del 2006 se concluirá la construcción de una máquina de
memoria distribuida en configuración de hipercubo de hasta 256 nodos, y para fines del 2007 se
pretende contar con una máquina de memoria compartida de características similares para satisfacer las
aplicaciones más demandantes de la computación técnica y científica.
No se obtuvo mayor rendimiento con gigabit ethernet que utilizando fast ethernet. Como se
desprende de los experimentos de red realizados, por lo que se demuestra que para obtener un
mayor rendimiento en gigabit ethernet es necesario tener en cuenta la arquitectura del nodo antes de
migrar de la tecnología fase ethernet. El máximo throughput alcanzable depende fuertemente del bus
PCI del nodo como así como también la velocidad del procesador y sus técnicas de manejar él
cache.
También es factor de la capacidad que posean las tarjetas de red para acceder al resto
de los componentes que le dan la característica de acceder directo a memoria, realizar checksums de
paquetes y de poseer su propia cache para el manejo de los sockets TCP, siendo necesario un
bus PCI dedicado que le garantice la tasa de transferencia adecuada. No solo depende del hardware el
desempeño de sistema sino también del la correcta configuración del los parámetros del protocolo de
red TCP/IP.
Se debe tener en cuenta que todas las pruebas realizadas con NetPIPE dan un valor
máximo del throughput de la máquina paralela. Y que con el hardware actual es prácticamente imposible
llegar a lograr el 50 % de la capacidad gigabit.
Con respecto a los sistemas de archivos disponibles, se ha podido comprobar que tener
configurados archivos ext3 y NFS, en el cluster brinda mayores posibilidades de uso posibilidades al
momento de implementar una solución a un problema dado. En la aplicación de la prueba con el
comando time, se demostró que NFS no es adecuado para procesamiento paralelo pues no tiene
consistencia en cache. Por último, las particiones ext3 locales en cada uno de los nodos son buenas
para ejecuciones seriales en los nodos internos del cluster pues se evita el uso de la red
innecesariamente.
Con respecto a la compatibilidad de la máquina para poder aceptar lenguajes de
programación de estándares para procesamiento paralelo. La máquina paralela cumplió aceptando el
estándar por de facto MPICH permitiéndole trabajar inclusive con otros sistemas operativos, también
aceptó programas elaborados en otras plataformas que contengan el mismo entandar.
103
Esto permitió a la vez que la máquina paralela acepte otro tipo de programas que acepta el
protocolo estándar MPI, como mpi-povray, el cual es un programa que permite la renderización y el
modelado de gráficos de alto consumo computacional.
104
BIBLIOGRAFÍA
Internetworking with TCP/IP. Volume I. Principles, Protocols and Architecture.
Douglas E. Comer
Editorial Prentice Hall
ISBN: 0-13-216987-8
InternetWorking with TCP/IP. Volume II. Design, Implementation and Internals.
Douglas E. Comer / David L. Stevens
Editorial Prentice Hall
ISBN: 0-13-134677-6
InternetWorking with TCP/IP. Volume III. Cliente - Server Programming and Applications.
Douglas E. Comer / David L. Stevens
Editorial Prentice Hall
ISBN: 0-13-474222-2
UNIX. Programación Avanzada.
Francisco Manuel Márquez García
Editorial RA-MA, 1993
ISBN: 84-7897-112-2
El Lenguaje de Programación C.
Brian W. Kerniguan / Dennis M. Ritchie
Editorial Prentice Hall
ISBN: 968-880-205-0
Aplique Turbo C++
Herbert Schildt
Editorial Mc Graw Hill
ISBN: 0-07-881610-6
Programación y Aplicaciones X Windows.
Eric F. Johnson / Kevin Reichard
Editorial Ra-Ma
ISBN: 84-7897-065-7
El Libro de las Comunicaciones del PC. Técnica, Programación y Aplicaciones.
José A. Caballar
Editorial Ra-Ma
ISBN: 84-7897-212-9
105
UNIX. Manual de Referencia. Sistema V. Versión 3.
Stephen Coffin
Editorial Mc Graw Hill
ISBN: 0-07-881299-2
Sistemas Operativos: Diseño e Implementación.
Andrew S. Tanenbaum
Editorial Prentice Hall
ISBN: 0-13-630302-1
Conéctate al Mundo de Internet.
De Krol / O’Reilly & Associates, Inc.
Editorial Mc Graw Hill
ISBN: 970-10-0637-2
Tratamiento Digital de Imágenes.
Alberto Domingo Ajenjo
Editorial Anaya Multimedia
ISBN: 84-7614-460-1
Robótica, Control, Visión e Inteligencia.
K.S. Fu / R.C. González / C.S.G. Lee
Editorial Mc Graw Hill
ISBN: 0-07-022625-3
106
ANEXO A. BREVE HISTORIA DE TCP/IP
Internet fue propuesta originalmente por la precursora de DARPA, creadora de proyectos
de investigación avanzada de la defensa (advanced research projets agency, ARPA), con una forma de
probar la viabilidad de las redes de conmutación de paquetes. (Cuando el enfoque de ARPA se volvió
de naturaleza militar, se cambio el nombre. Durante su estadía en el proyecto, ARPA previo una red de
líneas rentadas conectadas por nodos de conmutación. La red se denominó ARPAnet y los nodos se
conocieron como procesadores de Mensajes de Internet (IMPs).
ARPAnet inicialmente está formada por cuatro IMPs. En 1971 ARPAnet entró en servicio normal. Las
máquinas utilizaron ARPAnet mediante la conexión a un IMP y utilizando el protocolo "1822" (número
del documento técnico que describía el sistema).
Una necesidad comúnmente reconocida era la capacidad de transferir archivos de una
máquina a otra, así como la capacidad de aceptar registro de entrada remoto no podían ser realizados
hasta que se implementaron en un protocolo conocido como Programa de Control de Red (Network
Control Program, NCP) que cumplía con estos requisitos. Más adelante, a través de FTP (Protocolo de
Transferencia de Archivo, File Transfer Protocol) se añadió el correo electrónico y junto con el registro
y la transferencia de archivos remotos de NCP, se conformaron los servicios de ARPAnet.
Al llegar 1973 resultaba claro que NCP era incapaz de manejar el volumen de tráfico y la nueva
funcionalidad propuesta. Se inició un proyecto con el objetivo de desarrollar un nuevo protocolo. El
nacimiento de TCP/IP y las arquitecturas de las compuertas fueron propuestos por primera vez en 1974.
El artículo publicado por Cerf y Kahn describía un sistema que incluía un protocolo de aplicación
estandarizada,
que
también
utilizaba
confirmaciones
de
extremo
a
extremo.
También, proponían conectividad universal a través de la red. Estas dos ideas eran radicales en un
mundo de hardware y software propietarios, porque permitirían que cualquier tipo de plataforma
participara en la red. El protocolo fue creado y se conoció como TCP/IP.
Ya que dentro de un sistema TCP/IP los datos transmitidos se dividen en pequeños
paquetes, éstos resaltan una serie de características. La tarea de IP es llevar los datos a granel (los
paquetes) de un sitio a otro. Las computadoras que encuentran las vías para llevar los datos de una red a
otra (denominadas enrutadores) utilizan IP para trasladar los datos. En resumen IP mueve los paquetes
de datos a granel, mientras TCP se encarga del flujo y asegura que los datos estén correctos.
Las líneas de comunicación se pueden compartir entre varios usuarios. Cualquier tipo de paquete puede
transmitirse al mismo tiempo, y se ordenará y combinará cuando llegue a su destino. Compare esto con
la manera en que se transmite una conversación telefónica: una vez que establece una conexión, se
reservan algunos circuitos para usted, que no puede emplear en otra llamada, aun si deja esperando a su
interlocutor por veinte minutos.
Los datos no tienen que enviarse directamente entre dos computadoras. Cada paquete pasa
de computadora en computadora hasta llegar a su destino. Éste, claro está, es el secreto de como se
pueden enviar datos y mensajes entre dos computadoras aunque no estén conectadas directamente entre
sí. Lo que realmente sorprende es que sólo se necesitan algunos segundos para enviar un archivo de
a
buen tamaño de una máquina a otra, aunque estén separadas por miles de kilómetros y pese a que los
datos tienen que pasar por múltiples computadoras. Una de las razones de la rapidez es que, cuando
algo anda mal, sólo es necesario volver a transmitir un paquete, no todo el mensaje.
Los paquetes no necesitan seguir la misma trayectoria. La red puede llevar cada paquete de un lugar a
otro y usar la conexión más idónea que esté disponible en ese instante. No todos los paquetes de los
mensajes tienen que viajar, necesariamente, por la misma ruta, ni necesariamente tienen que llegar
todos al mismo tiempo.
La flexibilidad del sistema lo hace muy confiable. Si un enlace se pierde, el sistema usa
otro. Cuando usted envía un mensaje, el TCP divide los datos en paquetes, ordena éstos en secuencia,
agrega cierta información para control de errores y después los lanza hacia fuera, y los distribuye. En el
otro extremo, el TCP recibe los paquetes, verifica si hay errores y los vuelve a combinar para
convertirlos en los datos originales. De haber error en algún punto, el programa TCP destino envía un
mensaje solicitando que se vuelvan a enviar determinados paquetes.
TCP/IP es el protocolo común utilizado por todas las computadoras son conectadas a
Internet, de manera que éstos puedan comunicarse entre sí. Hay que tener en cuenta que en Internet se
encuentran conectadas computadoras de clases muy diferentes y con hardware y software incompatibles
en muchos casos, además de todos los medios y formas posibles de conexión. Aquí se encuentra una de
las grandes ventajas del TCP/IP, pues este protocolo se encargará de que la comunicación entre todos
sea posible. TCP/IP es compatible con cualquier sistema operativo y con cualquier tipo de hardware.
TCP/IP no es un único protocolo, sino que es en realidad lo que se conoce con este nombre es un
conjunto de protocolos que cubren los distintos niveles del modelo OSI. Los dos protocolos más
importantes son el TCP (Transmisión Control Protocol) y el IP (Internet Protocol), que son los que dan
nombre al conjunto. La arquitectura del TCP/IP consta de cinco niveles o capas en las que se agrupan
los protocolos y que se relacionan con los niveles OSI de la siguiente manera:
a) Aplicación: Se corresponde con los niveles OSI de aplicación, presentación y sesión. Aquí se
incluyen protocolos destinados a proporcionar servicios, tales como correo electrónico (SMTP),
transferencia de archivos (FTP), conexión remota (TELNET) y otros más recientes como el
protocolo HTTP (Hypertext Transfer Protocol).
b) Transporte: Coincide con el nivel de transporte del modelo OSI. Los protocolos de este nivel,
tales como TCP y UDP, se encargan de manejar los datos y proporcionar la fiabilidad necesaria
en el transporte de los mismos.
c) Internet: Es el nivel de red del modelo OSI. Incluye al protocolo IP, que se encarga de enviar los
paquetes de información a sus destinos correspondientes. Es utilizado con esta finalidad por los
protocolos del nivel de transporte.
d) Físico: Análogo al nivel físico del OSI.
e) Red: Es la interfaz de la red real. TCP/IP no especifica ningún protocolo concreto, así es que
corre por las interfaces conocidas, como por ejemplo: 802.2, CSMA/CD, X.25, etc.
b
El protocolo TCP/IP necesita funcionar sobre algún tipo de red o de medio físico que
proporcione sus propios protocolos para el nivel de enlace de Internet. Por este motivo hay que tener en
cuenta que los protocolos utilizados en este nivel pueden ser muy diversos y no forman parte del
conjunto TCP/IP. Sin embargo, esto no debe ser problemático puesto que una de las funciones y
ventajas principales del TCP/IP es proporcionar una abstracción del medio de forma que sea posible el
intercambio de información entre medios diferentes y tecnologías que inicialmente son incompatibles.
Para transmitir información a través de TCP/IP, ésta debe ser dividida en unidades de menor tamaño.
Esto proporciona grandes ventajas en el manejo de los datos que se transfieren y, por otro lado, esto es
algo común en cualquier protocolo de comunicaciones. En TCP/IP cada una de estas unidades de
información recibe el nombre de "datagrama" (datagram), y son conjuntos de datos que se envían como
mensajes independientes.
Para mucha gente los términos TCP/IP y Ethernet van juntos casi en forma automática,
principalmente por razones históricas, así como por el simple hecho de que más redes basadas en
Ethernet con TCP/IP que cualquier otro tipo. Ethernet se desarrolló originalmente en el Centro de
Investigaciones de Palo Alto de XEROX (PARC), como un paso hacia un sistema electrónico de
comunicaciones de oficina y desde entonces ha crecido en capacidad y popularidad.
Ethernet es un sistema de hardware proporcionado para las capas de vínculo de datos y
física del modelo OSI. Como parte de los estándares de Ethernet, se establecen los tipos de cable y las
velocidades de difusión. Hay varias versiones distintas de Ethernet, cada una de ellas con una velocidad
diferente de transferencia de datos. La más común es Ethernet versión 2, también conocida como
10base5, Thick Ethernet e IEEE 802.3 (Institute of Electrical and Electronic Engineers, IEEE). Este
sistema tiene una velocidad de 10 megabits por segundo.
Ambos tienen sus propios procesos para el empaquetado de la información: TCP/IP utiliza
direcciones de 32 bits, en tanto que Ethernet emplea un esquema de 48 bits.
El protocolo de transporte de clase 4 del modelo OSI (al que con frecuencia se le llama
TP4), y TCP tienen numerosas similitudes, pero también algunas diferencias. A continuación se dan a
conocer los puntos en que los dos protocolos son iguales. Los dos protocolos están diseñados para
proporcionar un servicio de transporte seguro, orientado a conexión y de extremo a extremo, sobre una
red insegura, que puede perder, dañar, almacenar y duplicar paquetes. Los dos deben enfrentarse a los
peores problemas como sería el caso de una subred que pudiera almacenar una secuencia válida de
paquetes y más tarde volviera a entregarlos.
Los dos protocolos también son semejantes por el hecho de que los dos tienen una fase de
establecimiento de conexión, una fase de transferencia de datos y después una fase de liberación de la
conexión. Los conceptos generales del establecimiento, uso y liberación de conexiones también son
similares, aunque difieren en algunos detalles. En particular, tanto TP4 como TCP utilizan la
comunicación ida-vuelta-ida para eliminar las dificultades potenciales ocasionadas por paquetes
antiguos que aparecieran súbitamente y pudiesen causar problemas. Sin embargo, los dos protocolos
también presentan diferencias muy notables.
Primero, TP4 utiliza nueve tipos diferentes de UTP, en tanto que TCP sólo tiene uno. Esta
c
diferencia trae como resultado que TCP sea más sencillo, pero al mismo tiempo también necesita una
cabecera más grande, porque todos los campos deben estar presentes en todas las TPDU. El mínimo
tamaño de la cabecera TCP es de 20 octetos; el mínimo tamaño de la cabecera TP4 es de 5 octetos. Los
dos protocolos permiten campos opcionales, que pueden incrementar el tamaño de las cabeceras por
encima del mínimo permitido.
Una segunda diferencia es con respecto a lo que sucede cuando los dos procesos, en forma
simultánea, intentan establecer conexiones entre los mismos dos TSAP (es decir, una colisión de
conexiones). Con TP4 se establecen dos conexiones duplex independientes; en tanto que con TCP, una
conexión se identifica mediante un par de TSAP, por lo que solamente se establece una conexión.
Una tercera diferencia es con respecto al formato de direcciones que se utiliza. TP4 no
especifica el formato exacto de una dirección TSAP; mientras que TCP utiliza números de 32 bits.
El concepto de calidad de servicio también se trata en forma diferente en los dos
protocolos, constituyendo la cuarta diferencia. TP4 tiene un mecanismo de extremo abierto, bastante
elaborado, para una negociación a tres bandas sobre la calidad de servicio. Esta negociación incluye al
proceso que hace la llamada, al proceso que es llamado y al mismo servicio de transporte. Se pueden
especificar muchos parámetros, y pueden proporcionarse los valores: deseado y mínimo aceptable. A
diferencia de esto, TCP no tiene ningún campo de calidad de servicio, sino que el servicio subyacente
IP tiene un campo de 8 bits, el cual permite que se haga una relación a partir de un número limitado de
combinaciones de velocidad y seguridad.
Una quinta diferencia es que TP4 permite que los datos del usuario sean transportados en
la TPDU CR, pero TCP no permite que los datos del usuario aparezcan en la TPDU inicial. El dato
inicial (como por ejemplo, una contraseña), podría ser necesario para decidir si se debe, o no, establecer
una conexión. Con TCP no es posible hacer que el establecimiento dependa de los datos del usuario.
Las cuatro diferencias anteriores se relacionan con la fase de establecimiento de la conexión. Las cinco
siguientes se relacionan con la fase de transferencia de datos. Una diferencia básica es el modelo del
transporte de datos. El modelo TP4 es el de una serie de mensajes ordenados (correspondientes a las
TSDU en la terminología OSI). El modelo TCP es el de un flujo continuo de octetos, sin que haya
ningún límite explícito entre mensajes. En la práctica, sin embargo, el modelo TCP no es realmente un
flujo puro de octetos, porque el procedimiento de biblioteca denominado push puede llamarse para sacar
todos los datos que estén almacenados, pero que todavía no se hayan transmitido.
Cuando el usuario remoto lleva a cabo una operación de lectura, los datos anteriores y
posteriores al push no se combinarán, por lo que, en cierta forma un push podría penarse como si
definiesen una frontera entre mensajes.
La séptima diferencia se ocupa de cómo son tratados los datos importantes que necesitan
de un procesamiento especial. TP4 tiene dos flujos de mensajes independientes, los datos normales y
los acelerados multiplexados de manera conjunta. En cualquier instante únicamente un mensaje
acelerado puede estar activo. TCP utiliza el campo acelerado para indicar que cierta cantidad de
octetos, dentro de la TPDU actualmente en uso, es especial y debería procesarse fuera de orden.
d
La octava diferencia es la ausencia del concepto de superposición en TP4 y su presencia en
TCP. Esta diferencia no es tan significativa como al principio podría parecer, dado que es posible que
una entidad de transporte ponga dos TPDU, por ejemplo, DT y AK en un único paquete de red.
La novena diferencia se relaciona con la forma como se trata el control de flujo. TP4
puede utilizar un esquema de crédito pero también se puede basar en el esquema de ventana de la capa
de red para regular el flujo. TCP siempre utiliza un mecanismo de control de flujo explícito con el
tamaño de la ventana especificado en cada TPDU.
La décima diferencia se relaciona con este esquema de ventana. En ambos protocolos el
receptor tiene la capacidad de reducir la ventana en forma voluntaria. Esta posibilidad genera
potencialmente problemas, si el otorgamiento de una ventana grande y su contracción subsiguiente
llegan en un orden incorrecto. En TCP no hay ninguna solución para este problema; en tanto en TP4
éste se resuelve por medio del número de subsecuencia que está incluido en la contracción, permitiendo
de esta manera que el emisor determine si la ventana pequeña siguió, o precedió, a la más grande.
Finalmente, la onceava y última diferencia existente entre los dos protocolos, consisten en
la manera como se liberan las conexiones. TP4 utiliza una desconexión abrupta en la que una serie de
TPDU de datos puede ser seguido directamente por una TPDU DR. Si las TPDU de datos se llegaran a
perder, el protocolo no los podría recuperar y la información, al final se perdería. TCP utiliza una
comunicación de ida-vuelta-ida para evitar la pérdida de datos en el momento de la desconexión. El
modelo OSI trata este problema en la capa de sesión. Es importante hacer notar que la Oficina Nacional
de Normalización de Estados Unidos estaba tan disgustada con esta propiedad de TP4, que introdujo
TPDU adicionales en el protocolo de transporte para permitir la desconexión sin que hubiera una
pérdida de datos. Como consecuencia de esto, las versiones de Estados Unidos y la internacional de
TP4 son diferentes.
Es importante señalar que el protocolo IP explicado anteriormente, o mejor dicho la
versión de éste es la más utilizada actualmente, pero hace muy poco tiempo salió una nueva versión
llamada la número 6. Las diferencias no son muchas, pero mejoran muchos aspectos de la antigua, ésta
no es muy utilizada, pero creemos que es necesario explicar como funciona, para poder hacer una
comparación con la antigua.
Una red TCP/IP transfiere datos mediante el ensamblaje de bloques de datos en paquetes,
cada paquete comienza con una cabecera que contiene información de control; tal como la dirección del
destino, seguido de los datos. Cuando se envía un archivo por la red TCP/IP, su contenido se envía
utilizando una serie de paquetes diferentes. El Internet protocol (IP), un protocolo de la capa de red,
permite a las aplicaciones ejecutarse transparentemente sobre redes interconectadas. Cuando se utiliza
IP, no es necesario conocer que hardware se utiliza, por tantota aplicación corre en una red de área
local. El Transmissión Control Protocol (TCP); un protocolo de la capa de transporte, asegura que los
datos sean entregados, que lo que se recibe, sea lo que se pretendía enviar y que los paquetes que sean
recibidos en el orden en que fueron enviados. TCP terminará una conexión si ocurre un error que haga
la transmisión fiable imposible.
e
La primera vez que uno oye hablar de Internet, casi siempre es en relación con el nombre
TCP/IP, en muchos casos se habla de TCP/IP como "el protocolo que se usa en Internet" o "que hace
funcionar Internet". Como explicación coloquial es válida, pero IP y TCP son dos protocolos con
funciones específicas y diferenciadas. Pero cuando se habla de TCP/IP no se está hablando únicamente
de estos dos protocolos, sino de toda una familia con fines diversos, que han constituido la arquitectura
de la actual red Internet. Entre ellos, por supuesto, se encuentra el fundamental, Internet Protocol o IP,
encargado de generar el internet virtual. TCP proporciona el nivel de transporte más empleado, pero es
posible encontrar otros protocolos de transporte en Internet como UDP. Otros protocolos vienen a
servir de apoyo a éstos, como ICMP y, para realizar una comunicación, será necesario resolver muchos
otros problemas como la correspondencia entre direcciones físicas y lógicas para lo que se emplean
protocolos como ARP, RARP y BOOTP; el mantenimiento de una información de rutas consistente, a
través de protocolos de encaminamiento como GGP, EGP, OSPF o RLP; la administración de red para
lo que se define otros protocolos como NSMP la accesibilidad de una serie de servicios finales en
forma de aplicación a través de otra serie de protocolos como TELNET, FTP,TFTP o SMTP. A todos
ellos y otros muchos, se alude cuando se menciona TCP/IP de forma genérica.
Desde el momento que surgió Ethernet la necesidad de realizar una conexión entre
distintas redes, se fija como primer objetivo ocultar no sólo el hardware sino, también, el tipo de red
sobre el que se sustenta la comunicación, para lo que se define una serie de servicios universales de
comunicación.
Este objetivo de transparencia puede alcanzarse a través de los programas de aplicación que de
encarguen de tratar en cada máquina con la red y el hardware específico con que ésta cuenta
proporcionando un sistema uniforme en la red. Sin embargo, este enfoque si bien es más intuitivo y
concreto y a veces se emplea en programas reducidos para resolver un problema bien definido, presenta
grandes problemas en cuanto el escenario aparece como un conjunto heterogéneo más o menos
numeroso y, sobre todo, cuando se persigue cierta generalidad. Así, si en determinado momento se
desea incorporar una nueva funcionalidad, es necesario desarrollar código para cada diferente
arquitectura.
Una posibilidad consiste en ceder una API (interfaces de programas de aplicaciones) de
comunicaciones implementando internamente una arquitectura de protocolos. Desde este punto de vista
se generará una inter-red virtual interconectada a través de un protocolo encargado de generar esta
imagen de red virtual, al que se denomina protocolo de red. Esta arquitectura puede estar constituida
por una serie de protocolos de propósito general, independiente de las aplicaciones, que se encarguen
de transmitir fragmentos de información desde un origen a un destino sin importarles la naturaleza de la
información que transportan. Por otra parte, al tratar los protocolos con fragmentos de información es
posible realizar un tratamiento más eficiente.
Con esta perspectiva, los programadores de aplicaciones emplean la API del sistema para
realizar la comunicación necesaria sin necesidad de preocuparse por los mecanismos reales de esta
comunicación separando una problemática de otra.
f
ANEXO B. CRONOLOGÍA DEL PROCESAMIENTO EN
PARALELO.
Año
1955
Suceso
El IBM 704 usa circuitos aritméticos paralelos binarios junto con una unidad de
punto flotante que aceleraban significativamente el desarrollo de operaciones numéricas frente
a las tradicionales unidades aritmético-lógicas (el arquitecto del sistema es Gnetne Amdahl). A
pesar de su velocidad (aprox. 5kFLOPS), las operaciones de E/S resultaban lentas y
representaban un cuello de botella. Como solución a este problema la IBM decide incorporar
procesadores de E/S independientes (y posteriormente llamados canales) en modelos
posteriores de la 704 y su sucesor, la IBM 709.
1956
IBM inicia el proyecto 7030 (también llamado STRETCH) para producir una
supercomputadora para el Laboratorio Nacional Los Álamos. Su meta es crear una máquina
100 veces más poderosa que las de su época.
Se inicia el proyecto LARC (Livermore Automatic Research Computer), el
diseño de una supercomputadora para el Laboratorio Nacional Livermore.
1958
El proyecto Atlas comienza como una aventura conjunta entre la Universidad de Manchester y
Ferranti Ltd. El arquitecto principal es Tom Kilburn.
Bull anuncia la Gamma 60 con múltiples unidades funcionales e instrucciones fork
y join en su conjunto de instrucciones. Llegaron a construirse 19.
John Cocke y Daniel Slotnick discuten el uso del paralelismo en cálculos
numéricos en un memorandum de la IBM. Posteriormente Slotnick propone la SOLOMON,
una máquina SIMD con 1024 elementos de procesamiento de 1 bit, cada uno con memoria
para 128 valores de 32 bits. La máquina nunca se construye pero es el punto de arranque para
trabajos posteriores.
1959
Sperry Rand entrega el primer sistema LARC, el cual dispone de un procesador
de E/S independiente que operaba en paralelo con una o dos unidades de procesamiento. Sólo
se construyeron dos.
IBM entrega su primera STRETCH, que presentaba la anticipación de
instrucciones y corrección de errores. Se construyen 8. La tecnología es reutilizada en la IBM
7090.
La primera IBM 7090 es entregada. Esta es la versión transistorizada de la IBM
709.
I
1960
Control Data inicia el desarrollo de su CDC 6600.
E. V. Yevreinov en el Instituto de Matemáticas en Novosibirsk (IMN) comienza
sus trabajos en arquitecturas fuertemente acopladas de paralelismo burdo con interconexiones
programables.
1962
CDC entrega su primera CDC 1604, máquina similar a la IBM 7090 caracterizada
por palabras de 48 bits y ciclos de memoria de 6µs.
La computadora Atlas es operacional. Es la primera máquina en usar memoria
virtual y paginación, su ejecución de instrucciones es en oleoducto (pipelined), y contiene
unidades aritméticas de punto flotante y punto fijo separadas. Su desempeño es de
aproximadamente 200kFLOPS.
C. A. Petri describe las Redes de Petri, un concepto teórico para la descripción y
análisis de las propiedades de sistemas concurrentes.
Burroughs introduce su multiprocesador MIMD simétrico D825. Cuenta de 1 a 4
CPUs que acceden a 1 ó 16 módulos de memoria usando un conmutador de barraje cruzado
(crossbar switch). Las CPUs son similares al posterior B5000, el sistema operativo es
simétrico con una cola compartida (shared ready queue).
1964
Control Data Corporation empieza a producir la CDC 6600, la primer
supercomputadora en ser un éxito técnico y comercial. Cada máquina tiene una CPU de 60 bits
y 10 unidades periféricas de procesamiento (PPUs). La CPU utiliza un marcador para manejar
la dependencia de instrucciones.
IBM inicia el diseño del Advanced Computer System (ACS), capaz de manejar
hasta siete instrucciones por ciclo. El proyecto fue cerrado en 1969 pero muchas de las técnicas
fueron incorporadas en posteriores computadores.
Daniel Slotnick propone la construcción de una computadora paralela masiva
para el Laboratorio Nacional Livermore, pero la Comisión de Energía Atómica da el contrato a
CDC, que construye la STAR-100. Slotnick consigue el financiamiento de la U.S. Air Force y
su diseño evoluciona a la ILLIAC-IV. La máquina es construida en la Universidad de Illinois,
con Burroughs y Texas Instruments como principales subcontratistas. La Advanced Scientific
Computer (ASC) de la Texas Instruments crece junto a esta iniciativa.
II
1965
General Electric, el MIT, y AT&T Bell Laboratories comienzan a trabajar en
El objetivo del proyecto es la construcción de un sistema operativo de propósito
General de memoria compartida, multiprocesamiento y tiempo compartido. Edsger Dijkstra
describe y nombra el Problema de las Regiones Críticas. Mucho del trabajo posterior en
sistemas concurrentes es dedicado a encontrar eficientes y seguras formas de manejar regiones
críticas.
Multics.
James W. Cooley y John W. Tukey describen el Algoritmo de la Transformada
Rápida de Fourier, que es posteriormente uno de los más grandes consumidores de ciclos de
punto flotante.
1976
Marzo
La Cray-1 es la primera computadora en usar el procesamiento vectorial y tenía
una capacidad de procesamiento pico de 100 MFLOPS. Frecuencia de reloj 110 MHz; 9 ns
ciclo del núcleo.
Cortesia de M. en C. Eduardo René Rodríguez Ávila [13].
13 Extracto de Principia, Sección de historia de la computación, URL: http://homepage.mac.com/eravila/history.html
III
ANEXO C. FUNCIONES BÁSICAS DE MPICH
Aún cuando MPI incluye más de 125 funciones, se puede trabajar en la creación de
cualquier programa en paralelo con sólo seis. Estas funciones se describen a continuación tanto en su
sintaxis para Fortran como para C. También se describe el tipo de dato de aquellos argumentos de las
funciones que no son inherentes a MPI. Los argumentos se describen en la tabla I y ahí se define el tipo
de dato de los argumentos MPI.
MPI predefine una serie de variables y de estructuras de datos inherentes a su
funcionamiento y estas se encuentran en un archivo de encabezado que debe ser incluido en todo
código que use MPI. La siguiente instrucción debe agregarse en la parte inicial del código:
a. En Fortran: include "mpif.h".
b.
En C: #include <mpi.h>
Las siguientes instrucciones inicializan el ambiente de trabajo en paralelo:
a.
En fortran: Call MPI_INIT (ierr).
b.
En C: MPI_INIT(&argc,argv)
Con las siguientes instrucciones MPICH inicializa varias estructuras de datos inherentes al
ambiente de trabajo MPI. Si el ambiente no se puede inicializar, el programa se detiene por completo:
a.
En fortran: Call MPI_COMM_SIZE(comm.,size,ierr).
b.
En C: MPI_COMM_SIZE(comm.., size)
La siguiente función, regresa el número de procesadores así como un comunicador por
default, comm = MPI_WORLD_COMM, el cual indica el conjunto de todos los procesadores asignados a la
ejecución del programa. Posteriormente, el usuario puede definir otros comunicadores para designar
subconjuntos de procesadores.
a. En fortran: call MPI_COMM_RANK (comm, rank, ierr).
b.
En C: MPI_COMM_RANK(comm, rank)
IV
La primitiva send, envía un mensaje a otro procesador. El procesador origen espera que el
procesador destinatario haya recibido el mensaje antes de continuar trabajando.
a.
Fortran: call MPI_SEND(buf, count, datatype, dest, tag, comm, ierr).
b.
En C: MPI_Send(&buf, count, datatype, dest, tag, comm).
Se dispone a recibir un mensaje de parte de otro procesador. El procesador destinatario no
puede continuar su trabajo hasta haber recibido dicho mensaje.
a.
Fortran: call MPI_RECV(buf, count, datatype, source, tag, comm, status, ierr).
b.
En C: MPI_Recv(&buf, count, datatype, source, tag, comm, &status)
La siguiente función, cierra el ambiente de trabajo en paralelo una vez finalizado el
trabajo:
a. Fortran: call MPI_FINALIZE(ierr).
b. En C: MPI_Finalize(.)
Los argumentos de las funciones tienen el siguiente significado:
Al iniciar la ejecución de un programa en paralelo, la instrucción MPI_COMM_SIZE regresa
un comunicador por default: MPI_COMM_WORLD, el cual contiene los números que corresponden a cada
uno de los procesadores que se asignan para la ejecución del programa. Esta información es utilizada
por la mayoría de las funciones MPI para saber cuáles son los procesadores de la computadora que se
han de comunicar entre si para efectuar dicha función. Posteriormente, el usuario puede seleccionar
subconjuntos de procesadores a partir de los procesadores definidos en MPI_COMM_WORLD para
obtener otros comunicadores. El tipo de dato de MPI_COMM_WORLD es definido como MPI_Comm en
mpif.h, mpi.h.
Los tipos de datos reconocidos por MPI son definidos en la tabla II siguiente.
V
Argc
Argv
Buf
Comm
Número de argumentos en la línea de comandos (C).
Argumentos en la línea de comandos (C).
Variable que contiene la información a comunicar.
Comunicador que incluye el número de cada procesador miembro de un ambiente de
trabajo en paralelo. Al iniciar la ejecución de un programa en paralelo, la instrucción
MPI_COMM_SIZE regresa un comunicador por default: MPI_COMM_WORLD, el cual
contiene los números que corresponden a cada uno de los procesadores que se asignan
para la ejecución del programa.
Cantidad de elementos contenidos en buf.
Count
Tipo de la variable buf. Los tipos de datos reconocidos por MPI son definidos en la tabla
datatype
2.
Número lógico del procesador al cual se ha transferido información.
Dest
Entero que identifica una situación asociada con error en proceso. Algunas
errorcode
implementaciones de MPI regresan este valor como si fuera producto de una instrucción
return errorcode.
Código de error de implementación que es igual a MPI_SUCCESS sí la función termina
Iré
con éxito; de otra manera, el valor de ierr corresponde a un valor que depende de la
implementación de MPI.
Número lógico del procesador.
Rank
Operación a ejecutar.
Op
Tamaño de buffer de salida.
Outsize
Posición del último elemento alimentado o recuperado de un buffer.
position
Variable que contiene la información a recibir.
Recvbuf
Cantidad de elementos contenidos en recvbuf.
recvcount
recvdatatype Tipo de la variable recvbuf. Los tipos de datos reconocidos por MPI son definidos en la
tabla II.
En combinación con las funciones MPI_TEST y MPI_WAIT proporciona información
Request
sobre el estado de una función MPI_ISEND o MPI_IRECV.
Variable que contiene la información a comunicar.
sendbuf
Cantidad de elementos contenidos en senbuf.
sendcount
senddatatype Tipo de la variable senbuf. Ver tabla II.
Número de procesadores asignados al programa.
Size
Número lógico del procesador que ha enviado información.
Source
Arreglo de tamaño MPI_STATUS_SIZE. Auxiliar en conocer el estado de ejecución de
Status
una función MPI.
Identifica el envío. Generalmente es cero y sólo cambia cuando se ha de comunicar más
Tag
de un envío.
Número lógico del procesador a quien se envía información.
Target
Tabla I. Argumentos de funciones MPI.
VI
MPI
C
MPI
Fortran
MPI_CHAR
signed char
MPI_INTEGER
INTEGER
MPI_SHORT
signed short int MPI_REAL
REAL
MPI_INT
signed int
MPI_DOUBLE_PRECISION DOUBLE PRECISION
MPI_LONG
signed long int
MPI_COMPLEX
COMPLEX
MPI_UNSIGNED_CHAR unsigned char
MPI_LOGICAL
LOGICAL
MPI_UNSIGNED_SHORT unsigned short int MPI_CHARACTER
CHARACTER
MPI_UNSIGNED
unsigned int
MPI_BYTE
MPI_UNSIGNED_LONG unsigned long int MPI_PACKED
MPI_FLOAT
float
MPI_DOUBLE
double
MPI_LONG_DOUBLE
long double
MPI_BYTE
MPI_PACKED
Tabla II. Correspondencia entre tipos de datos en MPI, Fortran y C.
VII
ANEXO D. NETPIPE.
NetPIPE es una herramienta independiente del funcionamiento del protocolo que
representa visualmente la red bajo una gran variedad de condiciones. Realiza las pruebas simples de los
mensajes tipo ping-pong que incrementan el tamaño de procesamiento entre dos procesos a través de
una red o dentro de un sistema de SMP.
El tamaño del mensaje puede elegirse a intervalos regulares, y con perturbaciones leves,
con el fin de proporcionar una prueba completa del sistema de comunicación. Cada punto de
referencias implica muchas pruebas del ping-pong para proporcionar una sincronización exacta. Los
estados latentes son calculados dividiendo el tiempo redondo del viaje por la mitad para los mensajes
pequeños generalmente en octetos menores a 64 Kbytes.
NetPIPE fue desarrollado originalmente en la LCC por Quinn Snell, Armin Mikler y Juan
Gustafson. El código ha sido desarrollado y mantenido por Dave Turner desde octubre de 2000 con
contribuciones diversas. Los módulos que se han agregado desde su creación involucran librerías de
prueba para PVM, TCGMSG, y los estándares para MPI y Mpi-2.
El archivo de instalación es llamado Netpipe_3.6.2.tar.gz y para instalarlo es necesario hacer
lo siguiente:
1. Colocar el archivo Netpipe_3.6.2.tar.gz en un directorio llamado netpipe.
2.
Descomprimir el archivo utilizando el comando tar –zxvf Netpipe_3.6.2.tar.gz
3. Utilizar el comando ./configure para crear el archivo make.
4. Utilizar el comando make para crear el ejecutable y a continuación make install
para que el archivo se encuentre completamente instalado.
A
Descargar