¿Qué son los Algoritmos
Paralelos?
Es el uso de varios procesadores trabajando juntos para
resolver una tarea común, creando una forma rápida y
eficiente de trabajo.
El modo de uso de los procesadores puede ser diseñado
por el programador:
Cada procesador trabaja en una porción del problema
Los procesos pueden intercambiar datos, a través de la
memoria o por una red de interconexión
Ventajas de la
Computación
Paralela
Algunas de las ventajas de la programación paralela son las
siguientes:
– Permiten resolver problemas que no caben en una CPU
– Permiten resolver problemas que no se resuelven en un
tiempo razonable
Estos también nos permiten ejecutar
– Problemas mayores
– Más rápidamente (aceleración)
– Más problemas con mayor eficiencia
Necesidad de la
Computación
Paralela
Algunas de las ventajas de la programación paralela son las
siguientes:
– Permiten resolver problemas que no caben en una CPU
– Permiten resolver problemas que no se resuelven en un
tiempo razonable
Estos también nos permiten ejecutar
– Problemas mayores
– Más rápidamente (aceleración)
– Más problemas con mayor eficiencia
Tecnologías que implementan la
programación paralela
•Open MP (Open Multi-Processing)(Chapman et al., 2008; Pas, 2009): proporciona una API,
que mediante directivas del compilador y llamadas a sub-rutinas, proporciona paralelismo
de datos.
•Intel TTB (Intel Threading Building Blocks): Modelo de programación paralela basado en
rutinas que utilizan hilos. Provee una serie de plantillas, tipos de datos y algoritmos.
•Intel ArBB (Inter Array Building Blocks): biblioteca para C++ desarrollada para aprovechar
diferentes tipos de procesadores en la resolución de problemas paralelos.
•JP: Java Parallel (PJ) es una API de programación paralela cuyos principales objetivos son:
apoyar tanto a la programación paralela en memoria compartida (basadas en hilos de
ejecución) y el grupo de programación paralela (basado en paso de mensajes), en una sola
API unificada.
Ejemplo - suma de
n números
Secuencial: t(n) = n − 1
Paralelo con n/2 elementos de proceso, como
mınimo t(n) n/2 = 2
En cada Pi, i = 0, 1, . . . , n/2 − 1
inicio = 2 ∗ i
desplazamiento = 1
activo = true
para k = 1, 2, . . . , log n
si activo
a[inicio] = a[inicio] + a[inicio +
desplazamiento]
desplazamiento = desplazamiento ∗ 2
finsi
si i mod desplazamiento 6= 0
activo = false
finsi
finpara
La técnica
memoria
compartida
Necesita del uso de cerrojos en los datos para impedir que se
modifique simultáneamente por dos procesadores, por lo que se
produce un coste extra en ciclos de CPU desperdiciados y ciclos
de bus. También obliga a serializar alguna parte del algoritmo.
La técnica paso de mensajes usa canales y mensajes pero esta
comunicación añade un coste al bus, memoria adicional para las
colas y los mensajes y latencia en el mensaje. Los diseñadores de
procesadores paralelos usan buses especiales para que el coste
de la comunicación sea pequeño pero siendo el algoritmo
paralelo el que decide el volumen del tráfico.
Algoritmo de parallel_for
•El algoritmo Concurrency::p arallel_for realiza repetidamente la misma tarea
en paralelo. Cada una de estas tareas se parametriza mediante un valor de
iteración. Este algoritmo es útil cuando se tiene un cuerpo de bucle que no
comparten recursos entre iteraciones de ese bucle.
•El parallel_for algoritmo crea particiones de las tareas de forma óptima para
la ejecución en paralelo. Utiliza un algoritmo de robo de trabajo y un robo de
intervalo para equilibrar estas particiones cuando se desequilibran las cargas
de trabajo.
Ejemplo
// parallel-for-structure.cpp
// compile with: /EHsc
#include <ppl.h>
#include <array>
#include <sstream>
#include <iostream>
using namespace concurrency;
using namespace std;
int wmain()
{
// Print each value from 1 to 5 in parallel.
parallel_for(1, 6, [](int value) {
wstringstream ss;
ss << value << L' ';
wcout << ss.str();
});
}