FUNDAMENTOS DE COMPUTACIÓN PARA CIENTÍFICOS CNCA Abril 2013 6. COMPUTACIÓN DE ALTO RENDIMIENTO Ricardo Román DEFINICIÓN High Performance Computing - Computación de Alto Rendimiento Técnicas, investigación e infraestructura entorno a problemas con alta demanda de recursos computacionales Comprende: Hardware: almacenamiento, procesamiento, redes... Software: sistemas de archivos, programación paralela... Aplicaciones : cálculos complejos, simulación, minería... DEFINICIÓN Supercomputación: Máquinas de gran escala, muchos CPUs y mucha memoria Computación cluster: Múltiples máquinas en red funcionando como una sola Rendimiento se mide en operaciones de punto flotante por segundo (FLOPS) En la actualidad las máquinas más grandes operan en el orden de petaFLOPS (www.top500.org) TIPOS DE COMPUTADORAS Taxonomía de Flynn Instrucciones SI/SD SI/MD Datos Datos MI/SD MI/MD Instrucciones TIPOS DE COMPUTADORAS SISD: Una instrucción por unidad de tiempo Trabaja sobre una sola variable (datos) Podría utilizar pipelining Ejemplo: Computador con CPU de un núcleo TIPOS DE COMPUTADORAS SIMD: Todos los procesadores ejecutan la misma instrucción Podrían utilizar datos o variables diferentes Requieren distribución y sincronización Ejemplo: GPUs IBM Cell (PS3) TIPOS DE COMPUTADORAS MISD: Maquina poco común Múltiples procesadores trabajan sobre los mismos datos Algunos usos posibles: Sistemas tolerantes a fallas Criptografía TIPOS DE COMPUTADORAS MIMD: Cada procesador ejecuta diferentes instrucciones sobre diferentes datos Se pueden construir a partir de componentes SIMD Ejemplo: Computadores con múltiples procesadores y cada procesador con múltiples núcleos MÁQUINAS PARALELAS - MIMD Memoria compartida: SMP (Symmetric Multi-Processor) Cada procesador posee su propia memoria caché, y está interconectado junto con otros procesadores a la memoria principal Direcciones de memoria comunes para todos los procesadores Mismos tiempos de respuesta Escrituras deben sincronizarse Cantidad de procesadores limitada MEMORIA COMPARTIDA MÁQUINAS PARALELAS Memoria distribuida: Direcciones de memoria separadas físicamente Lectura de un bloque de memoria local en forma inmediata Comunicación para leer memoria remota Bus de datos Red Tiempos de acceso a memoria son diferentes (local vs remoto) Permite conectar muchas máquinas y tener muchos procesadores MEMORIA DISTRIBUIDA MÁQUINAS PARALELAS Híbridas: Fusión de los enfoques anteriores Por ejemplo, clusters SMP: Múltiples máquinas de memoria compartida Conexión de red de alta velocidad Permiten utilizar varios paradigmas de programación MODELO HÍBRIDO GPGPU General Purpose computation on Graphic Processing Units (computación de propósito general en unidades de procesamiento gráfico) Inicialmente se utilizaba el hardware para procesamiento gráfico y las herramientas para utilizarlo en tareas de computación numérica Hoy en día los fabricantes de tarjetas gráficas han adaptado su arquitectura para facilitar la utilización del hardware en tareas de propósito general Algunas herramientas que dan más control al programador para utilizar el hardware de las GPUs para este propósito son CUDA y OpenCL CPU VS. GPU CPU se especializa en procesamiento secuencial o “modestamente” paralelo (múltiples operaciones secuenciales en varios núcleos) CPU = procesamiento multi-núcleo. La cantidad de núcleos va normalmente de 2 a 16 Núcleos con unidades de control complejas e hilos pesados (en recursos) GPU = procesamiento muchos -núcleos. La cantidad de núcleos es de cientos. Núcleos simples con unidades de control simples y gran área para procesamiento con hilos livianos (en recursos) VENTAJAS DE LA GPU Son comercialmente exitosas lo cual hace estén disponibles en casi cualquier equipo cómputo Permite el procesamiento numérico masivamente paralelo en computadoras personales El modelo de paralelismo de la GPU es mucho más escalable que el de la CPU debido a su compromiso con las operaciones de punto flotante y al tipo de aplicaciones que maneja SIMD CUDA Compute Unified Device Architecture Arquitectura para computación paralela desarrollada por Nvidia Permite utilizar el hardware de las GPUs para realizar procesamiento paralelo Procesa código secuencial en CPU y código paralelo en el dispositivo GPU Similar a la estructura de programación de OpenCL pero específico para hardware Nvidia por el momento CUDA Modelo de programación de CUDA Host – CPU Device – GPU Kernel: porción de código que se ejecuta en la GPU Grid: conjunto de hilos que ejecutan en un kernel PROGRAMAS PARALELOS Memoria compartida Las aplicaciones acceden la memoria global. Operaciones concurrentes Estructuras de datos compartidas Sincronización Memoria distribuida Utiliza comúnmente paso de mensajes para enviar y recibir datos y sincronizar procesos Un proceso sólo accede su memoria local Gran cantidad de procesadores Cada proceso se podría mapear a un procesador físico PROGRAMAS PARALELOS Hilos Múltiples rutas de ejecución concurrentes Cada hilo: comparte todos los recursos del hilo principal tiene datos locales Requieren sincronización Los hilos pueden crearse o destruirse El hilo principal debe permanecer activo durante toda la ejecución Asociado a máquinas de memoria compartida PROGRAMAS PARALELOS - ESTRATEGIAS Paralelismo de datos: Divide el problema en subdominios Cada procesador trabaja sobre datos independientes Podría mejorar la escalabilidad Paralelismo de tareas: Identifica regiones o tareas del programa Se ejecutan en paralelo aquellas que son independientes Diferentes procesadores realizan diferentes funciones PROGRAMAS PARALELOS - ESTRATEGIAS SPMD: Single Program, Multiple Data Un único programa es ejecutado por todos los procesadores. Cada copia del programa utiliza diferentes datos. Ej.: operaciones sobre matrices. MPMD: Multiple Program, Multiple Data Diferentes operaciones son realizadas por diferentes procesadores, sobre diferentes datos. Puede ser un programa paralelizado por tareas y datos, o una solución con múltiples programas ejecutables. CONCEPTOS DE COMPUTACIÓN PARALELA Sea T S el tiempo de ejecución secuencial, y T P el tiempo de paralelo: Trabajo: tiempo computacional que tarda el programa en finalizar. Un programa paralelo podría realizar mayor trabajo que uno secuencial, ya que utiliza más procesadores Aceleración : razón del tiempo secuencial con respecto al paralelo. A = TS / TP Eficiencia: medida de utilización de recursos del programa secuencial con respecto al paralelo. E = aceleración / procesadores = T S / (p*T P ) Overhead: trabajo que realiza un programa paralelo que no es parte de su versión secuencial. Por ejemplo, sincronización, distribución, manejo de procesos, etc. T O = p*T P – T S CONCEPTOS DE COMPUTACIÓN PARALELA Escalabilidad: un programa escalable cuando sucede alguna de las siguientes condiciones: El tiempo computacional es inversamente proporcional a la cantidad de procesadores Si se incrementa el tamaño del problema y la cantidad de procesadores proporcionalmente: El tiempo computacional permanece igual La eficiencia se mantiene positiva La escalabilidad es una función del overhead, y permite entender la relación entre n (tamaño del problema) y p (cantidad de procesadores).