Programacion concurrente, paralela y Kambalam

Anuncio
PROGRAMA CONCURRENTE.
16/01/08
Un programa concurrente es un programa que tiene mas de una linea logica de ejecucion, es decir, es
un programa que parece que varias partes del mismo se ejecutan simultaneamente. Un ejemplo de de
esto es un programa que realice determinada funcion y, simultaneamente, exponga datos en la pantalla.
Un programa concurrente puede correr en varios procesadores simultaneamente o no. Esta importancia
de la concurrencia es especialmente destacable en sistemas operatives como Linux, que ademas de
concurrentes, presentan unos mecanismos de concurrencia estables.
El concepto fundamental de la programacion concurrente es la nocion de proceso. El termino proceso
fue utilizado por primera vez por los diseñadores del sistema Multics en los años 60’s. Desde entonces,
el termino proceso, utilizado a veces como sinonimo de tarea, ha tenido muchas definiciones. A
continuacion se presentan algunas:
Un programa en ejecucion.
 Una actividad asincrona
 El “espiritu animado” de un procedimiento
 El “centro de control” de un procedimiento en ejecucion
 Lo que se manifiesta por la existencia de un “bloque de control del proceso” en el sistema
operativo
 La entidad a la que se asignan los procesadores
 La unidad “despachable”
Aunque se han dado muchas otras definiciones, no hay una definicion universalmente aceptada, pero el
concepto de “Programa en ejecucion” parece ser el que se utiliza con mas frecuencia. Un programa es
una entidad inanimada; solo cuando un procesador le “infunde vida” se convierte en la entidad
“activa” que se denomina proceso.
Un proceso pasa por una serie de datos discretos. Se dice que un proceso se esta ejecutando (estado de
ejecucion), si tiene asignada la CPU. Se dice que un proceso esta listo(estado listo) si pudiera utilizar
la CPU en caso de haber una disponible. Un proceso esta bloqueado (estado bloqueado) si se esta
esperando que suceda algun evento antes de poder seguir la ejecucion.
EN
EJECUCION
BLOQUEADO
DESPACHAR
EXPIRACION
DE TIEMPO
DESPERTAR
LISTO
BLOQUEAR
Los procesos secuenciales se han usado tradicionalmente para estudiar la concurrencia. ADA, es un
lenguaje que maneja procesos secuenciales.
Tanto sistemas paralelos como distribuidos son concurrentes; pero un sistema concurrente puede ser
no paralelo ni distribuido, como acontece, por ejemplo, con los sistemas operatives monoprocesadores
y multitarea, que son concurrentes pero no son paralelos ni distribuidos.
Como ya se menciono los procesos son concurrentes si existen simultanemente. La concurrencia es el
punto clave de la Multiprogramacion, el Multiproceso y el Proceso distribuido y fundamental para el
diseño de sistemas operativos. La concurrencia comprende un gran numero de cuestiones diseño,
incluyendo la comunicacion entre procesos, comparticion y competencia por lo recursos,
sincronizacion de la ejecucion de varios procesos y asignacion del tiempo de procesador a los
procesos.
La concurrencia puede presentarse en tres contextos diferentes:



Varias aplicaciones: La multiprogramacion se creo para permitir que el tiempo de procesador
de la maquina fuese compartido dinamicamente entre varios trabajos o aplicaciones activas.
Aplicaciones estructuradas: Como aplicacion de los principios del diseño modular y la
programacion estructurada, algunas aplicaciones pueden implementarse eficazmente como un
conjunto de procesos concurrentes.
Estructura del Sistema Operativo: Las mismas ventajas de estructuracion son aplicables a los
programadores de sistema y se han comprobado que algunos sistemas operatives estan
implementados con un conjunto de procesos.
Principios Generales de la concurrencia
En un sistema multiprogramado con un unico procesador, los procesos se intercalan en el tiempo para
dar la apariencia de ejecucion simultanea
En un sistema con varios procesadores, no solo es posible intercalar los procesos, sino tambien
superponerlos. La intercalacion y la superposicion representan formas de ejecucion muy diferentes.
Ambas tecnicas pueden contemplarse como ejemplos de proceso concurrente y ambas plantean los
mismos problemas. En el caso de un sistema monoprocesador, los problemas creados por la
multiprogramacion parten del hecho de que la velocidad relativa de ejecucion de los procesos no
puede predecirse.
Los procesos concurrentes pueden funcionar en forma totalmente independiente unos de otros, o
pueden ser asincronos, lo cual significa que en ocasiones requieren cierta sincronizacion o
cooperacion.
Cuando dos o mas procesos llegan al mismo tiempo a ejecutarse, se dice que se ha presentado una
concurrencia de procesos. Es importante mencionar que para que dos o mas procesos sean
concurrentes, es necesario que tengan alguna relacion entre ellos como puede ser la cooperacion para
un determinado trabajo o el uso de informacion o recursos compartidos, por ejemplo: en un sistema de
un procesador, la multiprogramacion es una condicion necesaria pero no suficiente para que exista
concurrencia, ya que los procesos pueden ejecutarse de forma totalmente independiente.
Las interacciones entre procesos tienen dos formas:
Primero comunicacion.- Si tenemos varios procesos ejecutando y queremos que interactuen
entre ellos para solucionar un determinado problema, y por tanto, necesitan intercambiar informacion,
es decir necesitan comunicarse. Esto implica el intercambio de datos entre procesos, ya sea por medio
de un mensaje implicito o a traves de variables compartidas. Una variable es compartida entre procesos
si es visible al codigo de esos procesos.
Mediante la comunicacion se consigue que la ejecucion de un proceso influya en la ejecucion de otro.
Segundo sincronizacion.- La sincronizacion (sinonimo de espera) es habitualmente necesaria
cuando dos procesos se comunican puesto que la velocidad a la que se ejecutan no es predecible. Para
que un proceso se communiqué con otro, aquel debera realizar acciones que sea capaz de detectar y
esto solo funciona si realizar y detectar ocurren en este orden. Relaciona el seguimiento de un proceso
con el seguimiento de otro. En otras palabras, la sincronizacion implica intercambio de informacion de
control entre procesos.
La necesidad de contar con comunicacion y sincronizacion puede verse en terminos de competencia y
cooperacion entre procesos. La competencia ocurre cuando el proceso requiere el uso exclusivo de un
recurso, como cuando dos procesos compiten por usar la misma impresora, o para reservar un asiento
en un vuelo. Aqui la sincronizacion es necesaria para garantizar a un proceso el uso exclusivo de un
recurso. La cooperacion ocurre cuando dos procesos trabajan en distintas partes del mismo problema y
por lo general incluyen a la comunicacion y a la sincronizacion.
PROGRAMACIÓN PARALELA
Gracias a las progresivas mejoras tecnológicas desarrolladas durante las décadas pasadas, la capacidad
de procesamiento de los ordenadores ha aumentado cada vez más. De todas formas, estas mejoras
tecnológicas - integración VLSI, aumento de la frecuencia de reloj en los procesadores, tienen un
límite físico, por lo cual el aumento de capacidad de procesamiento no es ilimitado. Hay una serie de
problemas que no se pueden resolver con este tipo de ordenadores: la circulación atmosférica y el
tiempo, la evolución de las galaxias, problemas de sistemas expertos e inteligencia artificial, etc.
Para la resolución de estos problemas se está investigando intensamente desde hace dos décadas en el
procesamiento paralelo. Hoy en día ya tenemos ordenadores comerciales que trabajan en paralelo, y
esta parece ser la principal línea de investigación para mejorar la potencia de los ordenadores.
De hecho, esta técnica ya ha llegado a los ordenadores personales gracias a la posibilidad de añadir
placas que contienen varios procesadores más. Esta línea de investigación ha dado lugar a los
multiprocesadores y los multicomputadores. Sin embargo, que un ordenador tenga una mayor
capacidad de procesamiento no se consigue simplemente colocando un número mayor de
procesadores, sino que supone una gran complejidad, tanto en el hardware como en el software.
Vamos a describir brevemente esta complejidad, centrándonos en los aspectos de programación.
En primer lugar, no todo problema puede ser paralelizado. Hay problemas que son inherentemente
secuenciales y por lo tanto es difícil conseguir su ejecución en paralelo. De todas formas, la mayoría
de los problemas científicos descritos anteriormente se pueden describir fácilmente en paralelo.
En segundo lugar, necesitamos una arquitectura paralela que permita ejecutar una determinada
aplicación, pero también un lenguaje adecuado que permita expresar el paralelismo del problema. Este
punto ha dado lugar a diversas líneas de trabajo e investigación que vamos a describir a continuación:
a) Verificación de programas paralelos. Un programa en paralelo no tiene nada que ver con un
programa secuencial, pues su comportamiento es muy diferente. Las técnicas de verificación para
programas secuenciales no sirven en el caso paralelo, por lo que se tiene que desarrollar toda la teoría
formal de verificación de programas. Se puede citar los trabajos de [Kel76] y [Owi76] como dos
trabajos pioneros que explican a fondo el problema de la verificación. Hay que tener en cuenta que en
el caso paralelo nos aparecen problemas tales como el deadlock, livelock, race conditions, el no
determinismo, etc., que complican abundantemente la verificación formal de un programa.
b) Abstracción del hardware de la máquina. Mientras está claro que los lenguajes secuenciales son
independientes de la máquina en que se ejecutan, no se puede decir lo mismo de los lenguajes
paralelos. Es fácil que una independencia de la máquina conduzca a una pérdida de potencia, por lo
que habitualmente se encuentran ligados en mayor o menor medida a una arquitectura determinada. Un
ejemplo de unión estrecha lo tenemos con el lenguaje Occam [Inm88], cuyo desarrollo está vinculado
al del transputer [Inm89]. Lo habitual es conseguir un grado de abstracción media, es decir, abstraer
los detalles de más bajo nivel (tipo de conexión entre los procesadores, potencia de cada procesador,
mecanismo de acceso a memoria por los procesadores, etc.), para dejar sólo la referencia al modelo de
procesamiento empleado (sistólicos, SIMD, MIMD, etc.).
c) Lenguajes síncronos o asíncronos. La mayoría de los lenguajes de programación desarrollados son
asíncronos, es decir, son no deterministas y están basados en las nociones de procesos y
comunicaciones entre procesos.
Ejemplos de lenguajes de este tipo son el ADA, MODULA, Occam, etc. y las extensiones paralelas
para Fortran, C, etc. Pero también se han desarrollado lenguajes síncronos, para aquellos problemas de
tiempo real deterministas, tales como interfaces para teclado o ratón, video juegos, problemas de
regulación automática, etc. Un ejemplo de este tipo de lenguaje es el ESTEREL [Ber84], que fue el
primero que se desarrolló.
d) Paralelización automática. El problema que tiene el desarrollo de nuevos lenguajes de
programación es que todo el software desarrollado hasta la fecha se queda obsoleto. Para evitar esto,
una de las líneas de investigación más potenciadas en los últimos años es la paralelización automática.
La idea es que sea el compilador el encargado de determinar qué zonas del programa se van a ejecutar
en paralelo, a partir de un programa escrito en un lenguaje secuencial. Los primeros desarrollos en esta
línea fueron para los casos de paralelismo de datos y en particular para operaciones que trataran con
vectores, por lo que se denominó a dichos compiladores vectorizadores.
Generalmente, el lenguaje secuencial mas empleado en este grupo es el Fortran, quizás porque la
mayoría de los supercomputadores utilizan este lenguaje. Un vectorizador Fortran analiza la secuencia
de instrucciones para una posible traducción a instrucciones vectoriales. Lógicamente, es
extremadamente dependiente de la máquina objeto, puesto que debe tener en cuenta las especiales
características de su hardware. Los principales análisis que realiza un vectorizador son: determinación
del flujo de procesamiento entre subprogramas, chequeo de las relaciones de dependencias entre los
subprogramas, análisis de las variables y reemplazo de los bucles internos por instrucciones
vectoriales. Un estudio de muchas de estas técnicas puede encontrarse en [Pad86]. Para máquinas de
diseño MIMD esta técnica ha dado buenos resultados en sistemas de memoria compartida
(multiprocesadores), habiendo poco trabajo aún desarrollado en el caso de memoria distribuida
(multicomputadores), donde se puede citar el trabajo recogido en [Ter89].
Especiales problemas se presentan cuando aparecen estructuras de datos recursivos, así como en el
manejo de los arrays y de los punteros, debido a la dependencia de unos datos con otros y a no poder
determinar exactamente esa relación entre ellos, conduciendo a veces a situaciones de ambigüedad.
Asimismo, otro de los problemas es el análisis interprocedural y el estudio del paralelismo anidado.
Diversos estudios y resoluciones de estos problemas pueden encontrarse en [Nic89], [Li88] y [Hen90].
e) Estilos de programación en paralelo. Tenemos dos estilos de programación en paralelo: el
paralelismo en los datos (data parallelism) o el paralelismo en el flujo de control del programa
(control parallelism).
El paralelismo en los datos se basa en realizar múltiples operaciones en paralelo sobre un gran
conjunto de datos, mientras que el paralelismo en el control del programa se basa en tener
simultáneamente varios flujos de control ejecutándose en paralelo. Últimamente se está prestando una
mayor atención al paralelismo dirigido por los datos. El lenguaje C* [Ros86] desarrollado por
Thinking Machines Corporation es un ejemplo de la importancia que está tomando este estilo de
paralelismo.
No hay que confundir esta dicotomía de estilos de programación como sinónimos a la oposición que
hay en el diseño del hardware de una máquina entre SIMD y MIMD. Si bien es cierto que los
computadores SIMD son más adecuados para ser programados en un estilo de paralelismo de datos,
también pueden ejecutar un paralelismo de control por interpretación, dependiendo el que tal
interpretación sea práctica de los detalles de coste de esa máquina determinada. De la misma forma,
aunque un diseño MIMD es más adecuado para ser programado en un estilo de paralelismo con varios
flujos de control, también se puede programar para un algoritmo con paralelismo en los datos.
En el caso de máquinas con diseño MIMD se utilizan 2 estilos de programación: el estilo fork-join y el
estilo SPMD (Single Program Múltiple Data) [Kar87]. En el estilo fork-join un proceso se divide en
varios subprocesos mediante la instrucción fork, y espera hasta que finalizan, reflejado mediante la
instrucción join que sirve además para sincronizar los procesos.
Este estilo se utiliza solo en máquinas MIMD de memoria compartida. En el estilo SPMD todos los
procesos ejecutan el mismo programa, pudiendo discriminar algunos segmentos de código en función
del identificador de ese proceso. Aunque este estilo es muy cómodo para el desarrollo de programas en
paralelo, presenta la dificultad de conseguir una carga balanceada entre los diversos procesadores, ya
que la carga para cada proceso puede ser muy diferente especialmente en aquellos problemas con
estructuras irregulares.
Como podemos observar, el estilo de programación SPMD es un híbrido entre los dos estilos anteriores
para el caso de máquinas MIMD. Este estilo de programación se utiliza tanto para MIMD de memoria
compartida como MIMD de paso de mensajes.
KANBALAM
La Universidad Nacional Autónoma de México puso en marcha el equipo KanBalam, la
supercomputadora más poderosa de América Latina, la cual tiene una capacidad de procesamiento
demás de siete billones de operaciones aritméticas por segundo.
KanBalam, que tuvo una inversión de tres millones de dólares, es la número 126 en la clasificación de
las 500 supercomputadoras más rápidas en el mundo; la 44 en cuanto a sitios académicos, y la 28
respecto a las supercomputadoras instaladas en universidades “Con este equipo de alto rendimiento se
multiplica la capacidad de la institución, así como la infraestructura que la UNAM pone al servicio de
México”, señaló el rector Juan Ramón De la Fuente. “Un adelanto como éste generará más conciencia
social respecto a la importancia de la ciencia, la tecnología y la investigación como palancas
ineludibles del desarrollo, destacó el rector.
También advirtió que el déficit tecnológico ha tenido consecuencias graves en proceso de desarrollo
del país.
“Hay campos que son virtualmente desconocidos, como la nanotecnología”, subrayó.
Por su parte el titular de la Dirección General de Servicios de Cómputo Académico (DGSCA),
Alejandro Pisanty Baruch, explicó que con esta herramienta se atiende la necesidad de la comunidad
universitaria y nacional al actualizar las capacidades de cálculo que requiere para participar en el
ámbito global del quehacer científico de manera competitiva y equilibrada. “Este nuevo equipo refleja
los avances tecnológicos en materia de cálculo numérico actual y marca un salto cualitativo para el
supercómputo en la UNAM desarrollado en los últimos 15 años”, agregó el director de la DGSCA.
Ambos directivos coincidieron en definir la nueva supercomputadora como una “máquina repatriadota
de cerebros”, ya que los científicos que permanecen en el extranjero y los que trabajan en México
podrán realizar los más complejos procesos de cómputo en la computadora que ya se encuentra en
Ciudad Universitaria. Pisanty informó que el supercómputo en la institución, es utilizado para
investigaciones en áreas como astrofísica, física de partículas, química cuántica, estudios del clima y la
contaminación, ingeniería sísmica, geología, ciencias biológicas y de materiales, entre otras
disciplinas. Tan sólo en los últimos tres años sus usuarios han generado más de 230 publicaciones
científicas con reconocimiento internacional.
El equipo permitirá a los científicos mexicanos establecerse entre los mejores del mundo y
representará una importante herramienta para que continúen aportando conocimientos en proyectos
internacionales de la mayor importancia.
La supercomputadora fue nombrada KanBalam en memoria de este matemático maya que vivió entre
635-702, y que fue reconocido por la precisión en sus cálculos relacionados con el dominio del tiempo.
Los datos
 Inversión de tres millones de dólares.
 Es el número 126 en la clasificación de las 500 supercomputadoras más rápidas en el mundo.
 Es la 44 en cuanto a sitios académicos, y la 28 respecto a las instaladas en universidades.
 Cuenta con mil 368 procesadores y una memoria RAM total de 3 mil gigabytes.
 Tiene una capacidad de procesamiento de más de siete billones de operaciones aritméticas por
segundo.
 Los mil 368 procesadores de este nuevo equipo están organizados en 337 nodos de cálculo,
cada uno con dos procesadores de dos núcleos.
De las matemáticas mayas a gigabytes KanBalam será utilizado para investigaciones en áreas como
astrofísica, física de partículas, química cuántica, estudios del clima y la contaminación, ingeniería
sísmica, geología, ciencias biológicas y de materiales, entre otras disciplinas. Tan sólo en los últimos
tres años, sus usuarios han generado más de 230 publicaciones científicas con reconocimiento
internacional.
El nuevo equipamiento cuenta con mil 368 procesadores (cores AMD Opteron de 2.6 GHz), una
memoria RAM total de 3 mil gigabytes y un sistema de almacenamiento de 160 terabytes. Ofrece a la
comunidad académica y de investigación nacional una capacidad de cálculo sin precedente en el país.
Los mil 368 procesadores de este nuevo equipo están organizados en 337 nodos de cálculo, cada uno
con dos procesadores de dos núcleos y ocho gigabytes de memoria, así como con cinco nodos
especiales con 64 Gigabytes. Su sistema de almacenamiento se conforma con 768 discos. Los nodos de
procesamiento y los dispositivos de almacenamiento se comunican a través de una red de alta
velocidad, con tecnología Infiniband de 10 gigabytes por segundo.
KanBalam es siete mil veces más potente que la primera supercomputadora de la Universidad
Nacional, CRAY-YMP (1991), y 79 veces más poderosa en cálculo que el equipo AlphaServer SC45,
adquirido en 2003.
Descargar