3. DISEÑO DE ALGORITMOS PARALELOS Y DISTRIBUIDOS

Documentos relacionados
Programación Concurrente y Paralela. Unidad 1 Introducción

Diseño de algoritmos paralelos

Esquema de Dividir y Vencer

Tema 9. Recursividad

Análisis y Diseño de Algoritmos

Análisis de rendimiento de algoritmos paralelos

Introducción a la programación: Contenido. Introducción

Divide & Conquer. Herman Schinca. Clase de Junio de 2011

Análisis de algoritmos

12/08/2017 AVL. Especificación sobre árboles AVL. AVL: rotaciones

TEMA 1: Algoritmos y programas

Algorítmica y Complejidad. Tema 5 Divide y Vencerás.

Tema 2. Divide y vencerás.

Complejidad computacional (Análisis de Algoritmos)

Análisis y Complejidad de Algoritmos. Arboles Binarios. Arturo Díaz Pérez

Tema: Programación Dinámica.

Programación de Ordenadores

Ordenamiento (Sorting)

Instituto José Manuel Estrada - Villa de Soto. Asignatura: Desarrollo de Soluciones Informáticas. Curso: 5to I. Docente: Contreras, María Elena

Tema: Programación Dinámica.

UNIDAD II Metodología de programación paralela. Lic. Jesús Germán Andrés PAUTSCH - FCEQyN - UNaM

TEMA 6: INTRODUCCIÓN A UML

Introducción Supongamos un subconjunto de n elementos X = {e 1,,e n de un conjunto referencial Y, X Y. Dentro de Y se define una relación de orden tot

ORGANIZACIÓN DE COMPUTADORAS DRA. LETICIA FLORES PULIDO

ÁRBOLES CRISTIAN ALFREDO MUÑOZ ÁLVAREZ JUAN DAVID LONDOÑO CASTRO JUAN PABLO CHACÓN PEÑA EDUARDO GONZALES

Estructura de datos y de la información Boletín de problemas - Tema 9

Computación Aplicada. Universidad de Las Américas. Aula virtual de Computación Aplicada. Módulo de Excel 2013 LIBRO 6

Métodos para escribir algoritmos: Diagramas de Flujo y pseudocódigo

Tema 6: Estructuras de datos recursivas

259. El número de combinaciones de m objetos entre un conjunto de n, denotado por n, para n 1 y 0 m n, se puede definir recursivamente por: m

Ejemplo: El problema de la mochila. Algoritmos golosos. Algoritmos y Estructuras de Datos III. Segundo cuatrimestre 2013

Programación Estructurada. Complementos de Informática Tema 2: Programación Estructurada y Programación Modular. Números Amigos

Tema V Generación de Código

IN34A - Optimización

Cristian Blanco

Un árbol binario T se define como un conjunto finito de elementos, llamados nodos, de forma que:

Multiplicación de matrices simétricas

7.1 Consideraciones. Considere la búsqueda de un libro en una biblioteca. Considere la búsqueda de un nombre en el directorio telefónico.

Tecnologías, Organización y Microarquitectura

Grafos. Suponiendo que e = [u, v]. Entonces los nodos u y v se llaman extremos de e y u y v se dice que son nodos adyacentes o vecinos.

Tema 01: Algoritmia y diagramas de flujo. Estructuras de datos (Prof. Edgardo A. Franco)

Algoritmos Iterativos de Búsqueda y Ordenación y sus tiempos

Estructuras de Datos II

Subrutinas. Subrutinas. Erwin Meza Vega

COMPARACIÓN DE MODELOS DE SINCRONIZACIÓN EN PROGRAMACIÓN PARALELA SOBRE CLUSTER DE MULTICORES

Capítulo 4: Grafos Clase 4: Árboles

La eficiencia de los programas

Ejercicio 2 Considere la representación para Lista de Naturales y Árbol Binario de Naturales de la Figura 1.

Sistemas de Base de Datos Paralelos

Diseño arquitectónico 1ª edición (2002)

2.3 DEFINICIÓN DE LENGUAJES ALGORÍTMICOS

Algebra Relacional. Bases de Datos 2 - Tecnologo de Informatica. BD2 - Algebra Relacoinal

Diagramas de flujo El método gráfico.

Backtracking: Esquema General

ALGORÍTMICA. Dpto. Ingeniería de Sistemas y Automática Facultad de Ciencias Universidad de Valladolid.

Universidad de Valladolid. Departamento de informática. Campus de Segovia. Estructura de datos Tema 4: Ordenación. Prof. Montserrat Serrano Montero

&217$'25(6',*,7$/(6. Figura 1.

INGENIERÍA DEL SOFTWARE I Práctica 5 Modelado de Diseño

Centro Asociado Palma de Mallorca. Tutor: Antonio Rivero Cuesta

Teoría de Grafos. Herramientas de programación para procesamiento de señales

PRÁCTICA #6 TIPOS DE DATOS ESTRUCTURADOS: Arreglos, Registros y Archivos

Árboles balanceados (AVL) Tablas de dispersión (Hash) Colas de prioridad (Heap)

Universidad de Valladolid. Departamento de informática. Campus de Segovia. Estructura de datos Tema 1: Recursividad. Prof. Montserrat Serrano Montero

Demostrando cotas inferiores: Arboles de decisión

ESTRUCTURAS DE DATOS Y ALGORITMOS

Estructura de Datos Unidad 6: ARBOLES

Colección de Tesis Digitales Universidad de las Américas Puebla. Romero Martínez, Modesto

Problemas computacionales, intratabilidad y problemas NP completos. Febrero Facultad de Ingeniería. Universidad del Valle

Bloques Aritméticos - Multiplicadores

Capítulo 8. Árboles. Continuar

INTRODUCCION A LA PROGRAMACION (C.U.) PROGRAMACION (T.I.G.)

Algoritmos paralelos para la Multiplicación de Matrices

RESUMEN DE ALGORITMOS PROBABILÍSTICOS

TEMA 1. INTRODUCCIÓN A LA PROGR. DISTRIBUIDA Y PARALELA

Auxiliar 1 - CC31A Programación de software sistema

LA ECUACIÓN CUADRÁTICA

Matemáticas Discretas L. Enrique Sucar INAOE. Teoría de Grafos. Problema de los puentes de Königsberg [Euler]

Tema: Algoritmos para la ruta más corta en un Grafo.

CRITERIOS EVALUACIÓN MATEMÁTICAS

PARADIGMA y LENGUAJES DE PROGRAMACIÓN

Introducción a Árboles Árboles Binarios

2.1 METODOLOGÍA PARA LA SOLUCIÓN DE PROBLEMAS

Solución - práctico 10

Programación MODULAR: Subalgoritmos - funciones y procedimientos

Actividad. Un lenguaje gráfico en el entorno educativo que permite representar la lógica de un diagrama de flujo es Flowol.

ARBOLES B. Lo que si es cierto es que la letra B no significa "binario", ya que:

n! = 1 2 n 0! = 1 (n+1)! = (n + 1) n!

Tema 2 Introducción a la Programación en C.

1. Secuencia y temporalización de los contenidos.

Distribución Física y Transporte. Diseño de Rutas para Los Vehículos (Shortes Path) Giancarlo Salazar P

Unidad II: Análisis semántico

TEMA 9: DIAGRAMA DE OBJETOS, SECUENCIA Y DESPLIEGUE EN UML

INDICE 1.1. Información y Significado 1.2. Arreglos en C 1.3. Estructura en C 1.4. Clases en C++ 2. La Pila 2.1. Definición y Ejemplos

Y alternativamente se presentarán soluciones de problemas donde se utilicen:

INSTITUTO NACIONAL SUPERIOR DEL PROFESORADO TÉCNICO - TÉCNICO SUPERIOR EN INFORMÁTICA APLICADA - PROGRAMACIÓN I

Matemáticas Básicas para Computación

Capítulo 3: Grafos Clase 1: Grafos: Modelos, tipos, representación e isomorfismo

Ordenamiento en Tiempo Lineal - Medianas y Ordenes sticas

Álgebra Lineal Ma1010

Grade 4 Mathematics Assessment

Transcripción:

3. DISEÑO DE ALGORITMOS PARALELOS Y DISTRIBUIDOS Uno de los ingredientes más importantes para el procesamiento paralelo son sin duda los algoritmos paralelos que tienen un considerable interés en su desarrollo. Dado un problema a resolver en paralelo, el algoritmo paralelo describe como puede resolverse el problema pensando en una determinada arquitectura paralela, mediante la división del problema en subproblemas, comunicando los procesadores y posteriormente uniendo las soluciones parciales para obtener la solución final. Por ejemplo, los algoritmos basados en la estrategia de divide y vencerás usualmente tienen una naturaleza inherentemente paralela. Existen dos enfoques en el diseño de algoritmos paralelos con respecto al número de procesadores disponibles. El primero es el diseño de un algoritmo en el cual el número de procesadores utilizados por el algoritmo es un parámetro de entrada, lo que hace que el número de procesadores no dependa del tamaño de entrada del problema. El segundo enfoque permite que el número de procesadores utilizados por el algoritmo paralelo crezca con el tamaño de la entrada, de tal forma que el número de procesadores no es un parámetro de entrada, pero si una función del tamaño de entrada del problema. Utilizando el esquema división de labor, un algoritmo diseñado con el segundo enfoque puede siempre ser convertido a un algoritmo del primer enfoque. 3.1. Patrones de Comunicación Paralela En relación a los patrones de comunicación que se establecen entre los procesos de una aplicación paralela y distribuida existen varias posibilidades de interacción: los farms (o granjas de procesos), los pipes (o cauces), los trees (o árboles), los cubes (o cubos o hipercubos), los grids (o mallas), las matrices de procesos, etc. De tal forma que saber qué patrón se adapta mejor a una aplicación determinada constituye una decisión importante de diseño que no puede ser totalmente automatizada. Una vez identificado el comportamiento paralelo de la aplicación en desarrollo, el segundo paso consiste en elaborar un bosquejo gráfico de su representación, con los detalles concretos de ésta: número de nodos, canales de conexión entre estos, etc., como un documento previo al diseño detallado en el que se detallará posteriormente el procesamiento paralelo del sistema objetivo. Cuando ya se tiene concretizado el modelo que define un patrón paralelo específico, digamos, por ejemplo, un tree, o alguno de los anteriormente mencionados, el paso siguiente será realizar su definición sintáctica y semántica. Traduciéndose finalmente la definición sintáctica a un programa en el entorno de programación más adecuado

para su implementación paralela ha de verificarse que la semántica resultante sea la correcta; es conveniente probarlo con varios ejemplos distintos para demostrar su genericidad así como observar el rendimiento de las aplicaciones que lo incluyan como un componente software. Los patrones paralelos que veremos a continuación son: el pipeline, el farm y el tree bajo la técnica de divide y vencerás, ya que se trata de un conjunto significativo y reutilizable de patrones utilizados en múltiples aplicaciones y algoritmos con diferentes propósitos, en diferentes áreas y con diferentes aplicaciones prácticas, según la literatura que hay sobre el tema. La configuración de cada uno de estos patrones es la siguiente: el pipeline está compuesto por un conjunto de estados conectados uno detras de otro, la información sigue un flujo de uno a otro; el farm se compone de un conjunto de procesos trabajadores y un proceso controlador; los trabajadores se ejecutan en paralelo hasta alcanzar un objetivo común y el controlador es el encargado de distribuir el trabajo y de controlar el progreso del cómputo global; el tree, hace que la información fluya desde la raíz hacia las hojas o viceversa, ejecutándose los nodos que se encuentran en el mismo nivel en el árbol en paralelo; la técnica de diseño de algoritmos denominada Divide y Vencerás utiliza este patrón para obtener la solución del problema inicial. El Patrón de Comunicación PIPELINE La técnica del procesamiento paralelo del pipeline es aplicable a la resolución de un amplio rango de problemas que son parcialmente secuenciales en su naturaleza. Utilizando la técnica del Pipeline, la idea es dividir el problema en una serie de tareas que tienen que ser completadas una después de otra. En un pipeline cada tarea puede ser ejecutada por un proceso, un thread o un procesador independiente [ROB], (figura 18): P0 P1 P2 Fig. 18. PipeLine

Algunas veces a los procesos del pipeline se les llama etapas (stages) del pipeline [SEL99]. Cada etapa puede contribuir a la solución del problema total y puede pasar la información necesaria a la siguiente etapa del pipeline. Este tipo de paralelismo es visto muchas veces como una forma de descomposición funcional, ya que el problema es dividido en funciones separadas que pueden ser ejecutadas individual e independientemente; pero con esta técnica las funciones se ejecutan en sucesión. Un algoritmo que resuelva un determinado problema puede ser entonces formulado como un pipeline si se puede dividir en una serie de funciones que podrían ser ejecutadas por las etapas del pipe [ROB]. Supongamos, por ejemplo, que queremos ordenar un conjunto de datos en desorden de mayor a menor (es decir, en orden descendente), pero se tiene ya implementado un algoritmo de ordenación de menor a mayor o en orden ascendente; si se utilizase este algoritmo de ordenación, sería necesario invertir la secuencia de los datos ya ordenados, lo que se puede llevar a cabo añadiendo un stage extra al pipeline con una función asignada que llevaría a cabo el proceso específico (figura 19). x f(x) = y y g(y) = z z Fig. 19. Pipeline con descomposición funcional La interpretación de los elementos de la figura anterior es como sigue: x representa al conjunto de datos inicial que supondremos está en desorden; f(x) representa la función ordena que recibe como entrada el conjunto de datos a ordenar y proporciona como salida la ordenación en orden ascendente (de menor a mayor) del conjunto de datos que le llegan; y representa entonces la salida de la función f(x), es decir, los datos ordenados; g(y) representa la función invierte que recibe el resultado de la función ordena para dar como salida el conjunto de datos previamente ordenados pero invertidos en su secuencia para tener un orden descendente (de mayor a menor); z es precisamente la salida de la función g(y) en la última etapa del pipeline. Suponiendo que el conjunto de datos con los que se trabaja en este ejemplo son números enteros, la secuencia de resultados dentro del pipeline sería la mostrada en la figura 20.

f(x) = y y y=[0,1,2,3,4,5,7,8,9,10] g(y) = z z=[10,9,8,7,5,4,3,2,1,0] Fig. 20. Secuencia de resultados en un Pipeline Así, si un problema que puede ser dividido en una serie de tareas secuenciales, el enfoque del pipeline puede proporcionar incremento en la velocidad de ejecución de los siguientes tres tipos de cálculos: 1. Cuando más de una instancia del problema completo puede ser ejecutada en paralelo; 2. bien una serie de datos pueden ser procesados y cada uno de estos se utiliza en múltiples operaciones; 3. bien si la información que demanda el siguiente proceso para iniciar su cálculo se pasa después de que el proceso actual haya completado todas sus operaciones internas. Con esta técnica muchos de los problemas computacionales que se llevan a cabo de forma secuencial pueden ser fácilmente paralelizados como un pipeline. Ejemplos de estos problemas son: la suma de números, el ordenamiento de números, la generación de números primos, el solucionar un sistema de ecuaciones lineales. El Patrón de Comunicación FARM El patrón paralelo de interacción Farm está formado de un conjunto de procesos independientes entre sí, llamados procesos trabajadores, y un proceso que los controla, llamado el proceso controlador [ROB], [SEL99]. Los procesos trabajadores se ejecutan en paralelo hasta alcanzar un objetivo común para todos ellos. El proceso controlador es el encargado de distribuir el trabajo y de controlar el progreso del farm hasta hallar la solución del problema que se pretende resolver en la aplicación que utilice este patrón. La figura 21 muestra el modelo del Farm.

Fig. 21. Farm con un proceso controlador y 5 procesos trabajadores Con este modelo podría ser interesante observar el rendimiento de la ejecución en paralelo de varios algoritmos de ordenación operando con un mismo conjunto de datos para todos ellos. Si utilizamos como patrón un Farm para resolver el problema planteado, el diseño del modelo sería más o menos el que se muestra en la figura 22. y=[0,1,2,3,4,5,7,8,9,10] PT 1 y=qsort(x) Controlador z=[0,1,2,3,4,5,7,8,9,10] PT 2 z=msort(x) w=[0,1,2,3,4,5,7,8,9,10] PT 3 w=ssort(x) y= 0,1,2,3,4,5,7,8,9,10] z= 0,1,2,3,4,5,7,8,9,10] Fig. 22. Farm que ejecuta 3 algoritmos de ordenación en paralelo

El Farm se forma de tres procesos trabajadores (PT1, PT2, PT3) y un proceso controlador. Cada proceso trabajador tiene asociado un algoritmo de ordenación diferente. En el caso del ejemplo de la figura, PT1 tiene asociado el algoritmo QuickSort, a PT2 se le asocia el algoritmo MergeSort y, finalmente, PT3 tiene asociado el algoritmo ShellSort. El proceso controlador recibe como entrada el conjunto de datos a ordenar, que viene definido como el arreglo X en el ejemplo distribuyendo a sus procesos trabajadores la información, después, en paralelo, se lleva a cabo la ejecución de los tres procesos PT1, PT2 y PT3. El resultado (y, z, w) es devuelto al proceso controlador, que finalmente los retornará como resultados finales también de forma paralela. Con esta técnica muchos problemas computacionales pueden ser fácilmente paralelizados como un farm de procesos. Algunos ejemplos de estos son: el cómputo de matrices; el ordenamiento de números; la solución de sistemas de ecuaciones; la solución al problema de caminos en grafos dirigidos a través de matrices de adyacencia. El Patrón de Comunicación TreeDV La técnica de Divide y Vencerás se caracteriza por la división de un problema en subproblemas que tienen la misma forma que el problema completo [BRA98]. La división del problema en subproblemas más pequeños se lleva a cabo utilizando la recursión. El método recursivo continúa dividiendo el problema hasta que las partes divididas ya no puedan dividirse más, entonces se combinan progresivamente y de forma ascendente los resultados parciales de cada subproblema hasta obtener la solución al problema inicial [BRA98]. En esta técnica, la división de cada problema suele hacerse a menudo en dos subproblemas; por tanto, supondremos una formulación recursiva del método Divide y Vencerás con un esquema de división en forma de un árbol binario, cuyos nodos serán procesadores, procesos o threads.

P0 P1 P2 P3 P4 P5 P6 P7 P8 P9 P1 0 P11 P12 P13 P14 Fig. 23. Árbol binario completo El nodo raíz del árbol recibe como entrada un problema completo que se divide en dos partes, una se envía al nodo hijo izquierdo, la otra se envía al nodo que representa al hijo derecho (figura. 23). Se repite recursivamente el proceso de división hasta llegar a los niveles más bajos del árbol hasta que, transcurrido un cierto tiempo, todos los nodos hoja reciben como entrada un subproblema de su nodo padre, entonces lo resuelven y le devuelven las soluciones. Cualquier nodo padre en el árbol obtendrá dos soluciones parciales de sus nodos hijos y las combinará para proporcionar una única solución que será la salida del nodo padre. Finalmente el nodo raíz proporcionará como salida la solución completa del problema inicial, [BRI93]. En la figura 23 se muestra un árbol binario completo, esto es, un árbol perfectamente balanceado con los nodos hojas en el mismo nivel, pero podría ocurrir que uno o más nodos hoja aparezcan en diferentes niveles del árbol si el número de subproblemas no es potencia de 2. Mientras que, en una implementación secuencial, un solo nodo del árbol puede ser ejecutado o visitado cada vez, en una implementación paralela de un algoritmo que siga este esquema se podría visitar más de un nodo al mismo tiempo, es decir, al dividir un problema en dos subproblemas, ambos pueden ser procesados de manera simultánea. Puede ser interesante utilizar esta técnica en una aplicación específica relacionada con el problema de la ordenación de un conjunto de datos, ya que existen varios algoritmos de ordenación que utilizan la técnica de divide y vencerás, junto con la recursión, como en el caso del algoritmo QuickSort u ordenación rápida, o bien en el algoritmo MergeSort, por citar dos de ellos. Supongamos entonces que se tiene una lista de números enteros en desorden y queremos llevar a cabo la ordenación de

dichos números por medio de la técnica de divide y vencerás en paralelo, utilizando para ello el algoritmo de ordenación rápida o Quicksort. Como primer paso el algoritmo selecciona como pivote uno de los elementos del conjunto de datos que vaya a ordenar; a continuación, el conjunto se divide en dos partes, una a la izquierda y la otra a la derecha del pivote; se desplazan los elementos, de tal manera que los que sean mayores que el pivote queden a su derecha mientras que los que sean menores queden a su izquierda, ver figura 24(a) posteriormente, las partes del conjunto que quedan a ambos lados del pivote se ordenan independientemente de forma paralela y recursiva; se llega al resultado final, que es el conjunto de datos completamente ordenado, ver figura 24(b), si cada nodo del árbol construye el array solución al subproblema que le ha sido encomendado colocando el subarray que le entrega su hijo derecho detrás del que le entrega el izquierdo, antes de devolverla a su nodo padre. X=[6,3,2,5,1,9,0,2,10,7] X=[2,3,2,5,1,0,6] P0 X=[9,10,7] P1 P2 X=[0,2,1,2] X=[3,5,6] X=[7] X=[9,10] P3 P4 P5 P6 X=[0] X=[2,1,2] X=[3] X=[5,6] X=[9] X=[10] P7 P8 P9 P1 0 P11 P12 X=[1] X=[1,2] P13 X=[2] X=[2] P14 X=[5] P15 X=[6] P16 Fig. 24 (a) Secuencia del algoritmo de ordenación QuickSort (DIVIDE) P17 P18

y=[0,1,2,2,3,5,6,7,9,10] y=[0,1,2,2,3,5,6] P0 y=[7,9,10] P1 P2 y=[0,1,2,2] y=[3,5,6] y=[7] y=[9,10] P3 P4 P5 P6 y=[0] y=[1,2,,2] y=[3] y=[5,6] y=[9] y=[10] P7 P8 P9 P1 0 P11 P12 y=[1,2] y=[2] y=[5] y=[6] P13 P14 P15 P16 Fig. 24(b) Secuencia del algoritmo de ordenación QuickSort (VENCE) y=[1] y=[2] P17 P18 Con la técnica de divide y vencerás muchos de los problemas computacionales que se llevan a cabo de manera secuencial pueden ser paralelizados como árboles binarios, donde cada nodo representa un proceso y cada proceso del árbol contiene una copia del mismo algoritmo de solución. Ejemplos de problemas que pueden ser solucionados con esta técnica son los siguientes: problemas de integración numérica; problemas de N-cuerpos; problemas de ordenación de datos; problemas de búsqueda de datos.