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

Upload: luis-belloch-gomez

Post on 13-Jun-2015

981 views

Category:

Technology


1 download

DESCRIPTION

Transparencias para la presentación del trabajo de CMCP.

TRANSCRIPT

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