Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Temario
1. Introduccion al clustering
2. Introduccin a la programacin paralela. 3. Instalacin y configuracin de un ambiente PC Paralelo 4. Paso de mensajes punto a punto. Ejercicios. 5. Paso de mensajes grupal. Ejercicios.
Secuencial: Una tarea en un solo CPU Concurrente: Varias tareas en uno o varios CPU's Multitarea: Varias tareas multiplexadas en un mismo CPU Distribuida: Paralela: Tareas similares, en diferentes CPU's locales para acceso a datos o computo intensivo. Web: Tareas simultaneas en diferentes CPU's locales y remotos para acceso a datos locales y remotos Grid: Tareas simultaneas en diferentes CPU's locales y remotos para computo intensivo.
Qu es la computacin distribuida?
Grupo de CPUs interconectados, que resuelven un problema especfico en forma colaborativa. Cada CPU resuelve una parte del problema. Un procesador esta formado por una o mas CPUs Un nodo es una computadora que cuenta con uno o mas procesadores y tiene recursos propios. Los nodos se comunican con otros nodos por medio de una red de interconexion. Entonces, la comunicacin entre CPUs se puede dar en varios niveles: por memoria compartida o por una red de interconexin.
Hardware individual
Limitacin de incremento de velocidad de actuales procesadores Continua miniaturizacin electrnica R=SMP o multicores
Intel y AMD los lanzaron al mercado masivo en 2006 Proyectan que en pocos aos habr procesadores con 12 cores
Hardware masivo
Que es un cluster?
Tipos de Nodos
Dedicados No dedicados
Semi-Homogneo
Heterogneo
Costo
Octacore 64 bits
Un cluster es mas que conectar computadoras entre s. Es necesario un sistema de administracin del cluster. Dicho sistema se encarga de interactuar con el usuario y los procesos que corren en l cluster
Tipos de cluster
Alto rendimiento (High Performance) Diseados para dar altas prestaciones de clculo (computo intensivo). Alta disponibilidad (High Availability) Trata de brindar la maxima disponibilidad posible de servicios (tolerancia a fallos). Alta productividad. Su funcin principal es realizar la mayor cantidad de trabajo posible sin importar mucho el tiempo de entrega de tareas (balance de carga).
Clusters Beowulf - Objetivo: arquitectura generica de hardware en clusters - Se usan en: donde se requiera mucho poder de computo - Ejemplos: PVM, MPI, OpenMP Clusters HA (Alta disponibilidad) -Objetivo principal: alta disponibilidad - Se usan en: servidores de internet. - Ejemplos: LVS (Linux Virtual Server) Clusters SSI (Single System Image) - Objetivo principal: balanceo de carga - Se usa en: atencin a muchos usuarios heterogeneos - Ejemplos: Mosix, OpenMosix, Condor, OpenSSI Clusters Grid - Objetivo principal: alto rendimiento; mucho tiempo (la red es Internet) - Se usan en: computacin distribuida - Ejemplos: Globus, BOINC
Componentes de un cluster
Nodos Pueden ser simples ordenadores, sistemas multi procesador o estaciones de trabajo (workstations). Sistema Operativo GNU/Linux Unix: Solaris / HP-Ux / Aix Windows NT / 2000 / 2003 Server Mac OS X Cluster OS's especiales Conexiones de Red Los nodos de un cluster pueden conectarse mediante una red Ethernet simple con tarjetas comunes (NIC's) , o utilizarse tecnologas especiales de alta velocidad como FastEthernet, GigaEthernet, 10GigaEthernet, Myrinet, Infiniband, etc.
Middleware Software que acta entre el SO y las aplicaciones, dndole al cluster : Una interfaz nica de acceso al sistema: denominada SSI (Single System Image), la cual genera la sensacin al usuario de que utiliza un nico ordenador muy potente. Herramientas para la administracin y mantenimiento del sistema: migracin de procesos, checkpoint-restart (congelar uno o varios procesos, mudarlos de servidor y continuar su funcionamiento en el nuevo host), balanceo de carga, tolerancia a fallos, etc.; Escalabilidad: debe poder detectar automticamente nuevos servidores conectados al cluster para proceder a su utilizacin.
Existen diversos tipos de middleware, como por ejemplo: MOSIX, OpenMOSIX, Condor, OpenSSI, etc.
El middleware recibe los trabajos y los distribuye entre los nodos del cluster, buscando que se ejecute de la forma ms rpida posible. Para lograr lo anterior el middleware puede migrar procesos entre nodos con distintas finalidades: Balancear la carga: si un nodo est muy cargado de procesos y otro est ocioso, pueden transferirse procesos del primero para liberarlo de carga y optimizar el funcionamiento; Mantenimiento de nodos: si hay procesos corriendo en un nodo que necesita mantenimiento o una actualizacin, es posible migrar los procesos a otro servidor y proceder a desconectar el nodo a reparar. Priorizacin de trabajos: Se le puede dar mayor importancia a ciertos procesos para que terminen mas rpido.
Clusters en el mundo
www.top500.org
1er Lugar - Comp. Roadruner - Inst. DOE/NNSA/LANL - Lugar: Los Alamos, USA - 129,600 procesadores PowerXCell 3.2 Ghz - Red Infiniband - Fabricante : IBM - 1456 Tflops pico
Clusters en el mundo
Lugar 60 Comp. Marenostrum Lugar: Barcelona Espaa - 10,240 procesadores - 94.21 Tflops
Marenostrum
Clusters en Mxico
Argentum - CNS
N 02
Clasificacin de computadoras
La clasificacin de Flynn (1966): La multiplicidad de los flujos de instrucciones y datos en una computadora. El esquema de Feng (1972): La comparacin del procesamiento serial con el procesamiento paralelo. Clasificacin de Hndler (1977): El grado de paralelismo y enrutamiento en los diferentes niveles de los subsistemas.
Clasificacin de computadoras
SISD Sigle Instruction Single Data SIMD Single Instruction Multiple Data
Clasificacin de computadoras
MIMD. Multiple Instruction Multiple Data
Memoria distribuida
P M P M P M P M P M P M
Memoria compartida
P P P P P P
BUS
Debilmente acopladas
Network
M em o r y
Fuertemente acopladas
Tipos de Paralelismo
Explcito : El programa indica explcitamente como cooperan los procesadores para resolver un problema especfico. El compilador es normal, la tarea del programador es bastante difcil. Implcito: Se usan los programas actuales y el compilador inserta las instrucciones necesarias para ejecutar el programa en una computadora paralela. El compilador analiza y comprende el programa para generar un codigo aplicable a una computadora paralela.
La mayoria de los lenguajes para programacin paralela, son lenguajes secuenciales con librerias para la sincronizar la comunicacin entre procesos. El problema de estos lenguajes es la portabilidad entre diferentes arquitecturas. Desde hace algun tiempo se han vuelto comunes el uso libreras estandard con primitivas independientes de la arquitectura como OpenMP y MPI. En bajo nivel aun no se ponen de acuerdo para usar paralelismo dentro del procesador. Intel tiene SSE y AMD a 3DNow
Paralelismo de datos/de control Paralelismo de datos: Procesos simultaneos que aplican las mismas operaciones a todos los datos . Es ms apropiado para ejecutar en computadoras SIMD, aunque tambin se pueden ejecutar en MIMD. Paralelismo de control: Procesos simultaneos con diferentes operaciones, aplicados a los mismos o diferentes datos. Es apropiado para ejecutarse en computadoras MIMD.
Resolver problemas mayores y/o mas rapidamente. El crecimiento de la capacidad de los CPUs secuenciales est llegando a su limite. Soluciones: Poner varios CPUs en un mismo procesador Poner varios procesadores en una misma placa base. Aprovechar la evolucion del HW de comunicaciones para usar los procesadores en otros nodos. En cualquier caso, es necesario realizar cambios en los programas actuales.
Tomar en cuenta la arquitectura HW que se tiene disponible Conocer las interdependencias del problema para disear de algoritmos eficientes. Aplicar mtodos y tcnicas para evaluar los algoritmos paralelos. Utilizar lenguajes y herramientas para computadores paralelos. Hacer nuestros programas paralelos portables. Usar compiladores autoparalelizantes.
Memoria Compartida
Grano Medio Grano Grueso
Memoria Distribuida
Control
Vectorial
Datos
Depender del tipo de problema y hardware disponible. Entre mas dependencias de datos tenga el problema es mas difcil paralelizarlo y aprovechar el poder adicional de otros procesadores. El hardware disponible ofrece varios niveles en los cuales hacer paralelizacin.
Nivel bajo : Vectorizacin instrucciones. Nivel medio: Threads Nivel Alto : Paso de mensajes.
Vectorizacin de cdigo
Es la paralelizacin que se da a nivel de datos. Los procesadores modernos incluyen instrucciones que permiten hacer esto, llamadas extensiones multimedia. Estas instrucciones usan los registros extras para guardar mas datos y poder aplicar la misma operacin sobre todos, en un mismo ciclo-procesador. Cada fabricante de procesadores ha creado sus propias extensiones multimedia, para sus procesadores. Intel desarroll MMX, SSE, SSE2, SSE3 AMD cuenta con 3DNow!
Vectorizacin de cdigo
Programar a este nivel regularmente se hace en ensamblador. Sin embargo existen algunas librerias como instrisic de Intel que ayuda a darle un nivel de abtraccin aceptable.
Threads
Cuando se tienen varios nucleos en una mismo motherboard, todos ellos comparten la misma memoria de programas. Para poder aprovechar estos nucleos es necesario crear threads para que estos sean atendidos por diferentes nucleos. Hay varias formas de crear threads: Posix Thread, Java, y OpenMP.
OpenMP es un API estndar para manejo de threads que definieron los principales fabricantes de hardware y software Cuenta con una serie de esquemas predefinidos de paralelizacin. Disponible para Fortran y C++
Threads
OpenMp establece :
Threads
OpenMp establece 6 mecanismos de sincronizacin.
Master. Solo el hilo principal ejecuta la regin indicada. Critical. La regin indicada solo puede ser accedida por un hilo al mismo tiempo. Barrier. Establece un punto para sincronizar todos los hilos. Una vez que todos han llegado a la barrera entonces continan con la ejecucin. Atomic. Establece una mini seccin de tipo Critical que incluye una regin de memoria accedida por un hilo a la vez. Flush. Establece un punto en el cual todos los hilos que usen ciertas variables de memoria, actualizan el contenido de las mismas. Ordered. Establece en una regin Do/For ciertas instrucciones que se ejecutan como si fueran secuenciales.
Threads
#include <omp.h> #include <stdio.h> #define CHUNKSIZE 10 #define N 100 int main (int argc, char *argv[]) { int nthreads, tid, i, chunk; float a[N], b[N], c[N]; for (i=0; i < N; i++) a[i] = b[i] = i * 1.0; chunk = CHUNKSIZE;
Threads
Un programa sencillo OpenMP (2/2) #pragma omp parallel shared(a,b,c,nthreads,chunk) private(i,tid) { tid = omp_get_thread_num(); if (tid == 0) { nthreads = omp_get_num_threads(); printf("Number of threads = %d\n", nthreads); } printf("Thread %d starting...\n",tid); #pragma omp for schedule(dynamic,chunk) for (i=0; i<N; i++) { c[i] = a[i] + b[i]; printf("Thread %d: c[%d]= %f\n",tid,i,c[i]); } } /* fin de la seccin paralela */ }
Paso de mensajes
Cuando se busca aprovechar el poder de clculo de otras computadoras conectadas en la misma red local (cluster), se usa una tcnica llamada paso de mensajes.
MPI es el estandar mas usado para realizar programas con paso de mensajes. Cuenta con versiones propietarias y de distribucin libre. Proporciona un entorno de ejecucin y una librera de programacin que permiten crear programas paralelos. El entorno de ejecucin permite acceder al hardware de comunicaciones. La librera de programacin proporciona una interfaz de programacin para lanzar los procesos y realizar las comunicaciones
Paso de mensajes
Inicializacin del ambiente MPI Comunicaciones entre procesos y Finalizacin del ambiente. Punto a punto bloqueante. Punto a punto no bloqueante. Colectiva.
MPI controla las comunicaciones ayudado por un demonio llamado POE que se encarga de la gestin de mensajes.
Paso de mensajes
Int main(int argc, char *argv[]) { int rango,nprocs,msg,et,fuen,dest; MPI_Status estado; MPI_Init (&argc, &argv); MPI_Comm_size (MPI_COMM_WORLD, &nprocs); MPI_Comm_rank (MPI_COMM_WORLD, &rango); switch (rango) { case 0: fuent = 1; dest=1; MPI_Recv ( &msg, 1, MPI_INT, fuente, et, MPI_COMM_WORLD, &estado); printf(Recibi el saludo de la maquina 1 =%d\n,msg); msg=msg*2; MPI_Send(&msg, 1, MPI_INT,dest,et, MPI_COMM_WORLD, &estado);
Paso de mensajes
Programa sencillo en MPI (2/2) case 1: fuent=0; dest=0; msg=15; MPI_Send(&msg, 1, MPI_INT,dest,et, MPI_COMM_WORLD,&estado); MPI_Recv (&msg, 1, MPI_INT, fuente, et, MPI_COMM_WORLD, &estado); printf(Recibi el saludo de la maquina 0 =%d\n,msg); }