Академический Документы
Профессиональный Документы
Культура Документы
Índice
1. Introducción/Filosofía
2. Historia
3. Ventajas y desventajas
4. Conceptos clave
5. Concurrencia vs Paralelismo
6. Arquitectura de Von Neumann
7. Taxonomía de Flynn
8. Arquitectura
9. Tipos de paralelismo
10. Paralelizacion Manual vs Automatica
11. Sincronización
12. Balanceador de carga
13. Medidas de rendimiento
14. Lenguajes de programacion
15. Aplicaciones
16. OpenMP
17. Presentación y taller
18. Bibliografía
Introducción
La computación paralela es el uso de múltiples recursos computacionales para resolver un
problema. Se distingue de la computación secuencial en que varias operaciones pueden
ocurrir simultáneamente.
Granularidad:
Se refiere al tamaño de cada tarea y a la independiencia de las demás tareas, se dividen en
dos categorías.
Gruesa: Cantidad relativamente grande de trabajo, alta independencia entre tareas y poca
necesidad de sincronización.
Fina: Cantidades pequeñas de trabajo, poca independencia entre tareas, y una alta demanda
de sincronización.
Scheduling:
Scheduling es el proceso en el que las tareas son asignadas a los procesos o hilos, y se les
da un orden de ejecución. Este puede ser especificado en el código, en tiempo de
compilación o dinámicamente en tiempo de ejecución. El proceso de scheduling debe tener
en cuenta la dependencia entre tareas, ya que, aunque muchas pueden ser independientes,
otras pueden requerir los datos producidos por otras tareas.
Un proceso pesado padre puede convertirse en varios procesos livianos hijos, ejecutados
de manera concurrente. Cada uno de estos procesos livianos se conoce como hilo. Estos se
comunican entre ellos a través de la memoria global.
Sincronizacion:
Los programas en paralelo necesitan la coordinación de procesos e hilos, para que haya
una ejecución correcta. Los métodos de coordinación y sincronización en la programación
paralela están fuertemente asociados a la manera en que los procesos o hilos intercambian
información, y esto depende de cómo está organizada la memoria en el hardware.
Mapping:
Mapping en el proceso de asignación de procesos e hilos a unidades de procesamiento,
procesadores o núcleos. Usualmente el mapping se hace por el sistema en tiempo de
ejecución, aunque en ocasiones puede ser influenciado por el programador.
Otros conceptos
Balanceo de carga
Se refiere a la práctica de distribuir cantidades equitativas de trabajoentre las tareas, de
modo que todas las tareas se mantengan ocupadas todo el tiempo.
Speedup:
Es un proceso para aumentar el rendimiento entre dos sistemas procesando el mismo
problema. Es la mejora en la velocidad de ejecución de una tarea ejecutada en dos
arquitecturas similares con diferentes recursos.
Overhead
Sección crítica
Un proceso tiene un segmento de código llamado sección crítica cuando este puede
modificar o leer información de memoria compartida con otros procesos. Dos procesos no
pueden ejecutar su seccion critica al mismo tiempo.
Concurrencia vs Paralelismo
Concurrencia
Capacidad de operar actividades al mismo tiempo. Es decir se pueden tener varios procesos
corriendo cada uno en un procesador o puede haber varios proceso que corran solo en un
procesador
Paralelismo
Son muchas actividades teniendo lugar al mismo tiempo, “la cualidad o el estado de ser
paralelo”. El hecho de ser paralelo implica que solo se pueden tener varios procesos
corriendo cada uno en un procesador.
Componentes principales
Memoria
Unidad de control
Unidad Aritmetica Logica
Entradas/Salidas
Memoria de acceso aleatorio
En la memoria de acceso aleatorio se almacenaban los datos y los programas que estaban
siendo ejecutados
Las instrucciones del programa son datos codificados que le dicen al computador que es lo
que tiene que hacer
Los datos son simplemente informacion que sera usada por el programa
Taxonomia de Flynn
Single Instruction, Single Data (SISD)
hay un elemento de procesamiento, que tiene acceso a un único programa y a un
almacenamiento de datos. En cada paso, el elemento de procesamiento carga una
instrucción y la información correspondiente y ejecuta esta instrucción. El resultado es
guardado de vuelta en el almacenamiento de datos. Luego SISD es el computador
secuencial convencional, de acuerdo al modelo de von Neumann.
Multiple Instruction, Single Data (MISD)
hay múltiples elementos de procesamiento, en el que cada cual tiene memoria privada del
programa, pero se tiene acceso común a una memoria global de información. En cada paso,
cada elemento de procesamiento de obtiene la misma información de la memoria y carga
una instrucción de la memoria privada del programa. Luego, las instrucciones posiblemente
diferentes de cada unidad, son ejecutadas en paralelo, usando la información (idéntica)
recibida anteriormente. Este modelo es muy restrictivo y no se ha usado en ningún
computador de tipo comercial.
Tipos de paralelismo
Paralelismo a nivel de bit:
Se habla de paralelismo al nivel de bit, cuando se aumenta el tamaño de la palabra del
procesador (tamaño de la cadena de bits a procesar). Este aumento reduce el número de
instrucciones que tiene que ejecutar el procesador en variables cuyos tamaños sean mayores
a la longitud de la cadena.
Ejemplo: En un procesador de 8-bits sumar dos números de 16bits tomaría dos instrucciones.
En un procesador de 16-bits esa operación requiere solo una instrucción.
Datos en paralelo
También conocido como PGAS (Partitioned Global Address Space)
Una serie de tareas trabajan de manera colectiva en la misma estructura de datos
Las tareas realizan la misma operación, pero cada una en su partición pero cada tarea
trabaja en una partición diferente de ésta
Sincronización
Sincronización Mínima:
1. Identificar suficiente concurrencia en la descomposición del problema.
2. Decidir cómo manejarla: distribución estática o dinámica.
3. Determinar el grado de granularidad y cómo explotar la concurrencia.
4. Reducir serialización y costes de sincronización.
1. Identificar suficiente concurrencia
Paralelismo por Tareas:
Grandes tareas (procedimientos) pueden realizarse en paralelo
No suele haber muchas tareas, no aumenta con el tamaño del problema
Dificultad para aplicar balanceo de carga
Paralelismo por Datos:
Más escalable, proporcional al tamaño del problema
Es factible aplicar balanceo de carga
2. Manejando concurrencia
Técnicas estáticas:
Asignación basada en la entrada
Bajo overhead
Siempre que sea posible, es preferible
Técnicas dinámicas:
Adapta el balanceo en tiempo de ejecución
Aumenta la comunicación y el overhead
3. Determinación de la granularidad
Grano grueso: pocas oportunidades de balanceo de carga.Grano fino: mayor overhead,
mayor comunicación, más sincronización.
4. Reducir la serialización
Sincronización de eventos:
Global versus punto a punto
Sincronización a bajo nivel produce mayor cantidad de sincronizaciones
Exclusión mutua:
Regiones críticas pequeñas
Dispersar las regiones críticas en el tiempo
Tipos de sincronización:
Barrier
Todas las tareas están involucradas
Cada tarea realiza su trabajo hasta que alcanza la barrera. Después, se detiene o "bloquea".
Cuando la última tarea llega a la barrera, todas las tareas se sincronizan.
Lo que sucede a partir de aquí varía. Algunas veces, una sección del código debe ser
ejecutada en serie. En otros casos, las tareas se liberan automáticamente para continuar su
trabajo.
Lock / semaphore
Puede involucrar cualquier número de tareas
Se utiliza para serializar el acceso a datos globales o a una sección de código. Sólo una
tarea a la vez se puede ejecutar.
La primera tarea en llegar al lock "lo bloquea". Esta tarea puede acceder de forma segura
(en serie) a los datos protegidos o al código.
Otras tareas pueden intentar adquirir el lock pero deben esperar hasta que la tarea que posee
el bloqueo lo libere.
Balanceador de carga
Se refiere a la práctica de distribuir cantidades aproximadamente iguales de trabajo entre
las tareas, de modo que todas las tareas se mantengan ocupadas todo el tiempo. Se puede
considerar una minimización del tiempo de inactividad de la tarea.
Cuando la cantidad de trabajo que realiza cada tarea es variable o no se puede predecir,
puede ser útil usar un planificador - task pool approach. Cuando cada tarea termina su
trabajo, espera en una cola para obtener una nueva pieza de trabajo.
Puede ser necesario diseñar un algoritmo que detecte y maneje desequilibrios de carga
como ocurren dinámicamente dentro del código.
Medidas de rendimiento
Tiempo de respuesta
Es el tiempo que tarda en ejecucion el programa A.
MIPS - MFLOPS
MIPS - Millones de operaciones por segundo. MFLOPS - Millones de operaciones de punto
flotante por segundo.
Eficiencia
La eficiencia del programa se mide en el costo de ejecucion.
SpeedUp
El SpeedUp resresenta la ganacia que se obtiene en la version paralela del programa respecto
a la version secuencial del mimo.
Ley de Amdahl
El incremento de velocidad de un programa utilizando múltiples procesadores en
computación paralela está limitada por la fracción secuencial del programa. Sea f el
porcentaje paralelizado del programa expresado en decimal, la ley de Amdahl dice que llega
un punto en el cual sin importar que el numero de procesadores sea muy alto , el speedup se
va a comportar de manera lineal ; esto de acuerdo al porcentaje que este paralelizado el
codigo. El speedup de un programa con un fragmento paralelizado se calcula con :
Lenguajes de programacion
Aplicaciones
Computación grafica
Ciertas clases de problemas producen desequilibrios de carga incluso si los datos están
distribuidos uniformemente entre las tareas
Aproximación y cálculo de constantes y/o
funciones numéricas.
Worldwide LHC Computing Grid (WLCG) es una colaboración global de centros de
computación. Fue lanzado en 2002 para proporcionar un recurso para almacenar, distribuir
y analizar los 15 petabytes (15 millones de gigabytes) de datos generados cada año por el
Large Hadron Collider (LHC).
Astronomía
Hay muchas aplicaciones de los supercomputadores a la astronomía, incluyendo el uso de
un supercomputador para simular eventos en el futuro, o pasado, para probar teorías
astronómicas. La Universidad de Minnesota Supercomputer Center simuló lo que una
explosión de supernova que se origina en el borde de una gigantesca nube de gas molecular
interestelar parecería 650 años después de la explosión.
Renderizado de imagenes y animación
OpenMP
Es una interfaz de programa de aplicación (API) que se puede utilizar para dirigir
explícitamente paralelismo de memoria compartida multi-procesos. Está compuesto por:
Directivas de compilación
Runtime Library Routines
Variables de entorno
Estructura general de OpenMP en C++
#include <omp.h>
int main () {
int var1, var2, var3;
//Código en
serie...
//Comienzo de la
región paralela hace fork del conjunto de threads
#pragma omp
parallel private(var1, var2) shared(var3)
{
//Región paralela
ejecutada por todos los threads
//otras
directivas OpenMP
//Todos los
threads se juntan en el thread master
}
//Continuación del
código...
}
#include <omp.h>
#include <stdio.h>
int main(int argc,
char *argv[])
{
/* Cada thread
tiene una variable id privada (tid) */
int nthreads,
tid;
#pragma omp
parallel private(tid)
{
/* Se asigna y
se imprime el id de cada thread */
tid =
omp_get_thread_num();
printf("Hello
World desde el thread = %d\n", tid);
/* Solo el
thread master ejecuta lo siguiente */
if (tid == 0)
{
nthreads =
omp_get_num_threads();
printf("El
numero de threads es = %d\n", nthreads);
}
}
}
Parallel For
#include <omp.h>
#include <stdio.h>
#define N
1000
#define CHUNKSIZE
100
int i, chunk;
float a[N], b[N],
c[N];
#pragma omp
parallel for \
shared(a,b,c,chunk) private(i) \
schedule(static,chunk)
Sincronización en OpenMP
#include <omp.h>
int main(int argc,
char *argv[])
{
int x;
x = 0;
#pragma omp
parallel shared(x)
{
#pragma omp
critical
x = x + 1;
}
/* Final de la
región paralela */
}
TALLER
Bibliografía
1. http://proparalelaydistribuida.blogdiario.com/tags/lenguajes-paralelos/
2. http://informatica.uv.es/iiguia/ALP/materiales/1_1_a_ComputacionParalela.pdf
3. http://lahuen.dcc.uchile.cl/mm_wiki/lib/exe/fetch.php?media=cpar:1-modelos.pdf
4. http://www.cs.buap.mx/~mtovar/doc/ProgConc/ProgramacionParalela.pdf
5. http://www.saber.ula.ve/bitstream/123456789/15969/1/com_par.pdf
6. https://computing.llnl.gov/tutorials/parallel_comp/
7. http://lsi.ugr.es/jmantas/pdp/tutoriales/tutorial_mpi.php?tuto=03_pi
8. http://ocw.uc3m.es/ingenieria-informatica/arquitectura-de-computadores-ii/materiales-de-
clasee/mc-f-002-iii
9. Rauber, T., & Runger, G. (n.d.). Parallel programming: For multicore and cluster systems.
Springer Books.
10. Intro to parallel programming. Udacity course.
11. Whitson, G. P. (2016). Parallel Computing. Salem Press Encyclopedia Of Science,
12. Presentaciones profesor Cesar Pedraza - Computación paralela y Distribuida
13. https://www.cs.purdue.edu/homes/ayg/book/Slides/
14. https://computing.llnl.gov/tutorials/parallel_comp/
15. http://web.mit.edu/vex/www/Parallel.pdf
16.
17. http://hdl.handle.net/10045/25282
18. https://webdocs.cs.ualberta.ca/~paullu/C681/parallel.timeline.html
19. https://es.wikipedia.org/wiki/Computaci%C3%B3n_paralela
20. http://webdelprofesor.ula.ve/ingenieria/gilberto/paralela/07_ModelosDeProgramacionParal
ela.pdf
21. http://webdelprofesor.ula.ve/ingenieria/gilberto/paralela/05_LeyDeAmdahlYMoore.pdf
22. http://repositoriodigital.uns.edu.ar/bitstream/123456789/2001/1/MgTesis%20Weinbach%2
0-%20Paradigmas%20de%20Programacion%20en%20Paralelo.pdf
Autores: Fabián Bernal, Camilo Albarracín, Juan Gaona, Luis Giraldo, Camilo Mosquera, Santiago
Peña, Yeliana Torres, Juan Ovalle, José Nieto