В 1978 году два исследователя из Карнеги-Меллона - Х.Т. Кунг и Чарльз Лейзерсон - опубликовали работу о систолических массивах для VLSI-схем. Идея была элегантной, но опередила своё время: вычисления в те годы не упирались в матричное умножение, и статья осталась в основном академическим курьёзом. Прошло почти четыре десятилетия, прежде чем Google обнаружил, что нейронные сети - это именно та задача, под которую Кунг и Лейзерсон проектировали свою архитектуру. В 2015 году первый TPU тихо занял своё место в серверных стойках датацентров Google, и вместе с ним 47-летняя идея наконец нашла свою убийственную аппликацию.
Понять систолический массив - значит сначала понять проблему, которую он решает. Проблема называется "стена памяти" - memory wall.
Память как узкое горло - откуда берётся проблема CPU и GPU
Процессор - любой обычный процессор, CPU или GPU - работает по одной схеме: взять данные из памяти, выполнить операцию, записать результат обратно в память. Для сложения двух чисел нужно два чтения и одна запись. Для матричного умножения матриц размером N×N нужно O(N²) чтений данных, но выполняется O(N³) операций - математически это выгодная пропорция. Казалось бы, матричное умножение должно быть именно той задачей, где арифметические блоки никогда не простаивают.
Но практика расходится с теорией. В реальных архитектурах каждый арифметический блок вынужден читать свои операнды из регистров или разделяемой памяти - и именно там возникает конкуренция. Сотни ядер GPU одновременно тянутся к общей памяти, шина данных перегружена, энергия тратится на перемещение данных, а не на вычисления. Чтение одного числа из DRAM-памяти потребляет примерно в 200 раз больше энергии, чем само умножение этого числа. Архитектурная расточительность огромная.
Именно эта проблема заставила Google искать принципиально иной подход: проектировать аппаратуру так, чтобы данные протекали сквозь вычисления, не касаясь памяти. Систолический массив - это и есть такая архитектура.
Принцип работы систолического массива на пальцах
Название "систолический" пришло из биологии. В систолической компьютерной системе функция процессора аналогична функции сердца: каждый процессор ритмично прокачивает данные, каждый раз выполняя короткое вычисление, поддерживая равномерный поток данных в сети.
Конкретно это выглядит так. Представьте сетку из процессорных элементов (PE) - небольших вычислительных ячеек, каждая из которых умеет выполнять одну операцию: умножение с накоплением, MAC (multiply-accumulate). Каждая ячейка соединена только с соседними - слева, справа, сверху, снизу. Никаких шин данных, никакого общего регистрового файла. Только короткие провода между соседями.
Теперь - матричное умножение. Пусть нужно перемножить матрицу весов W и матрицу активаций X. Веса загружаются в ячейки сверху и остаются на месте - каждая ячейка держит один вес. Активации входят слева и движутся горизонтально, строка за строкой, тактируемые общим клоком. Каждая ячейка умножает проходящую через неё активацию на свой вес, добавляет результат к накопленной сумме, пришедшей сверху, и передаёт обновлённую сумму вниз. Активация продолжает двигаться вправо - к следующей ячейке в строке.
Этот паттерн потоков данных означает, что каждое значение активации используется повторно 256 раз при прохождении горизонтального измерения, а каждая частичная сумма накапливает вклад от 256 умножений при движении вертикально. Результаты матричного умножения выходят снизу - без единого обращения к памяти во время самих вычислений. Данные вошли с одного края, ответы вышли с другого.
Как только данные поданы в систолический массив, дополнительная управляющая логика о том, как их обрабатывать, больше не нужна. При достаточно большом массиве обращений к памяти нет вообще - только ввод и вывод.
Устройство TPU v1 - радикальный минимализм в кремнии
Google развернул первый TPU в 2015 году, чтобы решить критическую проблему: нагрузки нейросетевого инференса угрожали удвоить площадь серверных мощностей компании. Инженеры спроектировали TPU v1 исключительно для инференса, убрав обучение полностью - ради максимальной производительности и энергоэффективности.
Первое поколение TPU - это 8-битный движок матричного умножения, управляемый CISC-инструкциями от хост-процессора через шину PCIe 3.0. Тактовая частота - 700 МГц, тепловой пакет - 28-40 Вт. На чипе 28 МБ памяти и 4 МБ 32-битных аккумуляторов, принимающих результаты из массива 256×256 8-битных умножителей.
Единственный такт инструкции MatrixMultiply может задействовать сотни тысяч операций. Во время выполнения этого массивного матричного умножения все промежуточные результаты передаются напрямую между 64 тысячами ALU без какого-либо доступа к памяти, что существенно снижает энергопотребление.
Архитектура TPU v1 отличалась тем, чего в ней не было. Никакого кэша, никакого спекулятивного исполнения, никакого предсказания ветвлений. Каждое перемещение данных и каждая инструкция были известны заранее и исполнялись детерминированно. Это делало TPU не просто быстрым, но предсказуемо быстрым - критически важное свойство для инференса с низкой задержкой в продакшне.
Детерминизм - это не просто инженерная чистоплотность. В датацентре Google, где тысячи запросов проходят через модель каждую секунду, гарантированная задержка на 99-м перцентиле ценнее, чем чуть более высокая средняя производительность с непредсказуемыми всплесками.
Математика пиковой производительности
Посчитать теоретический потолок TPU v1 легко - и именно эта простота расчёта говорит об архитектурной элегантности:
Количество MAC-ячеек: 256 × 256 = 65 536
Тактовая частота: 700 МГц
Операций за такт: 65 536 (умножение + сложение = 2 операции)
Пиковая производительность: 65 536 × 700 000 000 × 2 = 92 TOPS
Девяносто два триллиона 8-битных операций в секунду при потреблении менее 40 ватт. По сравнению с тогдашним GPU NVIDIA K80 TPU v1 обеспечивал в 15-30 раз более высокую пропускную способность инференса и в 30-80 раз лучшую производительность на ватт.
Почему такая эффективность? Потому что провода соединяют только пространственно соседние ALU, что делает их короткими и энергоэффективными. ALU выполняют только умножения и сложения в фиксированных паттернах, что упрощает их конструкцию. Чем проще транзисторная схема, тем плотнее её можно разместить на кристалле. Чем плотнее размещение, тем короче провода. Чем короче провода, тем меньше энергия на передачу сигнала. Систолический массив - это замкнутый цикл физических преимуществ.
Эволюция от TPU v1 к современным чипам
TPU v1 был великолепным специализированным молотком, но у него имелась ахиллесова пята: память. Канал DDR3 с пропускной способностью 34 ГБ/с не поспевал за аппетитом массива к весам. Систолический массив часто простаивал в ожидании данных - аппаратная версия классической проблемы программного голодания.
Google ответил на это в TPU v2 переходом на High Bandwidth Memory. Использование 16 ГБ HBM во втором поколении увеличило пропускную способность памяти до 600 ГБ/с и производительность до 45 терафлопс. Шестнадцатикратное увеличение пропускной способности памяти - вот что на практике отделяло "быстро" от "работает как задумано".
Параллельно Google решил проблему точности вычислений нестандартным способом - изобрёл bfloat16. Обычный float16 ограничивал диапазон представимых чисел, что создавало численные проблемы при обучении. BFloat16 сохраняет 8-битную экспоненту от float32 (и, значит, тот же динамический диапазон), но урезает мантиссу до 7 бит - уменьшая объём данных вдвое по сравнению с float32. Нейронные сети по природе своей устойчивы к такой потере точности в мантиссе - и bfloat16 стал стандартом не только для TPU, но постепенно распространился на другие ускорители.
Современные MXU в TPU v6e и TPU v7 состоят из массива 256×256 умножителей-аккумуляторов. Каждый такой MXU способен выполнять более 65 тысяч операций умножения-накопления за такт. Все умножения принимают входные данные в bfloat16, но все накопления выполняются в формате FP32. Входные данные низкой точности, накопление высокой - разумный компромисс между скоростью и точностью финального результата.
Слабые стороны архитектуры - честный разговор об ограничениях
Систолический массив - это инструмент, оточенный под одну задачу. И как любой специализированный инструмент, он беспомощен за пределами своей ниши.
Разреженные матрицы - первая серьёзная проблема. Рекомендательные системы и языковые модели с эмбеддингами обращаются к огромным таблицам через нерегулярные, зависящие от данных индексы. Структурированный поток данных MXU не даёт никакого преимущества для таких разреженных паттернов доступа к памяти - данные попросту не текут через массив равномерно, ячейки простаивают.
Маленькие матрицы - вторая проблема. Если размерности тензоров меньше размера стороны MXU - как правило, 128×128 - то часть ячеек просто не задействована. TPU приходится дополнять матрицы нулями до нужного размера, тратя вычислительную мощность впустую. Модель, которую никто не оптимизировал под размеры MXU, может использовать лишь малую долю его потенциала.
Управляющая логика и нерегулярные вычисления - третья проблема. Условные ветвления, динамические графы вычислений, операции над переменными длинами последовательностей - всё это плохо ложится на фиксированный паттерн потока данных. Именно поэтому каждый TensorCore TPU содержит, помимо MXU, векторный и скалярный блоки: для активаций, softmax, нормализаций и управляющей логики, с которыми систолический массив не справляется.
Google решает проблему разреженности через специализированные блоки SparseCores, которые впервые появились ещё в TPU v4. Это отдельные процессоры потока данных, ускоряющие разреженные операции - эмбеддинги и рекомендательные модели. Систолический массив остаётся там, где он силён - в плотном матричном умножении, а SparseCores берут на себя то, с чем он не справляется.
XLA - компилятор как часть архитектуры
Систолический массив требует, чтобы паттерн потока данных был известен заранее - во время компиляции. Это фундаментальное ограничение превращается в архитектурное преимущество благодаря компилятору XLA (Accelerated Linear Algebra), который Google разработал специально для TPU.
XLA принимает граф вычислений TensorFlow, JAX или PyTorch и транслирует его в последовательность инструкций для TPU, зная всё о размерностях тензоров, о том, какие данные нужно загрузить из HBM в VMEM перед запуском MXU, и о том, как переплести загрузку данных с вычислениями, чтобы массив никогда не простаивал.
Именно здесь аппаратная детерминированность TPU становится подарком для компилятора: традиционные кэши предназначены для обработки непредсказуемых паттернов доступа к памяти. Кэши позволяют аппаратуре быть гибкой. Но доступы к кэшу стоят значительной энергии. Зная паттерн заранее, XLA может полностью обойтись без кэшей - явно планируя все перемещения данных. Это и есть аппаратно-программный кодизайн: компилятор и кремний проектировались вместе, каждый с учётом возможностей другого.
На практике это означает, что программист, пишущий на JAX, получает доступ к систолическому массиву через матричные операции - jnp.dot(), jnp.matmul() - и компилятор самостоятельно разбивает их на тайлы подходящего размера, планирует загрузку весов и активаций, и выстраивает конвейер исполнения:
import jax
import jax.numpy as jnp
# Эта операция компилируется XLA в инструкции для MXU
@jax.jit
def matmul_tpu(a, b):
return jnp.dot(a, b)
# Размеры, кратные 128 - максимальная утилизация MXU
a = jnp.ones((1024, 1024), dtype=jnp.bfloat16)
b = jnp.ones((1024, 1024), dtype=jnp.bfloat16)
result = matmul_tpu(a, b)
Размерности, кратные 128 (или 256 для TPU v6e), - не случайный выбор. Это прямое следствие размера систолического массива: тайлы должны точно заполнять ячейки MXU, иначе часть из них простаивает.
Семь поколений - куда двигается архитектура
В апреле 2025 года Google представил TPU v7, названный Ironwood. Он будет доступен в двух конфигурациях: кластер из 256 чипов и кластер из 9216 чипов. Пиковая вычислительная производительность Ironwood составит 4614 ТФЛОПС. От 92 TOPS в 2015-м до 4614 TFLOPS в 2025-м - пятидесятикратный рост за десять лет, причём фундаментальная идея систолического массива осталась неизменной.
Каждое поколение добавляло масштаб: больший массив, быстрее память, шире межчиповые соединения. TPU v4 ввёл оптические коммутаторы (OCS) для перестройки топологии соединений между чипами прямо во время работы. TPU v5p получил четыре SparseCores на чип. Trillium перешёл на массив 256×256. Ironwood - следующий шаг в этой прогрессии.
Систолическая идея 1978 года оказалась не исторической диковинкой, а точным предсказанием того, какой вычислительный примитив станет определяющим для целой эпохи. Кунг и Лейзерсон описали сердце, которое будет биться в чипах, тренирующих языковые модели через полвека. Иногда правильная абстракция просто ждёт своего момента.