Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Se genera por la necesidad de aprovechar de mejor manera los recursos de hardware para
la creación de programas. Estos aspectos son útiles para mejorar la escalabilidad y tiempos
de respuesta de procesamiento.
Para diseñar programas paralelos, se tiene dos estrategias:
Paralelizar un programa secuencial
Es basado en que sé que se tiene una gran cantidad de programas secuenciales, lo cuales
fueron diseñados para un determinado hardware. Sin embargo, en la actualidad el hardware
a mejorado su prestación de una manera exponencial, obligando a los programadores a
reestructurar sus programas para aprovechar de mejor manera estos nuevos adelantos.
Para poder realizar la paralelización de un programa secuencial se lo puede realizar de
diversas maneras:
1. Paralelización automática: Va a depender tanto del hardware como del sistema
operativo para obtener un código paralelo eficiente para un programa secuencial.
Las características que este debe tener son las siguientes:
a. Distribuir las tareas (datos, instrucciones, procesos, programas, etc.) a través
del conjunto de procesadores.
b. Manejar la sincronización de tareas y accesos de memoria.
c. Uso adecuado del bus de control.
d. Administración de memoria compartida y/o distribuida.
e. Utilizar sistemas operativos (Multiusuario, Multitarea, Multihilo) que
manejen los conceptos de paralelismo.
* Tome en cuenta que estas consideraciones esta realizadas para multiprocesadores.
2. Librerías paralelas: A través del tiempo se han ido desarrollando diferentes librerías,
las cuales han permitido transformar funciones de programas secuenciales a
programas paralelos, con lo que se ha mejorado tiempos de respuesta y eficiencia en
los mismo (Mejoramiento del tiempo de cómputo). Las características de las librerías
paralelas son las siguientes:
a. Administrar a diferentes niveles el paralelismo (bit, instrucción, tarea).
b. Que sean adaptables a diferentes arquitecturas de procesamiento. (SIMD,
MIMD).
c. Asegurar la escalabilidad horizontal, sin afectar los cálculos computaciones
originales de la tarea.
d. Asegurarse que se soporte computación distribuida.
Ej: librerías MPI (Messaging passing interface) como por ejemplo Open MPI,
MVAPICH
Tener ideas que nos permitan resolver problemas diferentes por medios similares.
Utilizar librerías de programación paralela que ayuden a los programadores.
Identificar la sección criticas del algoritmo para implementar de manera adecuada
los patrones de comunicación.
Cabe resaltar que los patrones de comunicación para la programación en paralelo toman un
papel preponderante al momento del desarrollo, a continuación, se muestran algunos de
estos patrones que son utilizados en la programación en paralelo.
Patrones de Comunicación:
Metodología:
El diseño del algoritmo para computación paralela no es fácil y requiere de una gran
creatividad.
Para el desarrollo de programas en paralelo se utilizará la metodología en espiral adaptada
un conjunto de pasos determinados. Para esto debemos considerar lo siguiente:
Descomposición: Al nivel de división de cada una de las tareas, con la premisa de que en
cada ciclo se verifique que los recursos estén usados eficientemente. Hay que denotar
que la descomposición va a estar orientada a tres diferentes ámbitos, la descomposición
por dominio, la descomposición funcional, y la descomposición por problemas
irregulares. De los tres tipos de descomposición, la que conlleva un mayor grado de
complejidad es la descomposición por dominio la cual se discutirá más adelante.
Comunicación: Este aspecto esta relacionado con la concurrencia, y el patrón de
comunicación escogido, contemplado la fase descomposición, para el desarrollo de
la aplicación. Es importe notar, que en cada ciclo de la espiral se debe comprobar si
existen problemas de interbloqueo e inanición.
Agrupamiento: Este aspecto está relacionado con la sincronización de las tareas que
se determinaron en la fase de descomposición.
Asignación: Este aspecto esta relacionado con el rendimiento, para lo cual se
utilizará pruebas de estrés y carga.
Los dos primeros pasos estudian el problema de escalabilidad y concurrencia, mientras que
los dos últimos estudian el problema de localidad y mejoras en el rendimiento
computacional.
Descomposición Funcional
El trabajo se concentra en descomponer los cálculos a realizar. La descomposición funcional
es una herramienta fundamental de diseño estructurado de programas, ya que esta
descomposición del cálculo lleva consigo, en muchos casos, la descomposición del código
también. La estrategia consiste en dividir las funciones de un programa y operarlas
concurrentemente. Si se pueden dividir los cálculos, entonces se pasa a estudiar los datos, si
los datos son descompuestos, entonces la partición es completa.
Descomposición de problemas irregulares
En este caso, la estructura del programa evoluciona dinámicamente durante su ejecución y
no puede ser determinada a priori. La idea es definir un modelo que cambie dinámicamente
cuando el programa se ejecuta (por ejemplo, un árbol), de esta manera dicho modelo puede
ser usado para partir dinámicamente el programa. Esto conlleva a que cuando el tamaño de
las particiones varía, algún método de equilibrio de la carga es necesario, El esquema para
usar en la división, depende de la estructura del modelo, del costo de las comunicaciones y
del esquema de equilibro de la carga usado.
Comunicación
Las tareas que se van definiendo, son diseñadas para que en su mayoría puedan ser
ejecutadas concurrentemente, pero muchas veces eso no es posible, ya que no pueden
ejecutarse independientemente. Los cálculos para realizar en una tarea pueden requerir
datos de otras tareas, lo que implica que se deben transferir esos datos entre las tareas.
Definir la estructura comunicacional de la aplicación es clave en el futuro desempeño de una
aplicación. El diseño de la estructura comunicacional se puede descomponer en dos fases:
en la primera se definen los enlaces entre las tareas. A continuación, pasamos a categorizar
los tipos de comunicación:
Comunicación local y global: en la comunicación local una tarea se comunica
solamente con sus vecinos. En la comunicación global cada tarea se comunica con
todas, o casi todas. Así, en una comunicación global, muchas tareas pueden
participar, lo que puede conllevar a muchas comunicaciones.
Comunicación estructurada y no estructurada: es un tipo de comunicación donde el
patrón de comunicación de una tarea con sus vecinos forma una estructura regular,
por ejemplo, del tipo árbol o malla. Las no estructuradas pueden generar grafos de
comunicación arbitrarios.
Comunicación estática o dinámica: la comunicación estática establece patrones de
comunicación que no cambian en el tiempo, mientras que la dinámica puede ser
solamente determinada durante el tiempo de ejecución de la aplicación.
Comunicación síncrona o asíncrona: en el caso de la síncrona implica que las tareas
se ejecutan coordinadamente (es decir, se deben sincronizar entre ellas), en
contraste, la asíncrona significa que cada tarea puede ejecutarse al obtener los datos
que requiere, sin tener que esperar por otras tareas.
Agrupamiento.
El algoritmo hasta ahora es una abstracción, en el sentido de que aún no están especificados
los detalles para asegurar su eficiente ejecución, sobre un computador particular. De hecho,
puede ser bastante ineficiente, si se crean muchas tareas pequeñas y la arquitectura que se
posee no es apta para este tipo de diseño de programas. Las tareas y estructuras
comunicacionales definidas previamente deben ser evaluadas según los requerimientos de
rendimiento y costos de implementación. Así, en esta fase se revisan las decisiones de
descomposición y comunicación, para obtener un algoritmo que se ejecuta eficientemente
sobre un computador paralelo dado. Los procesos de agrupamiento y replicación deben
considerar:
Asignación
En este paso se especifica donde será ejecutada cada tarea. Las tareas son asignadas a los
procesadores de manera de maximizar la utilización de los procesadores y minimizar los
costos comunicacionales. Este problema no existe en sistemas uniprocesadores o
computadores a memoria compartida y/o distribuida con automática planificación de
tareas. En el último caso, el sistema operativo es el que realiza la distribución de las tareas.
En general, este es un problema difícil y su objetivo es minimizar el tiempo total de
ejecución de la aplicación a través de dos ideas: