Computo Paralelo

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

Maestría en Ciencias de la Ingeniería.

Programación
Dra. María Lucila Morales Rodríguez

Sobrevilla Reséndiz Erick

Cómputo Paralelo
Introducción.

En la actualidad es posible identificar un número creciente de


problemas de elevada complejidad computacional en diferentes
campos de las ciencias, cuyas implementaciones requieren ser
estudiadas para lograr la reducción de sus tiempos de
ejecución. La computación paralela y distribuida es, en muchos
casos, un método eficaz para la solución de este tipo de
problemas.

La infraestructura de computación paralela híbrida entre


procesadores y tarjetas gráficas es un entorno de desarrollo
que permite el diseño, implementación y ejecución de soluciones
paralelas. Está conformada por varios componentes tecnológicos
que intervienen en la reducción del tiempo de ejecución de las
aplicaciones.

El cómputo en paralelo se ha convertido en una de las


herramientas computacionales de mayor relevancia, ya que
permite dividir el problema en partes, de modo tal que cada
parte pueda resolverse en un procesador diferente,
simultáneamente con las demás.
Cómputo Paralelo.

Los sistemas de cómputo con procesamiento en paralelo surgen


de la necesidad de resolver problemas complejos en un tiempo
razonable, utilizando las ventajas de memoria, velocidad de
los procesadores, formas de interconexión de estos y
distribución de la tarea, a los que en su conjunto denominamos
arquitectura en paralelo. Entenderemos por una arquitectura en
paralelo a un conjunto de procesadores interconectados capaces
de cooperar en la solución de un problema [1].

Con frecuencia un modelo de programación se ajusta mejor a un


tipo de arquitectura que a otra. Sin embargo, un modelo
programación puede usarse sobre una arquitectura diferente a
la que le es natural.

Hablando de modelos de programación en paralelo se puede


destacar el siguiente, el modelo de Paralelismo sobre datos
que es la concurrencia que se obtiene cuando se aplica la misma
operación sobre todos los elementos de un conjunto.
Figura 1. Representación del funcionamiento del modelo de
paralelismo sobre datos.

Por otra parte se encuentra el modelo de paralelismo de paso


de mensajes en el cual un cómputo está compuesto de uno o más
procesos que se comunican enviando y recibiendo mensajes de
otros procesos.

Por último haré mención del modelo de Memoria compartida en


donde los procesos comparten direcciones de memoria donde
existe una comunicación mediante las variables que comparten y
una sincronización a través de mecanismos para el acceso
exclusivo a los datos.

Los sistemas computacionales actuales están constituidos por


varios componentes, por lo que son sistemas paralelos, pero
estos componentes organizados de formas distintas:

• Sistemas con varios cores y una memoria común a todos

• Un sistema multicore con una tarjeta gráfica con su propia


memoria

• Redes de multicores, cada uno con su memoria y


posiblemente su tarjeta gráfica

• Varias redes conectadas entre sí de forma remota[2].

En la mayoría de los ámbitos científicos deben resolverse


problemas computacionales muy complejos y con altos
requerimientos en tiempo y recursos.

Para resolver este tipo de problemas, el paralelismo se ha


convertido en una de las herramientas computacionales de mayor
relevancia, ya que permite dividir el problema en partes, de
modo tal que cada parte pueda ejecutarse un procesador
diferente, simultáneamente con las demás. Para esto, es
necesario contar con hardware que permita realizar cómputo
paralelo, y lenguajes de programación para el desarrollo de
aplicaciones con paralelismo [3].

La programación en paralelo ofrece una herramienta


computacional imprescindible para aprovechar el uso de
múltiples procesadores y en la resolución de problemas que no
pueden resolverse mediante técnicas clásicas. En el proceso de
diseño de programas paralelos hay que tener en cuenta lo
siguiente [4]:

1. Descomposición: involucra el proceso de dividir el problema


y la solución en partes más pequeñas. Es decir, determinar qué
parte del software realiza qué tarea.

2. Comunicación: se debe determinar cómo se lleva a cabo la


comunicación entre los distintos procesos o computadoras, cómo
sabe un componente de software cuando otro terminó o falló,
cómo solicita un servicio a otro componente, qué componente
debe iniciar la ejecución, etc.

3. Sincronización: se debe determinar el orden de ejecución de


los componentes, si todos los componentes inician su ejecución
simultáneamente, o alguno debe esperar mientras otros trabajan,
etc.

El empleo de técnicas de programación que hacen uso de memoria


compartida supone una inevitable complicación en el proceso de
programación, depuración y detección de errores. A pesar de
ello las ventajas son más que notorias, y permite maximizar la
concurrencia y el paralelismo, y por tanto el rendimiento de
las máquinas, tanto en arquitecturas multiprocesador como en
monoprocesador. En las arquitecturas multiprocesador,
obviamente, se maximizan los recursos de computación y en las
monoprocesador ayuda a evitar que determinadas operaciones
acaparen el uso de CPU durante más tiempo del debido.

Clasificación de Flynn.

Es una clasificación clásica de arquitecturas de computadoras


que hace alusión a sistemas con uno o varios procesadores,
Michael J. Flynn la publicó por primera vez en 1966 y por
segunda vez en 1970. Esta taxonomía se basa en el flujo que
siguen los datos dentro de la máquina y de las instrucciones
sobre esos datos. Se define como flujo de instrucciones al
conjunto de instrucciones secuenciales 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:

Figura 2.
Clasificación de Flynn de cómputo paralelo.

Single Instruction stream, Single Data stream (SISD). Los


sistemas Monoprocesador de este tipo 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, un
ejemplo de estos sistemas son las máquinas secuenciales
convencionales.

Figura 3. Ejemplo de máquina SISD.

Single Instruction stream, Multiple Data stream (SIMD). Estos


sistemas de procesador Matricial 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.

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.
Figura 4. Ejemplo de una máquina SIMD.

Multiple Instruction stream, Single Data stream (MISD).


Sistemas con múltiples instrucciones Array Sistólico que operan
sobre un único flujo de datos. Este tipo de sistemas no ha
tenido implementación hasta hace poco tiempo. Los sistemas MISD
se contemplan de dos maneras distintas:

Varias instrucciones operando simultáneamente sobre un único


dato.

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.
Figura 6. Ejemplo de máquina MISD.

Multiple Instruction stream, Multiple Data stream (MIMD).


Sistemas con un flujo de múltiples instrucciones
Multiprocesador que operan sobre múltiples datos. Estos
sistemas empezaron a utilizarse antes de la década de los 80s.
Son sistemas con memoria compartida que permiten ejecutar
varios procesos simultáneamente (sistema multiprocesador).

Figura 7. Ejemplo de máquina MIMD.

Librerías de cómputo paralelo en java.

Framework Fork/Join.

Este framework realiza la paralelización de tareas de forma


recursiva, aplicando el principio Divide y Vencerás. Existirá
un umbral bajo el cual una tarea será indivisible, definido
por el tamaño de la misma. Una vez el tamaño de las sub-tareas
llegue al umbral, el rendimiento de las mismas disminuirá en
caso de seguir dividiéndolas.

Fork/Join se encuentra en la librería java.util.concurrent.


Esta librería contiene una serie de interfaces y clases con
las que se puede implementar concurrencia o paralelismo en los
códigos. Entre otros mecanismos, encontramos los semáforos,
los tipos atómicos, las barreras o los cerrojos, clases de la
librería que pueden implementarse.

Librerías de cómputo paralelo en Python.

MPI ("Message Passing Interface", Interfaz de Paso de


Mensajes).

Es un estándar que define la sintaxis y la semántica de las


funciones contenidas en una biblioteca de paso de mensajes
diseñada para ser usada en programas que exploten la existencia
de múltiples procesadores.

El paso de mensajes es una técnica empleada en programación


concurrente para aportar sincronización entre procesos y
permitir la exclusión mutua, de manera similar a como se hace
con los semáforos, monitores, etc.

Su principal característica es que no precisa de memoria


compartida, por lo que es muy importante en la programación de
sistemas distribuidos.

Los elementos principales que intervienen en el paso de


mensajes son el proceso que envía, el que recibe y el mensaje.

Python es uno de los lenguajes de programación más populares


de procesamiento y ciencia de datos en general. El entorno
proporciona una gran cantidad de librerías y frameworks que
facilitan la informática de alto rendimiento.
Python tiene varios APIs (Interfaz de Programación de
Aplicaciones) para hacer programación paralelo/concurrente:

celery: Un distribuidor de tareas de alto nivel. Las tareas


están en cola y ejecutaron concurrentemente utilizando diversos
paradigmas como multiprocessing o gevent.

Concurrent.Futures: una parte del módulo de la biblioteca


estándar que proporciona una capa de abstracción de alto nivel
incluso sobre roscas. Los hilos se modelan como tareas
asincrónicas.

threading: la manera estándar de trabajar con hilos en Python.


Es un contenedor de API de alto nivel sobre la funcionalidad
expuesta por el módulo _thread, que es una interfaz de bajo
nivel sobre la implementación de hilos del sistema operativo.

gevent and greenlets: Greenlets, también llamados micro-hilos


de rosca, son las unidades de ejecución que puede ser
programado de forma colaborativa y puede realizar tareas
simultáneamente sin mucho arriba.

multiprocessing: Similar al módulo threading, que ofrece una


interfaz muy similar, pero con procesos en lugar de hilos.
Referencias.

[1] Carrillo Ledesma, Antonio. Introducción al cómputo en


paralelo. Editorial Facultad de Ciencias de la UNAM. 2018.

[2] Giménez, Domingo. Introducción a la Computación Paralela.


Universidad de Murcia. 1ª ed.

[3] Weinbach, Natalia Luz. Paradigmas de Programación en


Paralelo: Paralelismo Explícito y Paralelismo Implícito.
Universidad Nacional Del Sur, Bahía Blanca, Argentina 2008.

[4] Cameron Hughes and Tracey Hughes. Parallel and Distributed


Programming Using C++. Addison Wesley, Aug. 2003.

[5] Díaz Gracia, Noelia; Díaz Sanzo, Lucas; Fernández Méndez,


Aida. Programación de SM de Memoria Compartida. Arquitectura y
Tecnología de Computadores –Escuela de Ingeniería Informática
- Universidad de Oviedo Campus de Viesques E-33271 Gijón

También podría gustarte