El acceso a memoria no uniforme ( NUMA ) es un diseño de memoria de computadora utilizado en multiprocesamiento , donde el tiempo de acceso a la memoria depende de la ubicación de la memoria en relación con el procesador. Según NUMA, un procesador puede acceder a su propia memoria local más rápido que la memoria no local (memoria local de otro procesador o memoria compartida entre procesadores). [1] NUMA es beneficioso para cargas de trabajo con alta localidad de memoria de referencia y baja contención de bloqueo , porque un procesador puede operar en un subconjunto de memoria en su mayor parte o en su totalidad dentro de su propio nodo de caché, lo que reduce el tráfico en el bus de memoria. [2]
Las arquitecturas NUMA siguen lógicamente en escalamiento a las arquitecturas de multiprocesamiento simétrico (SMP). Fueron desarrollados comercialmente durante la década de 1990 por Unisys , Convex Computer (más tarde Hewlett-Packard ), Honeywell Information Systems Italy (HISI) (más tarde Groupe Bull ), Silicon Graphics (más tarde Silicon Graphics International ), Sequent Computer Systems (más tarde IBM ), Data General (más tarde EMC , ahora Dell Technologies ), Digital (más tarde Compaq , luego HP , ahora HPE ) e ICL . Las técnicas desarrolladas por estas empresas aparecieron posteriormente en una variedad de sistemas operativos similares a Unix y, hasta cierto punto, en Windows NT .
La primera implementación comercial de un sistema Unix basado en NUMA fue [ ¿dónde? ] [ ¿ cuando? ] la familia de servidores Symmetrical Multi Processing XPS-100, diseñada por Dan Gielan de VAST Corporation para Honeywell Information Systems Italia.
Las CPU modernas funcionan considerablemente más rápido que la memoria principal que utilizan. En los primeros días de la informática y el procesamiento de datos, la CPU generalmente funcionaba más lenta que su propia memoria. Las líneas de rendimiento de los procesadores y la memoria se cruzaron en la década de 1960 con la llegada de las primeras supercomputadoras . Desde entonces, las CPU se han visto cada vez más "hambrientas de datos" y teniendo que detenerse mientras esperan que lleguen datos de la memoria (por ejemplo, para computadoras basadas en la arquitectura Von-Neumann, consulte Cuello de botella de Von Neumann ). Muchos diseños de supercomputadoras de las décadas de 1980 y 1990 se centraron en proporcionar acceso a memoria de alta velocidad en lugar de procesadores más rápidos, lo que permitía a las computadoras trabajar con grandes conjuntos de datos a velocidades que otros sistemas no podían alcanzar.
Limitar el número de accesos a la memoria proporcionó la clave para extraer un alto rendimiento de una computadora moderna. Para los procesadores básicos, esto significó instalar una cantidad cada vez mayor de memoria caché de alta velocidad y utilizar algoritmos cada vez más sofisticados para evitar errores de caché . Pero el dramático aumento en el tamaño de los sistemas operativos y de las aplicaciones que se ejecutan en ellos generalmente ha superado estas mejoras en el procesamiento de caché. Los sistemas multiprocesador sin NUMA empeoran considerablemente el problema. Ahora un sistema puede dejar sin capacidad a varios procesadores al mismo tiempo, especialmente porque sólo un procesador puede acceder a la memoria de la computadora a la vez. [3]
NUMA intenta solucionar este problema proporcionando memoria separada para cada procesador, evitando el impacto en el rendimiento cuando varios procesadores intentan direccionar la misma memoria. Para problemas relacionados con datos distribuidos (comunes en servidores y aplicaciones similares), NUMA puede mejorar el rendimiento de una única memoria compartida en un factor aproximado del número de procesadores (o bancos de memoria separados). [4] Otro enfoque para abordar este problema es la arquitectura de memoria multicanal , en la que un aumento lineal en el número de canales de memoria aumenta linealmente la concurrencia de acceso a la memoria. [5]
Por supuesto, no todos los datos terminan confinados en una sola tarea, lo que significa que más de un procesador puede requerir los mismos datos. Para manejar estos casos, los sistemas NUMA incluyen hardware o software adicional para mover datos entre bancos de memoria. Esta operación ralentiza los procesadores conectados a esos bancos, por lo que el aumento general de la velocidad debido a NUMA depende en gran medida de la naturaleza de las tareas en ejecución. [4]
AMD implementó NUMA con su procesador Opteron (2003), utilizando HyperTransport . Intel anunció la compatibilidad NUMA para sus servidores x86 e Itanium a finales de 2007 con sus CPU Nehalem y Tukwila . [6] Ambas familias de CPU Intel comparten un chipset común ; la interconexión se llama Intel QuickPath Interconnect (QPI), que proporciona un ancho de banda extremadamente alto para permitir una alta escalabilidad integrada y fue reemplazada por una nueva versión llamada Intel UltraPath Interconnect con el lanzamiento de Skylake (2017). [7]
Casi todas las arquitecturas de CPU utilizan una pequeña cantidad de memoria no compartida muy rápida conocida como caché para explotar la localidad de referencia en los accesos a la memoria. Con NUMA, mantener la coherencia de la caché en la memoria compartida tiene una sobrecarga significativa. Aunque son más sencillos de diseñar y construir, los sistemas NUMA no coherentes con la caché se vuelven prohibitivamente complejos de programar en el modelo de programación de arquitectura estándar de von Neumann . [8]
Normalmente, ccNUMA utiliza comunicación entre procesadores entre controladores de caché para mantener una imagen de memoria consistente cuando más de un caché almacena la misma ubicación de memoria. Por este motivo, ccNUMA puede funcionar mal cuando varios procesadores intentan acceder a la misma área de memoria en rápida sucesión. El soporte para NUMA en los sistemas operativos intenta reducir la frecuencia de este tipo de acceso asignando procesadores y memoria de manera compatible con NUMA y evitando algoritmos de programación y bloqueo que hacen necesarios los accesos no compatibles con NUMA. [9]
Alternativamente, los protocolos de coherencia de la caché, como el protocolo MESIF, intentan reducir la comunicación necesaria para mantener la coherencia de la caché. Scalable Coherent Interface (SCI) es un estándar IEEE que define un protocolo de coherencia de caché basado en directorios para evitar las limitaciones de escalabilidad encontradas en sistemas multiprocesador anteriores. Por ejemplo, SCI se utiliza como base para la tecnología NumaConnect. [10] [11]
Se puede ver a NUMA como una forma estrechamente acoplada de computación en clúster . La adición de paginación de memoria virtual a una arquitectura de clúster puede permitir la implementación de NUMA completamente en software. Sin embargo, la latencia entre nodos de la NUMA basada en software sigue siendo varios órdenes de magnitud mayor (más lenta) que la de la NUMA basada en hardware. [2]
Dado que NUMA influye en gran medida en el rendimiento del acceso a la memoria, se necesitan ciertas optimizaciones de software para permitir la programación de subprocesos y procesos cerca de sus datos en memoria.
A partir de 2011, los sistemas ccNUMA son sistemas multiprocesador basados en el procesador AMD Opteron , que se puede implementar sin lógica externa, y el procesador Intel Itanium , que requiere que el chipset sea compatible con NUMA. Ejemplos de conjuntos de chips habilitados para ccNUMA son el SGI Shub (Super hub), el Intel E8870, el HP sx2000 (utilizado en los servidores Integrity y Superdome) y los que se encuentran en los sistemas basados en NEC Itanium. Los sistemas ccNUMA anteriores, como los de Silicon Graphics, se basaban en procesadores MIPS y el procesador DEC Alpha 21364 (EV7).