INTRODUCCION A LA COMPUTACION PARALELA 2nd Workshop: New Frontiers of Bioinformatics in Latin America Gridding Biology Dr. Pablo Guillén Universidad de Los Andes 22-26 de Noviembre de 2004
Qué es el Paralelismo? Una estrategia para ejecutar grandes tareas complejas, de forma más rápida. Una tarea grande puede ser ejecutada serialmente (un paso seguido de otro) o puede descomponerse en tareas más pequeñas para ser ejecutadas simultáneamente, es decir, en paralelo. El paralelismo es hecho: Descomponiendo las tareas en tareas más pequeñas Asignando las tareas más pequeñas a múltiples trabajadores para trabajar simultáneamente Coordinando los trabajadores
Programación en secuencial Tradicionalmente, los programas han sido escritos para computadores seriales: Una instrucción es ejecutada a un tiempo Usando un solo procesador La velocidad de procesamiento depende en la rapidez que la data puede ser movida a través del Hardware
La necesidad de máquinas rápidas Existen diferentes clases de problemas que requieren un procesamiento más rápido: Problemas de simulación y modelaje: Basados en aproximaciones sucesivas Más cálculo, más precisión Problemas dependientes de los cálculos y manipulación de grandes cantidades de datos: Procesamiento de señal e imágenes Rendering de imágenes Base de datos
La necesidad de máquinas rápidas Problemas de cómputo intensivo: Modelaje de clima Dinámica de fluidos Dinámica de población Genoma Humano Simulación de yacimientos petrolíferos (Sísmica)
COMPUTO EN PARALELO Múltiples procesadores (Los trabajadores) Red (Enlace entre los trabajadores) Ambiente para crear y administrar el procesamiento en paralelo Sistema operativo Paradigma de la programación en paralelo Pase de mensajes: MPI Paralelismo de datos: Implantado en Bibliotecas Fortran 90 / High Performance Fortran OpenMP Un algoritmo paralelo y un programa paralelo
Programación en paralelo La programación en paralelo involucra: Descomponer un algoritmo o data en partes Distribuir las partes como tareas, las cuales son trabajadas en múltiples procesadores simultáneamente Coordinar el trabajo y la comunicación de estos procesadores Consideraciones de la programación en paralelo: El tipo de arquitectura paralela que está siendo usada El tipo de comunicación que está siendo usada
Taxonomia de la Arquitectura Todos los computadores paralelos usan múltiples procesadores Existen diferentes métodos usados para clasificar los computadores No existe una taxonomia que se ajuste a los diseños La taxonomia de Flynn's usa la relación de instrucciones del programa a datos del programa. Las cuatro categorías son: SISD Single Instruction, Single Data Stream SIMD Single Instruction, Multiple Data Stream MISD - Multiple Instruction, Single Data Stream MIMD Multiple Instruction, Multiple Data Stream
Modelo SISD: Single Instruction, Single Data Stream No es un computador paralelo Computador de von Neumann serial convencional Una única instrucción es emitida cada ciclo de reloj Cada instrucción opera sobre un único elemento de data (escalar) Está limitado por el número de instrucciones que pueden ser emitidas en una unidad de tiempo dada La ejecución es frecuentemente medida en MIPS (million of instructions per second) o frecuencia del reloj MHz (Megahertz)
Modelo SIMD: Single Instruction, Multiple Data Stream Es una arquitectura de von Neumann con un mayor poder en las instrucciones Cada instrucción puede operar en más de un elemento de datos La ejecución es medida en MFLOPS (millions of floating point operations per second) Existencia de dos tipos: Vectorial SIMD Paralelo SIMD
Modelo SIMD: Single Instruction, Multiple Data Stream
Modelo MIMD: Multiple Instructions, Multiple Data El paralelismo es alcanzado conectando juntos múltiples procesadores Incluye todas las formas de configuraciones de multiprocesadores Cada procesador ejecuta su propio flujo de instrucciones independientemente de los otros procesadores sobre un único flujo de data
Modelo MIMD: Multiple Instructions, Multiple Data Ventajas Los procesadores pueden ejecutar múltiples flujos de trabajos simultáneamente Cada procesador puede ejecutar cualquier operación sin considerar lo que otros procesadores están haciendo Desventajas Es necesario un balanceo de carga y sincronización para coordinar los procesadores al final de las estructuras paralelas en las aplicaciones Puede ser difícil de programar
Modelo MIMD: Multiple Instructions, Multiple Data
Memoria de las Arquitecturas La manera en que los procesadores se comunican es dependiente de la arquitectura de la memoria, la cual, a su vez, afectaría como escribir un programa en paralelo Los tipos de memoria son: Memoria Compartida Memoria Distribuida
Memoria Compartida Múltiples procesadores operan independientemente pero comparten los mismos recursos de memoria Solo un procesador puede acceder a una posición de la memoria compartida a un tiempo La sincronización es obtenida controlando la escritura y lectura a la memoria compartida Ventajas Fácil uso La data compartida es rápida a través de las tareas (velocidad de acceso a memoria)
Memoria Compartida Desventajas La memoria está limitada por el ancho de banda. Un aumento de procesadores sin un aumento del ancho banda puede causar un cuello de botella El usuario es el responsable para especificar la sincronización Ejemplos: Cray Y-MP, Convex C-2, Cray C-90
SUNE 450 4 Procesadores SUN 3500 4 Procesadores
Memoria Distribuida Múltiples procesadores operan independientemente pero cada uno tiene su propia memoria La data es compartida a través de una red de comunicación usando pases de mensajes El usuario es el responsable de la sincronización usando pase de mensajes Ventajas La memoria es escalable al número de procesadores. Cada procesador puede rápidamente acceder a su propia memoria sin interferencia
Memoria Distribuida Desventajas El usuario es el responsable para enviar y recibir data a través de los procesadores Ejemplos: ncube Hypercube, Intel Hypercube, IBM SP1, SP2
Cluster 4 Procesadores
Memoria Procesador (arreglo) Memoria Distribuida MPP - Massively Parallel Processor Memoria Compartida SMP - Symmetric Multiprocessor Procesadores idénticos Acceso igual a la memoria Algunas veces llamado UMA Uniform Memory Access, o CC-UMA - Cache Coherent UMA Cache coherente significa que si un procesador actualiza una posición en la memoria compartida, todos los otros procesadores conocen acerca de la actualización
Memoria Procesador (arreglo) NUMA - Non-Uniform Memory Access Algunas veces llamado CC-NUMA - Cache Coherent NUMA A menudo hecho enlazando dos o más SMPs Un SMP puede directamente acceder la memoria de otro SMP No todos los procesadores tienen igual tiempo de acceso a toda la memoria El acceso de memoria a través del enlace es lento
Memoria Procesador (arreglo) Combinaciones Múltiples SMPs son conectados por una red Los Procesadores dentro de un SMP se comunican vía memoria Requieren pase de mensajes entre SMPs Un SMP no puede directamente acceder a la memoria de otro SMP Múltiples procesadores de memoria distribuida conectados a una gran memoria compartida La transferencia de memoria local a memoria compartida es transparente al usuario
COMUNICACIÓN DE LOS PROCESADORES Red de comunicación De una manera de coordinar las tareas de múltiples nodos trabajando en el mismo problema, alguna forma de comunicación inter-procesadores es requerida para: Transmitir la información y data entre los procesadores Sincronizar las actividades de los nodos Memoria distribuida
COMUNICACIÓN DE LOS PROCESADORES Conectividad entre los nodos Los nodos son conectados unos a otros por un switch nativo Los nodos son conectados a la red (y por tanto, uno a otro) vía la ethernet Tipos de comunicación ip - Internet Protocol (TCP/IP) se ejecuta sobre la ethernet o se ejecuta sobre el switch us-userspace se ejecuta sobre el switch
Paradigmas de la Programación en Paralelo Existen muchos métodos de programación en computadores paralelos. Dos de los más usados son pase de mensajes y paralelismo de datos. Pase de mensajes: el usuario hace llamadas a bibliotecas para explícitamente compartir información entre los procesadores. Paralelismo de datos: un particionamiento de la data determina el paralelismo. Memoria compartida: múltiples procesos comparten un espacio de memoria común.
Paradigmas de la Programación en Paralelo Operación remota a memoria: un conjunto de procesos en la cual un proceso puede acceder la memoria de otro proceso sin su participación Threads (hebras, hilos): un proceso teniendo múltiples (concurrentes) trayectorias de ejecución Modelo combinado: compuesto de dos o más de los presentados anteriormente.
Pase de mensajes El modelo de pases de mensajes se define como: Un conjunto de procesos usando solo memoria local Los procesos se comunican enviando y recibiendo mensajes La transferencia de data requiere operaciones cooperativas para ser ejecutada por cada proceso (una operación de envío debe tener una operación de recepción) La programación con pases de mensajes es hecha enlazando y haciendo llamadas a bibliotecas las cuales administran el intercambio de data entre los procesadores
Paralelismo de datos El modelo de paralelismo de datos se define como: Cada proceso trabaja sobre una parte diferente de la misma estructura de datos. Usa un enfoque Single Program Multiple Data (SPMD). La data es distribuida a través de los procesadores. Todo el pase de mensajes es transparente al programador La programación con un modelo de paralelismo de datos se satisface escribiendo un programa con directivas de paralelismo de datos y compilando el programa con un compilador de paralelismo de datos. El compilador convierte el programa en código estándar y llama una biblioteca de pase de mensajes para distribuir la data a todos los procesos
Implantación Pase de mensajes: Message Passing Interface (MPI) Una biblioteca portable y estándar de pase de mensajes Disponible para programas en Fortran y C Disponible para diferentes máquinas paralelas La comunicación entre tareas es por pase de mensajes Todo el paralelismo es explícito: el programador es el responsable del paralelismo del programa y la implantación de las directivas MPI El modelo de programación es SPMD (Single Program Multiple Data)
Implantación F90 / High Performance Fortran (HPF) Fortran 90 (F90) - (ISO / ANSI extensión estándar a Fortran 77) High Performance Fortran (HPF) - extensiones a F90 para soportar programación de paralelismo de datos Directivas de compilación permiten al programador la distribución y asignación de la data
Pasos para crear un Programa en Paralelo 1. Si existe un código serial, depure (debug) el código completamente 2. Use opciones de optimización 3. Identifique las partes del código que pueden ser ejecutadas concurrentemente: Requiere un buen conocimiento del código Explote cualquier paralelismo inherente que pueda existir Puede requerir reestructurar el programa y/o algoritmo Puede requerir un nuevo algoritmo. Use técnicas de Profiling, Optimización y de Ejecución
Pasos para crear un Programa en Paralelo 4. Particionar el programa: Paralelismo funcional Paralelismo de datos Una combinación de ambos 5. Desarrolle el código: El código puede estar influenciado/determinado por la arquitectura de la máquina Escoja un paradigma de programación Determine la comunicación 6. Compile, pruebe y Depure
Descomponer el Programa Existen tres métodos para descomponer un problema en tareas más pequeñas para ser ejecutadas en paralelo: Descomposición Funcional, Descomposición de Dominio, o una combinación de ambos Descomposición Funcional (Paralelismo Funcional) Descomponer el problema en diferentes tareas las cuales pueden ser distribuidas a múltiples procesadores para su ejecución de manera simultánea Es bueno cuando no existe una estructura estática o fija del número de cálculos a ser ejecutados
Descomposición de Dominio (Paralelismo de Datos) Descomponer los datos del problema y distribuir porciones de datos a múltiples procesadores para su ejecución de manera simultánea Es bueno de usar en problemas donde: La data es estática (factorizar y resolver grandes matrices o esquema de diferencia finitas) El dominio es fijo pero los cálculos dentro de diferentes regiones del dominio son dinámicos (modelos de fluidos)
Comunicación Entender las comunicaciones entre los procesadores es esencial. La comunicación de pase de mensajes es programada explícitamente. El programador debe entender y codificar la comunicación Los compiladores de paralelismo de datos hacen toda la comunicación transparente. El programador no necesita entender las comunicaciones subyacentes La buena ejecución del código va a depender de la escritura del algoritmo con la mejor comunicación posible
Comunicación Los tipos de comunicaciones para pase de mensajes y paralelismo de datos son exactamente los mismos. Las comunicaciones en computadores de memoria distribuida: Punto a Punto De uno a todos De todos a todos Cómputo colectivo
Comunicación Punto a Punto El método más básico de comunicación entre dos procesadores es el mensaje punto a punto. El procesador origen envía el mensaje al procesador destino. El procesador destino recibe el mensaje. El mensaje comúnmente incluye la información, la longitud del mensaje, la dirección del destinatario y posiblemente una bandera. Típicamente las bibliotecas de pases de mensajes subdividen los envíos y recepciones básicos en dos tipos: Con bloqueo el proceso espera hasta que el mensaje sea transmitido Sin bloqueo el proceso continúa aún si el mensaje no ha sido transmitido
Comunicación Uno a todos Un proceso puede tener información la cual los otros procesos requieren. Un broadcast es un mensaje enviado a muchos otros procesos. Una comunicación uno a todos ocurre cuando un procesador envía la misma información a muchos otros procesos.
Comunicación Todos a todos Una comunicación de todos a todos cada proceso envía su única información a todos los otros procesos.
Ley de Amdahl's Diseño y consideraciones de ejecución Ley de Amdahl's postula que la aceleración del programa es definida por la fracción del código (P) la cual es paralelizada: 1 speedup = -------- 1 - P
Diseño y consideraciones de ejecución Si nada del código puede ser paralelizado, P = 0 y la aceleración = 1 (aceleración nula). Si todo el código paralelizado, P = 1 y la aceleración es infinita (en teoría). Si 50% del código puede ser paralelizado, la aceleración máxima = 2, lo cual significa que el código se ejecutará el doble de rápido.
Diseño y consideraciones de ejecución Introduciendo el número de procesadores ejecutando la fracción paralela de trabajo, la relación puede ser modelada por: 1 speedup = ------------ P + S --- N donde P = fracción paralela, N = número de procesadores y S = fracción serial.
Diseño y consideraciones de ejecución Existen límites a la escalabilidad del paralelismo. Por ejemplo, con P =.50,.90 y.99 (50%, 90% and 99% del código es paralelizable): speedup -------------------------------- N P =.50 P =.90 P =.99 ----- ------- ------- ------- 10 1.82 5.26 9.17 100 1.98 9.17 50.25 1000 1.99 9.91 90.99 10000 1.99 9.91 99.02
Balanceo de carga El balanceo de carga se refiere a la distribución de las tareas, de una manera tal, que se asegura más eficientemente la ejecución en paralelo Si las tareas no están distribuidas de una manera balanceada, se podría estar esperando por la culminación de una tarea, mientras las otras ya han finalizado El performance puede ser incrementado si el trabajo puede ser uniformemente distribuido
Granularidad De una manera de coordinar entre diferentes procesadores trabajando en el mismo problema, alguna forma de comunicación entre ellos es requerido La razón entre cómputo y comunicación es conocida como la granularidad Paralelismo de grano fino (Fine-grain parallelism)
Paralelismo de grano fino (Fine-grain parallelism) Todas las tareas ejecutan un pequeño número de instrucciones entre ciclos de comunicación Es baja la razón cómputo a comunicación Facilita el balanceo de carga Implica alta comunicación y menos oportunidad para una mejora de performance Si la granularidad es fina, es posible que el tiempo requerido para la comunicación y sincronización entre las tareas sea mayor que el tiempo de cómputo
Paralelismo de grano grueso (Coarse-grain parallelism) Definido por grandes cómputos los cuales consisten de un gran número de instrucciones entre puntos de comunicación Es alta la razón cómputo a comunicación Implica más oportunidad para una mejora de performance Es más díficil para balancear la carga eficientemente La granularidad más eficiente es dependiente del algoritmo y el hardware en el cual éste se ejecutará
Dependencia de data Una dependencia de data existe cuando ocurre múltiple uso de una misma posición de memoria Una dependencia de data: frecuentemente inhibe la ejecución en paralelo Ejemplo 1: DO J = START, END A(J) = A(J-1) * 2 ENDDO Se debe haber calculado el valor de A(J-1) antes de calcular el valor de A(J)
Dependencia de data Si la tarea 2 tiene A(J) y la tarea 1 tiene A(J-1), el valor de A(J) es dependiente en: Memoria distribuida La tarea 2 obteniendo el valor de A(J-1) de la tarea 1 Memoria compartida La tarea 2 lee A(J-1) antes o después que la tarea 1 actualiza ésta
Cálculo de PI Paralelismo trivial Computacionalmente intensivo Comunicación mínima Operaciones de I/O mínimas El valor de PI puede ser calculado de muchas maneras, las cuales pueden ser facilmente paralelizables
Cálculo de PI Descripción del problema serial Consideremos el siguiente método de aproximar PI 1. Inscriba un círculo en un cuadrado 2. Genere puntos aleatorios en el cuadrado 3. Determine el número de puntos en el cuadrado que están también en el círculo 4. Sea r el número de puntos en el círculo dividido por el número de puntos en el cuadrado 5. PI ~ 4 r 6 Observar que mientras más puntos son generados, mejor será la aproximación
Cálculo de PI Pseudo-código serial para este procedimiento: npoints = 10000 circle_count = 0 do j = 1,npoints generate 2 random numbers between 0 and 1 xcoordinate = random1; ycoordinate = random2 if (xcoordinate, ycoordinate) inside circle then circle_count = circle_count + 1 end do PI = 4.0*circle_count/npoints
Cálculo de PI Solución Paralela: Pase de mensajes Estrategia de paralelización: descomponer el lazo en porciones los cuales pueden ser ejecutados por los procesadores Para aproximar PI: Cada procesador ejecuta su porción del lazo un número de veces Cada procesador puede hacer su trabajo sin requerir alguna información de los otros procesadores (no existe dependencia de data) Esta situación es conocida como paralelismo trivial Un proceso actúa como maestro y colecciona los resultados (modelo SPMD)
Cálculo de PI Solución Paralela: Pase de mensajes Pseudo-código: La letras Rojas incluye pase de mensajes npoints = 10000 circle_count = 0 p = number of processors num = npoints/p do j = 1, num generate 2 random numbers between 0 and 1 xcoordinate = random1 ; ycoordinate = random2 if (xcoordinate, ycoordinate) inside circle then circle_count = circle_count + 1 end do
if I am MASTER endif Cálculo de PI Solución Paralela: Pase de mensajes receive from WORKER their circle_counts compute PI (use MASTER and WORKER calculations) else if I am WORKER send to MASTER circle_count
GRACIAS!