33. Paralelismo vs Concurrencia
Paralelismo:
Surge cuando al menos dos tareas se ejecutan
de manera simultánea (físicamente).
34. Paralelismo vs Concurrencia
Paralelismo:
Surge cuando al menos dos tareas se ejecutan
de manera simultánea (físicamente).
Objetivo: optimizar tiempo de ejecución.
35. Paralelismo vs Concurrencia
Paralelismo:
Surge cuando al menos dos tareas se ejecutan
de manera simultánea (físicamente).
Objetivo: optimizar tiempo de ejecución.
Concurrencia:
36. Paralelismo vs Concurrencia
Paralelismo:
Surge cuando al menos dos tareas se ejecutan
de manera simultánea (físicamente).
Objetivo: optimizar tiempo de ejecución.
Concurrencia:
Surge cuando al menos dos tareas están
realizando progreso (e.g. time sharing).
37. Paralelismo vs Concurrencia
Paralelismo:
Surge cuando al menos dos tareas se ejecutan
de manera simultánea (físicamente).
Objetivo: optimizar tiempo de ejecución.
Concurrencia:
Surge cuando al menos dos tareas están
realizando progreso (e.g. time sharing).
Objetivo: tareas colaborativas.
38. Ley de Amdahl
Gene Amdahl, 1967
La máxima mejora en desempeño que puede
obtenerse al paralelizar un programa, está dada
por:
P = Porción paralelizable [0, 1].
N = Número de procesadores.
42. Modelo más tradicional
Hilos (Threads)
c/u con Stack propio
Memoria (estado) compartida
Locks para el acceso a variables compartidas
Manualmente se adquiere / libera
45. Problemas del Modelo de Hilos
Muy sensible a el orden de ejecución
Condiciones de competencia.
46. Problemas del Modelo de Hilos
Muy sensible a el orden de ejecución
Condiciones de competencia.
Deadlocks
47. Problemas del Modelo de Hilos
Muy sensible a el orden de ejecución
Condiciones de competencia.
Deadlocks
El pánico lleva a la serialización
48. Problemas del Modelo de Hilos
Muy sensible a el orden de ejecución
Condiciones de competencia.
Deadlocks
El pánico lleva a la serialización
Bloquea / serializa todo!
49. Problemas del Modelo de Hilos
Muy sensible a el orden de ejecución
Condiciones de competencia.
Deadlocks
El pánico lleva a la serialización
Bloquea / serializa todo!
Adiós concurrencia
50. Problemas del Modelo de Hilos
Muy sensible a el orden de ejecución
Condiciones de competencia.
Deadlocks
El pánico lleva a la serialización
Bloquea / serializa todo!
Adiós concurrencia
Muy propenso a errores.
51. Problemas del Modelo de Hilos
Muy sensible a el orden de ejecución
Condiciones de competencia.
Deadlocks
El pánico lleva a la serialización
Bloquea / serializa todo!
Adiós concurrencia
Muy propenso a errores.
62. Programación Funcional
Las funciones son abstracciones de 1er nivel.
Se pueden usar funciones como parámetros de
otras, así como valores de retorno.
63. Programación Funcional
Las funciones son abstracciones de 1er nivel.
Se pueden usar funciones como parámetros de
otras, así como valores de retorno.
Funciones de funciones (Higher Order Functions).
64. Programación Funcional
Las funciones son abstracciones de 1er nivel.
Se pueden usar funciones como parámetros de
otras, así como valores de retorno.
Funciones de funciones (Higher Order Functions).
Los programas se ejecutan evaluando expresiones.
65. Programación Funcional
Las funciones son abstracciones de 1er nivel.
Se pueden usar funciones como parámetros de
otras, así como valores de retorno.
Funciones de funciones (Higher Order Functions).
Los programas se ejecutan evaluando expresiones.
A diferencia de secuencias de sentencias
69. Programación Funcional
Las funciones son puras
Sin efectos colaterales.
El resultado es función solamente de los
parámetros, no de algún estado (transparencia
referencial).
70. Programación Funcional
Las funciones son puras
Sin efectos colaterales.
El resultado es función solamente de los
parámetros, no de algún estado (transparencia
referencial).
Típicamente, se evita mantener estado mutable.
73. Los programas funcionales son implícitamente
paralelizables (1/4)
Función F que transforma valores:
F(v1) -> v2
74. Los programas funcionales son implícitamente
paralelizables (1/4)
Función F que transforma valores:
F(v1) -> v2
Función ‘map’ sobre listas que utiliza F sobre cada elemento
de la lista, para formar otra lista:
75. Los programas funcionales son implícitamente
paralelizables (1/4)
Función F que transforma valores:
F(v1) -> v2
Función ‘map’ sobre listas que utiliza F sobre cada elemento
de la lista, para formar otra lista:
map( F, list1 ) -> list2
76. Los programas funcionales son implícitamente
paralelizables (1/4)
Función F que transforma valores:
F(v1) -> v2
Función ‘map’ sobre listas que utiliza F sobre cada elemento
de la lista, para formar otra lista:
map( F, list1 ) -> list2
Ejemplo 1 (Erlang):
77. Los programas funcionales son implícitamente
paralelizables (1/4)
Función F que transforma valores:
F(v1) -> v2
Función ‘map’ sobre listas que utiliza F sobre cada elemento
de la lista, para formar otra lista:
map( F, list1 ) -> list2
Ejemplo 1 (Erlang):
L = [ 1, 2, 3, 4, 5].
78. Los programas funcionales son implícitamente
paralelizables (1/4)
Función F que transforma valores:
F(v1) -> v2
Función ‘map’ sobre listas que utiliza F sobre cada elemento
de la lista, para formar otra lista:
map( F, list1 ) -> list2
Ejemplo 1 (Erlang):
L = [ 1, 2, 3, 4, 5].
lists:map (fun(X) -> 2*X end, L)
79. Los programas funcionales son implícitamente
paralelizables (1/4)
Función F que transforma valores:
F(v1) -> v2
Función ‘map’ sobre listas que utiliza F sobre cada elemento
de la lista, para formar otra lista:
map( F, list1 ) -> list2
Ejemplo 1 (Erlang):
L = [ 1, 2, 3, 4, 5].
lists:map (fun(X) -> 2*X end, L)
Resultado: [2, 4, 6, 8, 10]
80. Los programas funcionales son implícitamente
paralelizables (1/4)
Función F que transforma valores:
F(v1) -> v2
Función ‘map’ sobre listas que utiliza F sobre cada elemento
de la lista, para formar otra lista:
map( F, list1 ) -> list2
Ejemplo 1 (Erlang):
L = [ 1, 2, 3, 4, 5].
lists:map (fun(X) -> 2*X end, L)
Resultado: [2, 4, 6, 8, 10]
¿Importa el orden en que se aplicó F?
81. Los programas funcionales son implícitamente
paralelizables (1/4)
Función F que transforma valores:
F(v1) -> v2
Función ‘map’ sobre listas que utiliza F sobre cada elemento
de la lista, para formar otra lista:
map( F, list1 ) -> list2
Ejemplo 1 (Erlang):
L = [ 1, 2, 3, 4, 5].
lists:map (fun(X) -> 2*X end, L)
Resultado: [2, 4, 6, 8, 10]
¿Importa el orden en que se aplicó F?
No. Por tanto ¡es paralelizable!
82. Los programas funcionales son implícitamente
paralelizables (2/4)
Ejemplo 2. ¿Cuántas paralelizaciones son posibles?
List obtenerCursosSugeridos(idAlumno) ->
Lists.filter (
cursosDePeriodoActivo(),
esCursoDeAlgunaMateria(
materiasPorAprobarDeAlumno( idAlumno ) )
83. Los programas funcionales son implícitamente
paralelizables (2/4)
Ejemplo 2. ¿Cuántas paralelizaciones son posibles?
Pueden evaluarse en
paralelo porque no hay
dependencias
List obtenerCursosSugeridos(idAlumno) ->
Lists.filter (
cursosDePeriodoActivo(),
esCursoDeAlgunaMateria(
materiasPorAprobarDeAlumno( idAlumno ) )
84. Los programas funcionales son implícitamente
paralelizables (2/4)
Ejemplo 2. ¿Cuántas paralelizaciones son posibles?
Pueden evaluarse en
paralelo porque no hay
dependencias
List obtenerCursosSugeridos(idAlumno) ->
Lists.filter (
cursosDePeriodoActivo(),
esCursoDeAlgunaMateria(
materiasPorAprobarDeAlumno( idAlumno ) )
La función ‘filter’ puede aplicar en paralelo la
función ‘esCursoDeAlgunaMateria’ a cada elemento
de la lista.
85. Los programas funcionales son implícitamente
paralelizables (3/4)
Al ser expresiones, los programas funcionales no
imponen un orden estricto de ejecución, por lo que
partes del programa (sub-expresiones) pueden ser
evaluadas en paralelo, delegando a la plataforma
esta tarea.
87. Los programas funcionales son implícitamente
paralelizables (4/4)
Las características que hacen que los programas
funcionales sean paralelizables son dos:
88. Los programas funcionales son implícitamente
paralelizables (4/4)
Las características que hacen que los programas
funcionales sean paralelizables son dos:
Independencia del tiempo.
89. Los programas funcionales son implícitamente
paralelizables (4/4)
Las características que hacen que los programas
funcionales sean paralelizables son dos:
Independencia del tiempo.
No existencia de variables mutables.
109. Map-Reduce
Propiedades deseables en el operador ‘Reduce’
Asociatividad
a ⊕ ( b ⊕ c ) = (a ⊕ b) ⊕ c
Conmutatividad
a⊕b=b⊕a
Asociatividad y Conmutatividad
110. Map-Reduce
Propiedades deseables en el operador ‘Reduce’
Asociatividad
a ⊕ ( b ⊕ c ) = (a ⊕ b) ⊕ c
Conmutatividad
a⊕b=b⊕a
Asociatividad y Conmutatividad
a ⊕ ( b ⊕ c ) = (c ⊕ a) ⊕ b
114. Ejemplo de Map-Reduce
Problema: contar el número de veces que
aparece una palabra en un documento.
map(String name, String document):
for each word w in document:
EmitIntermediate(w, "1")
115. Ejemplo de Map-Reduce
Problema: contar el número de veces que
aparece una palabra en un documento.
map(String name, String document):
for each word w in document:
EmitIntermediate(w, "1")
116. Ejemplo de Map-Reduce
Problema: contar el número de veces que
aparece una palabra en un documento.
map(String name, String document):
for each word w in document:
EmitIntermediate(w, "1")
117. Ejemplo de Map-Reduce
Problema: contar el número de veces que
aparece una palabra en un documento.
map(String name, String document):
for each word w in document:
EmitIntermediate(w, "1")
reduce(String word, Iterator partialCounts):
int sum = 0;
for each count in partialCounts:
sum += parseInt(count)
Emit(word, AsString(sum))
122. Actores
Modelo de programación concurrente
Un actor:
Tiene un estado interno, no compartido.
Tiene su propio hilo de ejecución (event loop).
123. Actores
Modelo de programación concurrente
Un actor:
Tiene un estado interno, no compartido.
Tiene su propio hilo de ejecución (event loop).
Puede enviar y recibir mensajes a otros actores, de
manera asíncrona.
124. Actores
Modelo de programación concurrente
Un actor:
Tiene un estado interno, no compartido.
Tiene su propio hilo de ejecución (event loop).
Puede enviar y recibir mensajes a otros actores, de
manera asíncrona.
En respuesta a un mensaje, puede:
125. Actores
Modelo de programación concurrente
Un actor:
Tiene un estado interno, no compartido.
Tiene su propio hilo de ejecución (event loop).
Puede enviar y recibir mensajes a otros actores, de
manera asíncrona.
En respuesta a un mensaje, puede:
Cambiar su estado interno.
126. Actores
Modelo de programación concurrente
Un actor:
Tiene un estado interno, no compartido.
Tiene su propio hilo de ejecución (event loop).
Puede enviar y recibir mensajes a otros actores, de
manera asíncrona.
En respuesta a un mensaje, puede:
Cambiar su estado interno.
Enviar mensajes a otros actores.
132. ¿Cuándo utilizar Actores?
Cuando el problema se preste de manera natural a
descomposición de diferentes tareas concurrentes.
Cuando se requiere descomponer la aplicación de
tal manera que se permita escalar de manera
diferente a cada parte de la misma.
133. ¿Cuándo utilizar Actores?
Cuando el problema se preste de manera natural a
descomposición de diferentes tareas concurrentes.
Cuando se requiere descomponer la aplicación de
tal manera que se permita escalar de manera
diferente a cada parte de la misma.
Cuando se quiere tener transparencia al escalar
aplicaciones entre un CPU de varios cores a un
cluster de máquinas.
134. Software Transactional
Memory
Ok, es imposible evitar al 100% el estado
mutable.
¿Cómo manejar el estado mutable en
concurrencia de manera segura?
Usar transacciones en memoria para
modificar las referencias mutables.
136. Otros modelos
Colecciones paralelas
listOfFiles.par foreach(file => sendToS3(file))
Data Flow
“Cambiar el valor de 1 variable,
automáticamente debería forzar el recálculo
de valores que dependen de dicha variable”.
140. Futuro
Experiencia
Investigación
con HPC
Necesidades
de la Industria
141. "My thesis is that the best way to write parallel
applications is not to have to think about
parallelism, just as the best way to deal with
memory and it's management is not to have to
worry about this management. You have this
garbage collector... let it deal with that"
Guy Steele, 2011
142. Referencias
The Free Lunch is Over. http://j.mp/mL1PMf
How to Think About Parallel Programming: Not!
http://j.mp/jXYNeH
Introduction to Parallel Programming and
MapReduce http:/ /j.mp/pLFVZA
Actors in Scala http://j.mp/plti66
Concepts, Techniques and Models of Computer
Programming. Van Roy & Haridi, 2004. http://
j.mp/m7gYbi
Notes de l'éditeur
\n
\n
- La densidad de transistores se duplica cada 18 meses.\n- La velocidad de los transistores se duplica cada 18 meses.\n- La pared de la energía (The Power Wall)\n\n
- La densidad de transistores se duplica cada 18 meses.\n- La velocidad de los transistores se duplica cada 18 meses.\n- La pared de la energía (The Power Wall)\n\n
- La densidad de transistores se duplica cada 18 meses.\n- La velocidad de los transistores se duplica cada 18 meses.\n- La pared de la energía (The Power Wall)\n\n
- El Cell fue introducido por Sony, Toshiba e IBM para el Play Station 3.\n- ¿Cómo programar esta máquina explotando todos sus nucleos de procesamiento.\n\n
- El Cell fue introducido por Sony, Toshiba e IBM para el Play Station 3.\n- ¿Cómo programar esta máquina explotando todos sus nucleos de procesamiento.\n\n
La fujitsu K Computer fue catalogada la computadora más potente del mundo (Junio 2011)\nEl poder de las supercomputadoras se ha duplicado cada 14 meses!\n
La fujitsu K Computer fue catalogada la computadora más potente del mundo (Junio 2011)\nEl poder de las supercomputadoras se ha duplicado cada 14 meses!\n
La fujitsu K Computer fue catalogada la computadora más potente del mundo (Junio 2011)\nEl poder de las supercomputadoras se ha duplicado cada 14 meses!\n
La fujitsu K Computer fue catalogada la computadora más potente del mundo (Junio 2011)\nEl poder de las supercomputadoras se ha duplicado cada 14 meses!\n
La fujitsu K Computer fue catalogada la computadora más potente del mundo (Junio 2011)\nEl poder de las supercomputadoras se ha duplicado cada 14 meses!\n
La fujitsu K Computer fue catalogada la computadora más potente del mundo (Junio 2011)\nEl poder de las supercomputadoras se ha duplicado cada 14 meses!\n
La fujitsu K Computer fue catalogada la computadora más potente del mundo (Junio 2011)\nEl poder de las supercomputadoras se ha duplicado cada 14 meses!\n
La fujitsu K Computer fue catalogada la computadora más potente del mundo (Junio 2011)\nEl poder de las supercomputadoras se ha duplicado cada 14 meses!\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
Supuesto: una aplicación monolítica.\nConforme más usuarios, se necesita introducir más hardware... \nTope: Ley de Amdahl\npero no todas las sub-funcionalidades de la aplicación requieren escalar de igual manera.\nNo solo aplica a usuarios.\n
Supuesto: una aplicación monolítica.\nConforme más usuarios, se necesita introducir más hardware... \nTope: Ley de Amdahl\npero no todas las sub-funcionalidades de la aplicación requieren escalar de igual manera.\nNo solo aplica a usuarios.\n
Supuesto: una aplicación monolítica.\nConforme más usuarios, se necesita introducir más hardware... \nTope: Ley de Amdahl\npero no todas las sub-funcionalidades de la aplicación requieren escalar de igual manera.\nNo solo aplica a usuarios.\n
Supuesto: una aplicación monolítica.\nConforme más usuarios, se necesita introducir más hardware... \nTope: Ley de Amdahl\npero no todas las sub-funcionalidades de la aplicación requieren escalar de igual manera.\nNo solo aplica a usuarios.\n
Supuesto: una aplicación monolítica.\nConforme más usuarios, se necesita introducir más hardware... \nTope: Ley de Amdahl\npero no todas las sub-funcionalidades de la aplicación requieren escalar de igual manera.\nNo solo aplica a usuarios.\n
Supuesto: una aplicación monolítica.\nConforme más usuarios, se necesita introducir más hardware... \nTope: Ley de Amdahl\npero no todas las sub-funcionalidades de la aplicación requieren escalar de igual manera.\nNo solo aplica a usuarios.\n
Supuesto: una aplicación monolítica.\nConforme más usuarios, se necesita introducir más hardware... \nTope: Ley de Amdahl\npero no todas las sub-funcionalidades de la aplicación requieren escalar de igual manera.\nNo solo aplica a usuarios.\n
Supuesto: una aplicación monolítica.\nConforme más usuarios, se necesita introducir más hardware... \nTope: Ley de Amdahl\npero no todas las sub-funcionalidades de la aplicación requieren escalar de igual manera.\nNo solo aplica a usuarios.\n
Supuesto: una aplicación monolítica.\nConforme más usuarios, se necesita introducir más hardware... \nTope: Ley de Amdahl\npero no todas las sub-funcionalidades de la aplicación requieren escalar de igual manera.\nNo solo aplica a usuarios.\n
Supuesto: una aplicación monolítica.\nConforme más usuarios, se necesita introducir más hardware... \nTope: Ley de Amdahl\npero no todas las sub-funcionalidades de la aplicación requieren escalar de igual manera.\nNo solo aplica a usuarios.\n
\n
\n
\n
\n
\n
\n
\n
Supuesto: una aplicación monolítica.\nConforme más usuarios, se necesita introducir más hardware... \nTope: Ley de Amdahl\npero no todas las sub-funcionalidades de la aplicación requieren escalar de igual manera.\nNo solo aplica a usuarios.\n
Supuesto: una aplicación monolítica.\nConforme más usuarios, se necesita introducir más hardware... \nTope: Ley de Amdahl\npero no todas las sub-funcionalidades de la aplicación requieren escalar de igual manera.\nNo solo aplica a usuarios.\n
¿Por qué no simplemente programamos con hilos?\n
¿Por qué no simplemente programamos con hilos?\n
¿Por qué no simplemente programamos con hilos?\n
¿Por qué no simplemente programamos con hilos?\n
¿Por qué no simplemente programamos con hilos?\n
¿Por qué no simplemente programamos con hilos?\n
¿Por qué no simplemente programamos con hilos?\n
¿Por qué no simplemente programamos con hilos?\n
¿Por qué no simplemente programamos con hilos?\n
¿Por qué no simplemente programamos con hilos?\n
Implícito: El sistema se hace cargo de la paralelización.\nExplícito: El programador define y controla los procesos\n
Implícito: El sistema se hace cargo de la paralelización.\nExplícito: El programador define y controla los procesos\n
Implícito: El sistema se hace cargo de la paralelización.\nExplícito: El programador define y controla los procesos\n
Implícito: El sistema se hace cargo de la paralelización.\nExplícito: El programador define y controla los procesos\n
Implícito: El sistema se hace cargo de la paralelización.\nExplícito: El programador define y controla los procesos\n
Implícito: El sistema se hace cargo de la paralelización.\nExplícito: El programador define y controla los procesos\n
Implícito: El sistema se hace cargo de la paralelización.\nExplícito: El programador define y controla los procesos\n