Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Computación Paralela

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 57

Procesamiento Paralelo

Carlos Arevalo 1
Contenido
● Introducción
– Porqué procesamiento paralelo
– Ventajas y desventajas del procesamiento paralelo
– Obstáculos del procesamiento paralelo
● Plataformas de computación paralela
– Sistemas de memoria compartida y coherencia de
caches
– Sistemas de memoria distribuida
– Redes de interconexión y enrutamiento

Carlos Arevalo 2
Contenido
● Principios del diseño de algoritmos paralelos
– Técnicas de descomposición
– Cálculo de mapeos y planificación
– Plantillas
● Operaciones básicas de comunicación
● Modelado analítico de programas paralelos
– Speedup, eficiencia y escalabilidad
– Optimización del costo

Carlos Arevalo 3
Contenido
● Programación de plataformas de espacio de
direcciones compartido
– IBIS Satin
– Java Fork Join Framework
● Programación de sistemas escalables
– Pase de mensajes (MPI, IBIS GMI)
– Parallel Java
● Algortimos no numéricos
– Ordenamiento
– Grafos
– Programación dinámica
Carlos Arevalo 4
Contenido
● Algoritmos numéricos
– Algoritmos de matrices densas
– Algoritmos de matrices esparcidas
● Resolviendo problemas en cluster con
MapReduce

Carlos Arevalo 5
Intoducción
● Definición de procesamiento paralelo:
capacidad de ejecutar partes de un programa
simultáneamente
● Objetivo: reducir el tiempo de ejecución de los
programas

Carlos Arevalo 6
Introducción
● ¿Porqué procesamiento paralelo?
– La programación es más compleja
– No todos los problemas se pueden descomponer
fácilmente en tareas que se puedan ejecutar
simultáneamente
– Ley de Moore (últimos 40 años):
● Cada 18 meses se duplica la complejidad (número
de componentes) de los procesadores
● La duplicación del número de componentes implica
– duplicación de la capacidad de procesamiento
– Disminución del costo de procesamiento

Carlos Arevalo 7
Introducción
● ¿Porqué procesamiento paralelo?
– En años recientes el desarrollo de procesadores se
ha topado con una barrera causada por:
● Calentamiento de los procesadores al aumentar la
velocidad y la cantidad de componentes
● Imposibilidad de aumentar el tamaño de los chipos
debido al tiempo de propagación de las señales
dentro de los chips aunado a la imposibilidad de
disminuir el tamaño de los componentes

Carlos Arevalo 8
Introducción
● ¿Porqué procesamiento paralelo?
– Por lo tanto para poder aumentar la capacidad de
procesamiento el único camino viable es:
● Poner varios procesadores en un chip (multi-core)
● Varios procesadores en un computador
● Interconectar varios computadores mediante una
red
– Todas estas soluciones caen dentro del área de
procesamiento paralelo

Carlos Arevalo 9
● Velocidad de la memoria
– La velocidad de los procesadores ha aumentado en
40% por año mientras que la velocidad de la
memoria ha aumentado 10% por año
– Por lo tanto se requieren de caches
– Los caches se basan en el principio de localidad de
los datos
– El procesamiento paralelo también se beneficia del
principio de localidad de los datos por lo que se
puede aprovechar la experiencia adquirida

Carlos Arevalo 10
● Motivaciones para el procesamiento paralelo:
– Resolver problemas más rápidamente (e.g.,
programas de optimización). El énfasis es en reducir
el tiempo de ejecución de programas que tardan
mucho tiempo
– Resolver más instancias de un mismo programa -
más transacciones por minuto (bancos, comercio
electrónico, etc.). El énfasis es ejecutar muchas
veces programas que no tardan mucho tiempo
– Mayor poder de procesamiento. Poder resolver
problemas más grandes de lo qué es posible
actualmente

Carlos Arevalo 11
● Barreras del procesamiento paralelo
– La ley de Moore. Los uniprocesadores son baratos y su
capacidad de procesamiento se duplica cada 18 meses
(hasta ahora)
– La ley de Amdahl:
● Speedup <= p/[1 + ƒ(p – 1)]
● Speedup: tiempo de ejecución del programa en 1
procesador entre el tiempo de ejecución en p
procesadores
● p: número de procesadores
● f: fracción del programa que no puede ser paralelizada
El speedup nunca puede superar 1/f. Si f=0.1, el speedup
no puede ser mayor de 10 (no importa cuantos
procesadores se usen)
Carlos Arevalo 12
● Barreras del procesamiento paralelo
– La ley de Amdahl:

Carlos Arevalo 13
Usos del Procesamiento Paralelo
● Ingeniería y diseño
– Diseño de motores de combustión interna
– Diseño de estructuras
– Problemas de optimización
● Aplicaciones científicas
– Bioinformática, astronomía, ...
● Aplicaciones comerciales
– Sistemas Web escalables (Amazon, Google,
Facebook, Tweeter, ...)
– Sistemas transacciones (bancos)
– Sistemas para bolsas de valores (Wall Street ...)
Carlos Arevalo 14
Usos del Procesamiento Paralelo
● Juegos
– El Playstation 3 tiene 8 procesadores y su
programación es inherentemente paralela
● Aplicaciones de propósito general
– Los PC hoy en día tienen procedores de 6-8 cores y
el número está aumentando
– Existe ya una versión dual core del procesador ARM
(usado en muchos teléfonos celulares) y se anuncia
un ARM de 4 cores para el 2012

Carlos Arevalo 15
Herramientas para el Desarrollo de
Programas Paralelos

Carlos Arevalo 16
IBIS
● Para desarrollar aplicaciones paralelas se
necesita algún tipo de biblioteca que permita a
los diferentes nodos comunicarse entre si
● A continuación se presentan algunas
bibliotecas o “frameworks” de procesamiento
paralelo
● Estas herramientas caen dentro de tres
categorías:
– Implícitas
– Semi-implícitas
– Explícitas

Carlos Arevalo 17
IBIS

Herramientas implícitas:
● El programador escribe una aplicación
secuencial. La herramienta paraleliza el
programa automáticamente.
– No da resultados satisfactorios en muchos casos
– Se deben usar lenguajes especiales

Carlos Arevalo 18
IBIS
Herramientas semi-implícitas:
● El programador identifica las partes del programa que
pueden ser resueltas en paralelo
● La herramienta se encarga de asignar las tareas a
procesadores, realizar balance de carga y
comunicación entre procesos. Ofrece al programador
un modelo de programación de alto nivel
● Permiten obtener un alto rendimiento y esconden gran
parte de la complejidad del procesamiento paralelo
● No se pueden usar en todas las situaciones
● Ejemplos: Cilk, Satin, GMI (Group Method Invocation)

Carlos Arevalo 19
IBIS
Herramientas explícitas:
● El programador debe no solo identificar las partes del
programa que pueden ser resueltas en paralelo sino
también de asignar las tareas a procesadores, realizar
balance de carga y comunicación entre procesos
● Sirven en prácticamente todas las circunstancias y
permiten obtener un alto rendimiento
● La programación resulta mucho más compleja
● Ejemplos: MPI (message passing interface), RPC
(Remote Procedure Call), HP Java

Carlos Arevalo 20
IBIS

MPI
● Paralelismo explícito
● Define e implementa un conjunto de primitivas
de intercambio de mensajes
● Incluye comunicación punto a punto síncrona y
asíncrona y varios modos de comunicación
colectiva: broadcast, scatter, gather
● Generalmente se usa para paralelismo SPMD
(single program múltiple data)

Carlos Arevalo 21
IBIS

MPI
● Rendimiento: alto
● Facilidad de uso: baja
● Aplicabilidad: sirve para la mayoría de las
aplicaciones
● Portabilidad: media (C y Fortran. Se requiere
recompilación y posiblemente modificación del
código fuente)

Carlos Arevalo 22
IBIS
RPC
● Remote procedure call
● Paralelismo explícito
● No requiere el manejo explícito de mensajes
● Ampliamente utilizado en procesamiento distribuido
● El programador debe resolver explícitamente
problemas de balance de carga y tolerancia a fallas
● No soporta comunicación colectiva
● Ejemplos RMI y CORBA

Carlos Arevalo 23
IBIS

RPC
● Rendimiento: alto
● Facilidad de uso: baja
● Aplicabilidad: sirve para la mayoría de las
aplicaciones
● Portabilidad: depende del lenguaje de
programación utilizado

Carlos Arevalo 24
IBIS

GMI, Satin
● Paralelismo semi-implícito
● Utilizan modelos de programación fáciles de
usar
● Ocultan la comunicación entre procesos,
balance de carga y tolerancia a fallas

Carlos Arevalo 25
IBIS

GMI, Satin
● Rendimiento: alto
● Facilidad de uso: alta
● Aplicabilidad: sirven para ciertas aplicaciones
(Satin: divide and conquer)
● Portabilidad: Alta

Carlos Arevalo 26
IBIS

Carlos Arevalo 27
IBIS
● Un sistema de software para computación
paralela en Grids
● Escrito en Java
● Desarrollado por la Universidad Vrije de
Holanda
● Da soporte al desarrollo de aplicaciones
escritas en Java (la mayoría de las bibliotecas
de computación paralela están escritas para C
o Fortran)
● http://www.cs.vu.nl/ibis/index.html

Carlos Arevalo 28
IBIS
● IBIS consiste en:
– Una biblioteca de comunicación de bajo nivel llamada IPL
(Ibis Portability Layer)
– Varios modelos de programación que facilitan el
desarrollo de las aplicaciones:
● MPJ. MPI para Java. MPI (Message Passing Interface)
es el mecanismo de comunicación más utilizado para el
desarrollo de aplicaciones paralelas. MPJ es la
implementación para Java
● Satin. Biblioteca para el desarrollo de aplicaciones
paralelas de tipo divide and conquer
● GMI. Group Method Invocation. Generalización de RMI
(Remote Method Invocation). Permite la invocación de
métodos a grupos de objetos

Carlos Arevalo 29
IBIS
● Arquitectura de IBIS

Carlos Arevalo 30
Satin
● Biblioteca de computación paralela para
problemas de tipo “divide and conquer”
● Escrita en Java
● Realiza:
– Asignación automática de trabajos a diferentes
nodos ibis
– Comunicación entre tareas
– Balance de carga
● Forma parte de Ibis. Un sistema de software
para computación paralela en Grids
● http://www.cs.vu.nl/ibis/satin.html
Carlos Arevalo 31
Satin
● Satin provee
– Asignación automática de tareas. Cuando se ejecuta
un método definido como Spawnable Satin
automáticamente determina si se ejecutará en el
mismo nodo o un nodo diferente. El intercambio de
mensajes requerido es realizado implícitamente
– Comunicación entre tareas
– Balance de carga. Satin ofrece tres mecanismos de
balance de carga:
● Job stealing
● Cluster aware job Stealing
● Master worker

Carlos Arevalo 32
Satin
● Satin está basada en CILK, una biblioteca para
programas divide and conquer para C
● Incluye dos primitivas: spawn y sync
● La operación spawn en Java se realiza invocando un
método marcado previamente como spawnable
● Un método invocado de esta manera se ejecuta en
paralelo con el método desde donde fue invocado
● El programador determina qué métodos son
spawnable mediante interfaces marcadoras (marker
interfaces) derivadas de la interfaz satin.Spawnable
● Cualquier método declarado en estas interfaces está
marcado como spawnable

Carlos Arevalo 33
Satin
● La operación sync es una operación de sincronización
con la semántica siguiente:
– Esperar por todos los métodos ejecutados (spawned)
por el método actual
– Los valores devueltos por los métodos sólo estarán
disponibles después que termine la operación sync
– Sync está definido en la clase satin.SatinObject
– Todas las clases que ejecutan (spawn) tareas deben
extender esta clase

Carlos Arevalo 34
Satin
● Ejemplo: una aplicación de búsqueda
interface Searcher extends
ibis.satin.Spawnable {
public int search(int a[], int from,
int to, int val);
}

Carlos Arevalo 35
Satin
● Ejemplo: una aplicación de búsqueda
class SearchImpl1 extends SatinObject implements Searcher {
public int search(int a[], int from, int to, int val) {
for(int i = from; i < to; i++) {
if (a[i] == val) return i;
}
return -1;
}
...

Carlos Arevalo 36
Satin
● Ejemplo: una aplicación de búsqueda
public static void main(String[] args) {
SearchImpl1 s = new SearchImpl1();
int a[] = new int[2000000];
for(int i=0; i<2000000; i++) {
a[i] = (int) (Math.random() * 1000000);
}
int res1 = s.search(a, 0, 1000000, 42);
int res2 = s.search(a, 1000000, 2000000, 42);
// Wait for results of the two invocations above.
s.sync();
// Now compute an overall result.
int res = (res1 >= 0) ? res1 : res2;
}
}

Carlos Arevalo 37
Satin
● El mecanismo de pasar parámetros en Satin es
diferente del utilizado normalmente en Java
– Si el método es ejecutado localmente (en la misma
máquina virtual que el invocador) se pasan los
parámetros por referencia, mientras que si se invoca
remotamente se pasan los parámetros por valor
– Dado que no es posible saber si el método se
ejecutará local o remotamente el programador debe
asegurarse que el programa funcionará
correctamente en ambos casos

Carlos Arevalo 38
Satin
● Satin no provee memoria compartida
● La única forma de compartir datos es pasando
parámetros y devolviendo resultados
● En particular no se debe acceder a variables globales
● Es decir que los métodos no pueden tener efectos
laterales (side effects)

Carlos Arevalo 39
Satin
Finalización de tareas
● En programas paralelos es posible que una tarea
encuentre la “solución” del problema planteado,
mientras que otras tareas continuan ejecutándose
● Un ejemplo son los algoritimos exploratorios
● Satin provee un método para finalizar muchas tareas a
la vez y otro para devolver datos de una función que
está a varios niveles de llamadas recursivas
● El método para detener las tareas es stop y está
definido en la clase satin.Object

Carlos Arevalo 40
Satin
Finalización de tareas
● Para devolver los resultados se pueden lanzar
excepciones desde el punto donde se obtengan
● Lanzar una excepción es costoso porque normalmente
se crea un Stack Trace
● Satin provee una excepción ibis.satin.Inlet que no crea
un Stack Trace

Carlos Arevalo 41
Satin
Finalización de tareas
● Ejemplo
class SearchResultFound extends Inlet {
int pos;

SearchResultFound(int pos) {
this.pos = pos;
}
}

Carlos Arevalo 42
Satin
Finalización de tareas
● Ejemplo
class SearchResultFound extends Inlet {
int pos;
SearchResultFound(int pos) {
this.pos = pos;
}
}
interface Searcher3 extends ibis.satin.Spawnable {
public void search(int a[], int from, int to, int val)
throws SearchResultFound;
}
Carlos Arevalo 43
Satin
Finalización de tareas. Ejemplo
class SearchImpl3 extends SatinObject implements Searcher3 {
public void search(int a[], int from, int to, int val)
throws SearchResultFound {
if (from == to) { // El arreglo completo a sido explorado
return; // No se encontró el elemento
}
if (to - from == 1) { // Sólo queda un elemento
if (a[from] == val) { // Lo encontramos
throw new SearchResultFound(from);
} else {
return; // El elemento no fue encontrado
}
}
int mid = (from + to) / 2;
search(a, from, mid, val);
search(a, mid, to, val);
sync();
}
Carlos Arevalo 44
Satin
Finalización de tareas. Ejemplo
class SearchImpl3 extends SatinObject implements Searcher3 {
try {
s.search(a, 0, 1000000, 42);
s.search(a, 1000000, 2000000, 42);

// Esperar por los resultados


s.sync();
} catch (SearchResultFound x) {
// Venimos aquí si una de las tareas encontró la solución
s.abort(); // matar los demás trabajos
res = x.pos;
return; // se necesita el return porque la execpción
// se ejecuta en un hilo separado
}

Carlos Arevalo 45
Satin
Uso de Satin
● Los programas escritos con satin deben incorporar la
biblioteca satin-x.x.jar
● Los programas son compilados primero con el
compilador de java y luego se debe invocar el programa
satinc pasándo como parámero el directorio a archivo
jar que contiene las clases generadas por el compilador
de java
● satinc es un reescritor de código (code rewriter). Estos
programas toman como entrada archivos binarios (en
lugar de código fuente) y los modifican
● Una vez que satinc ha modificado las clases se puede
correr la aplicación con satin. Para ello se debe invocar
la máquina virtual con varios parámetros y varias
bibliotecas
Carlos Arevalo de satin 46
Satin
Uso de Satin
● Satin prove un scrip, satin-run (satin-run.bat en
Windows)
● Antes de ejecutar las aplicaciones se debe ejecutar la
aplicación satin-server la cual permite a los nodos de
una aplicacion encontrase
● Ejemplo de uso:
$SATIN_HOME/bin/satin-server --events
$ CLASSPATH=$SATIN_HOME/examples/lib/satin-
examples.jar \
$SATIN_HOME/bin/satin-run \
-Dsatin.closed -Dibis.server.address=localhost \
-Dibis.pool.size=2
Carlos Arevalo -Dibis.pool.name=test \ 47
GMI
● GMI: Group Method Invocation (Invocación de
métodos en Grupo)
● Biblioteca Java para procesamiento paralelo
● Extiende RMI (Remote Method Invocation) con
primitivas de comunicación colectiva:
– Broadcast
– Multicas
– Reducciones
● http://www.cs.vu.nl/ibis/gmi.html

Carlos Arevalo 48
GMI
● GMI extiende RMI de varias maneras:
– Grupos de objetos.
● Un grupo de objetos que implementan la misma
interfaz
● Cada objeto se ejecuta en una máquina virtual
diferente
● Existe una referencia de grupo. Al invocar un
método usando esta referencia, todos los objetos
de grupo reciben la invocación

Carlos Arevalo 49
GMI
● Grupos de objetos

Carlos Arevalo 50
GMI
● GMI soporta varios mecanismos de invocación
– Invocación individual. La invocación se envía a un
único miembro del grupo
– Invocación de grupo. La invocación se envía a todos
los miembros del grupo
– Invocación personalizada de grupo. La invocación se
envía a todos los miembros del grupo. Los
parámetros son personalizados para cada miembro
del grupo
– Invocación combinada. Varias aplicaciones (en
diferentes máquinas virtuales) invocan un método
de grupo. El método es consolidado en una única
invocación y enviada al grupo usando alguno de los
tres mecanismos definidos
Carlos Arevalo 51
GMI
● Adicionalmente GMI soporta varios
mecanismos para el manejo de los resultados
– Descartar resultados
– Devolver un resultado. Cada miembro devuelve un
resultado. Se selecciona uno y se descartan los
demás
– Reenviar (forward) resultados. Los resultados son
enviados a un objeto definido por el usuario (no se
devuelven a quien hizo la llamada)
– Combinar resultados. Combinar todos los resultados
en uno solo usando un método definido por el
usuario

Carlos Arevalo 52
GMI
● Ejemplo:
interface Example extends ibis.gmi.GroupInterface {
public void put(String message);
public String get();
}

Carlos Arevalo 53
GMI
● Ejemplo:
class Implementation extends GroupMember implements Example {
private String message = null;
public synchronized void put(String message) {
this.message = message;
notify();
}
public synchronized String get() {
while (message == null) {
wait();
}
return message;
}
}

Carlos Arevalo 54
GMI
● Ejemplo:
class BroadcastExample {
public static void main(String[] args) {
int size = Group.size();
int rank = Group.rank();
if (rank == 0) {
Group.create("ExampleGroup", Example.class, size);
}
// All JVMs create an implementation object.
Implementation impl = new Implementation();
// And join the group
Group.join("ExampleGroup", impl);

Carlos Arevalo 55
GMI
● Ejemplo:
if (rank == size-1) {
// The last JVM retrieves a group reference
Example group = (Example) Group.lookup("ExampleGroup");
// Then configures ’put’ to be forwarded to the whole group
GroupMethod m = Group.findMethod(group,
"void put(java.lang.String)");
m.configure(new GroupInvocation(), new DiscardReply());
// Now invoke a method on the group
group.put("Hello world!");
}

Carlos Arevalo 56
GMI
● Ejemplo:
// All JVMs can now retrieve the data using a local(!) call
String message = impl.get();
System.out.println(message);
// Done
Group.exit();
}
}

Carlos Arevalo 57

También podría gustarte