Está en la página 1de 7

Diseño de Programas Paralelos.

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

3. Recodificación de partes: En base de la plataforma computacional, de la


metodología de desarrollo y del programa a refactorizar, se tiene la posibilidad de
separar el programa por módulos e independientemente generar programas
paralelos para con que ello se mejoren los tiempos de respuesta.
a. Análisis individual de cada una de las tareas (procesos, funciones, módulos,
etc.) para poder mejorar los tiempos de respuesta y aspectos fiabilidad.
b. Análisis de características individuales de cada una de las tareas para poder
maximizar el uso de los recursos.
c. Realizar la correspondencia entre la aplicación a refactorizar con la
arquitectura de hardware con la que se cuenta.
d. Capacitación a nivel de programadores y de usuarios para poder obtener una
aplicación la cual mejore su eficiencia con relación a una aplicación
secuencial.
e. Utilización de estándares y codificación segura al momento de refactorizar.
Desarrollar un programa paralelo nuevo.
Es partir desde una idea concebida para un programa, el cual requiera gran capacidad de
procesamiento o mantener tiempos de respuesta bajos. Hay que tomar en cuenta que el
desarrollo de un programa en paralelo va a corresponder con ciertas consideraciones del
desarrollo de los programas secuenciales.

 Determinar la arquitectura sobre la cual vamos a desarrollar el programa.


 Que lenguaje de programación podemos utilizar.
 Determinar, plataformas, sistemas operativos e IDE’s de programación.
 Identificar el paradigma de desarrollo adecuado.
 Determinar el alcance del problema a resolver. A través de hojas de ruta en donde se
pueda encontrar cronogramas y responsables para cada una de las actividades.
(Esto es importante dado que la programación en paralelo esta diseñada para
resolver problemas grandes y presenta una mayor eficiencia al resolver los mismos).
 Contemplar la fase de manteamiento y escalabilidad.

Paradigmas de programación Paralela.


Para el desarrollo de programación en paralelo es importante conocer cada uno de los
elementos utilizados en programación secuencial pueden no ser los mas adecuados para la
programación en paralelo. Recuerde que un algoritmo no es un paradigma; Y los paradigmas
en programación en paralelo se pueden resumir en las siguientes ideas.

 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:

 Maestro / Esclavo: Es dividir el trabajo en subtareas que serán realizadas por


diferentes esclavos bajo la supervisión de un maestro. En este caso se aplicará la
arquitectura MIMD, con la finalidad de representar o utilizar varias instrucciones
sobre varios datos de un set para mejorar la eficiencia.
 Divide y vencerás: Es dividir cada tarea en pequeñas subtareas hasta que no sea
posible dividirlas más, esto nos ayudara a distribuir cada una de estas actividades
para diferentes procesadores. Tome en cuenta que estas actividades van a ser
singulares, es decir que no se pueden dividir más, y que hay que tratar de que sean
independientes para no generar cuellos de botella.
 Árbol binario: Es justamente dividir una tarea en tareas hijas, con las cuales se
mantiene una correspondencia directa con el padre.
Tome en cuenta que todos estos patrones de comunicación, esta enfocados a la división de
tareas, si bien es cierto cada uno mantiene una idea diferente de como van a ser
administradas las tareas creadas, todos se encuentran bajo la idea de que al tener tareas
más pequeñas se mejora el tiempo de respuesta y el rendimiento en la realización de
operaciones.
Metodología para desarrollar programas paralelos.
Generalidades:
Al momento de desarrollar programas en paralelo se deben tener las siguientes
consideraciones:

 Definir el enfoque/paradigma apropiado para la arquitectura que se tiene.


 Utilizar metodologías estandarizadas, en donde se encuentren definida la
documentación, los roles y responsabilidades de los stakeholder.
 Separar los tiempos de comunicación de Entrada/Salida y del cálculo de la aplicación,
aplicando técnicas de calendarización o planificación de procesos.
 Usar modelos de rendimiento que incluyan los aspectos mas relevantes de la
aplicación.
 Realizar un conjunto de pruebas para diferentes escenarios dentro de la aplicación
mediante pruebas carga y estrés para las diferentes configuraciones de los equipos
utilizados.

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:

 Tome en cuenta que la metodología en espiral propone tener entregables al final de


cada ciclo, y durante este ciclo se deben realizar un análisis factibilidad para poder
pasar a la siguiente etapa.
 Es la retroalimentación que se tiene al finalizar cada uno de los ciclos de desarrollo.
 Identificación de necesidades por parte del usuario a lo largo del proceso desarrollo
a través del prototipo generado.
Para el desarrollo de programación en paralelo existen cuatro pasos que se repiten en esta
metodología tipo espiral lo cuales se detallan a continuación:

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

Note en el grafico anteriormente expuesto que el tiempo utilizado en el desarrollo basado


en esta metodología depende la cantidad de espirales que se apliquen, tomando en cuenta
que cada una de las espirales se reduce dado que en cada fase se encuentra un mejor
rendimiento y eficiencia de la aplicación.
Descomposición
Un eficiente uso de los recursos se refiere a cómo el rendimiento de una aplicación dada
varía según el número de procesadores disponibles. El tiempo de ejecución del programa
paralelo puede ser mejorado añadiendo procesadores, hasta un límite dado, donde no hay
más mejoras, ya que no hay suficiente trabajo para tener ocupados a todos los
procesadores por la influencia de la comunicación.
Descomposición por dominio.
El diseñador se concentra en partir los datos y en como asociar los cálculos a esos datos. La
idea central es dividir dichas estructuras de datos en componentes que pueden ser
manipulados independientemente (concurrentemente). Si es posible, los datos se dividen
de igual tamaño a condición de que los procesadores sean de igual poder. Además, los
cálculos a realizar también se descomponen típicamente, para asociar los cálculos con los
datos sobre los cuales se ejecutan. Diferentes particiones son posibles, según la estructura
de datos que se tenga y los cálculos que se requieren realizar. Esto implica que tanto las
estructuras de datos como los cálculos a realizar deben ser estudiados simultáneamente. Se
pueden usar en aplicaciones con una gran cantidad de datos regulares.

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:

 Aumentar la cantidad de cálculos y reducir los costos comunicacionales


 Aumentar la flexibilidad con respecto a la escalabilidad y proceso de decisión de las
asignaciones
 Reducir costos de diseño de software

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:

 Colocar tareas concurrentes en diferentes procesadores.


 Colocar tareas que se comunican frecuentemente en el mismo procesador.

También podría gustarte