Al borde de un ataque de Matlab sálvame C++ Francisco Javier García Blas Universidad Carlos III de Madrid Grupo ARCOS 2016

Documentos relacionados
Tema: Plantillas en C++.

cuevogenet Paralelización en CUDA de la Dinámica Evolutiva de Redes Génicas Dirigido por: Fernando Díaz del Río José Luis Guisado Lizar

Lenguaje C. República Bolivariana de Venezuela Fundación Misión Sucre Aldea Fray Pedro de Agreda Introducción a la Programación III

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

PROGRAMACIÓN N C++ CONSTRUCTORES PROG.C++ L11 CONSTRUCTORES DEL LENGUAJE

Fundamentos de la programación

FLAG/C. Una API para computación matricial sobre GPUs. M. Jesús Zafont Alberto Martín Francisco Igual Enrique S. Quintana-Ortí

Heterogénea y Jerárquica

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

12 símbolos (13 si se incluye el espacio en blanco)

CAR.

Cátedra I Informática Autor I Carlos Bartó

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

Funciones y Parámetros

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

Introducción a C++ y Code::Blocks

Tipos de datos y operadores en C++

Cómputo paralelo con openmp y C

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

INTRODUCCIÓN AL LENGUAJE C++

Programación 1 Tema 3. Información, datos, operaciones y expresiones

Francisco Javier Hernández López

Tema 1. Programación modular. Programación Avanzada Ingeniería Técnica en Informática de Gestión Jorge Badenas

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Programación Híbrida e Introducción a la Programación de GPUs

Programación en C. Algoritmo y Estructura de Datos. Ing. M. Laura López. Programación en C

Plantillas (Templates)

Librería Thrust. Clase 4.

Testing Unitario. Laboratorio de Testing y Aseguramiento de la Calidad del Software

Segundo Taller Final de PROGRAMACIÓN ORIENTADO A OBJETOS. INGENIERÍA DE SISTEMAS. Docente y Administrativo: Luz Esperanza Espitia Preciado

2º curso / 2º cuatr. Arquitectura de Computadores. Grado en Ing. Informática. Seminario 1. Herramientas de programación paralela I: Directivas OpenMP

C++17. El lenguaje que sustituirá a C++11/14. J. Daniel Garcia. 24 de noviembre de Grupo ARCOS Universidad Carlos III de Madrid C++17

Arquitecturas de Altas Prestaciones y Supercomputación

Construcciones del Lenguaje Java

CAR. Responsable : María del Carmen Heras Sánchez. Asesores Técnicos : Daniel Mendoza Camacho Yessica Vidal Quintanar.

PRÁCTICA DE LABORATORIO 3 Tipo Abstrato de Dato

Introducción rápida a la programación (estructurada ) con C++

Computación Híbrida, Heterogénea y Jerárquica

Arquitecturas GPU v. 2013

Programación. Test Autoevaluación Tema 3

Práctica de gsoap. int ns enviar (unsigned nodo, std::string cadena, std::string &resultado); int ns recibir(unsigned nodo, std::string &resultado);

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Introducción a C++ Índice

Computación Matricial y Paralela

Lenguaje C Funciones. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia

Programación en Paralelo con MPI en Clusters Linux

Introduccion al Lenguaje C. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia

CONTENIDO. Programación orientada a objetos - POO. Clases. Constructores y destructores. Definiciones. Entrada y salida

Arquitectura de Computadores: Exámenes y Controles

Cursada Segundo Cuatrimestre 2012 Guía de Trabajos Prácticos Nro. 1

Utilización de la programación paralela en procesadores gráficos para el cálculo científico.

Solving Dense Linear Systems on Platforms with Multiple Hardware Accelerators

Punteros. Definición Un puntero es un dato que contiene una dirección de memoria.

Programación I Funciones

LENGUAJE. Tema 4 Vectores, Matrices y Cadenas de caracteres.

Introducción al lenguaje C

MPI es un estándar de programación en paralelo mediante paso de mensajes que permite crear programas portables y eficientes.

Técnicas SuperEscalares en la Paralelización de Bibliotecas de Computación Matricial sobre Procesadores Multinúcleo y GPUs

Sistemas Operativos Práctica 3

Programación C++ (1 Parte) Dr. Oldemar Rodríguez Rojas Escuela De Informática Universidad Nacional

Funciones y paso de parámetros

Nociones básicas de computación paralela

Programación Estructurada

Funciones: Pasos por Referencia Recursividad

El lenguaje de Programación C. Fernando J. Pereda

UNIVERSIDAD DE LOS ANDES NUCLEO UNIVERSITARIO RAFAEL RANGEL (NURR) DEPARTAMENTO DE FISICA Y MATEMATICA AREA COMPUTACION TRUJILLO EDO.

Arquitectura de aceleradores. Carlos Bederián IFEG CONICET GPGPU Computing Group FaMAF UNC

Paradigma de paso de mensajes

Paso de Borland Turbo C (bajo DOS) a Anjuta (Linux) 1.

Cómputo en paralelo con OpenMP 1

SEGUNDO PARCIAL INFORMATICA II

Unidad II Fundamentos de C++ M.C. Juan Carlos Olivares Rojas

Fundamentos de programación

Programación C++ Tipos Parametrizados. Dr. Oldemar Rodríguez Rojas Escuela de Informática Universidad Nacional

4. Operadores Operador asignación

Primeros pasos con CUDA. Clase 1

Cálculo Estructural, Fluídos e Magnetismo Ansys 5.7

Soluciones a ejercicios de paralelismo y concurrencia

Programación MATLAB: Programas y Funciones.

Sobre Carga de Operadores

Herramientas computacionales para la matemática MATLAB: Estructuras de control

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

Tema 1: Introducción. Índice. Notas

Hoja de ejercicios del Tema 3

Impresión por pantalla

Librerías estándar en C++ STL: Standard Template Library. Álvaro Sánchez Miralles José Porras (Fidel Fernández)

Programación en Lenguaje C

Introducción a Java. Introducción a Java. Programación I

Impresión por pantalla. 3. Indicar la salida por pantalla (2 puntos-20 minutos)

Elementos de un programa en C

Rancagua, Agosto 2009

C++11: Simplificando la vida del programador

Tipos Abstractos de Datos

INTRODUCCIÓN A LA COMPUTACIÓN PARALELA CON GPUS

Expresiones y sentencias

Modelos de computadores paralelos

Ejercicios De Programación De C++ Algoritmos. Lenguaje De Programación C++:

Escuela Politécnica Superior de Elche

Preliminares. Tipos de variables y Expresiones

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

Transcripción:

Al borde de un ataque de Matlab sálvame C++ Francisco Javier García Blas fjblas@inf.uc3m.es Universidad Carlos III de Madrid Grupo ARCOS 2016

Matlab 2

3 Introducción Qué es Matlab?, MATrix LABoratory Es un lenguaje de programación (inicialmente escrito en C) para realizar cálculos numéricos con vectores y matrices. Como caso particular puede también trabajar con números escalares, tanto reales como complejos. Cuenta con paquetes de funciones especializadas.

4 Mito 1: Matlab es difícil

5 Google Trend Gran comunidad de usuarios. Usado en múltiples áreas de la ingeniería.

6 Mito 1: Matlab es difícil

7 Mito 2: Matlab es lento

8 Matlab es lento Matlab utiliza Intel MatkKernel Library (MKL) Intel MKL incluye una nueva función de Descarga Automática (AO). Multiprocesadores Intel Xeon Phi de forma automática y transparente

9 Mito 2: Matlab es lento

10 Mito 3: Matlab es caro

11

12 Mito 3: Matlab es caro

13 Qué SI nos gusta de Matlab? Prototipado rápido de aplicaciones Soporte para desarrolladores Representación sencilla de operaciones algebraicas Interfaz gráfica (GUI) para depuración y desarrollo Matlab Simulink Programación paralela basada en maestro-esclavo (workers) Parfor Bucles paralelos GPU

14 Qué NO nos gusta de Matlab? Entorno cerrado de desarrollo (esclavos de Matlab). Gestión de memoria. El despliegue de aplicaciones es altamente dependiente. Limitadas alternativas para la paralelización eficiente en memoria compartida.

Sálvame C++ 15

16 Alternativas a Matlab en C++ Eigen Armadillo ArrayFire

17 Qué es Armadillo? Biblioteca de código libre para C++. Fácil uso y con una sintaxis similar a Matlab. Basada en templates y C++11. Lambdas (transform, for_each, reduce) Contenedores Soporte para BLAS y LAPACK de forma adicional. Representa tipos básicos para representación matemática: Mat (2D) Cube (3D) Soporte para aceleración mediante tarjetas gráfica (GPU). Proporciona vectorización automática SIMD (eg. SSE2). CUIDADO: representación column-major. Soporte para CMake http://arma.sourceforge.net/

18 Qué NO proporciona Armadillo? Todo el conjunto de bibliotecas proporcionadas por Matlab. Paralelización de operaciones sobre vectores. #pragma omp parallel for for (int i = 0; i < inda.n_elem; ++i) { slicevf_gm.at(inda(i)) = ODF(ODF.n_rows - 1,i); } } http://arma.sourceforge.net/

Asignatura/Tema 19 Operadores en Armadillo Operadores sobrecargados para clases Mat, Col, Row y Cube +: Suma de dos objetos. -: Resta de un objeto de otro o negación de un objeto. /: División de un objeto por otro objeto o un escalar. * Multiplicación matricial de dos objetos; No aplicable a la clase Cube a menos que multiplique un cubo por un escalar. %: Multiplicación por elementos de dos objetos. ==: Evaluación de igualdad entre elementos de dos objetos; Genera una matriz de tipo umat con entradas que indican si en una posición dada los dos elementos de los dos objetos son iguales (1) o no iguales (0)

20 Ejemplo: multiplicación de matrices #include <iostream> #include <armadillo> using namespace std; using namespace arma; int main (int argc, char** argv) { mat A = randu<mat>(5000,5000); mat B = randu<mat>(5000,5000); mat C = A *B; return 0; }

21 Ejemplo: Solver g++ -o solver solver.cpp -larmadillo #include <iostream> #include <armadillo> int main() { arma::vec b; b << 2.0 << 5.0 << 2.0; arma::mat A; A << 1.0 << 2.0 << arma::endr << 2.0 << 3.0 << arma::endr << 1.0 << 3.0 << arma::endr; std::cout << Solución a mínimos cuadrados: std::cout << solve(a,b) << std::end; << std::end; } return 0; 3.0000-0.3636

22 Ejemplo: Programación funcional // Idiff(Idiff>1) = 1; // Idiff(Idiff<0) = 0; Idiff.elem( find(idiff > 1.0) ).ones(); Idiff.elem( find(idiff < 0.0) ).zeros();

23 Matlab Vs Armadillo MATLAB for i = 1:Niter fodfi = fodf; Ratio = mbessel_ratio(n_order,reblurred_s); RL_factor = KernelT * ( Signal.* (Ratio))./ (KernelT * (Reblurred)+ eps); fodf = fodfi.* RL_factor; Reblurred = Kernel * fodf; Reblurred_S = (Signal.* Reblurred)./ sigma2; sigma2_i = (1/N) * sum( (Signal.^2 + Reblurred.^2)/2 - (sigma2.* Reblurred_S).* Ratio, 1)./n_order; sigma2_i = min((1/10)^2, max(sigma2_i,(1/50)^2)); sigma2 = repmat(sigma2_i,[n, 1]); end Armadillo for (auto i = 0; i < Niter; ++i) { fodfi = fodf; Ratio = mbessel_ratio<t>(n_order,reblurred_s); RL_factor = KernelT * (Signal % Ratio) / ((KernelT * Reblurred) + std::numeric_limits<t>::epsilon()); fodf = fodfi % RL_factor; Reblurred = Kernel * fodf; Reblurred_S = (Signal % Reblurred) / sigma2; sigma2_i = (1.0/N) * sum( (pow(signal,2) + pow(reblurred,2))/2 - (sigma2 % Reblurred_S) % Ratio, 0) / n_order; sigma2_i.transform( [](T val) { return std::min<t>(std::pow<t>(1.0/10.0,2), std::max<t>(val, std::pow<t>(1.0/50.0,2))); } ); sigma2 = repmat(sigma2_i, N, 1); }

24 Cómo puedo hacer para acelerar mi aplicación? Permite paralelización casi mágica de mi aplicación: Mediante enlazado de bibliotecas comúnmente usadas: Intel MKL (CPU) OpenBLAS (CPU) Atlas (CPU) Magma (GPU) NVidia permite la descarga (offloading) del cálculo matricial cublas: necesitamos trabajar con API (complejo) NVBLAS: descarga automática (fácil)

25 Configurando NVBLAS NVBLAS_LOGFILE nvblas.log NVBLAS_CPU_BLAS_LIB libmkl_rt.so #NVBLAS_CPU_BLAS_LIB libopenblas.so NVBLAS_GPU_LIST 0 #NVBLAS_GPU_LIST ALL NVBLAS_TILE_DIM 2048 #NVBLAS_GPU_DISABLED_SGEMM #NVBLAS_GPU_DISABLED_DGEMM #NVBLAS_GPU_DISABLED_CGEMM #NVBLAS_GPU_DISABLED_ZGEMM NVBLAS_CPU_RATIO_CGEMM 0.07 %> LD_PRELOAD=LD_PRELOAD=/usr/local/cuda-7.5/lib64/libnvblas.so./miapplicacion

26 ArrayFire Programación orientada a dispositivos Basado en la clase array Limitado a datos en 1D/2D/3D Open source Neutral Nvidia AMD (OpenCL) CPU (CUDA) Múltiples funcionalidades Soporte para CMake https://github.com/arrayfire/arrayfire

27 Ejemplos básicos array A = array(seq(1,9), 3, 3); af_print(a); af_print(a(0)); // primer elemento af_print(a(0,1)); // primera fila, segunda columna af_print(a(end)); // último elemento af_print(a(-1)); // último elemento (también) af_print(a(1,span)); // segunda fila af_print(a.row(end)); // última fila af_print(a.cols(1,end)); // todo menos la segunda fila float b_host[] = {0,1,2,3,4,5,6,7,8,9}; array b(10, 1, b_host); af_print(b(seq(3))); af_print(b(seq(1,7))); af_print(b(seq(1,7,2))); af_print(b(seq(0,end,2)));

28 Ejemplo #include <arrayfire.h> #include <stdio.h> #include <math.h> #include <cstdlib> static af::array A; static void fn() { } af::array B = af::matmul(a,a); B.eval(); int main(int argc, char ** argv) { double peak = 0; try { int device = argc > 1? atoi(argv[1]) : 0; af::setdevice(device); af::info(); } std::cout << Benchmark N-by-N << std::endl; for (auto n = 128; n <= 2048; n += 128) { std::cout << n << x << n << ; A = af::constant (1, n, n); double time = af::timeit(fn); double gflops = 2.0 * powf(n,3) / (time * 1e9); if (gflops > peak) peak = gflops; std::cout << gflops << GF << std::endl; } } catch (af::exception & e) { std::cout << e.what() << std::endl;; throw; } std::cout << ## Max << peak << GFLOPS << std::endl; return 0;

29 Gfor-loop La construcción gfor-loop puede utilizarse para iniciar simultáneamente todas las iteraciones de un bucle for de la GPU o dispositivo. siempre y cuando las iteraciones sean independientes. gfor-loop se realiza cada iteración al mismo tiempo (en paralelo). Tamaño del intervalo limitado. FFT a cada rodaja de un volumen: for (auto i = 0; i < N; ++i) A(span,span,i) = fft2(a(span,span,i)); // Secuencial gfor (seq i, N) A(span,span,i) = fft2(a(span,span,i)); // Paralelo

30 ArrayFire + Armadillo Ambos comparten el mismo layout de memoria (column-major). Es posible transferir datos de la clase Mat (Armadillo) a array (ArrayFire). af::array mat_gpu = af::array(filas, columnas, mat_cpu.memptr()); mat_gpu.host(mat_cpu.memptr());

31 Caso de uso: phardi Identificación de fibras nerviosas para estudiar el grado de conectividad de las distintas áreas del cerebro. Rendimiento: pseudo-tiempo real: Quirófano (operatorio). Procesamiento estadístico (clínico). http://www.bitbucket.com/fjblas/phardi

32

33 Evaluación (I) Intel Xeon E5-2630 v3 8 núcleos 2.40 GHz, 128 GB RAM Ubuntu 14.04 x64 CUDA versión 7.5. Compiladores GCC 5.1 Flags O3 y DNDEBUG Nvidia Tesla K40 GTX 680

34 Evaluación (II)

35 Evaluación (y III)

36 Conclusiones Es posible el despliegue de aplicaciones fuera del ámbito Matlab. Flexibilidad de desarrollo. Matlab como DSL.

37

Al borde de un ataque de Matlab sálvame C++. Francisco Javier García Blas Universidad Carlos III de Madrid Grupo ARCOS 2016