Computación de alto rendimiento o High-Performance Computing (HPC)
El término computación de alto rendimiento hace referencia a cualquier sistema informático que su capacidad de computo es mayor que pueden manejar los ordenadores de sobremesa normales. En otras palabras, la computación de alto rendimiento es un conjunto de tecnologías hardware y software que es capaz de tratar información en el menor tiempo posible es decir a gran velocidad. El término supercomputación se usa como sinómino a computación de alto rendimiento.
Supercomputación en la empresa, rompiendo barreras
Supercomputación e Industria - Salud y Medio Ambiente
Supercomputación e Industria - Manufactura
Introducción en computación de alto rendimiento
Entrevista con Mateo Valero, ¿Para qué se necesita realmente la supercomputación?
Los ordenadores de alto rendimiento contienen todos los componentes habituales de un ordenador de sobremesa - procesador (CPU), memoria principal (RAM), almacenamiento (storage), refrigeración, etc.
En la taxomonía de los ordenadores de alto rendimiento, los superordenadores o supercomputadores son los más potentes en computación.
Los superordenadores es una agrupación (cluster en inglés) de ordenadores que están interconectado por una red de alto rendimiento y conectado a un sistema de almacenamiento de alto rendimiento.
Superordenador
A cada ordenador en un superordenador es conocido como nodo. Cada nodo puede se construido con un o más procesadores, una cantidad de memoria principal y una capacidad de disco duro local limitada. Además, puede contener distintos tipos de aceleradores:
La unidad de procesamiento gráfica (GPU en inglés): Este tipo de hardware es usado generalmente para el procesamiento gráfico. A su vez, es capaz de proporcionar una cantidad elevada de capacidad de cómputo, es decir, cientos de procesos ejecutándose paralelamente. Este tipo de hardware es adecuado para el cálculo algebraico lineal.
Una matriz de puertas lógicas programable en campo (FPGA es ingés): Es una hardware programable que puede ser utilizado para acelerar algunos procesos específicos que normalmente se llevan a cabo con los procesadores.
Generalmente, los ordenadores de alto rendimiento son gestionados por el sistema operativo Linux.
¿Qué es Linux?
Típicamente, la interacción con los ordenadores de alto rendimiento se realiza con la consola o shell.
A su vez, popularmente, las aplicaciones software son gestionadas por el sistema module.
Introducción
Se distribuyen en dos versiones:
TCL: Distribución más expendida en los ordenadores de alto rendimiento actualmente
LMOD: Distribución en expansión y ofrece una gran versatilidad.
Gestor de colas/trabajos
Tradicionalmente, los ordenadores de alto rendimiento emplean algún sistema para la gestión de los recursos del ordenador entre los usuarios. Por lo general, a estos sistemas se conoce con el nombre de gestor de colas o gestor de trabajos. En un gestor de cola, un trabajo o job (en inglés) se refiere a una aplicación con los datos de entrada para su ejecución.
Los gestores de colas principales son:
SLURM (Simple Linux Utility for Resources Management)
PBS (Portable Batch System) o TORQUE (Terascale Open-source Resource and QUEue Manager) que se distribuye en el estándad abierto, OpenPBS (https://www.openpbs.org/)
Hoy en día, el gestor de cola SLURM es el más popular en los ordenadores de alto rendimiento:
Página oficial:
Resumen de los comandos:
Programación paralela
Esta sección, se expone la programación aplicada generalmente en ordenadores de computación de alto rendimiento. El concepto de rendimiento es vago y puede significar varias cosas. Nosotros usaremos el concepto de rendimiento significado la resolución de un problema en el menor tiempo posible. En cambio, la productividad es cuánto trabajo se puede realizar por unidad de tiempo.
En el entorno de computación de alto rendimiento, el rendimiento es la métrica principal que se quiere conseguir optimizar, es decir, la resolución de un problema se complete en el menor tiempo posible.
Tradicionalmente, la computación en serie se ha empleado para el desarrollos de las aplicaciones software y consiste en la ejecución o división del trabajo una tras otra. En cambio, a mediado de la década de 2000, se democratizó los ordenadores paralelos motivando el uso de la computación en paralelo.
La computación en paralelo aplica el concepto de paralelismo que consiste en la realización de múltiples cosas al mismo tiempo. En concreto, se puede definir como la utilización de varios recursos de computación para la resolución de un problema. Este paradigma de computación permite:
La división de un problema en partes discretas para su ejecución simultáneamente, es decir, en múltiples recursos de computación como los procesadores.
En la computación en paralelo se emplean varios/as modelos/paradigmas de programación, conocido también como programación paralela, de las cuales se resaltan:
Memoria compartida, OpenMP
Hilos, (OpenMP o POSIX threads en linux)
Pasos de mensajes, MPI
Estos paradigmas de programación son abstracciones sobre de arquitecturas del ordenador, y se pueden emplear en cualquier de las mismas.
Paradigmas de programación
OpenMP
Un modelo de programación portable y escalable que proporciona a los programadores una interfaz simple y flexible para el desarrollo de aplicaciones paralelas. En otras palabras, es una interfaz de programación de aplicaciones (API) para la programación paralela de memoria compartida.
Página web oficial
Introducción a openMP
Resumen de las directivas:
MPI
MPI (Message Passing Interface) es un estándar que define la sintaxis y la semántica de las funciones contenidas en una biblioteca de paso de mensajes
Introducción de MPI (inglés)
Resumen del lenguaje
GPGPU
La computación de propósito general en la unidad de procesamiento gráfica (GPU) consiste en aprovechar las capacidades de cómputo de las GPUs. La GPU es una aceleradora de computación para la álgebra lineal, como el aprendizaje profundo. Principalmente, los grandes fabricantes de GPUs son Nvidia y AMD.
Introducción GPU * https://www.youtube.com/watch?v=9zfojkQXNoQ
Varios modelos de programación que son empleados
Nvidia CUDA (lenguaje de programación para las tarjetas gráficas de Nvidia)
Parallel computing on GPUs with CUDA (curso en inglés)
OpenACC (programación se realiza con directivas (pragmas) y biblioteca e independiente del fabricante de la tarjeta gráfica)
AMD HIP, lenguaje de programación para las tarjetas gráficas de AMD. Este lenguaje también puede ser empleado con las tarjetas gráficas de Nvidia.
Compiladores
La creación de una aplicación software desde el código fuente se consigue a través de los compiladores. Este proceso es conocido como compilación. Los compiladores principales son:
GNU GCC: es un conjunto de compiladores y librerías de los lenguajes C, C++, Objective-C, Fortran, Ada, Go, and D.
Página oficial
Intel oneAPI: conjunto de herramientas y librerías para el desarrollo de aplicaciones a través de diferentes arquitectura de computadores.
Página oficial
Nvidia HPC SDK: conjunto de software, librerías y compiladores para los lenguajes C, C++, Fortran, directivas OpenACC y CUDA
Página oficial
En la siguinte tabla se muestra la relación de los compiladores y los lenguajes:
Lenguaje |
GNU GCC |
Intel oneAPI |
Nvidia HPC SDK |
---|---|---|---|
C |
gcc |
Actual: icx; Clásico: icc |
nvc |
C++ |
g++ |
Actual: icpx; Clásico: icpc |
nvc++ |
Fortan |
gfortran |
Actual: ifx; Clásico: ifort |
nvfortran |
Aceleradores |
– |
dpc++ (C++ basado en SYCL) |
nvcc (CUDA) |
Buenas prácticas
Control de versiones
El control de versiones se define como la gestión de la historia de cambio de un proyecto. Una versión, revisión o edición de un proyecto, es el estado en el que se encuentra el mismo en un momento dado de su desarrollo o modificación. Esta gestión permite el trabajo en equipo en el mismo proyecto sincronizado las contribuciones de cada miembro del equipo.
Generalmente, el control de versiones se realiza a través de un sistema de control de versiones (en inglés Version Control System, VCS). De estos sistemas hay una gran abánico y nosotros resaltaremos el git:
Página oficial de git
Videos de git (en inglés):
Principiante: http://iactalks.iac.es/talks/view/1426
Advanzado: http://iactalks.iac.es/talks/view/1438
Para mayor información de buenas prácticas puedes leer la página web (best practices del EuroCC danés).