paralelismo en lenguajes de alto nivel

Post on 13-Jun-2015

990 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

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

top related