0% encontró este documento útil (0 votos)
94 vistas

02 Grafos Computacion

Este documento trata sobre grafos de computación y programación paralela con fork-join. Explica conceptos como paralelismo funcional y de datos, descomposición de problemas, grafos de computación, métricas como trabajo y longitud crítica, y planificación. También cubre el modelo fork-join y librerías como PASL para expresar paralelismo con este modelo.

Cargado por

Manuel Palomino
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
94 vistas

02 Grafos Computacion

Este documento trata sobre grafos de computación y programación paralela con fork-join. Explica conceptos como paralelismo funcional y de datos, descomposición de problemas, grafos de computación, métricas como trabajo y longitud crítica, y planificación. También cubre el modelo fork-join y librerías como PASL para expresar paralelismo con este modelo.

Cargado por

Manuel Palomino
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 33

Programación

Paralela
Clase 2: Grafos de
Computación

Hugo R. Cordero
Temas
• Paralelismo funcional y de datos
• Grafo de Computación
• Paralelismo con Fork-Join
• Librerías para programación en
Java
Motivación
¿Son los grafos una forma para
representar las tareas que se
ejecutan?

¿Cómo podemos entender el flujo


que pueden seguir las tareas en
paralelo?

¿Podemos aprovechar la
representación para medir el tiempo
de ejecución?
Terminología
• Nodo: una unidad discreta de un sistema informático que
normalmente ejecuta su propia instancia del sistema operativo
• Procesador: chip que comparte una memoria común y un disco
local
• Núcleo (core): una unidad de procesamiento en un chip de
computadora capaz de soportar un hilo de ejecución
• Coprocesador: un procesador liviano
• Cluster: una colección de nodos que funcionan como un solo
recurso

Fuente: Introduction to Parallel Programming,


Linda Woodard
Descomposición de problemas para el
Paralelismo
Descomposición de dominio
• Descomposición del problema en función de los datos. Los datos son
divididos en partes de aproximadamente el mismo tamaño y las
partes son asignadas a diferentes procesadores.
• Cada procesador trabaja sólo con la parte de datos que le son
asignados.
Descomposición funcional
• Descomposición en tareas (o reparto dinámico de tareas). El
problema se divide en un gran número de partes más pequeñas y las
subtareas son asignadas a los procesadores disponibles.
• El tiempo de ejecución viene determinado por el proceso que tarde
más.
Fuente: Resolución de problemas en paralelo, Vicente Cerverón
Paralelismo Funcional
• Cada proceso realiza una "función" diferente
o ejecuta diferentes secciones de código que
son independientes.
• Ejemplos:
• 2 hermanos hacen trabajo de jardinería
• 8 agricultores construyen un granero

• Comúnmente programado con librerías de


paso de mensajes.

Fuente: Introduction to Parallel Programming, Linda Woodard


Paralelismo de Datos
• Cada proceso hace el mismo
trabajo en datos únicos e
independientes
• Ejemplos:
• 2 hermanos cortan el césped
• 8 agricultores pintan un granero

• Generalmente más escalable que


el paralelismo funcional
• Se puede programar a un alto
nivel con librerías de memoria
compartida o en un nivel inferior
usando paso de mensajes

Fuente: Introduction to Parallel Programming, Linda Woodard


Grafo de Computación
• Un grafo de computación (CG) captura la ejecución dinámica de un
programa paralelo, para una entrada específica.
• Los nodos de CG son pasos en la ejecución del programa.
• Un paso es una computación secuencial, no async, no finish

• Las aristas de CG representan restricciones de orden:


• Las aristas “Continue" o transitivas, definen la secuencia de pasos dentro de
una tarea
• Las aristas “Spawn" o de generación, conectan las tareas principales con las
tareas asíncronas secundarias
• Las aristas de “Join" o de unión, conectan el final de cada tarea asíncrona con
las operaciones de finalización del nodo inmediato

• Los grafos de computación son ejemplos de "gráficos acíclicos dirigidos"


• No es posible que un nodo dependa de sí mismo

Fuente: Fundamentals of Parallel Programming, M.Joyner, Z.Budimlić, 2019


Grafo de Computación (2)

• Cualquier nodo con más de una salida debe utilizar un async


(debe tener una arista de generación saliente)

• Cualquier nodo con más de una entrada debe utilizar un


finish (debe tener una arista de unión entrante)

• Agregar o quitar aristas transitivas no afectan las


restricciones de orden

Fuente: Fundamentals of Parallel Programming, M.Joyner, Z.Budimlić, 2019


Grafo de Computación (3)

Fuente: Fundamentals of Parallel Programming, Vivek Sarkar, 2019


B1 B2
Un caso práctico
• ¿Puedo iniciar alguna de estas tareas a la
vez?
• Hervir agua y tallarines
B3
• Picar las verduras
• Freír la carne
• Hacer la salsa de la pasta
A

Fuente: Fundamentals of Parallel Programming, M.Joyner, Z.Budimlić, 2019


Un caso práctico (2)

• Si dos afirmaciones cualquiera no tiene camino


de aristas dirigidos desde uno al otro, entonces
pueden correr en paralelos entre sí

Fuente: Fundamentals of Parallel Programming, M.Joyner, Z.Budimlić, 2019


Métricas del Grafo de Computación
• TIME(N) es el tiempo de ejecución de cada nodo N de un grafo G

• WORK(G) es la sumatoria de tiempos de todos los nodos que componen el


grafo.
• WORK(G) es el trabajo total que se realizará en G

• CPL(G) es ruta más larga de G, al sumar tiempos de ejecución de todos los


nodos en el camino
• Dichos caminos se llama ruta crítica
• CPL(G) es la longitud de estas rutas (longitud de ruta crítica, también conocida
como el lapso del grafo)
• CPL(G) es también el tiempo de ejecución más corto posible para el cálculo del
grafo

Fuente: Fundamentals of Parallel Programming, M.Joyner, Z.Budimlić, 2019


Métricas del Grafo de Computación (2)
• Se define paralelismo ideal de un grafo de
computación G como la razón de:
WORK (G) / CPL (G)
• El paralelismo ideal solo depende del grafo de
computación, y se interpreta como la
aceleración que puedes obtener con un número
ilimitado de procesadores
• Ejemplo:

WORK (G) = 26

CPL (G) = 11

Paralelismo ideal = WORK (G) / CPL (G)


= 26/11 ~ 2.36

Fuente: Fundamentals of Parallel Programming, M.Joyner, Z.Budimlić, 2019


Métricas del Grafo de Computación (3)
• Suponga que todos los nodos tienen TIEMPO = 1, entonces WORK = 10 para
ambos gráficos. ¿Cuál grafo de computación tiene mejor paralelismo ideal?

Fuente: Fundamentals of Parallel Programming, M.Joyner, Z.Budimlić, 2019


Planificación
• La planificación o Scheduling es el
proceso en el que las tareas son
asignadas a los procesos o hilos, y
se les da un orden de ejecución.
Este puede ser especificado en el
código, en tiempo de compilación o
dinámicamente en tiempo de
ejecución.

• El proceso de scheduling debe tener


en cuenta la dependencia entre
tareas, ya que, aunque muchas
pueden ser independientes, otras
pueden requerir los datos
producidos por otras tareas.

Fuente: http://ferestrepoca.github.io/paradigmas-de-programacion/paralela/paralela_teoria/index.html
Planificación de un grafo de computación
• La planificación de un grafo
de computación es dado sobre
un número fijo P de
procesadores.
• Para el ejemplo, cada nodo en
su etiqueta tiene su tiempo de
ejecución TIME(N)
• La planificación S, permite
calcular el tiempo de
finalización:
TP s

Fuente: Fundamentals of Parallel Programming, M.Joyner, Z.Budimlić, 2019


Planificación de un grafo de computación (2)

• Con 3 procesadores, tiempo de finalización = 11

Fuente: Fundamentals of Parallel Programming, M.Joyner, Z.Budimlić, 2019


Paralelismo con fork-join

• Es un modelo fundamental en la computación paralela, se remonta a 1963 y desde


entonces se ha utilizado ampliamente. En el paralelismo fork-join, los cálculos crean
oportunidades para el paralelismo al bifurcarse en ciertos puntos que se especifican
mediante anotaciones en el texto del programa.

• Cada punto “fork” bifurca el flujo de control del cálculo en dos hilos lógicos. Cuando el
control alcanza el punto de ramificación, las ramas comienzan a ejecutarse. Cuando se
completan todas las ramas, el control “join” (une) los flujos de las ramas.

Fuente: Fundamentals of Parallel Programming, M.Joyner, Z.Budimlić, 2019


Paralelismo con fork-join (2)

• Los resultados calculados por las ramas generalmente se leen de la memoria y se


fusionan en el punto de unión. Las regiones paralelas pueden bifurcarse y unirse
recursivamente de la misma manera que los programas de división y conquista se
dividen y unen recursivamente.

Fuente: Fundamentals of Parallel Programming, M.Joyner, Z.Budimlić, 2019


Librerías para fork-join

• PASL (Parallel Algorithm Scheduling


Library) es una biblioteca C++ que
permite escribir programas
implícitamente paralelos. En PASL,
fork-join se expresa mediante la
aplicación de la función fork2 ()

• Fork-join es independiente del


número de argumentos y se deriva
fácilmente mediante la aplicación
repetida de un fork-join binario.

Fuente: Parallel Computing: Theory and Practice, Umut Acar


Paralelizando: Fibonacci

• Función recursiva de Fibonacci F(n).

• Recuerde que el enésimo número de


Fibonnacci está definido por la relación de
recurrencia:

• Se muestra el siguiente código secuencial:

Fuente: Parallel Computing: Theory and Practice, Umut Acar


Paralelizando: Fibonacci con fork-join

• Para escribir una versión paralela,


observamos que las dos llamadas
recursivas son completamente
independientes: no dependen la
una de la otra (ninguna usa un
dato generado o escrito por otro).
• Por lo tanto, podemos realizar las
llamadas recursivas en paralelo.
En general, dos funciones
independientes se pueden
ejecutar en paralelo.

Fuente: Parallel Computing: Theory and Practice, Umut Acar


Paralelizando: Fibonacci con async-finish

• Es un requisito que cada async tenga lugar en el contexto de finish. Este


puede servir como punto de sincronización para un número arbitrario de
cálculos asincrónicos.

Fuente: Parallel Computing: Theory and Practice, Umut Acar


Librerías para Hilos en Java

• La máquina virtual JAVA es un sistema multihilos. Cada programa java


lanza su propio hilo.

• JAVA dispone de la clase Thread, que permite lanzar un nuevo hilo y que
se ejecute dentro de la JVM

• Puede también a una clase extender el funcionamiento como Hilo, a


través de la clase Thread o de la implementación de la interface
Runnable
Librerías para Hilos en Java (2)
• Runnable es más flexible, porque permite a la clase implementar otras clases

• Así mismo, con Runnable hace el código más mantenible


Librerías para Hilos en Java (3)
• Desde Java 7 se dispone de librerías para Fork-Join, dentro del paquete de concurrencia

Fuente: https://www.logicbig.com/tutorials/core-java-tutorial/java-multi-threading/fork-and-
join.html
Librerías para Hilos en Java (4)
• Para estructuras con async-finish , Rice University dispone de HJlib (Habanero Java
Library):
• https://wiki.rice.edu/confluence/display/PARPROG/HJlib+%28Thread-
blocking+Runtime%29+Download+and+Set+Up

• Es un framework para programación en múltiples core

• Descargable con Java 8 y Java 7

Fuente: Shams Imam, Vivek Sarkar, Rice University


Lectura 2
Escuchar el video de Traversal of Graphs - Intro to Parallel Programming
https://www.youtube.com/watch?v=baTC5cA7bnY

Realizar un resumen de 1 página, donde incluya cómo podría ser


resuelto el problema por programación paralela.

Fecha de entrega: próxima clase.


Laboratorio 2

• Forme sus grupos de trabajo.

• Reúnase en grupo y desarrolle la


práctica de laboratorio 2 de Grafos
e Hilos.

• Presente el trabajo al finalizar la


clase.
Resumen
• Un nodo es una unidad discreta de un sistema informático que
normalmente ejecuta su propia instancia del sistema operativo
• En el paralelismo funcional, cada proceso realiza una función
diferente o ejecuta diferentes secciones de código que son
independientes.
• Un grafo de computación (CG) captura la ejecución dinámica de un
programa paralelo, para una entrada específica.
• La planificación o Scheduling es el proceso en el que las tareas son
asignadas a los procesos o hilos, y se les da un orden de ejecución.
• Cada punto de ramificación “fork” (bifurca) el flujo de control del
cálculo en dos o más hilos lógicos. Cuando se completan todas las
ramas, el control “join” (une) para unificar los flujos de las ramas.
¿Preguntas?

• ¿Por qué es importante los grafos de computación para la


programación paralela?
Referencias
• Linda Woodard, Introduction to Parallel Programming, 2013

• Vicente Cerverón , Resolución de problemas en paralelo, Universitat de València

• Vivek Sarkar, Fundamentals of Parallel Programming, 2019.


• Module 1: Parallelism

• Mack Joyner, Zoran Budimlić , COMP 322 - Fundamentals of Parallel


Programming, 2019.
• Computation Graphs, Ideal Parallelism

• Umut Acar, Parallel Computing: Theory and Practice, Carnegie Mellon University

• Links:
• http://ferestrepoca.github.io/paradigmas-de-
programacion/paralela/paralela_teoria/index.html
• http://www.cs.cmu.edu/afs/cs/academic/class/15210-f15/www/tapp.html
• https://shamsimam.github.io/papers/2014-pppj-hjlib-slides.pdf

También podría gustarte