Programación Paralela

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 7

ITSM Programación paralela

Introducción.
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 -integación VLSI, aumento
de la frecuencia de reloj en los procesadores, etc. 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.

Desarrollo.
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. 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.

Luis Angel Ortega Huesca Ing. Sistemas Computacionales


ITSM Programación paralela

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. 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.

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
más 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.
Para máquinas de diseño MIMD esta técnica ha dado buenos resultados en
sistemas de memoria compartida (multiprocesadores), habiendo poco

Luis Angel Ortega Huesca Ing. Sistemas Computacionales


ITSM Programación paralela

trabajo aún desarrollado en el caso de memoria distribuida


(multicomputadores).

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.

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*
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 Multiple
Data). 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

Luis Angel Ortega Huesca Ing. Sistemas Computacionales


ITSM Programación paralela

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.
Herramientas de desarrollo.
Inicialmente, los ordenadores se programaban en código máquina (tiras de unos y
ceros), dedicándose un ordenador a un solo usuario. El desarrollo del primer
compilador de Fortran al principio de los años 60, junto con toda la teoría de
lenguajes formales desarrollada en aquella época por Chomsky dió lugar al
desarrollo de los lenguajes de alto nivel, siendo la tendencia actual el desarrollo de
lenguajes de programación cercanos al lenguaje natural. Junto al desarrollo de
lenguajes y compiladores, pronto se empezaron a desarrollar herramientas que
facilitaran la tarea de programar una aplicación determinada. Estas herramientas
recibieron el nombre de depuradores, pues ayudaban al programador a depurar un
programa de los errores que tuviera y hacerlo por tanto más eficaz.
Posteriormente vino el desarrollo de interfaz gráfica, pues de manera visual se
mejora notablemente todo el proceso de programar y depurar una aplicación. La
facilidad de interfaz gráfica ha permitido que haya muchas más personas que se
acerquen al apasionante mundo de la programación, ya que la principal
característica de estos entornos es que son entornos agradables al usuario,
permitiéndole desarrollar programas de una forma cómoda y eficaz. En el caso del
paralelismo sucede de forma similar, aunque con una complejidad añadida por el
hecho de tener que pensar en paralelo. Aunque en el mundo real las cosas
suceden en paralelo, el programador está acostumbrado a programar unas
acciones después de otras, es decir, secuencialmente. La programación en
paralelo no es una cosa sencilla. El paso de un programa secuencial a un
programa paralelo es una tarea habitualmente laboriosa, complicada y necesitada
de varios intentos antes de llegar a una solución con éxito. El principal problema
que se encuentra el programador es que la intuición le falla, es decir, no es fácil
imaginar cómo se va a desarrollar la ejecución de un programa paralelo. Para
solventar este problema, se han desarrollado diversas herramientas que ayudan
en la tarea de programar en paralelo.
En el caso de los multicomputadores (máquinas MIMD con memoria distribuida) el
desarrollo de un programa paralelo no se limita tan solo a dividir el programa
secuencial en procesos, sino -y esto lo difícil del asunto hay que coordinar
(sincronizar) y comunicar estos procesos de cara a la correcto resolución del
problema, conseguir una carga balanceada en cada procesador y determinar de
qué forma arrancan y finalizan los diversos procesos. Las ayudas para resolver
esta falta de intuición en los programadores se ha dirigido desde una doble
perspectiva:

Luis Angel Ortega Huesca Ing. Sistemas Computacionales


ITSM Programación paralela

a) El desarrollo de compiladores que a partir de código secuencial (o cuasi-


secuencial) se encarguen de paralelizar la aplicación.
b) El desarrollo de herramientas que permitan simular o emular un programa
paralelo para una determinada máquina y ayuden al programador a ir
adquiriendo una forma de pensar en paralelo.
Casos de estudio.
La programación paralela involucra muchos aspectos que no se presenta en la
programación convencional (secuencial). El diseño de un programa paralelo tiene
que considerar entre otras cosas, el tipo de arquitectura sobre la cual se va a
ejecutar el programa, las necesidades de tiempo y espacio que requiere la
aplicación, el modelo de programación paralelo adecuado para implantar la
aplicación y la forma de coordinar y comunicar a diferentes procesadores para que
resuelvan un problema común. Existen varias herramientas disponibles para
programación paralela. En el curso utilizaremos PVM y MPI, dado su alta
disponibilidad para computadoras diferentes y su aceptación en la comunidad
académica.
Ventajas y desventajas.
Existen algunos factores que trabajan en contra de la eficiencia del paralelismo y
pueden atenuar tanto la ganancia de velocidad como la ampliabilidad.
 Costes de inicio: en una operación paralela compuesta por miles de
proceso, el tiempo de inicio puede llegar ser mucho mayor que le tiempo
real de procesamiento, lo que influye negativamente en la ganancia de
velocidad.
 Interferencia: como lo procesos que se ejecutan en un proceso paralelo
acceden con frecuencia a recursos compartidos, pueden sufrir un cierto
retardo como consecuencia de la interferencia de cada nuevo proceso en la
competencia, este fenómeno afecta tanto la ganancia de velocidad como la
ampliabilidad.
 Sesgo: normalmente es difícil dividir una tarea en partes exactamente
iguales, entonces se dice que la forma de distribución de los tamaños es
sesgada.
El procesamiento paralelo implica una serie de dificultades a nivel programación
de software, es difícil lograr una optimización en el aprovechamiento de los
recursos de todas las CPU con el que se esté trabajando sin que se formen cuello
de botella. En muchas de las ocasiones no es posible el trabajar con equipos
multiprocesadores dado el elevado costo que este representa, así que solo se
dedica a ciertas áreas de investigación especializada o proyectos
gubernamentales o empresariales.
IDE.

Luis Angel Ortega Huesca Ing. Sistemas Computacionales


ITSM Programación paralela

 X10 (IBM): Lenguaje orientado a objetos, basado en Java (pero no es una


extensión).

 Chapel (Cray): es un lenguaje paralelo emergentes se están desarrollando


en Cray Inc. con el objetivo de hacer frente a este problema y hacer la
programación paralela mucho más productivo y de acceso general.

 Unified Parallel C (UPC): es una extensión del lenguaje de programación


C diseñado para computación de alto rendimiento en máquinas paralelas,
incluyendo tanto aquellas con un espacio de memoria global (SMP y
NUMA) como aquellas con un espacio de memoria distribuido, como los
clusters. El programador observa un único espacio de memoria compartida
donde las variables se pueden leer y escribir desde cualquier procesador,
pero cada reside físicamente en un único procesador, con el que se dice
que tiene afinidad. UPC usa un modelo de computación SPMD (Single
Program Multiple Data) donde la cantidad de procesos se puede indicar
tanto en tiempo de compilación como al inicio de la ejecución del programa.

 ParaSail: Tucker Taft, ha diseñado un nuevo lenguaje, llamado Parallel


Specification and Implementation Language (ParaSail), específicamente
para la escritura de software para procesadores multinúcleo. El lenguaje
tiene como objetivo evitar los problemas que suelen ocurrir cuando se
trabaja con chips de varios núcleos.

ParaSail tiene un aspecto similar a C o C++, dos de los lenguajes más


usados. La diferencia es que divide automáticamente un programa en miles
de tareas más pequeñas que después se pueden propagar a través de
núcleos: un truco conocido como 'pico-threading', que maximiza el número
de tareas que se llevan a cabo en paralelo, sin importar el número de
núcleos.

 ZPL: Es un lenguaje de programación con paralelismo implícito orientado a


operaciones con vectores o arreglos, creado por Lawrence Snyder de la
Universidad de Washington en 1993 (el primer compilador disponible para
uso general, fue liberado en 1997). El objetivo de ZPL es el facilitar la
programación de ejecutables que corran eficientemente en una gran
variedad de arquitecturas secuenciales y paralelas.

Luis Angel Ortega Huesca Ing. Sistemas Computacionales


ITSM Programación paralela

Los programas de ZPL no contienen directivas o instrucciones


explícitamente paralelas, dado que es el compilador del lenguaje el único
responsable de extraer el paralelismo inherente a las operaciones
presentes en un programa. ZPL explota exclusivamente el modelo de
paralelismo de datos.

Conclusión.
Se ha presentado el estado actual de las herramientas para programación paralela
para el caso de multicomputadores. Se han presentado las dos tendencias que
hay en el desarrollo de facilidades de programación: la paralelización automática
de código a partir de un programa secuencial y el uso de entornos de
programación que permiten la simulación de un programa paralelo, permitiendo de
esta forma que el programador se acostumbre a pensar en paralelo.
Todo esto se están desarrollando de una forma algo lenta quizá, pues la
arquitectura paralela ya es una realidad en nuestros días, ahora el reto se
presenta a los programadores que deseen enfocarse al paradigma del cómputo
paralelo pues ahora la necesidad recae en tener unos buenos programadores de
computadoras paralelas y como logramos ver ya es posible, pues contamos con
algunos cuantos lenguajes paralelos, así como con sus compiladores.

Luis Angel Ortega Huesca Ing. Sistemas Computacionales

También podría gustarte