Your SlideShare is downloading. ×
Paralelismo en lenguajes de alto nivel
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

Paralelismo en lenguajes de alto nivel

956
views

Published on

Transparencias para la presentación del trabajo de CMCP.

Transparencias para la presentación del trabajo de CMCP.

Published in: Technology

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

  • Be the first to like this

No Downloads
Views
Total Views
956
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
8
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Paralelismo en lenguajes de alto nivel Un repaso por algunas opciones en .Net y Java Luis Belloch Gómez CMCP Enero 2010 jueves 21 de enero de 2010
  • 2. Máquina Virtual (jvmclr) Librerías Sistema Sistema Operativo CPUs Memoria jueves 21 de enero de 2010
  • 3. void *malloc(size_t size); void free(void *pointer); jueves 21 de enero de 2010
  • 4. void *malloc(size_t size); void free(void *pointer); new Object(); jueves 21 de enero de 2010
  • 5. El código es portable entre arquitecturas La gestión de la memoria es automática jueves 21 de enero de 2010
  • 6. public class Counter { private int value = 0; public synchronized void incr(){ value = value + 1; } } .... Counter counter = new Counter(); counter.incr(); jueves 21 de enero de 2010
  • 7. public class Counter { private int value = 0; public synchronized void incr(){ value = value + 1; } } .... Counter counter = new Counter(); counter.incr(); jueves 21 de enero de 2010
  • 8. Abstracciones jueves 21 de enero de 2010
  • 9. plinq Parallel LINQ Language Integrated Query Paralelismo de datos Construcciones declarativas jueves 21 de enero de 2010
  • 10. plinq IEnumerable<Factura> facturas = ... var query = from f in facturas where f.Ciudad == ... select f; var suma = query.Sum(f => f.importe); jueves 21 de enero de 2010
  • 11. plinq IEnumerable<Factura> facturas = ... var query = from f in facturas where f.Ciudad == ... select f; var suma = query.Sum(f => f.importe); facturas.Where(f => f.Ciudad == ...).Select(f => f); jueves 21 de enero de 2010
  • 12. plinq IEnumerable<Factura> facturas = ... var query = from f in facturas where f.Ciudad == ... select f; var suma = query.Sum(f => f.importe); λ λ facturas.Where(f => f.Ciudad == ...).Select(f => f); jueves 21 de enero de 2010
  • 13. plinq IEnumerable<Factura> facturas = ... var query = from f in facturas where f.Ciudad == ... select f; var suma = query.Sum(f => f.importe); λ λ facturas.Where(f => f.Ciudad == ...).Select(f => f); jueves 21 de enero de 2010
  • 14. plinq IEnumerable<Factura> facturas = ... var query = from f in facturas where f.Ciudad == ... select f; var suma = query.Sum(f => f.importe); λ λ facturas.Where(f => f.Ciudad == ...).Select(f => f); jueves 21 de enero de 2010
  • 15. plinq var q = from f in facturas.AsParalell() jueves 21 de enero de 2010
  • 16. plinq var q = from f in facturas.AsParalell() jueves 21 de enero de 2010
  • 17. plinq var q = from f in facturas.AsParalell() void PMatMul(...) { Parallel.For(0, size, (i) => { for (int j = 0; j < size; j++) { result[i, j] = 0; for (int k = 0; k < size; k++) { result[i, j] += m1[i, k] * m2[k, j]; } } }); } jueves 21 de enero de 2010
  • 18. Actores (paso de mensajes) jueves 21 de enero de 2010
  • 19. scala var actor1 = actor { receive { case x : String => println(x) } } ... actor1 ! "hello world!" jueves 21 de enero de 2010
  • 20. scala var actor1 = actor { receive { case x : String => println(x) } } ... actor1 ! "hello world!" jueves 21 de enero de 2010
  • 21. scala var actor1 = actor { loop { react { case s : String => println(s) } } } ... actor1 ! "hello world!" jueves 21 de enero de 2010
  • 22. scala var actor1 = actor { loop { react { case s : String => println(s) } } } ... actor1 ! "hello world!" jueves 21 de enero de 2010
  • 23. Clojure Memoria Transaccional ¿por qué bloquear? jueves 21 de enero de 2010
  • 24. cloju re !"#$$%&'&()$*+,- !"#$$%&.$,)#&/0( 1,2#"34&567$8-,&94&9::; <7+",7&<2-,,"4&=)7>"?@$,A ! ! (def counter(ref 0)) (dosync (alter counter inc)) jueves 21 de enero de 2010
  • 25. cloju re !"#$$%&'&()$*+,- !"#$$%&.$,)#&/0( 1,2#"34&567$8-,&94&9::; <7+",7&<2-,,"4&=)7>"?@$,A ! ! (def counter(ref 0)) (dosync (alter counter inc)) jueves 21 de enero de 2010
  • 26. cloju re (defn run [nvecs nitems nthreads niters] !"#$$%&'&()$*+,- (let [vec-refs (vec (map !"#$$%&.$,)#&/0( 1,2#"34&567$8-,&94&9::; (comp ref vec) <7+",7&<2-,,"4&=)7>"?@$,A (partition nitems (range (* nvecs nitems))))) swap #(let [v1 (rand-int nvecs) v2 (rand-int nvecs) ! ! i1 (rand-int nitems) i2 (rand-int nitems)] (dosync (let [temp (nth @(vec-refs v1) i1)] (alter (vec-refs v1) assoc i1 (nth @(vec-refs v2) i2)) (alter (vec-refs v2) assoc i2 temp)))) report #(do (prn (map deref vec-refs)) (println "Distinct:" (count (distinct (apply concat (map deref vec-refs))))))] (report) (dorun (apply pcalls (repeat nthreads #(dotimes [_ niters] (swap))))) (report))) (run 100 10 10 100000) (println "Done.") jueves 21 de enero de 2010
  • 27. cloju re (defn run [nvecs nitems nthreads niters] !"#$$%&'&()$*+,- (let [vec-refs (vec (map !"#$$%&.$,)#&/0( 1,2#"34&567$8-,&94&9::; (comp ref vec) <7+",7&<2-,,"4&=)7>"?@$,A (partition nitems (range (* nvecs nitems))))) swap #(let [v1 (rand-int nvecs) v2 (rand-int nvecs) ! ! i1 (rand-int nitems) i2 (rand-int nitems)] (dosync (let [temp (nth @(vec-refs v1) i1)] (alter (vec-refs v1) assoc i1 (nth @(vec-refs v2) i2)) (alter (vec-refs v2) assoc i2 temp)))) report #(do (prn (map deref vec-refs)) (println "Distinct:" (count (distinct (apply concat (map deref vec-refs))))))] (report) (dorun (apply pcalls (repeat nthreads #(dotimes [_ niters] (swap))))) (report))) (run 100 10 10 100000) (println "Done.") jueves 21 de enero de 2010
  • 28. cloju re (defn run [nvecs nitems nthreads niters] !"#$$%&'&()$*+,- (let [vec-refs (vec (map el acceso a vec es transaccional !"#$$%&.$,)#&/0( 1,2#"34&567$8-,&94&9::; (comp ref vec) <7+",7&<2-,,"4&=)7>"?@$,A (partition nitems (range (* nvecs nitems))))) swap #(let [v1 (rand-int nvecs) v2 (rand-int nvecs) ! ! i1 (rand-int nitems) i2 (rand-int nitems)] (dosync (let [temp (nth @(vec-refs v1) i1)] (alter (vec-refs v1) assoc i1 (nth @(vec-refs v2) i2)) (alter (vec-refs v2) assoc i2 temp)))) report #(do (prn (map deref vec-refs)) (println "Distinct:" (count (distinct (apply concat (map deref vec-refs))))))] (report) (dorun (apply pcalls (repeat nthreads #(dotimes [_ niters] (swap))))) (report))) (run 100 10 10 100000) (println "Done.") jueves 21 de enero de 2010
  • 29. cloju re (defn run [nvecs nitems nthreads niters] !"#$$%&'&()$*+,- (let [vec-refs (vec (map el acceso a vec es transaccional !"#$$%&.$,)#&/0( 1,2#"34&567$8-,&94&9::; (comp ref vec) <7+",7&<2-,,"4&=)7>"?@$,A (partition nitems (range (* nvecs nitems))))) swap #(let [v1 (rand-int nvecs) v2 (rand-int nvecs) ! ! i1 (rand-int nitems) el bloque siguiente i2 (rand-int nitems)] (dosync va dentro de una (let [temp (nth @(vec-refs v1) i1)] (alter (vec-refs v1) assoc i1 transacción (nth @(vec-refs v2) i2)) (alter (vec-refs v2) assoc i2 temp)))) report #(do (prn (map deref vec-refs)) (println "Distinct:" (count (distinct (apply concat (map deref vec-refs))))))] (report) (dorun (apply pcalls (repeat nthreads #(dotimes [_ niters] (swap))))) (report))) (run 100 10 10 100000) (println "Done.") jueves 21 de enero de 2010
  • 30. jueves 21 de enero de 2010
  • 31. Conclusiones jueves 21 de enero de 2010
  • 32. Conclusiones hilos tradicionales no componen jueves 21 de enero de 2010
  • 33. Conclusiones hilos tradicionales plinq no componen uso declarativo jueves 21 de enero de 2010
  • 34. Conclusiones hilos tradicionales plinq no componen uso declarativo actores, mensajes memoria distribuida jueves 21 de enero de 2010
  • 35. Conclusiones hilos tradicionales plinq no componen uso declarativo Clojure actores, mensajes stm, sin bloqueos memoria distribuida memoria compartida jueves 21 de enero de 2010
  • 36. ¿preguntas? jueves 21 de enero de 2010
  • 37. ¡gracias! jueves 21 de enero de 2010