SlideShare una empresa de Scribd logo
1 de 37
Descargar para leer sin conexión
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
Máquina Virtual (jvmclr)

                             Librerías Sistema

                             Sistema Operativo

                             CPUs  Memoria


jueves 21 de enero de 2010
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();



jueves 21 de enero de 2010
El código es portable
                             entre arquitecturas




                             La gestión de la
                             memoria es automática




jueves 21 de enero de 2010
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
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
Abstracciones

jueves 21 de enero de 2010
plinq   Parallel LINQ
                             Language Integrated Query
                                Paralelismo de datos
                             Construcciones declarativas




jueves 21 de enero de 2010
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
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
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
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
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
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.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
Actores
                             (paso de mensajes)




jueves 21 de enero de 2010
scala




                             var actor1 = actor {
                                 receive {
                                     case x : String =>
                                         println(x)
                                 }
                             }
                             ...
                             actor1 ! "hello world!"




jueves 21 de enero de 2010
scala




                             var actor1 = actor {
                                 receive {
                                     case x : String =>
                                         println(x)
                                 }
                             }
                             ...
                             actor1 ! "hello world!"




jueves 21 de enero de 2010
scala



                             var actor1 = actor {
                                 loop {
                                    react {
                                      case s : String =>
                                          println(s)
                                    }
                                 }
                             }
                             ...
                             actor1 ! "hello world!"




jueves 21 de enero de 2010
scala



                             var actor1 = actor {
                                 loop {
                                    react {
                                      case s : String =>
                                          println(s)
                                    }
                                 }
                             }
                             ...
                             actor1 ! "hello world!"




jueves 21 de enero de 2010
Clojure

                             Memoria Transaccional
                                  ¿por qué bloquear?




jueves 21 de enero de 2010
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
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
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
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
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
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
jueves 21 de enero de 2010
Conclusiones




jueves 21 de enero de 2010
Conclusiones

                         hilos tradicionales
                         no componen




jueves 21 de enero de 2010
Conclusiones

                         hilos tradicionales   plinq
                         no componen           uso declarativo




jueves 21 de enero de 2010
Conclusiones

                         hilos tradicionales   plinq
                         no componen           uso declarativo



            actores, mensajes
            memoria distribuida


jueves 21 de enero de 2010
Conclusiones

                         hilos tradicionales    plinq
                         no componen            uso declarativo


                                                  Clojure
            actores, mensajes                  stm, sin bloqueos
            memoria distribuida                memoria compartida


jueves 21 de enero de 2010
¿preguntas?

jueves 21 de enero de 2010
¡gracias!

jueves 21 de enero de 2010

Más contenido relacionado

La actualidad más candente (20)

Paralela4
Paralela4Paralela4
Paralela4
 
Paralela5
Paralela5Paralela5
Paralela5
 
Cap6
Cap6Cap6
Cap6
 
Paralela8
Paralela8Paralela8
Paralela8
 
Derivación
DerivaciónDerivación
Derivación
 
Paralela1
Paralela1Paralela1
Paralela1
 
P1
P1P1
P1
 
clase de matlab
clase  de   matlabclase  de   matlab
clase de matlab
 
Java ArrayList Iterator
Java ArrayList IteratorJava ArrayList Iterator
Java ArrayList Iterator
 
Vectors
VectorsVectors
Vectors
 
Tutorial rapido de octave
Tutorial rapido de octaveTutorial rapido de octave
Tutorial rapido de octave
 
4 varible aleatoriadiscreta (1)
4 varible aleatoriadiscreta (1)4 varible aleatoriadiscreta (1)
4 varible aleatoriadiscreta (1)
 
Estructura de datos I Primera Parte
Estructura de datos I Primera ParteEstructura de datos I Primera Parte
Estructura de datos I Primera Parte
 
Estadistica 2
Estadistica 2Estadistica 2
Estadistica 2
 
Calcular taller 1
Calcular taller 1Calcular taller 1
Calcular taller 1
 
Introduccion a la metodologia bootstrap
Introduccion a la metodologia bootstrapIntroduccion a la metodologia bootstrap
Introduccion a la metodologia bootstrap
 
Clase3 asignaciones
Clase3 asignacionesClase3 asignaciones
Clase3 asignaciones
 
11funciones 1231096290787715-2
11funciones 1231096290787715-211funciones 1231096290787715-2
11funciones 1231096290787715-2
 
Parte2
Parte2Parte2
Parte2
 
Convolucion Tiempo Discreto
Convolucion Tiempo DiscretoConvolucion Tiempo Discreto
Convolucion Tiempo Discreto
 

Destacado (13)

Kerberos
KerberosKerberos
Kerberos
 
Kerberos and its application in cross realm operations
Kerberos and its application in cross realm operationsKerberos and its application in cross realm operations
Kerberos and its application in cross realm operations
 
Ch14
Ch14Ch14
Ch14
 
Kerberos, Token and Hadoop
Kerberos, Token and HadoopKerberos, Token and Hadoop
Kerberos, Token and Hadoop
 
An Introduction to Kerberos
An Introduction to KerberosAn Introduction to Kerberos
An Introduction to Kerberos
 
Kerberos presentation
Kerberos presentationKerberos presentation
Kerberos presentation
 
Kerberos protocol
Kerberos protocolKerberos protocol
Kerberos protocol
 
CRYPTOGRAPHY AND NETWORK SECURITY
CRYPTOGRAPHY AND NETWORK SECURITYCRYPTOGRAPHY AND NETWORK SECURITY
CRYPTOGRAPHY AND NETWORK SECURITY
 
Kerberos
KerberosKerberos
Kerberos
 
Kerberos : An Authentication Application
Kerberos : An Authentication ApplicationKerberos : An Authentication Application
Kerberos : An Authentication Application
 
Kerberos Authentication Protocol
Kerberos Authentication ProtocolKerberos Authentication Protocol
Kerberos Authentication Protocol
 
kerberos
kerberoskerberos
kerberos
 
Kerberos
KerberosKerberos
Kerberos
 

Último

EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
FagnerLisboa3
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
AnnimoUno1
 

Último (11)

EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 

Paralelismo en lenguajes de alto nivel

  • 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
  • 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