Paralelismo en
            lenguajes de alto nivel
            Un repaso por algunas opciones en .Net y Java
            L...
Máquina Virtual (jvmclr)

                             Librerías Sistema

                             Sistema Operativo

...
void *malloc(size_t size);
                      void free(void *pointer);




jueves 21 de enero de 2010
void *malloc(size_t size);
                      void free(void *pointer);




                             new Object();
...
El código es portable
                             entre arquitecturas




                             La gestión de la
 ...
public class Counter
                  {
                      private int value = 0;
                      public synchro...
public class Counter
                  {
                      private int value = 0;
                      public synchro...
Abstracciones

jueves 21 de enero de 2010
plinq   Parallel LINQ
                             Language Integrated Query
                                Paralelismo d...
plinq


                 IEnumerable<Factura> facturas = ...

                 var query = from f in facturas
            ...
plinq


                 IEnumerable<Factura> facturas = ...

                 var query = from f in facturas
            ...
plinq


                 IEnumerable<Factura> facturas = ...

                 var query = from f in facturas
            ...
plinq


                 IEnumerable<Factura> facturas = ...

                 var query = from f in facturas
            ...
plinq


                 IEnumerable<Factura> facturas = ...

                 var query = from f in facturas
            ...
plinq




             var q = from f in facturas.AsParalell()




jueves 21 de enero de 2010
plinq




             var q = from f in facturas.AsParalell()




jueves 21 de enero de 2010
plinq




             var q = from f in facturas.AsParalell()


             void PMatMul(...) {
               Parallel....
Actores
                             (paso de mensajes)




jueves 21 de enero de 2010
scala




                             var actor1 = actor {
                                 receive {
                   ...
scala




                             var actor1 = actor {
                                 receive {
                   ...
scala



                             var actor1 = actor {
                                 loop {
                       ...
scala



                             var actor1 = actor {
                                 loop {
                       ...
Clojure

                             Memoria Transaccional
                                  ¿por qué bloquear?




jueve...
cloju
                                                                                    re

                            ...
cloju
                                                                                    re

                            ...
cloju
                                                                                                       re
          ...
cloju
                                                                                                       re
          ...
cloju
                                                                                                       re
          ...
cloju
                                                                                                       re
          ...
jueves 21 de enero de 2010
Conclusiones




jueves 21 de enero de 2010
Conclusiones

                         hilos tradicionales
                         no componen




jueves 21 de enero de ...
Conclusiones

                         hilos tradicionales   plinq
                         no componen           uso decl...
Conclusiones

                         hilos tradicionales   plinq
                         no componen           uso decl...
Conclusiones

                         hilos tradicionales    plinq
                         no componen            uso de...
¿preguntas?

jueves 21 de enero de 2010
¡gracias!

jueves 21 de enero de 2010
Upcoming SlideShare
Loading in...5
×

Paralelismo en lenguajes de alto nivel

978

Published on

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
978
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
9
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Paralelismo en lenguajes de alto nivel

  1. 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. 2. Máquina Virtual (jvmclr) Librerías Sistema Sistema Operativo CPUs Memoria jueves 21 de enero de 2010
  3. 3. void *malloc(size_t size); void free(void *pointer); jueves 21 de enero de 2010
  4. 4. void *malloc(size_t size); void free(void *pointer); new Object(); jueves 21 de enero de 2010
  5. 5. El código es portable entre arquitecturas La gestión de la memoria es automática jueves 21 de enero de 2010
  6. 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. 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. 8. Abstracciones jueves 21 de enero de 2010
  9. 9. plinq Parallel LINQ Language Integrated Query Paralelismo de datos Construcciones declarativas jueves 21 de enero de 2010
  10. 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. 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. 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. 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. 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. 15. plinq var q = from f in facturas.AsParalell() jueves 21 de enero de 2010
  16. 16. plinq var q = from f in facturas.AsParalell() jueves 21 de enero de 2010
  17. 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. 18. Actores (paso de mensajes) jueves 21 de enero de 2010
  19. 19. scala var actor1 = actor { receive { case x : String => println(x) } } ... actor1 ! "hello world!" jueves 21 de enero de 2010
  20. 20. scala var actor1 = actor { receive { case x : String => println(x) } } ... actor1 ! "hello world!" jueves 21 de enero de 2010
  21. 21. scala var actor1 = actor { loop { react { case s : String => println(s) } } } ... actor1 ! "hello world!" jueves 21 de enero de 2010
  22. 22. scala var actor1 = actor { loop { react { case s : String => println(s) } } } ... actor1 ! "hello world!" jueves 21 de enero de 2010
  23. 23. Clojure Memoria Transaccional ¿por qué bloquear? jueves 21 de enero de 2010
  24. 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. 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. 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. 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. 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. 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. 30. jueves 21 de enero de 2010
  31. 31. Conclusiones jueves 21 de enero de 2010
  32. 32. Conclusiones hilos tradicionales no componen jueves 21 de enero de 2010
  33. 33. Conclusiones hilos tradicionales plinq no componen uso declarativo jueves 21 de enero de 2010
  34. 34. Conclusiones hilos tradicionales plinq no componen uso declarativo actores, mensajes memoria distribuida jueves 21 de enero de 2010
  35. 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. 36. ¿preguntas? jueves 21 de enero de 2010
  37. 37. ¡gracias! jueves 21 de enero de 2010
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×