Concurrencia paralelismo

2,935 views

Published on

Presentación realizada para la asignatura Arquitecturas Multiprocesador.

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,935
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
49
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Concurrencia paralelismo

  1. 1. Paralelismo vs. ConcurrenciaRoberto Costumero Moreno Arquitecturas Multiprocesador Curso 2011 / 2012
  2. 2. Una visión general• Programas cada vez más complejos.• Sistemas con múltiples CPUs multicore.• Posibilidad de reducir el tiempo de ejecución de un programa.
  3. 3. Ventajas• Menor tiempo de cómputo.• Mayor aprovechamiento de los recursos.• Permite en muchas tareas el acceso simultáneo de varios usuarios.• Favorece una mayor cohesión y un menor acoplamiento entre las tareas a realizar.
  4. 4. Desventajas• Mayor complejidad de los programas.• Condiciones de carrera, ejecuciones no determinísticas...• Mayor grado de especialización de los ingenieros.• Código muy difícil de depurar.
  5. 5. ¿Qué son laconcurrencia y el paralelismo?
  6. 6. • Concurrencia: Ejecución de programas de forma no determinística.• Paralelismo: Explotación de la eficiencia de programas de forma determinística.
  7. 7. Concurrencia• Dos operaciones pueden estar realizándose en el mismo tiempo o no. Depende del paralelismo.• Es necesaria para implementar paralelismo.• Provee sistemas de sincronización y comunicación para programas ejecutados en una o más CPU.
  8. 8. Paralelismo• Implica la ejecución simultánea de dos o más operaciones en el mismo número de CPUs.• Necesita de mecanismos de concurrencia para juntar las partes de los cálculos realizados.
  9. 9. ¿Por qué es importante la concurrencia?• Permite la simulación de una ejecución paralela en un entorno monocore.• Gestiona el acceso seguro a elementos compartidos y secciones críticas.• Garantiza que el resultado de las operaciones es siempre el mismo, independientemente del nº de threads.
  10. 10. ¿Por qué es importante el paralelismo?• Creciente número de cores en los ordenadores.• Permite una gran disminución del tiempo de cómputo en programas de gran escala.• Contribuye a un mayor aprovechamiento de los recursos.
  11. 11. Ejemplos• Cálculo secuencial, concurrente (1 CPU) y paralelo (2 CPU) del número PI.• Cálculo de la suma de los elementos de un vector de forma secuencial, concurrente y paralela.
  12. 12. package main PI secuencialimport ( "fmt" "math" "runtime")func main() { runtime.GOMAXPROCS(1) fmt.Println(pi(100000))}// pi launches n goroutines to compute an// approximation of pi.func pi(n int) float64 { f := 0.0 for k := 0; k <= n; k++ { f += term(float64(k)) } return f}func term(k float64) float64 { return 4 * math.Pow(-1, k) / (2*k + 1)}
  13. 13. package main PI Concurrenteimport ( "fmt" "math" "runtime")func main() { runtime.GOMAXPROCS(1) fmt.Println(pi(100000))}// pi launches n goroutines to compute an// approximation of pi.func pi(n int) float64 { ch := make(chan float64) for k := 0; k <= n; k++ { go term(ch, float64(k)) } f := 0.0 for k := 0; k <= n; k++ { f += <-ch } return f}func term(ch chan float64, k float64) { ch <- 4 * math.Pow(-1, k) / (2*k + 1)}
  14. 14. package main PI Paraleloimport ( "fmt" "math" "runtime")func main() { runtime.GOMAXPROCS(2); fmt.Println(pi(100000))}// pi launches n goroutines to compute an// approximation of pi.func pi(n int) float64 { ch := make(chan float64) for k := 0; k <= n; k++ { go term(ch, float64(k)) } f := 0.0 for k := 0; k <= n; k++ { f += <-ch } return f}func term(ch chan float64, k float64) { ch <- 4 * math.Pow(-1, k) / (2*k + 1)}
  15. 15. Tiempos ejecución3.1416026534897203 Secuencial Concurrente Paralelo Real 0m0.032s User 0m0.027s Sys 0m0.002s
  16. 16. Tiempos ejecución3.1416026534897203 Secuencial Concurrente Paralelo Real 0m0.032s 0m0.689s User 0m0.027s 0m0.333s Sys 0m0.002s 0m0.347s
  17. 17. Tiempos ejecución3.1416026534897203 Secuencial Concurrente Paralelo Real 0m0.032s 0m0.689s 0m1.497s User 0m0.027s 0m0.333s 0m0.493s Sys 0m0.002s 0m0.347s 0m1.210s
  18. 18. package main Vector secuencialimport ( "fmt" "container/vector" "runtime")func sum (v *vector.IntVector, n int) int { var total int = 0 for i := n; i < v.Len(); i += 4 { total += v.At(i) } return total}func main () { runtime.GOMAXPROCS(1) var v *vector.IntVector = new (vector.IntVector) for i := 0; i < 100000000; i++ { v.Push(i) } var t int = 0 for i := 0; i < 4; i++ { t += sum (v, i) } fmt.Println(t)}
  19. 19. import ( Vector Concurrente "fmt" "container/vector" "runtime")func sum (v *vector.IntVector, n int, ch chan int) { var total int = 0 for i := n; i < v.Len(); i += 4 { total += v.At(i) } ch <- total}func main () { runtime.GOMAXPROCS(1) var v *vector.IntVector = new (vector.IntVector) for i := 0; i < 100000000; i++ { v.Push(i) } var t int = 0 ch := make(chan int) for i := 0; i < 4; i++ { go sum (v, i, ch) } for i := 0; i < 4; i++ { t += <-ch } fmt.Println(t)}
  20. 20. import ( "fmt" Vector Paralelo "container/vector" "runtime")func sum (v *vector.IntVector, n int, ch chan int) { var total int = 0 for i := n; i < v.Len(); i += 4 { total += v.At(i) } ch <- total}func main () { runtime.GOMAXPROCS(2) var v *vector.IntVector = new (vector.IntVector) for i := 0; i < 100000000; i++ { v.Push(i) } var t int = 0 ch := make(chan int) for i := 0; i < 4; i++ { go sum (v, i, ch) } for i := 0; i < 4; i++ { t += <-ch } fmt.Println(t)}
  21. 21. Tiempos ejecución 887459712 Secuencial Concurrente Paralelo Real 0m3.694s User 0m3.031s Sys 0m0.626sTiempos de inserción de elementos: real 0m2.716s || user 0m1.977s || sys 0m0.668s
  22. 22. Tiempos ejecución 887459712 Secuencial Concurrente Paralelo Real 0m3.694s 0m3.725s User 0m3.031s 0m3.068s Sys 0m0.626s 0m0.632sTiempos de inserción de elementos: real 0m2.716s || user 0m1.977s || sys 0m0.668s
  23. 23. Tiempos ejecución 887459712 Secuencial Concurrente Paralelo Real 0m3.694s 0m3.725s 0m3.179s User 0m3.031s 0m3.068s 0m3.025s Sys 0m0.626s 0m0.632s 0m0.638sTiempos de inserción de elementos: real 0m2.716s || user 0m1.977s || sys 0m0.668s
  24. 24. Bibliografía• http://existentialtype.wordpress.com/2011/03/17/ parallelism-is-not-concurrency/• http://existentialtype.wordpress.com/2011/03/15/ teaching-fp-to-freshmen/• http://ghcmutterings.wordpress.com/2009/10/06/ parallelism-concurrency/• http://my.opera.com/Vorlath/blog/2009/10/08/ parallel-vs-concurrent• http://golang.org

×