Preparación y Adaptación de Códigos Científicos para su Ejecución Paralela TICAL 2018

Documentos relacionados
Modelos de Programación Paralela Prof. Gilberto Díaz

CUDA: MODELO DE PROGRAMACIÓN

CÓMPUTO DE ALTO RENDIMIENTO EN MEMORIA COMPARTIDA Y PROCESADORES GRÁFICOS

Introducción a Cómputo Paralelo con CUDA C/C++

Alejandro Molina Zarca

GPGPU ( GENERAL PURPOSE COMPUTING ON GRAPHICS PROCESSING UNITS)

Francisco Javier Hernández López

Francisco J. Hernández López

TEMA 2: PROGRAMACIÓN PARALELA (I)

CUDA (Compute Unified Device Architecture)

CARACTERIZACION DE PROBLEMAS A SOLUCIONAR MEDIANTE PROGRAMACIÓN MULTIPROCESO DE MEMORIA COMPARTIDA. Autor ERIKA VIVIANA RIAÑO BEJAR

Primeros pasos con CUDA. Clase 1

Introducción a la Programación de Memoria Compartida.. con OpenMP

Sistemas Complejos en Máquinas Paralelas

Arquitecturas GPU v. 2015

Computación de Propósito General en Unidades de Procesamiento Gráfico GPGPU

CLUSTER FING: ARQUITECTURA Y APLICACIONES

Francisco J. Hernández López

GPU-Ejemplo CUDA. Carlos García Sánchez

Taller de Programación Paralela

SISTEMAS PARALELOS Y DISTRIBUIDOS. 3º GRADO EN ING. INFORMÁTICA. ING. COMPUTADORES PRÁCTICA 8: INTRODUCCIÓN A OPENMP.

ARQUITECTURA DE SISTEMAS PARALELOS 2. 4º INGENIERÍA INFORMÁTICA. PRÁCTICA 4. PROGRAMACION PARALELA CON openmp.

Introducción a la Arquitectura y Plataforma de Programación de Cómputo Paralelo CUDA (36 hrs) Instructor M. en C. Cristhian Alejandro Ávila-Sánchez

INTRODUCCIÓN A LA PROGRAMACIÓN EN CUDA. Francisco Javier Hernández López

Tema 3 GPUs: Introducción

CDI Arquitecturas que soportan la concurrencia. granularidad

Simulaciones Astrofísicas en GPU's

Computación en Manycores

Introducción a los Sistemas Multiprocesadores

Modelo de aplicaciones CUDA

Ejemplos de optimización para Kepler Contenidos de la charla [18 diapositivas]

Multiplicación de Matrices en Sistemas cc-numa Multicore. Autor: Jesús Cámara Moreno Director: Domingo Giménez Cánovas

Arquitecturas de Altas Prestaciones y Supercomputación

Es una API (Aplication Program Interface) que se usa para paralelismo basado en hilos múltiples en entornos de memoria compartida

INTRODUCCIÓN A LA PROGRAMACIÓN DE GPUS CON CUDA

PROGRAMACIÓN PARALELA. Modelos de programación paralela Paradigmas de programación paralela

PROGRAMACIÓN AVANZADA DE GPUs PARA APLICACIONES CIENTÍFICAS

Modelos de computadores paralelos

Plan 95 Adecuado DEPARTAMENTO: ELECTRÓNICA CLASE: ELECTIVA DE ESPECIALIDAD ÁREA: TÉCNICAS DIGITALES HORAS SEM.: 4 HS. HORAS / AÑO: 64 HS.

Cómputo paralelo con openmp y C

Esquemas algorítmicos paralelos - Particionado y Paralelismo de Datos

MAGMA. Matrix Algebra on GPU and Multicore Architecture. Ginés David Guerrero Hernández

Introducción a los sistemas de Multiprocesamiento Prof. Gilberto Díaz

TAREA 1. INTRODUCCIÓN A LOS SISTEMAS OPERATIVOS.

Segunda Parte: TECNOLOGÍA CUDA

Programación Gráfica de Altas Prestaciones

Multiprocesamiento en lenguaje C Introducción a Open Multiprocessing (OpenMP)

Computación de Propósito General en Unidades de Procesamiento Gráfico GPGPU. Clase 0 Lanzamiento del Curso. Motivación

Guía y fundamentos de la programación en paralelo

Nociones básicas de computación paralela

Herramientas para el estudio de prestaciones en clusters de computación científica, aplicación en el Laboratorio de Computación Paralela

CUDA 5.5 y Visual Studio Express 2012 para Escritorio. Primeros pasos.

Programación en Intel Xeon Phi

PARADIGMA y LENGUAJES DE PROGRAMACIÓN

INTRODUCCIÓN A LA COMPUTACIÓN PARALELA CON GPUS

Lusitania. Pensando en Paralelo. César Gómez Martín

Paralelismo. MPI Paso de mensajes. Francisco García Sánchez Departamento de Informática y Sistemas

METODOLOGÍA DE LA PROGRAMACIÓN PARALELA. Modelos de programación paralela Paradigmas de programación paralela

1 Primitivas básicas de OpenMP

OpenMP. Qué es OpenMP?

Introducción a la Programación Paralela

Paralelismo en monoprocesadores. Introducción

Computación de Altas Prestaciones Sistemas computacionales

Esquemas algorítmicos paralelos - Particionado y Paralelismo de Datos

Una Biblioteca Numérica Paralela para UPC

48 ContactoS 84, (2012)

Computación de Propósito General en Unidades de Procesamiento Gráfico GPGPU

Entornos de programación paralela basados en modelos/paradigmas

Computación en procesadores gráficos

Multiprocesadores de Memoria Compartida

Guía docente de la asignatura

DESARROLLO DE APLICACIONES EN CUDA

Unidad I: Organización del Computador. Ing. Marglorie Colina

Arquitecturas GPU v. 2013

Ejemplos de optimización para Kepler. 1. Balanceo dinámico de la carga. Contenidos de la charla [18 diapositivas]

V. OPTIMIZACIÓN PARA COMPUTACIÓN GPU EN CUDA

Evolución del software y su situación actual

Paralelización sobre GPU del Algoritmo de Eliminación de Gauss-Jordan para la Solución de Sistemas de Ecuaciones Lineales

Divide y Vencerás Programación Dinámica

Computación Matricial y Paralela

Paralelización especulativa

UNIDAD II Metodología de programación paralela. Lic. Jesús Germán Andrés PAUTSCH - FCEQyN - UNaM

Tile64 Many-Core. vs. Intel Xeon Multi-Core

Sistemas Operativos. Procesos

Programación Paralela

UNIDAD II. Software del Computador. Ing. Yesika Medina Ing. Yesika Medina

Introducción a Cómputo Paralelo con CUDA C/C++

Guía práctica de estudio 11 Introducción a OpenMP.

Sistema electrónico digital (binario) que procesa datos siguiendo unas instrucciones almacenadas en su memoria

Organización del Sistema Operativo

Modelos de Programación Paralela

HPC: Aplicaciones y Software

Relación de Ejercicios. Programación Paralela 4º de Grado en Ingeniería Informática.

PRÁCTICA DE LABORATORIO 4 Programación Orientada a Objetos

Optimización de Rutinas Multinivel de Álgebra Lineal en Sistemas Multicore

Introducción a la Computación Paralela

Transcripción:

Preparación y Adaptación de Códigos Científicos para su Ejecución Paralela TICAL 2018 Gilberto Díaz gilberto.diaz@uis.edu.co Universidad Industrial de Santander Centro de Súper Computación y Cálculo Científico (SC3) Bucaramanga - Colombia

Eterna Necesidad El software científico de cualquier área debe ejecutarse de forma ágil y eficiente.

Uno de los objetivos principales de todo software científico es reducir el tiempo de ejecución para obtener resultados en tiempos razonables. Reportes de Clima Alertas de Tsunami Difusión de enfermedades Etc. Eterna Necesidad

Actualmente existen distintas técnicas especializadas para reducir el tiempo de procesamiento de los datos. Técnicas para Acelerar Algoritmos

Técnicas para Acelerar Algoritmos Aceleración de algoritmos Código eficiente Compiladores Paralelismo Funcional Paralelismo de Datos Redes de alto desempeño Baja latencia Almacenamiento de alto desempeño Sistemas de Archivos Paralelos

Técnicas para Acelerar Algoritmos Aceleración de algoritmos Código eficiente Compiladores Paralelismo Funcional Paralelismo de Datos Estrategias para acelerar el código original Redes de alto desempeño Baja latencia Almacenamiento de alto desempeño Sistemas de Archivos Paralelos

Técnicas para Acelerar Algoritmos Para programar un código científico que se ejecute rápido, lamentablemente/ afortunadamente, se debe conocer el hardware donde se va a ejecutar. L2 A ALU C L2 Processor L1 L2 L1 B A B ALU C L1 L2 L1 Prefetch device L3 RAM A B A B ALU C ALU C

Técnicas para Acelerar Algoritmos Entre las estrategias tenemos Evitar saltos en el código Uso de memoria dinámica Aprovechar la meoria cache Linealizar estructuras de datos Especificar la arquitectura en tiempo de compilación

Evitar Saltos en el Código Los científicos generalmente no cuentan con formación en programación, sin embargo, escriben muchos códigos para modelar situaciones físicas. Esto genera programas ineficientes IF(NC5.EQ.1) GO TO 999... END DO... 999 CONTINUE WRITE(*,*)'*** Computation Terminated ***'..

Uso de Memoria Dinámica Usar estructuras de datos de tamaño adecuado evita el mal uso de la memoria RAM. #define TAM 1000.. float var[tam];. for(i=0; i<10; i++){ var[i] = x*pi;

Aprovechar la Memoria Cache Usar memoria contínua Matriz::Matriz(const int f, const int c){ int i, j; filas = f; columnas = c; elems = new float * [filas]; for(i=0; i<filas; i++){ elems[i] = new float[columnas]; } } Matriz::Matriz(const int f, const int c){ int i, j; filas = f; columnas = c; elems = new float * [filas]; elems[0] = new float [filas*columnas]; for(i=0; i<filas; i++) elems[i] = elems[0] + i * columnas; }

Aprovechar la Memoria Cache Intercambiar estructuras de repetición (loop interchange) for(i=0; i<filas; i++){ for(j=0;j<cols;j++){... } for(j=0; j<cols; j++){ for(j=0;i<filas;i++){... }

Aprovechar la Memoria Cache Integrar estructuras de repetición (loop fusion) for(i=0; i<tam; i++) c[i] = d[i]+3.0; for(i=0; i<tam; i++) a[i] = b[i]*4.0; for(i=0; i<tam; i++){ c[i] = d[i]+3.0; a[i] = b[i]*4.0; }

Linealizar Estructuras de Datos for(i=0; i<res.filas; i++) for(j=0; j<res.cols; j++) for(k=0; k<res.cols; k++) res.elems[i][j] = res.elems[i][j] + this->elems[i][k]* m.elems[k][j]; for(i=0; i<res.filas*res.cols; i++) for(j=0; j<res.filas; j++) res.elems[i] = res.elems[i]+ this->elems[j]* m.elems[j*m.colus];

Banderas de Optimización del Compilador CFLAGS="-march=corei7-avx -O2 -pipe"

Acelerar Algoritmos Utilicemos un ejemplo de rendering para explicar como podemos resolver un problema de forma más rápido

Acelerar Algoritmos Podemos dividir el problema en trozos más pequeños

Acelerar Algoritmos Y asignar cada trozo a un procesador distinto. Así, cada procesador resuelve más rápido un problema más pequeño en menor tiempo.

Paralelismo de Datos Acelerar Algoritmos a 00 a 01 a 02 b 00 b 01 b 02 c 00 c 01 c 02 a 10 a 11 a 12 x b 10 b 11 b 12 = c 10 c 11 c 12 a 20 a 21 a 22 b 20 b 21 b 22 c 20 c 21 c 22

Paralelismo de Datos Acelerar Algoritmos a 00 a 01 a 02 b 00 b 01 b 02 c 00 c 01 c 02 a 10 a 11 a 12 x b 10 b 11 b 12 = c 10 c 11 c 12 a 20 a 21 a 22 b 20 b 21 b 22 c 20 c 21 c 22

Paralelismo de Datos Acelerar Algoritmos a 00 a 01 a 02 b 00 b 01 b 02 c 00 c 01 c 02 a 10 a 11 a 12 x b 10 b 11 b 12 = c 10 c 11 c 12 a 20 a 21 a 22 b 20 b 21 b 22 c 20 c 21 c 22

Paralelismo de Datos Acelerar Algoritmos a 00 a 01 a 02 b 00 b 01 b 02 c 00 c 01 c 02 a 10 a 11 a 12 x b 10 b 11 b 12 = c 10 c 11 c 12 a 20 a 21 a 22 b 20 b 21 b 22 c 20 c 21 c 22

Paralelismo de Datos Acelerar Algoritmos c00 = a00b00 + a01b10 + a02b20 c01 = a00b01 + a01b11 + a02b21 c02 = a00b02 + a01b12 + a02b22... c22 = a20b02 + a21b12 + a22b22

Paralelismo de Datos Acelerar Algoritmos c00 = a00b00 + a01b10 + a02b20 c01 = a00b01 + a01b11 + a02b21 c02 = a00b02 + a01b12 + a02b22... c22 = a20b02 + a21b12 + a22b22

Acelerar Algoritmos Más formalmente Ecuación de Calor Discretizar Codificar for(i=0; i<n; i++) a[i] = b[i] + c[i];

Acelerar Algoritmos Acelerar un algoritmo implica generar varios hilos de ejecución utilizando diferentes técnicas. for(i=0; i<n; i++) a[i] = b[i] + c[i]; a[0] = b[0] + c[0];. a[n] = b[n] + c[n]; a[0] = b[0] + c[0]; a[1] = b[1] + c[1];.. a[m] = b[m] + c[m];.. a[n] = b[n] + c[n];

Modelos de Programación Paralela Un modelo de programación paralela o paradigma es un conjunto de tecnologías de software que permiten expresar algoritmos paralelos para implantar aplicaciones en la arquitectura adecuada.

Modelos de Programación Paralela Un modelo de programación paralela incluye distintas áreas: Aplicaciones Lenguajes de programación Compiladores Bibliotecas Sistemas de comunicación Dispositivos de I/O paralelos

Modelos de Programación Paralela Hoy en día es muy difícil realizar un programa paralelo de forma automática. Por esto, el usuario debe escoger el modelo apropiado, o una mezcla de ellos, para construir su programa

Modelos de Programación Paralela Un modelo de programación paralela es implemenntado de distintas formas: Como bibliotecas invocadas desde programas tradicionales Como extensiones de lenguajes de programación Como modelos de ejecución completamente nuevos

Modelos de Programación Paralela Una primera categorización de estos modelos se realiza de acuerdo al manejo de la memoria: Memoria compartida (shared memory) Memoria distribuida (distributed memory) Memoria compartida distribuida (distributed shared memory)

Memoria Compartida en Procesadores Tradicionales Los hilos se comunican utilizando la memoria Cores Procesadores GPUs Posix Threads OpenMP RAM

Memoria Compartida (OpenMP) OpenMP es un API conformado por tres elementos Directivas del compilador: es un conjunto de instrucciones que le permite al programador comunicarse con el compilador Biblioteca de funciones: rutinas para gestionar los parámetros paralelos: número de hilos participantes y en ID actual Variables de ambiente:

Memoria Compartida (OpenMP) OpenMP está disponible para C C++ Fortran

Memoria Compartida (OpenMP) El hilo de control se divide así mismo tantas veces como lo necesite (modelo fork-join) Master Thread Regiones paralelas

Memoria Compartida (OpenMP) La mayoría de los bloques de OpenMP son directivas del compilador llamadas pragmas Los pragmas definen las regiones paralelas C/C++ : #pragma omp parallel { code } #pragma omp parallel thread1 thread2 thread3

Memoria Compartida (OpenMP) #pragma omp parallel for for (i=0; i<n; i++){ Do_Work(i); }

Memoria Compartida Usando Aceleradores Los hilos se comunican utilizando la memoria CUDA OpenCL OpenACC Procesadores GPUs Cores RAM

Memoria Compartida (CUDA) Hay una amplia diferencia entre un procesador tradicional y los procesadores de los aceleradores (GPU): La mayoría de los transistores en una GPU están dedicados a procesamiento. En un CPU hay muchos transistores que deben gestionar el flujo de datos, la memoria chache, etc. Control UAL UAL UAL UAL Cache RAM RAM

Memoria Compartida (CUDA) CUDA es una tecnología que permite utilizar el poder de procesamiento masivamente paralelo de las GPUs de NVIDIA. Es un modelo de programación desarrollado por NVIDIA para sus GPUs. CUDA es una extensión del leguaje C para programación GPU.

Memoria Compartida (CUDA) La programación GPU, especialmente CUDA, es apropiada para enfrentar problemas donde la descomposición de dominio sea mayoritariamente la fuente de paralelismo

Memoria Compartida (CUDA) Jerarquía de los hijos de ejecución en CUDA Grid 0,0 0,1 0,2 1,0 1,1 1,2 2,0 2,1 2,2 Block 0,0 0,1 1,0 1,1 Thread

Memoria Compartida (CUDA Jerarquía de Memoria) Core 1 Registers Cache L1 Cache L2 CPU Core 2 Registers Cache L1 Cache L2 Bloque (0,0) GPU Bloque (1,0) Memoria Compartida Memoria Compartida Registros Registros Registros Registros Hilo (0,0) Hilo (1,0) Hilo (0,0) Hilo (1,0) Cache L3 Memoria Global Memoria Constante Memoria RAM

Memoria Compartida (CUDA) Multiplicación de matrices en un leguaje tradiconal #define N 20 float c[n][n]; void mulmat(float a[n][n], float b[n][n]){ int i,j,k; for(i=0; i<n; i++) for(j=0; j<n; j++) for(k=0; k<n; k++) c[i][j] = c[i][j] + a[i][k]*b[k][j]; }

Memoria Compartida (CUDA) El kernel correspondiente para la multiplicación de matrices es: global void MatrixMult(float *Md, float *Nd, float *Pd, int Width){ //Cálculo del índice de fila de Pd y M int Row blockidx.y * TILE_WIDTH + threadidx.y; //Cálculo del índice de columna de Pd y N int Col blockidx.x * TILE_WIDTH + threadidx.x; float Pvalue = 0; for( int k = 0; k < Width; ++k ) Pvalue += Md[Row*Width+k] * Nd[k*Width+Col]; Pd[Row*Width*Col] = Pvalue; }

Memoria Compartida (OpenACC) Es un estándar diseñado para simplificar la programación paralela de sistemas heterogéneos de CPU/GPU. Está disponible sólo para el juego de compiladores de PGI

Memoria Compartida (OpenACC) #pragma acc kernels { #pragma acc loop independent collapse(2) for ( int j = 1; j < n-1; j++ ) { for ( int i = 1; i < m-1; i++ ) { Anew[j][i] = 0.25 * (A[j][i+1] + A [j][i-1] + A[j-1][i] + A[j+1][i]); error = max (error,fabs(anew[j][i] - A[j][i])); } } } }

Memoria Distribuida (MPI) Cuando los recursos de un sólo computador no son sufcientes, entonces es necesario acudir a los recursos de otros computadores

Memoria Distribuida (MPI) Los hilos se comunican utilizando mensajes por la red MPI Cores GPUs Cores Procesadores RAM Cores GPUs Cores Procesadores RAM

Memoria Compartida Distribuida (Modelo Híbrido) Los hilos se comunican utilizando mensajes por la red y la memoria Cores GPUs Cores Procesadores RAM Cores GPUs Cores Procesadores RAM

Sistemas de Archivos Paralelos Lustre PVFS GPFS BeeFS File Asfdjlsfsdfkjsdfjsdhners Werweiujoifdsfshgvbcvs Sdfsjdfañsdfjdhegbdbbcv Sdfsdjflkjsdfskdjf asdfkj sdfkjasdfijwerlkjsdfasdfj