El crecimiento exponencial de los modelos de Machine Learning ha impulsado una demanda insaciable de capacidad de memoria, superando las capacidades de los sistemas tradicionales. La expansión de memoria a través de interfaces como CXL (Compute Express Link) emerge como una solución viable para escalar la capacidad, pero introduce desafíos inherentes de latencia y ancho de banda al acceder a la memoria remota. Este problema fundamental de la computación distribuida, donde la distancia física entre CPU y memoria impacta el rendimiento, se agrava con cargas de trabajo intensivas en datos.

El MX1 aborda esta tesis al integrar computación directamente en el dispositivo de expansión de memoria. Al colocar miles de núcleos RISC-V junto a la DRAM expandida y el almacenamiento SSD, el MX1 busca explotar el ancho de banda interno del dispositivo, que es significativamente mayor que el disponible a través del enlace CXL al host. Esto permite procesar grandes volúmenes de datos in situ, reduciendo la necesidad de transferencias costosas a través del bus del sistema y mitigando los cuellos de botella de latencia y ancho de banda que son comunes en arquitecturas de memoria expandida.

Históricamente, la computación near-memory ha sido un área de investigación activa, desde los procesadores vectoriales hasta las arquitecturas de memoria en pila (HBM) con lógica integrada. El MX1 representa una evolución de este concepto, aplicando los principios de procesamiento paralelo masivo y eficiencia energética a un dispositivo de expansión de memoria CXL, adaptándose a las necesidades de las cargas de trabajo modernas de ML y procesamiento de datos.

Arquitectura del Sistema

El MX1 es un dispositivo CXL 3.2 Tipo 3 (CXL.mem) que se conecta al host a través de una interfaz PCIe 6/CXL 3.2 x8, proporcionando 128 GB/s de ancho de banda. Puede alojar hasta 2 TB de memoria DDR5 y expone ocho carriles PCIe 6 adicionales para conectar SSDs. Estos SSDs pueden ser presentados al host como memoria, con la DRAM del MX1 actuando como una caché para mitigar la alta latencia de los SSDs. La caché opera con páginas de 64 KB y utiliza un 'map cache' de 1024 entradas para rastrear las páginas DRAM mapeadas a direcciones respaldadas por SSD. Las fallas de caché son manejadas por firmware ejecutándose en los núcleos RISC-V del MX1, que se encarga de buscar datos del SSD y actualizar los mapeos. También soporta una región 'pinned prefix' para fijar datos críticos en DRAM.

El componente computacional del MX1 consiste en 3072 núcleos RISC-V de ejecución in-order a 1.1 GHz, organizados en clústeres de 32 núcleos que comparten cachés L2 y un TLB de datos. Cuatro clústeres forman un 'subsistema' (128 núcleos), la unidad mínima de asignación de trabajo. Un Network-on-Chip (NoC) propietario conecta los subsistemas a la caché L3 y a la memoria. Dos núcleos Arm Cortex A53 gestionan las funciones de control. La jerarquía de caché de datos incluye una caché L1 de 4 KB virtualmente direccionada por núcleo y una caché L2 VIPT de 128 KB compartida por clúster. Para instrucciones, cuatro núcleos RISC-V comparten una caché L1 de 8 KB, y una caché L2 de instrucciones de 128 KB a nivel de clúster. Las instrucciones operan directamente sobre direcciones físicas, eliminando la necesidad de traducción de direcciones y TLBs para el flujo de instrucciones.

El MX1 extiende RISC-V con un Vector Processing Engine (VPE) a nivel de subsistema, accesible a través de colas de comandos. Este VPE soporta operaciones vectoriales FP32 y FP16, ofreciendo aproximadamente 3 TFLOPS de rendimiento de producto punto en todo el chip. El modelo de programación es similar a OpenCL o CUDA, donde un kernel se invoca múltiples veces y cada invocación utiliza un índice para procesar datos específicos. La memoria virtual se comparte con el host, permitiendo que el código del host y del MX1 compartan punteros, con las tablas de páginas configuradas por el software de XCENA para mantener los mismos mapeos. El dispositivo utiliza las capacidades de snooping de CXL.mem para mantener la coherencia de caché con el host, permitiendo que los núcleos RISC-V del MX1 y los CPUs del host trabajen en los mismos buffers.

Flujo de Acceso a Memoria SSD Cacheada

  1. 1 Host Request El host solicita datos de una dirección de memoria respaldada por SSD.
  2. 2 MX1 Map Cache Lookup El MX1 busca la dirección en su 'map cache' (DRAM a SSD).
  3. 3 Cache Hit Si hay un acierto, los datos se leen de la DRAM del MX1 y se envían al host.
  4. 4 Cache Miss (Page Fault) Si hay un fallo, se genera un 'page fault' manejado por firmware RISC-V.
  5. 5 Firmware Fetch El firmware lee la página de datos correspondiente del SSD.
  6. 6 DRAM Cache Update Los datos se escriben en la DRAM del MX1 y se actualiza el 'map cache'.
  7. 7 Data to Host Los datos se envían desde la DRAM del MX1 al host.
CapaTecnologíaJustificación
compute RISC-V Cores (3072x) Ejecución de cargas de trabajo data-parallel, firmware para gestión de memoria y SSDs. vs Arm Cortex-M/R, MIPS microAptiv, Custom ASICs 3072 núcleos in-order a 1.1 GHz, organizados en subsistemas de 128 núcleos.
compute Vector Processing Engine (VPE) Aceleración de operaciones vectoriales FP32/FP16 para cargas de trabajo de ML. vs Integración de GPUs ligeras, Unidades SIMD más tradicionales ~3 TFLOPS de throughput de producto punto, accesible vía colas de comandos.
compute Arm Cortex A53 (2x) Funciones de control y gestión del dispositivo MX1. vs RISC-V de propósito general, MIPS M-class
storage DDR5 DRAM Memoria principal expandida para el host y caché para SSDs internos. vs HBM (High Bandwidth Memory), LPDDR5X Hasta 2 TB de capacidad, 128 GB/s de ancho de banda al host.
storage NVMe SSDs Almacenamiento de alta capacidad, presentado como memoria al host, con caching en DRAM. vs HDD (para capacidad masiva), Memoria no volátil (NVM) de próxima generación Conectividad vía 8 carriles PCIe 6 downstream, soporte RAID.
networking CXL 3.2 (PCIe 6 x8) Interfaz de alta velocidad para conectar el dispositivo MX1 al host, permitiendo expansión de memoria y coherencia de caché. vs PCIe puro, Gen-Z, OpenCAPI 128 GB/s de ancho de banda bidireccional.
networking Network-on-Chip (NoC) Interconexión interna de alta velocidad entre subsistemas RISC-V, caché L3 y memoria. vs Bus compartido, Crossbar switch Diseño in-house para optimizar el ancho de banda interno.

Trade-offs

Ganancias
  • ▲▲ Capacidad de memoria
  • Eficiencia energética (por FLOP/operación)
  • Ancho de banda interno a la memoria expandida
  • Mitigación de latencia de SSDs
Costes
  • Throughput de cómputo FP32 (comparado con GPUs de alta gama)
  • Rendimiento single-threaded de los núcleos RISC-V
  • Complejidad de programación (modelo similar a OpenCL/CUDA)

Fundamentos Teóricos

La arquitectura del MX1 se alinea con el concepto de 'Processing-in-Memory' (PIM) o 'Near-Memory Computing', un área de investigación que ha sido explorada desde las décadas de 1970 y 1980. Trabajos pioneros como los de 'Processing-in-Memory: A Parallel Architecture for Very Large Databases' por H. T. Kung y J. L. Smith (1982) ya planteaban la idea de mover la computación más cerca de los datos para superar el 'memory wall'. La integración de miles de núcleos simples y eficientes para cargas de trabajo data-parallel recuerda a los diseños de procesadores vectoriales y de muchos-núcleos (many-core) como el Intel Xeon Phi, que buscaban maximizar el throughput en lugar del rendimiento de un solo hilo, un principio bien establecido en la arquitectura de computadoras.

La jerarquía de caché y el manejo de la memoria virtual en el MX1, con cachés L1 virtualmente direccionadas y L2 VIPT, reflejan técnicas comunes en el diseño de CPUs modernas para optimizar el rendimiento y reducir la latencia de acceso a memoria. La elección de páginas de 64 KB para la memoria expandida y el almacenamiento SSD se relaciona con la optimización del uso del TLB y la alineación con los tamaños de bloque de SSD, un compromiso entre la granularidad de la memoria y la eficiencia de la traducción de direcciones, como se discute en la literatura sobre sistemas operativos y arquitectura de memoria. La extensibilidad de RISC-V para integrar un Vector Processing Engine (VPE) es un ejemplo de especialización de hardware, una tendencia que se remonta a los coprocesadores y aceleradores de propósito especial, y que es fundamental para el rendimiento en cargas de trabajo de Machine Learning, donde los algoritmos de álgebra lineal dominan.