You are on page 1of 28

Programación Paralela y Distribuida

Clase 02 - Background

John Sanabria - john.sanabria@correounivalle.edu.co

John Sanabria - john.sanabria@correounivalle.edu.co


Programación Paralela y Distribuida Clase 02 - Background 1 / 20
Teoría del rendimiento o performance

¿Qué es performance?

Reducir el tiempo total de computación

Incrementar la tasa a la cuál una serie de resultados se alcanza

Reducir la cantidad de energía consumida durante la computación

Una vez usted define que es performance usted comienza a trabajar en


modificar su código para alcanzar ese performance

OJO es importante el performance pero con resultados correctos

John Sanabria - john.sanabria@correounivalle.edu.co


Programación Paralela y Distribuida Clase 02 - Background 2 / 20
Teoría del rendimiento
El rendimiento de un programa se puede medir o teóricamente o
prácticamente a través de las implementaciones en software de este
programa
Teóricamente es más económico a la hora de comparar versiones del
programa
Teóricamente se pueden identificar posibles limitaciones en el programa
Una vez identificado el algoritmo teórico se debería pasar a la versión en
software

John Sanabria - john.sanabria@correounivalle.edu.co


Programación Paralela y Distribuida Clase 02 - Background 3 / 20
Latency y Throughput

Latency corresponde al tiempo que toma


completar una tarea
Throughput corresponde a la tasa a la cual
una serie de tareas puede ser completada
en una cierta cantidad de tiempo. Un
término análogo es bandwidth de red
El pipelining es un ejemplo de mejora en el
throughput pero incremento del latency
debido a las esperas que se tienen en cada
etapa del pipeline
Los servidores web deben tener response Figure 1: Pipelining de 5 etapas
times bajos pero se deteriora el throughput
de solicitudes dado que estas se encolan y
se ocasiona una demora del procesamiento

John Sanabria - john.sanabria@correounivalle.edu.co


Programación Paralela y Distribuida Clase 02 - Background 4 / 20
Ley de Amdahl (1)
La ley de Amdahl establece que el tiempo de ejecución de un programa está dividido en
Instrucciones ejecutadas serialmente, 𝑊𝑠𝑒𝑟
Instrucciones ejecutadas en paralelo, 𝑊𝑝𝑎𝑟
Si tenemos 𝑃 workers los tiempos para ejecutar un algoritmo está dado por:
𝑇1 = 𝑊𝑠𝑒𝑟 + 𝑊𝑝𝑎𝑟 ,
𝑊𝑝𝑎𝑟
𝑇𝑃 = 𝑊𝑠𝑒𝑟 + 𝑃
Insertando estas expresiones en la fórmula del speedup tenemos que:
𝑊 +𝑊𝑝𝑎𝑟
𝑆𝑃 = 𝑠𝑒𝑟 𝑊𝑝𝑎𝑟
𝑊𝑠𝑒𝑟 + 𝑃
Sea 𝑓 la fracción de código no paralelizable, entonces:
𝑊𝑠𝑒𝑟 = 𝑓𝑇1
𝑊𝑝𝑎𝑟 = (1 − 𝑓)𝑇𝑃
Se sustituye nuevamente en la ecuación del speedup
1
𝑆𝑃 ≤
𝑓+ 1−𝑓
𝑃

John Sanabria - john.sanabria@correounivalle.edu.co


Programación Paralela y Distribuida Clase 02 - Background 5 / 20
Andhals Law

Si una tarea tarda 2 minutos en completarse y puede acelerar el 40 %


de la tarea 4 veces , entonces
Told =2 mins=120 s,
p=0.4
s=4

Aunque el 40 % de la tarea es cuatro


veces más rápida, la tarea no ha recibido
un impulso significativo en el tiempo de
ejecución. El nuevo tiempo total es de
83,9 s, un 30 % más rápido que el
original.

John Sanabria - john.sanabria@correounivalle.edu.co


Programación Paralela y Distribuida Clase 02 - Background 10 / 20
Andhals Law

Suponga un programa cuya versión inicial toma en ejecutarse 12


segundos. En su versión paralela le toma 5 segundos. ¿Cuál es el
speedup de este programa?

El speedup se calcula como la relación entre el tiempo de ejecución de la


versión inicial y el tiempo de ejecución de la versión paralela. Por lo
tanto, el speedup se calcula como:

Speedup = Tiempo de ejecución de la versión inicial / Tiempo de


ejecución de la versión paralela
Speedup = 12 segundos / 5 segundos
Speedup = 2.4

Por lo tanto, el speedup de este programa es de 2.4, lo que significa que


la versión paralela del programa es 2.4 veces más rápida que la versión
inicial.

John Sanabria - john.sanabria@correounivalle.edu.co


Programación Paralela y Distribuida Clase 02 - Background 10 / 20
Andhals Law

La unidad de medida del speedup es adimensional, ya que representa


simplemente la relación entre el tiempo de ejecución de la versión
inicial y el tiempo de ejecución de la versión paralela del programa.

Por lo tanto, el speedup no tiene una unidad de medida específica, sino


que se expresa como un número que indica cuántas veces más rápido
es la versión paralela del programa en comparación con la versión
inicial.

Por ejemplo, un speedup de 2 significa que la versión paralela del


programa se ejecuta el doble de rápido que la versión inicial.

John Sanabria - john.sanabria@correounivalle.edu.co


Programación Paralela y Distribuida Clase 02 - Background 10 / 20
Andhals Law
En un entorno con 4 procesadores, el porcentaje aproximado del código que se puede ejecutar
en paralelo se puede calcular utilizando la Ley de Amdahl. Esta ley establece que el speedup
máximo que se puede obtener al paralelizar un programa está limitado por la fracción de código
que no se puede paralelizar.

Speedup máximo = 1 / (1 - P)

Donde P es la fracción del código que se puede ejecutar en paralelo. Despejando P,


obtenemos:

P = 1 - 1/Speedup máximo

En este caso, el speedup máximo es 4 (el número de procesadores disponibles), por lo que:

P = 1 - 1/4 = 0.75

Por lo tanto, aproximadamente el 75% del código se puede ejecutar en paralelo.

El porcentaje del código que se puede ejecutar de forma serial es simplemente el complemento
del porcentaje que se puede ejecutar en paralelo:

Porcentaje serial = 100% - Porcentaje paralelo = 100% - 75% = 25%

John Sanabria - john.sanabria@correounivalle.edu.co


Programación Paralela y Distribuida Clase 02 - Background 10 / 20
Pipelining

Suponga que se requieren ejecutar 4 instrucciones en un procesador.


Esas instrucciones se deben ejecutar en un procesador que tiene tres
etapas: instruction fetch, instruction decode, instruction execute. Las
etapas mencionadas toman en ejecutarse, cada una, los siguientes
tiempos: 30 ns (instruction fetch), 40 ns (instruction decode), y 20 ns
(instruction execute).
Si el procesador no implementa la idea de pipelining, ¿cuánto tiempo le
toma ejecutar estas 4 instrucciones?
Si el procesador implementa la idea de pipelining, ¿cuánto tiempo le
toma ejecutar estas 4 instrucciones?
¿Cuál es el speedup de correr el programa en un procesador sin
pipelining versus un procesador con pipelining?

John Sanabria - john.sanabria@correounivalle.edu.co


Programación Paralela y Distribuida Clase 02 - Background 10 / 20
Pipelining
Sin pipelining, cada instrucción debe esperar a que se complete la etapa anterior antes de poder ejecutarse
en la siguiente etapa. Por lo tanto, el tiempo total de ejecución de las 4 instrucciones es igual a la suma de
los tiempos de las tres etapas para cada instrucción, más el tiempo de espera entre instrucciones:

Tiempo total sin pipelining = (30 + 40 + 20) + (30 + 40 + 20 + 90) + (30 + 40 + 20 + 130) + (30 + 40 + 20 +
170)
= 30 + 120 + 210 + 260
= 620 ns

Con pipelining, se pueden ejecutar varias instrucciones simultáneamente en diferentes etapas, lo que reduce
el tiempo total de ejecución. En este caso, podemos dividir las instrucciones en tres grupos, cada uno en
una etapa diferente, y hacer que las etapas funcionen en paralelo. Por lo tanto, el tiempo total de ejecución
es igual al tiempo de la etapa más larga, que es 130 ns:

Tiempo total con pipelining = 130 ns

El speedup se define como la relación entre el tiempo de ejecución sin pipelining y el tiempo de ejecución
con pipelining:

Speedup = Tiempo total sin pipelining / Tiempo total con pipelining


= 620 ns / 130 ns
= 4.77

Por lo tanto, el speedup de correr el programa en un procesador con pipelining en comparación con un
procesador sin pipelining es de aproximadamente 4.77 veces.

John Sanabria - john.sanabria@correounivalle.edu.co


Programación Paralela y Distribuida Clase 02 - Background 10 / 20
Pipelining
Para dividir las instrucciones en grupos, podemos utilizar la técnica de "pipelining" para que cada etapa del
procesador pueda trabajar en paralelo con la siguiente etapa. En este caso, podemos dividir las
instrucciones en tres grupos:

Grupo 1: La primera instrucción se ejecuta en la etapa de instruction fetch (30 ns)


Grupo 2: La segunda instrucción se ejecuta en la etapa de instruction fetch (30 ns), mientras que la primera
instrucción se ejecuta en la etapa de instruction decode (40 ns)
Grupo 3: La tercera instrucción se ejecuta en la etapa de instruction fetch (30 ns), mientras que la segunda
instrucción se ejecuta en la etapa de instruction decode (40 ns) y la primera instrucción se ejecuta en la
etapa de instruction execute (20 ns)
Mientras tanto, la cuarta instrucción se ejecuta en la etapa de instruction fetch (30 ns) y se va moviendo de
etapa en etapa a medida que las instrucciones anteriores avanzan en el pipeline.

El tiempo total de ejecución del programa será igual al tiempo que tarda la instrucción más lenta en
completarse en el pipeline. En este caso, la tercera instrucción es la que tarda más tiempo en completarse,
ya que tiene que pasar por todas las etapas del pipeline. Por lo tanto, el tiempo total de ejecución del
programa con pipelining será igual al tiempo que tarda la tercera instrucción en completarse, más el tiempo
de espera para las otras instrucciones:

Tiempo total con pipelining = 30 + 40 + 20 + 40 + 20 + 20 + 20 + 20


= 130 ns

Por lo tanto, el tiempo total de ejecución del programa con pipelining es de 130 ns, que es mucho más
rápido que sin pipelining. Esto se debe a que las etapas del pipeline pueden trabajar en paralelo, lo que
reduce el tiempo total de ejecución.

John Sanabria - john.sanabria@correounivalle.edu.co


Programación Paralela y Distribuida Clase 02 - Background 10 / 20
Pipelining

John Sanabria - john.sanabria@correounivalle.edu.co


Programación Paralela y Distribuida Clase 02 - Background 10 / 20
Ley de Amdahl (2)
La ley de Amdahl nos dice entonces que por mucho poder paralelo que
se tenga a disposición, el algoritmo está limitado por el tiempo que
toma ejecutar sus instrucciones secuenciales
1
𝑆∞ ⟶ 𝑓

Figure 2: Serial + Paralelo

John Sanabria - john.sanabria@correounivalle.edu.co


Programación Paralela y Distribuida Clase 02 - Background 6 / 20
Speedup, eficiencia y escalabilidad (1)
Speedup compara la latencia de ejecutar un programa con una unidad
de hardware (worker) versus 𝑃 unidades de hardware
𝑠𝑝𝑒𝑒𝑑𝑢𝑝 = 𝑆𝑃 = 𝑇𝑇1
𝑃
Eficiencia es el speedup dividido por el número de workers, 𝑃:
𝑆𝑃 𝑇1
𝑒𝑓𝑓𝑖𝑐𝑖𝑒𝑛𝑐𝑦 = 𝑃 = 𝑃 ×𝑇𝑃

John Sanabria - john.sanabria@correounivalle.edu.co


Programación Paralela y Distribuida Clase 02 - Background 7 / 20
Speedup, eficiencia y escalabilidad (2)
Ejercicio numérico
Suponga que un programa secuencial toma 2.5 segundos en ser
ejecutado. El programa se modifica de modo que al ser ejecutado sobre un
computador con 8 núcleos alcanza un tiempo de 725 milésimas de segundo.
¿Cuál es la eficiencia de este programa?

Ejercicio numérico
Suponga un programa 𝐴 del cual se sacaron una versión secuencial 𝐴 y una
versión paralela 𝐴𝑝 que usaba 8 hilos de ejecución. Los tiempos de
ejecución del programa fueron 𝑇𝐴 = 12 y 𝑇𝐴𝑝 = 5. ¿Qué porcentaje del
código es secuencial y qué porcentaje es paralela?
1
Hint: El 𝑆𝑝𝑒𝑒𝑑𝑢𝑝 = 1−𝑓+𝑓/𝑝 siendo 𝑓 la porción del código secuencial y 𝑝 el número de workers
involucrados en el procesamiento paralelo (workers: threads, cores)

John Sanabria - john.sanabria@correounivalle.edu.co


Programación Paralela y Distribuida Clase 02 - Background 8 / 20
Speedup, eficiencia y escalabilidad (3)
La eficiencia ideal es 1
¿Eso qué significa?Hint use la fórmula de eficiencia e
identifique en que momento se logra obtener un valor de 1

El término linear speedup es cuando un algoritmo corre 𝑃 veces más


rápido cuando este ejecuta sobre 𝑃 procesadores
Superlinear speedup es cuando se tiene una eficiencia superior a 1,
es decir, superior al 100%
Un programa serial ineficiente (e.g. pobre uso de cache) se compara con
un programa afinado y ejecutado en paralelo
En una búsqueda basada en árboles, un algoritmo puede llegar más
rápido a identificar ramas del árbol que no llevan a ningún resultado,
podar esas ramas y así evitar que otras instancias intenten ir por esas
ramas

John Sanabria - john.sanabria@correounivalle.edu.co


Programación Paralela y Distribuida Clase 02 - Background 9 / 20
Modelo Work-Span

El modelo Work-Span deriva su nombre del


número total de tareas a ejecutar (work) y
del tiempo que toma llevar a cabo esas
tareas en una máquina infinitamente
paralela (span)

Cuando el número de procesadores es 1 (P


= 1) entonces procesar toma 𝑇1 . Cuando el
num. de procesadores es ∞ entonces
procesar tomar 𝑇∞

El ejemplo gráfico indica que el 𝑇1 o el


work de esa aplicación es 18 y su 𝑇∞ o su
span es 6. El span se conoce también como
el depth del grafo
Figure 3: Ejemplo Work-Span con 18
tareas

John Sanabria - john.sanabria@correounivalle.edu.co


Programación Paralela y Distribuida Clase 02 - Background 10 / 20
Model Work-Span (2)

En este modelo es imposible tener un speedup superlinear


𝑇1 𝑇1
𝑆𝑝 = 𝑇𝑃 ≤ 𝑇1 =𝑃
𝑃

😟 Adicionar más procesadores no mejorará el rendimiento pues hay un


límite dado por la cantidad de tareas que se pueden ejecutar en
paralelo
𝑇1 𝑇1
𝑆𝑝 = 𝑇𝑃 ≤ 𝑇∞

𝑤𝑜𝑟𝑘 𝑇1 18
➡ 𝑠𝑝𝑒𝑒𝑑𝑢𝑝 ≤ 𝑠𝑝𝑎𝑛 . En el gráfico anterior el 𝑠𝑝𝑒𝑒𝑑𝑢𝑝 = 𝑇∞ = 6 =3
Work-Span no considera los costos de acceso a memoria y
comunicación. A un modelo que sí los considere se llama
burdened-span

John Sanabria - john.sanabria@correounivalle.edu.co


Programación Paralela y Distribuida Clase 02 - Background 11 / 20
La Fórmula de Little

La fórmula de Little nos relaciona el throughput y la latencia con la


concurrencia

Considere se desea tener un sistema capaz de procesar 𝑅 ítems por


unidad de tiempo y le toma al sistema procesar cada ítem 𝐿 unidades
de tiempo. La concurrencia del sistema está dado por

𝐶 =𝑅×𝐿
Concurrencia tiene que ver con el número total de tareas que están
en progreso al mismo tiempo, mientras que el paralelismo se
encarga de ejecutar las tareas al mismo tiempo

Concurrencia es un término más general que paralelismo y se puede


entender también como un paralelismo simulado o
pseudo-paralelismo

John Sanabria - john.sanabria@correounivalle.edu.co


Programación Paralela y Distribuida Clase 02 - Background 12 / 20
La Fórmula de Little (2)

La concurrencia se puede usar para mejorar el throughput cuando las


tareas llevan a cabo operaciones con alta latencia

Suponga que un core ejecuta una operación por click del reloj pero
cada operación espera por un acceso a memoria que toma 3 click del
reloj ➡ para ocultar la latencia se pueden ejecutar
𝐶𝑡𝑖𝑒𝑚𝑝𝑜/𝑖𝑛𝑠𝑡 = 𝑅𝑡𝑖𝑒𝑚𝑝𝑜/𝑎𝑐𝑐𝑒𝑠𝑜 × 𝐿𝑎𝑐𝑐𝑒𝑠𝑜/𝑖𝑛𝑠𝑡 = 1 × 3 operaciones a
la vez

IMPORTANTE en este caso las operaciones deben ser independientes


entre ellas

Este principio de concurrencia es el que usa el paquete


multithreading de Python

ENTONCES paralelizar para ocultar la latencia y maximizar el


throughput requiere sobre descomponer un problema y generar
extra concurrencia por cada unidad de procesamiento
John Sanabria - john.sanabria@correounivalle.edu.co
Programación Paralela y Distribuida Clase 02 - Background 13 / 20
Riesgos de la programación en paralelo

Condiciones de competencia Exclusión mutua y candados


(race conditions) (locks)

Figure 4: X podría quedar o con el valor


de ‘a’ o de ‘b’
Figure 5: mutex para garantizar acceso
ordenado

John Sanabria - john.sanabria@correounivalle.edu.co


Programación Paralela y Distribuida Clase 02 - Background 14 / 20
Riesgos de la programación en paralelo (2)

Deadlock se produce cuando dos procesos Strangled Scaling (“estrangulación” del


se bloquean mutuamente sin permitir el escalamiento) se produce cuando se usan
avance de ninguno de los dos candados en zonas de código amplio, se
debe tener bloqueos más limitados en el
código (fine-grain locking) . En general,
deben evitarse al máximo los candados

Falta de localidad

Localidad temporal se accede a la


misma posición de memoria en el
futuro cercano
Localidad espacial se accede a
posiciones de memoria cercanas
en el futuro cercano

Figure 6: Ambos procesos requieren R1


y R2

John Sanabria - john.sanabria@correounivalle.edu.co


Programación Paralela y Distribuida Clase 02 - Background 15 / 20
Riesgos de la programación en paralelo (3)
Desbalance en la carga es la carga Overhead incrementar el número de tareas
desigual entre trabajadores. Si las tareas a procesar implica un mayor sobrecosto a la
se pueden descomponer hora de gestionar y sincronizar tal cantidad
arbitrariamente entonces con su división de tareas. Se debe encontrar un
se puede balancear la carga balance de modo que se reduzca el coste
en tiempo de la gestión en relación a la
ganancia a la hora de procesar las tareas

Figure 8: Más tareas demandan más


costos de gestión y sincronización
Figure 7: Descomposición de tareas
para alcanzar el balance

John Sanabria - john.sanabria@correounivalle.edu.co


Programación Paralela y Distribuida Clase 02 - Background 16 / 20
Resumen

La arquitectura del computador afecta de manera significativa el


tiempo de ejecución de los programas

La ley de Amdahl nos da unos límites teóricos respecto al rendimiento


de una aplicación

El modelo work-span nos permite conocer unos límites, uno bajo(work,


serial) y otro alto(span, paralelo), respecto al rendimiento de un
programa

John Sanabria - john.sanabria@correounivalle.edu.co


Programación Paralela y Distribuida Clase 02 - Background 17 / 20
Resumen (2)

Se enumeraron algunos riesgos en la programación en paralelo que


pueden limitar la escalabilidad de las aplicaciones

Hacer que el paralelismo escale con los datos

Mantener el span corto

Sobre-descomponer las tareas de modo que haya una holgura en la


paralelización

Minimizar la sincronización (evitar locks)

Usar el concepto de localidad para disminuir el tráfico a la memoria

Aprovechar el paralelismo vectorial y de hilos de ser posible

John Sanabria - john.sanabria@correounivalle.edu.co


Programación Paralela y Distribuida Clase 02 - Background 18 / 20
John Sanabria - john.sanabria@correounivalle.edu.co
Programación Paralela y Distribuida Clase 02 - Background 19 / 20
NOTA
El reordenamiento de operaciones puede causar en un algoritmo una
mejora en su rendimiento. Sin embargo, ese reordenamiento puede
traer diferentes resultados

a = 1e20
b = 1e-20
c = 1e-20
d = a + b - a
e = b + c - b
f = d + e

# Order 1
# (a + b - a) + (b + c - b) + a = (b) + (c) + a
f_order1 = d + e + a

# Order 2
# b + c - a + a + (a + b - a) + (b + c - b) = b + c + b + c
f_order2 = b + c - a + a + d + e

John Sanabria - john.sanabria@correounivalle.edu.co


Programación Paralela y Distribuida Clase 02 - Background 20 / 20

You might also like