Открыть сервис

Неоднородный доступ к памяти

Неоднородный доступ к памяти (англ. Non-Uniform Memory Access, NUMA) — это архитектура организации компьютерной памяти, используемая в многопроцессорных системах, при которой время доступа к различным областям оперативной памяти зависит от того, к какому процессору (или группе процессоров) она физически привязана. В отличие от симметричной многопроцессорной архитектуры (SMP) с однородным доступом (UMA), где все процессоры имеют равное время доступа ко всей памяти, в NUMA-системах память разделена на локальные и удалённые зоны, что позволяет масштабировать вычислительные системы до сотен и тысяч ядер без критического роста задержек.

История

Идея неоднородного доступа к памяти возникла в 1980-х годах как ответ на ограничения SMP-архитектур. В SMP-системах все процессоры подключаются к общей шине памяти, что при увеличении числа процессоров приводит к перегрузке шины и росту задержек. Первые коммерческие NUMA-системы появились в начале 1990-х годов: например, машины семейства BBN Butterfly (Bolt Beranek and Newman) и системы Sequent NUMA-Q. В 1995 году компания Silicon Graphics (SGI) выпустила систему SGI Origin 2000, которая стала одной из первых широко распространённых NUMA-архитектур для рабочих станций и серверов.

В 2000-х годах NUMA стала стандартом для серверов на базе процессоров Intel Itanium 2 и AMD Opteron. В 2007 году Intel внедрила NUMA-архитектуру в процессоры Xeon серии 7300, а с 2010-х годов NUMA является неотъемлемой частью всех многопроцессорных систем x86-64, включая серверы на базе AMD EPYC и Intel Xeon Scalable. В современных суперкомпьютерах и системах с процессорами ARM (например, Fujitsu A64FX) NUMA также применяется для управления памятью.

Принцип работы

В NUMA-системе вся оперативная память физически делится на несколько узлов (NUMA-узлов), каждый из которых привязан к одному или нескольким процессорам (или ядрам) через контроллер памяти. Каждый процессор имеет прямой доступ к своему локальному узлу памяти с минимальной задержкой (обычно 50–100 нс). Доступ к памяти другого узла (удалённой) осуществляется через межсоединения (например, Intel UPI, AMD Infinity Fabric, IBM PowerBus) и занимает в 1,5–3 раза больше времени.

Ключевые понятия

  • NUMA-узелгруппа процессоров (ядер) и связанная с ними локальная память.
  • Локальная память — память, физически подключённая к контроллеру памяти данного узла.
  • Удалённая память — память, принадлежащая другому узлу.
  • Межсоединение — канал передачи данных между узлами (например, шина, кольцо, сетка).
  • Политика размещения — стратегия, определяющая, на каком узле выделяется память для процесса (например, first-touch, round-robin, interleaving).

Типы NUMA

  1. Аппаратная NUMA (ccNUMA) — когерентная NUMA, где аппаратно обеспечивается согласованность кэшей всех процессоров. Примеры: процессоры AMD EPYC, Intel Xeon.
  2. Программная NUMA — эмуляция неоднородного доступа через операционную систему, часто используется в виртуализации.
  3. Гибридная NUMA — комбинация аппаратной и программной поддержки, применяемая в суперкомпьютерах (например, Cray XC).

Архитектура и устройство

Современные NUMA-системы строятся на основе многоядерных процессоров, каждый из которых содержит встроенный контроллер памяти (IMC). Например, в процессоре AMD EPYC 7763 (64 ядра) имеется 8 контроллеров памяти, каждый из которых обслуживает до 2 каналов DDR4. Таким образом, процессор сам является NUMA-узлом, а его ядра делятся на группы (CCD — Core Complex Die), каждая из которых имеет доступ к своему сегменту памяти.

В многопроцессорных серверах (например, с 4 или 8 процессорами) каждый процессор образует отдельный NUMA-узел. Межсоединения между процессорами (например, Infinity Fabric у AMD или UPI у Intel) образуют топологию: кольцо, сетка 2D-тор, гиперкуб. В системах с большим числом узлов (например, суперкомпьютер Fugaku с 7 630 848 ядрами) используется иерархическая NUMA (hNUMA), где узлы объединены в кластеры.

Пример топологии

Рассмотрим 4-процессорный сервер Intel Xeon Platinum 8380 (40 ядер на процессор). Каждый процессор имеет 8 каналов памяти DDR4-3200. Процессоры соединены через UPI в кольцо. В такой системе:

  • Доступ к локальной памяти (своего процессора) — ~80 нс.
  • Доступ к памяти соседнего процессора (через одно UPI-соединение) — ~120 нс.
  • Доступ к памяти через два UPI-соединения — ~160 нс.

Применение

NUMA-архитектура широко используется в следующих областях:

  • Серверы баз данных — системы управления базами данных (например, Oracle, PostgreSQL) оптимизируют размещение данных в локальной памяти для ускорения запросов.
  • Высокопроизводительные вычисления (HPC) — суперкомпьютеры, такие как Summit (США) и «Ломоносов-2» (Россия), используют NUMA для распределения памяти между узлами.
  • Виртуализация — гипервизоры (VMware ESXi, KVM) привязывают виртуальные машины к конкретным NUMA-узлам для минимизации задержек.
  • Облачные вычисления — платформы (AWS, Яндекс.Облако) используют NUMA-аффинность для повышения производительности инстансов.
  • Научные расчёты — моделирование климата, молекулярная динамика, обработка больших данных.

Классификация по степени неоднородности

  1. SMP (UMA) — однородный доступ, все процессоры имеют равное время доступа ко всей памяти. Используется в настольных ПК и небольших серверах (до 8 ядер).
  2. NUMA — неоднородный доступ, время доступа зависит от узла. Характерен для серверов с 2–8 процессорами.
  3. hNUMA — иерархическая NUMA, где узлы объединены в несколько уровней (например, в суперкомпьютерах с тысячами узлов).
  4. NUMA с кэш-когерентностью (ccNUMA) — аппаратно обеспечивается согласованность кэшей, что упрощает программирование.
  5. NUMA без кэш-когерентности (ncNUMA) — каждый процессор работает с собственной памятью, обмен данными требует явной синхронизации (используется в некоторых встраиваемых системах).

Особенности программирования для NUMA

Разработка приложений для NUMA-систем требует учёта локальности памяти. Основные подходы:

  • First-touch allocation — память выделяется на том узле, где процессор впервые обращается к ней. Это стандартная политика в Linux.
  • Явное связывание — использование системных вызовов (например, mbind() в Linux) для привязки памяти к конкретному узлу.
  • Потоковая аффинность — привязка потоков к ядрам одного узла, чтобы избежать удалённых обращений.
  • Интерливинг — равномерное распределение памяти по всем узлам, что снижает локальность, но увеличивает пропускную способность.

В языках программирования (C, C++, Fortran) для NUMA-оптимизации используются библиотеки, такие как numactl (Linux), libnuma (Linux), OpenMP с директивами OMP_PLACES и OMP_PROC_BIND.

Преимущества и недостатки

Преимущества

  • Масштабируемость — возможность построения систем с сотнями и тысячами ядер без перегрузки шины.
  • Снижение задержек — локальный доступ к памяти быстрее, чем в SMP-системах с общей шиной.
  • Энергоэффективность — меньшее энергопотребление за счёт локализации трафика.
  • Гибкость — возможность комбинировать процессоры с разной производительностью.

Недостатки

  • Сложность программирования — требуется учёт топологии и аффинности.
  • Неравномерность производительности — при неправильном размещении данных производительность может падать на 30–50 %.
  • Затраты на межсоединения — дополнительные аппаратные ресурсы для связи между узлами.
  • Проблемы с кэш-когерентностью — в ccNUMA требуется протокол когерентности, что увеличивает сложность и задержки.

Примеры NUMA-систем

  • Серверы на базе AMD EPYC — процессоры с 8–12 контроллерами памяти, образующими до 12 NUMA-узлов на один процессор.
  • Серверы Intel Xeon Scalable — 2–8 процессоров, каждый с 6–8 каналами памяти, соединённых через UPI.
  • Суперкомпьютер «Ломоносов-2» (МГУ, Россия) — использует гибридную архитектуру с NUMA-узлами на базе процессоров Intel Xeon E5-2697v3.
  • Fujitsu A64FX — процессор для суперкомпьютера Fugaku, имеет 4 NUMA-узла (CMG) с 8 ядрами и 8 ГБ памяти каждый.
  • IBM Power10 — серверы с поддержкой до 16 процессоров и иерархической NUMA.

Интересные факты

  • В NUMA-системах с большим числом узлов (например, 256) задержка доступа к удалённой памяти может превышать 1 микросекунду, что в 10–20 раз больше локальной задержки.
  • В операционной системе Linux поддержка NUMA была добавлена в ядро версии 2.5 (2002 год), а в Windows — начиная с Windows Server 2008.
  • Некоторые процессоры (например, Intel Xeon Phi) используют гибридную NUMA-архитектуру, где часть памяти является локальной, а часть — удалённой через PCI Express.
  • В суперкомпьютере Fugaku (Япония) используется технология Tofu Interconnect D, которая обеспечивает 6D-тор для соединения NUMA-узлов.

Источники

  • Hennessy, J. L., Patterson, D. A. «Computer Architecture: A Quantitative Approach», 6th Edition, 2019.
  • Intel Corporation. «Intel Xeon Processor Scalable Family Technical Overview», 2021.
  • AMD. «AMD EPYC 7003 Series Processor Architecture», 2022.
  • Linux Kernel Documentation. «NUMA Memory Policy», 2023.
  • «High Performance Computing: Modern Systems and Practices», 2020.
Загружаем BFOmetr…