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.

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.

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.

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.

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:

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.

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

  • 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.

Varios modelos de programación que son empleados

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:

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:

Para mayor información de buenas prácticas puedes leer la página web (best practices del EuroCC danés).