paralelismo en lenguajes de alto nivel
DESCRIPTION
Transparencias para la presentación del trabajo de CMCP.TRANSCRIPT
Paralelismo enlenguajes de alto nivelUn repaso por algunas opciones en .Net y Java
Luis Belloch GómezCMCP Enero 2010
jueves 21 de enero de 2010
Máquina Virtual (jvm\clr)
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
La gestión de la memoria es automática
El código es portable entre arquitecturas
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
Language Integrated QueryParalelismo de datos
Construcciones declarativas
plinq Parallel LINQ
jueves 21 de enero de 2010
IEnumerable<Factura> facturas = ...
var query = from f in facturas where f.Ciudad == ... select f; var suma = query.Sum(f => f.importe);
plinq
jueves 21 de enero de 2010
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);
plinq
jueves 21 de enero de 2010
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);λ λ
plinq
jueves 21 de enero de 2010
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);λ λ
plinq
jueves 21 de enero de 2010
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);λ λ
plinq
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
var actor1 = actor { receive { case x : String => println(x) }}...actor1 ! "hello world!"
scala
jueves 21 de enero de 2010
var actor1 = actor { receive { case x : String => println(x) }}...actor1 ! "hello world!"
scala
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
Clo jure
Memoria Transaccional¿por qué bloquear?
jueves 21 de enero de 2010
(def counter(ref 0))(dosync (alter counter inc))
! !
!"#$$%&'&()$*+,-
!"#$$%&.$,)#&/0(1,2#"34&567$8-,&94&9::;
<7+",7&<2-,,"4&=)7>"?@$,A
clojure
jueves 21 de enero de 2010
(def counter(ref 0))(dosync (alter counter inc))
! !
!"#$$%&'&()$*+,-
!"#$$%&.$,)#&/0(1,2#"34&567$8-,&94&9::;
<7+",7&<2-,,"4&=)7>"?@$,A
clojure
jueves 21 de enero de 2010
(defn run [nvecs nitems nthreads niters] (let [vec-refs (vec (map (comp ref vec) (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.")
! !
!"#$$%&'&()$*+,-
!"#$$%&.$,)#&/0(1,2#"34&567$8-,&94&9::;
<7+",7&<2-,,"4&=)7>"?@$,A
clojure
jueves 21 de enero de 2010
(defn run [nvecs nitems nthreads niters] (let [vec-refs (vec (map (comp ref vec) (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.")
! !
!"#$$%&'&()$*+,-
!"#$$%&.$,)#&/0(1,2#"34&567$8-,&94&9::;
<7+",7&<2-,,"4&=)7>"?@$,A
clojure
jueves 21 de enero de 2010
(defn run [nvecs nitems nthreads niters] (let [vec-refs (vec (map (comp ref vec) (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.")
! !
!"#$$%&'&()$*+,-
!"#$$%&.$,)#&/0(1,2#"34&567$8-,&94&9::;
<7+",7&<2-,,"4&=)7>"?@$,A
clojure
el acceso a vec es transaccional
jueves 21 de enero de 2010
(defn run [nvecs nitems nthreads niters] (let [vec-refs (vec (map (comp ref vec) (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.")
! !
!"#$$%&'&()$*+,-
!"#$$%&.$,)#&/0(1,2#"34&567$8-,&94&9::;
<7+",7&<2-,,"4&=)7>"?@$,A
clojure
el acceso a vec es transaccional
el bloque siguienteva dentro de unatransacción
jueves 21 de enero de 2010
jueves 21 de enero de 2010
Conclusiones
jueves 21 de enero de 2010
Conclusiones
hilos tradicionalesno componen
jueves 21 de enero de 2010
Conclusiones
hilos tradicionalesno componen
plinquso declarativo
jueves 21 de enero de 2010
Conclusiones
actores, mensajesmemoria distribuida
hilos tradicionalesno componen
plinquso declarativo
jueves 21 de enero de 2010
Conclusiones
actores, mensajesmemoria distribuida
hilos tradicionalesno componen
Clo jurestm, sin bloqueos
memoria compartida
plinquso declarativo
jueves 21 de enero de 2010
¿preguntas?
jueves 21 de enero de 2010
¡gracias!
jueves 21 de enero de 2010