Фундаментальный теоретический конспект лекции по дисциплине «Архитектура аппаратных средств» (СИЭУиП, тема 1.8, занятие 19). Архитектурные принципы многопрограммности, сильносвязанные многопроцессорные комплексы (SMP, NUMA), протоколы кэш-когерентности (MESI, MOESI), слабосвязанные многомашинные системы (кластеры Beowulf, передача сообщений MPI, интерконнекты InfiniBand и RoCE) и балансировка нагрузки.
Исторически первые вычислительные машины функционировали в режиме однопрограммной пакетной обработки: процессор исполнял одну задачу от начала до конца. Если программе требовалась операция ввода-вывода (считывание перфокарты, обращение к магнитной ленте или диску), быстродействующий процессор полностью простаивал миллионы машинных тактов.
Многопрограммность (мультипрограммирование) — это способ организации функционирования вычислительной системы, при котором в оперативной памяти одновременно содержатся несколько готовых к выполнению программ, а процессор динамически переключается между ними, обеспечивая максимальный коэффициент полезного использования аппаратных узлов.
Для реализации многопрограммности архитектура ЭВМ и операционная система разделяют вычислительную работу на две ключевые абстракции:
CR3), что влечет за собой аппаратную инвалидацию кэша трансляции адресов TLB (Translation Lookaside Buffer).Современные процессоры реализуют параллелизм на трех принципиально разных аппаратных уровнях:
В сильносвязанных вычислительных системах процессоры объединены общей оперативной памятью (Shared Memory) и функционируют под управлением единого экземпляра операционной системы.
В классической архитектуре SMP (Symmetric Multiprocessing) все процессоры абсолютно равноправны и подключены к единой оперативной памяти через общую системную шину или кроссбар-коммутатор (Crossbar).
Эта организация называется UMA (Uniform Memory Access — однородный доступ к памяти): время обращения к любому физическому адресу ОЗУ строго одинаково для любого ядра в системе.
В серверах с архитектурой NUMA физическая память разделена между процессорными сокетами (или чиплетами). Каждый сокет имеет собственный встроенный контроллер памяти и локальные каналы DDR4/DDR5 (образуя локальный NUMA-узел).
При этом логически память остается единым сквозным 64-битным адресным пространством: любое ядро может прочитать или записать байт в ОЗУ любого другого сокета без участия программных сообщений.
Связь между сокетами осуществляется по высокоскоростным когерентным шинам с пакетной передачей (Intel UPI — Ultra Path Interconnect или AMD Infinity Fabric).
Если ОС или СУБД случайным образом раскидывает потоки и память по сокетам, постоянные межсокетовые транзакции приводят к падению производительности до 30–50%. Для борьбы с этим применяют привязку потоков к сокетам (CPU Pinning / numactl) и локальное выделение страниц.
Поскольку каждое процессорное ядро оснащено собственными быстрыми локальными кэшами L1 и L2, в системе возникает фундаментальная проблема: если Ядро 1 изменило значение переменной X в своем кэше L1, а Ядро 2 считывает X из своего кэша, Ядро 2 прочитает устаревшее значение (Stale Data). Нарушается целостность памяти.
Кэш-когерентность (Cache Coherence) — это аппаратное свойство системы, гарантирующее, что все процессоры видят согласованную и единую последовательность изменений по каждому адресу памяти.
В системах с шинной организацией каждый кэш-контроллер непрерывно «подслушивает» (снупит) все транзакции адресов на системной шине. Когда процессор выполняет чтение или запись, кэш-контроллеры остальных ядер сравнивают адрес транзакции со своими тегами кэша и реагируют в соответствии с протоколом когерентности.
Классический протокол MESI (также известный как протокол Иллинойса) присваивает каждой 64-байтной строке кэша один из 4 статусов:
| Состояние | Название | Смысл состояния | Связь с оперативной памятью |
|---|---|---|---|
| M | Modified (Модифицированная) | Строка присутствует только в одном данном кэше; данные изменены ядром (Dirty). | Не совпадает с ОЗУ. При вытеснении обязательна обратная запись (Write-Back). |
| E | Exclusive (Эксклюзивная) | Строка присутствует только в данном кэше; значение не изменялось (Clean). | Полностью совпадает с ОЗУ. Процессор может записать данные, мгновенно перейдя в M. |
| S | Shared (Разделяемая) | Строка может присутствовать в кэшах нескольких ядер одновременно для чтения. | Полностью совпадает с ОЗУ. Запись запрещена без предварительной инвалидации других копий. |
| I | Invalid (Недействительная) | Строка не содержит актуальных данных (пустая или инвалидированная другим ядром). | Любое обращение вызывает аппаратный кэш-промах (Cache Miss). |
Размер единицы когерентности — строка кэша (Cache Line) — составляет 64 байта. Если два потока на разных ядрах изменяют две независимые переменные (например, counter_A и counter_B), расположенные в памяти рядом (в пределах одних 64 байт):
counter_A инвалидирует всю 64-байтную строку в кэше Ядра 2.counter_B инвалидирует строку в кэше Ядра 1.alignas(64) (C++) или вставка дополнительного заполнителя (padding).
В отличие от SMP, слабосвязанные системы (кластеры) состоят из автономных вычислительных узлов (компьютеров/серверов), каждый из которых работает под управлением собственной независимой операционной системы и имеет полностью изолированную оперативную память.
Историческая концепция Beowulf (1994 г., NASA) доказала, что суперкомпьютерную производительность можно получить объединением серийных общедоступных компьютеров (COTS — Commercial Off-The-Shelf) на базе Linux через стандартную локальную сеть.
Поскольку общей памяти нет, взаимодействие между процессами осуществляется по парадигме передачи сообщений (Message Passing). Общепринятым промышленным стандартом является библиотека MPI (Message Passing Interface):
MPI_Send / MPI_Recv — базовые операции точка-точка (Point-to-Point).MPI_Bcast — широковещательная рассылка массива данных от мастера всем узлам.MPI_Allreduce — глобальная параллельная редукция (суммирование, нахождение максимума) с распределением результата всем участникам.MPI_Barrier — глобальный барьер синхронизации: все процессы останавливаются, пока самый медленный узел не достигнет барьера.Главный барьер масштабирования кластеров — сетевая латентность (Network Latency). Если передача сообщения требует десятков микросекунд, процессоры простаивают на барьерах синхронизации.
| Интерконнект | Аппаратная задержка (Latency) | Нагрузка на центральный процессор | Область применения |
|---|---|---|---|
| Стандартный Ethernet (TCP/IP) | 15–50 микросекунд (мкс) | Высокая: прерывания ядра ОС, копирование буферов, софтварный стек. | Офисные сети, веб-сервисы, распределенная обработка Hadoop / Spark. |
| RoCE v2 (RDMA over Converged Ethernet) | 1.5–3.0 микросекунды (мкс) | Нулевая (Zero-Copy, Kernel-Bypass): сетевая карта передает данные напрямую из памяти. | Корпоративные облачные дата-центры, хранилища NVMe-oF, обучение нейросетей. |
| InfiniBand (HDR 200G / NDR 400G) | 0.6–1.0 микросекунды (мкс) | Аппаратная: управление потоком без потерь (Lossless), редукция в коммутаторах (SHARP). | Суперкомпьютеры рейтинга Top500, молекулярная физика, CFD, квантовая химия. |
Технология RDMA позволяет сетевому адаптеру одного узла напрямую считывать или записывать байты в оперативную память удаленного узла без задействования операционной системы и прерываний процессора хоста. Это устраняет контекстные переключения и снижает задержку в 10–50 раз по сравнению с классическим TCP/IP сокетом.
Увеличение числа вычислительных узлов не дает пропорционального ускорения программы из-за двух фундаментальных факторов: наличия последовательного кода и накладных расходов интерконнекта.
Рассматривает задачу фиксированного суммарного размера. Если доля строго последовательного кода равна $s$ ($0 \le s \le 1$), а доля параллельного кода $p = 1 - s$:
Следствие: Если в программе всего 5% последовательного кода ($s = 0.05$), даже на суперкомпьютере с миллионом процессоров ускорение никогда не превысит $1 / 0.05 = \mathbf{20}$ раз!
Учитывает реальность высокопроизводительных вычислений: с ростом вычислительной мощности масштабируется размер решаемой задачи (увеличивается точность сетки, число моделируемых частиц):
При слабом масштабировании ускорение растет практически линейно относительно $n$, поскольку доля последовательной работы размывается огромным объемом полезных параллельных расчетов.
В кластерах и многопроцессорных системах время решения задачи ограничено самым медленным узлом (эффект "Straggler"). Различают два метода балансировки: