# ROCm

ROCm es una pila de software Advanced Micro Devices (AMD) para la programación de la unidad de procesamiento gráfico (GPU). ROCm abarca varios dominios: computación de uso general en unidades de procesamiento gráfico (GPGPU), computación de alto rendimiento (HPC), computación heterogénea. Ofrece varios modelos de programación: HIP (programación basada en GPUs), OpenMP/Interfaz de paso de mensajes (MPI) (programación basada en la directiva), OpenCL.
ROCm es un software gratuito, libre y de código abierto (excepto los blobs de firmware de GPU), se distribuye bajo varias licencias.

## Antecedentes

La primera pila de software GPGPU de ATI/AMD fue Close to Metal, que se convirtió en Stream.
ROCm se lanzó alrededor de 2016 con la Iniciativa Boltzmann. La pila ROCm se basa en pilas de GPU AMD anteriores, algunas herramientas se remontan a GPUOpen, otras a la arquitectura de sistema heterogéneo (HSA).

### Arquitectura del sistema heterogéneo

HSA tenía como objetivo producir una representación intermedia independiente del hardware de nivel medio, que podría compilarse JIT en el hardware final (GPU, FPGA...) utilizando el finalizador apropiado. Este enfoque se eliminó para ROCm: ahora crea solo código de GPU, utilizando LLVM y su backend AMDGPU que se actualizó, aunque todavía hay investigaciones sobre esa modularidad mejorada con LLVM MLIR.

### Microsoft AMP C++ 1.2

C++ AMP es una extensión del modelo de compilación y programación de C++ que permite la aceleración del código C++ en hardware de datos paralelos.

## Habilidades de programación

ROCm como una pila abarca desde el controlador del kernel hasta las aplicaciones del usuario final. AMD tiene videos introductorios sobre el hardware AMD GCN, y la programación ROCm a través de su portal de aprendizaje.
Una de las mejores introducciones técnicas sobre la pila y la programación ROCm/HIP se encuentra, hasta la fecha, en Reddit.

## Soporte de hardware

ROCm está dirigido principalmente a GPU profesionales discretas, pero el soporte no oficial incluye GPU de consumo de la familia Vega y RDNA2.
Las Unidades de Procesador Acelerado (APU) están "habilitadas", pero no son admitidas oficialmente. Tener ROCm funcional allí está involucrado.

### GPU de nivel profesional

Los aceleradores AMD Instinct son los ciudadanos ROCm de primera clase, junto con la serie de GPU Radeon Pro para prosumidores: en su mayoría reciben soporte completo.
La única GPU de nivel de consumidor que tiene un soporte relativamente igual es, a partir de enero de 2022, la Radeon VII (GCN 5 - Vega).

### GPU de nivel de consumidor

| Nombre de la serie deGPU | Southern Islands | Sea Islands | Volcanic Islands | Arctic Islands/Polaris | Vega | Navi 1X | Navi 2X |
| Lanzamiento | Enero 2012 | Sep 2013 | Junio 2015 | Junio 2016 | Junio 2017 | Julio 2019 | Nov 2020 |
| Nombre comercial | Radeon HD 7000 | Radeon Rx 200 | Radeon Rx 300 | Radeon RX 400/500 | Radeon RX Vega/Radeon VII(7 nm) | Radeon RX 5000 | Radeon RX 6000 |
| Soporte AMD | | | | | | | |
| Conjunto de instrucciones | Conjunto de instrucciones de GCN | Conjunto de instrucciones de GCN | Conjunto de instrucciones de GCN | Conjunto de instrucciones de GCN | Conjunto de instrucciones de GCN | Conjunto de instrucciones de RDNA | Conjunto de instrucciones de RDNA |
| Microarquitectura | GCN 1.a gen | GCN 2.a gen | GCN 3.a gen | GCN 4.a gen | GCN 5.a gen | RDNA | RDNA 2 |
| Tipo | Modelo de sombreado unificado | Modelo de sombreado unificado | Modelo de sombreado unificado | Modelo de sombreado unificado | Modelo de sombreado unificado | Modelo de sombreado unificado | Modelo de sombreado unificado |
| ROCm | | | | | | | |
| OpenCL | 1.2 (en Linux: 1.1 (sin soporte de imagen) con Mesa 3D) | 2.0 (Controlador Adrenalin en Win7+) (en Linux: 1.1 (sin soporte de imagen) con Mesa 3D, 2.0 con controlador de AMD o AMD ROCm) | 2.0 (Controlador Adrenalin en Win7+) (en Linux: 1.1 (sin soporte de imagen) con Mesa 3D, 2.0 con controlador de AMD o AMD ROCm) | 2.0 (Controlador Adrenalin en Win7+) (en Linux: 1.1 (sin soporte de imagen) con Mesa 3D, 2.0 con controlador de AMD o AMD ROCm) | 2.0 (Controlador Adrenalin en Win7+) (en Linux: 1.1 (sin soporte de imagen) con Mesa 3D, 2.0 con controlador de AMD o AMD ROCm) | 2.0 | 2.1 |
| Vulkan | 1.0 (Win 7+ or Mesa 17+) | 1.2 (Adrenalin 20.1, Linux Mesa 3D 20.0) | 1.2 (Adrenalin 20.1, Linux Mesa 3D 20.0) | 1.2 (Adrenalin 20.1, Linux Mesa 3D 20.0) | 1.2 (Adrenalin 20.1, Linux Mesa 3D 20.0) | 1.2 (Adrenalin 20.1, Linux Mesa 3D 20.0) | 1.2 (Adrenalin 20.1, Linux Mesa 3D 20.0) |
| Modelo de sombreado | 5.1 | 5.1 6.3 | 5.1 6.3 | 5.1 6.3 | 6.4 | 6.4 | 6.5 |
| OpenGL | 4.6 (en Linux: 4.6 (Mesa 3D 20.0)) | 4.6 (en Linux: 4.6 (Mesa 3D 20.0)) | 4.6 (en Linux: 4.6 (Mesa 3D 20.0)) | 4.6 (en Linux: 4.6 (Mesa 3D 20.0)) | 4.6 (en Linux: 4.6 (Mesa 3D 20.0)) | 4.6 (en Linux: 4.6 (Mesa 3D 20.0)) | 4.6 (en Linux: 4.6 (Mesa 3D 20.0)) |
| Direct3D | 11 (11_1) 12 (11_1) | 11 (12_0) 12 (12_0) | 11 (12_0) 12 (12_0) | 11 (12_0) 12 (12_0) | 11 (12_1) 12 (12_1) | 11 (12_1) 12 (12_1) | 11 (12_1) 12 (12_2) |
| /drm/amdgpu | Experimental | Experimental | | | | | |

## Ecosistema de software
### Recursos de aprendizaje

El gerente de producto de AMD ROCm hizo un recorrido por la pila.

### Integración de terceros

Los principales consumidores de la pila son aplicaciones de aprendizaje automático y computación de alto rendimiento/GPGPU.

#### Aprendizaje automático

Varios marcos de aprendizaje profundo tienen un backend ROCm:
* PyTorch
* TensorFlow
* ONNX
* MXNet
* CuPy
* MIAbierto
* Caffe
* Iree (que utiliza la representación intermedia multinivel LLVM (MLIR))

#### Supercomputación

ROCm está ganando una tracción significativa en el top 500. ROCm se utiliza con las supercomputadoras exascala ElCapitan y Frontier.
Parte del software relacionado se encuentra en el hub AMD Infinity.

#### Otra aceleración e interoperación de gráficos

A partir de la versión 3.0, Blender ahora puede usar núcleos de cómputo HIP para sus ciclos de renderizado.

#### Otros idiomas
##### Julia

Julia tiene el paquete AMDGPU.jl, que se integra con LLVM y selecciona componentes de la pila ROCm. En lugar de compilar código a través de HIP, AMDGPU.jl usa el compilador de Julia para generar LLVM IR directamente, que luego LLVM consume para generar código de dispositivo nativo. AMDGPU.jl usa la implementación HSA de ROCr para cargar código nativo en el dispositivo y ejecutarlo, de forma similar a como HIP carga su propio código de dispositivo generado.
AMDGPU.jl también admite la integración con rocBLAS (para BLAS), rocRAND (para generación de números aleatorios) y rocFFT (para FFT) de ROCm. Está prevista una futura integración con rocALUTION, rocSOLVER, MIOpen y algunas otras bibliotecas de ROCm.

### Distribución de software
#### Oficial

El software ROCm actualmente se distribuye en docenas de repositorios públicos de GitHub. Dentro del meta-repositorio público principal, hay un manifiesto xml para cada lanzamiento oficial: usar git-repo, una herramienta de control de versiones construida sobre git, es la forma recomendada de sincronizar con la pila localmente.
El lanzamiento de ROCm 5.1 es inminente, probablemente a mediados de febrero dado un lanzamiento menor cada mes.
| Área de aplicación | Publicación en GitHub |
| Nivel bajo (principalmente) | https://github.com/radeonopencompute |
| Nivel medio (principalmente) | https://github.com/rocm-developer-tools |
| Nivel Alto (principalmente) | https://github.com/rocmsoftwareplatform/ |
AMD comienza a distribuir aplicaciones en contenedores para ROCm, en particular aplicaciones de investigación científica reunidas en AMD Infinity Hub.
AMD distribuye paquetes adaptados a varias distribuciones de Linux.

#### Terceros

Existe un ROCm de empaquetado de ecosistemas de terceros en crecimiento.
Las distribuciones de Linux están empaquetando oficialmente (de forma nativa) ROCm, con varios grados de avance: Arch, Gentoo, Debian y Fedora, GNU Guix, NixOS.
Hay paquetes de spack.

## Componentes

Hay un componente de espacio de kernel, ROCk, y el resto (hay aproximadamente cien componentes en la pila) está hecho de módulos de espacio de usuario.
La política tipográfica no oficial es usar: mayúsculas ROC seguido de minúsculas para bibliotecas de bajo nivel, es decir ROCt, y lo contrario para las bibliotecas orientadas al usuario, es decir, rocBLAS.
AMD está desarrollando activamente con la comunidad LLVM, pero la actualización no es instantánea y, a partir de enero de 2022, todavía está rezagada. AMD todavía empaqueta oficialmente varias bifurcaciones LLVM para partes que aún no están actualizadas – optimizaciones del compilador destinadas a permanecer patentadas, soporte de depuración, descarga de OpenMP...

### Nivel bajo
#### ROCm – Bibliotecas de dispositivos

Compatibilidad con bibliotecas implementadas como código de bits LLVM. Estos proporcionan varias utilidades y funciones para operaciones matemáticas, atómicas, consultas de parámetros de lanzamiento, lanzamiento del kernel en el dispositivo, etc.

#### ROCt – Thunk

El thunk es responsable de todo el pensamiento y las colas que van a la pila.

#### ROCr – Tiempo de ejecución

El tiempo de ejecución de ROC es diferente del tiempo de ejecución de lenguaje común de ROC en que no es lo mismo.

#### ROCm – Soporte del compilador

El administrador de objetos de código ROCm se encarga de interactuar con la representación intermedia de LLVM.

### Nivel medio
#### Tiempo de ejecución de lenguaje común de ROCclr

Common Language Runtime es una capa de indirección que adapta las llamadas a ROCr en Linux y PAL en Windows. Solía poder enrutar entre diferentes compiladores como el compilador HSAIL. Ahora está siendo absorbido por las capas superiores de direccionamiento indirecto (HIP, OpenCL).

#### OpenCL

ROCm envía su cargador ICD de controlador de cliente instalable y una implementación de OpenCL agrupada. A partir de enero de 2022, ROCm 4.5.2 incluye OpenCL 2.2 y está rezagado con respecto a la competencia.

#### HIP – Interfaz heterogénea para portabilidad

La implementación de AMD para sus GPU se llama HIPAMD. También hay una implementación de CPU principalmente para fines de demostración.

#### HICC

HIP construye un compilador `HIPCC` que envuelve a Clang y compila con LLVM open AMDGPU backend, o redirige al compilador NVIDIA.

#### HIPIFICAR

HIPIFY es una herramienta de compilación de fuente a fuente, traduce CUDA a HIP y viceversa, ya sea utilizando una herramienta basada en clang o un script Perl similar a sed.

#### GPUFORT

Al igual que HIPIFY, GPUFORT es una herramienta que compila el código fuente en otras fuentes de lenguaje de tercera generación, lo que permite a los usuarios migrar de CUDA Fortran a HIP Fortran. También está en el repertorio de proyectos de investigación, más aún.

### Nivel alto

Las bibliotecas de alto nivel de ROCm suelen ser consumidas directamente por el software de aplicación, como los marcos de aprendizaje automático. La mayoría de las siguientes bibliotecas se encuentran en la categoría General Matrix Multiply (GEMM), en la que sobresale la arquitectura GPU.
La mayoría de estas bibliotecas orientadas al usuario vienen en forma dual: hip para la capa de direccionamiento indirecto que puede enrutar al hardware de Nvidia y roc para la implementación de AMD.

#### rocBLAS / hipBLAS

rocBLAS y hipBLAS son fundamentales en las bibliotecas de alto nivel, es la implementación de AMD para los subprogramas de álgebra lineal básica. Utiliza la biblioteca Tensile en privado.

#### rocSOLVER / hipSOLVER

Este par de bibliotecas constituye la implementación de LAPACK para ROCm y está fuertemente acoplado a rocBLAS.

### Utilidades

* Herramientas de desarrollo de ROCm: depuración, trazador, generador de perfiles, interfaz de administración del sistema, suite de validación, administración de clústeres.
* Herramientas GPUOpen: analizador de GPU, visualizador de memoria.
* Herramientas externas: radeontop (descripción general de TUI).

## Comparación con los competidores

ROCm es un competidor de pilas similares destinadas a la computación GPU: Nvidia CUDA e Intel OneAPI.

### NVIDIA CUDA

Nvidia es de código cercano hasta cuBLAS y bibliotecas de alto nivel. Nvidia vende la interfaz de Clang y su backend de GPU LLVM de ejecución de subprocesos paralelos (PTX) como Nvidia CUDA Compiler (NVCC). Hay una capa de código abierto encima, por ejemplo, RAPIDS.