Paralelismo en lenguajes de alto nivel

37
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

description

Transparencias para la presentación del trabajo de CMCP.

Transcript of Paralelismo en lenguajes de alto nivel

Page 1: Paralelismo en lenguajes de alto nivel

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

Page 2: Paralelismo en lenguajes de alto nivel

Máquina Virtual (jvm\clr)

Librerías Sistema

Sistema Operativo

CPUs \ Memoria

jueves 21 de enero de 2010

Page 3: Paralelismo en lenguajes de alto nivel

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

jueves 21 de enero de 2010

Page 4: Paralelismo en lenguajes de alto nivel

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

new Object();

jueves 21 de enero de 2010

Page 5: Paralelismo en lenguajes de alto nivel

La gestión de la memoria es automática

El código es portable entre arquitecturas

jueves 21 de enero de 2010

Page 6: Paralelismo en lenguajes de alto nivel

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

Page 7: Paralelismo en lenguajes de alto nivel

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

Page 8: Paralelismo en lenguajes de alto nivel

Abstracciones

jueves 21 de enero de 2010

Page 9: Paralelismo en lenguajes de alto nivel

Language Integrated QueryParalelismo de datos

Construcciones declarativas

plinq Parallel LINQ

jueves 21 de enero de 2010

Page 10: Paralelismo en lenguajes de alto nivel

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

Page 11: Paralelismo en lenguajes de alto nivel

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

Page 12: Paralelismo en lenguajes de alto nivel

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

Page 13: Paralelismo en lenguajes de alto nivel

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

Page 14: Paralelismo en lenguajes de alto nivel

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

Page 15: Paralelismo en lenguajes de alto nivel

plinq

var q = from f in facturas.AsParalell()

jueves 21 de enero de 2010

Page 16: Paralelismo en lenguajes de alto nivel

plinq

var q = from f in facturas.AsParalell()

jueves 21 de enero de 2010

Page 17: Paralelismo en lenguajes de alto nivel

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

Page 18: Paralelismo en lenguajes de alto nivel

Actores(paso de mensajes)

jueves 21 de enero de 2010

Page 19: Paralelismo en lenguajes de alto nivel

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

scala

jueves 21 de enero de 2010

Page 20: Paralelismo en lenguajes de alto nivel

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

scala

jueves 21 de enero de 2010

Page 21: Paralelismo en lenguajes de alto nivel

scala

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

jueves 21 de enero de 2010

Page 22: Paralelismo en lenguajes de alto nivel

scala

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

jueves 21 de enero de 2010

Page 23: Paralelismo en lenguajes de alto nivel

Clo jure

Memoria Transaccional¿por qué bloquear?

jueves 21 de enero de 2010

Page 24: Paralelismo en lenguajes de alto nivel

(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

Page 25: Paralelismo en lenguajes de alto nivel

(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

Page 26: Paralelismo en lenguajes de alto nivel

(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

Page 27: Paralelismo en lenguajes de alto nivel

(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

Page 28: Paralelismo en lenguajes de alto nivel

(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

Page 29: Paralelismo en lenguajes de alto nivel

(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

Page 30: Paralelismo en lenguajes de alto nivel

jueves 21 de enero de 2010

Page 31: Paralelismo en lenguajes de alto nivel

Conclusiones

jueves 21 de enero de 2010

Page 32: Paralelismo en lenguajes de alto nivel

Conclusiones

hilos tradicionalesno componen

jueves 21 de enero de 2010

Page 33: Paralelismo en lenguajes de alto nivel

Conclusiones

hilos tradicionalesno componen

plinquso declarativo

jueves 21 de enero de 2010

Page 34: Paralelismo en lenguajes de alto nivel

Conclusiones

actores, mensajesmemoria distribuida

hilos tradicionalesno componen

plinquso declarativo

jueves 21 de enero de 2010

Page 35: Paralelismo en lenguajes de alto nivel

Conclusiones

actores, mensajesmemoria distribuida

hilos tradicionalesno componen

Clo jurestm, sin bloqueos

memoria compartida

plinquso declarativo

jueves 21 de enero de 2010

Page 36: Paralelismo en lenguajes de alto nivel

¿preguntas?

jueves 21 de enero de 2010

Page 37: Paralelismo en lenguajes de alto nivel

¡gracias!

jueves 21 de enero de 2010