Матричное расширение (instruction set architecture) — это часть архитектуры компьютера, которая определяется программируемой частью ядра микропроцессора.</p>" data-abbr="ISA">ISA CPU… Что это и что оно делает? Уже из названия понятно, что это расширение позволяет ускорять операции над матрицами на CPU. Но задумывались ли вы когда-нибудь, какие они бывают, когда появились, кто и как их создает?
Меня зовут Валерия Пузикова, я эксперт по разработке ПО в компании YADRO, к.ф.-м.н. Около 15 лет разрабатываю численные методы для решения задач линейной алгебры, дополненной и виртуальной реальности, аэрогидродинамики. Вычислительные задачи таких классов всегда приводят к работе с матрицами больших размерностей, поэтому критически важным становится ускорение матричных операций, в том числе с помощью расширений.
Матричные расширения появились не так давно — чуть более трех лет назад. Несмотря на это, они есть у каждой уважающей себя процессорной архитектуры, в том числе у относительно молодой открытой RISC-V. Причем, как это ни парадоксально, по числу матричных расширений RISC-V уже обогнала все остальные архитектуры: на данный момент разработаны два кастомных расширения и прямо сейчас разрабатываются два стандартных.
Почему их так много и чем они отличаются? Поддерживаются ли разреженные матрицы? Об этом и многом другом вы узнаете из статьи. Приготовьтесь, будет интересно и (спойлер!) без многоэтажных формул.

Эту статью можно поделить на две части:
Попытаемся понять, зачем вообще нужны матричные расширения и в чем тут соль.
Соберем воедино все, что можно найти в открытых источниках о ныне существующих матричных расширениях — от Intel AMX до SpacemiT IME.
А через неделю выйдет продолжение. Попробуем разобраться, как идет разработка стандартных матричных расширений RISC-V и что в связи с этим ждать. Подписывайтесь, чтобы не пропустить.
Часть первая: 5 вопросов для «первого свидания»
В каких приложениях нужно ускорять матричные операции?
Матричные операции — это основные хот-споты для приложений из таких областей, как:
искусственный интеллект и машинное обучение (AI/ML),
компьютерное зрение (CV),
дополненная и виртуальная реальность (AR/VR),
математическое моделирование сложных физико-технических систем (CAE, HPC),
усовершенствованные системы помощи водителю (ADAS) и др.
Все эти области сейчас переживают стремительное развитие: спрос на вычислительные мощности для таких задач постоянно увеличивается на порядки и зачастую опережает темпы развития железа — CPU и ускорителей. И остро стоит вопрос о том, что матричные операции необходимо ускорять. Прежде всего речь идет об операциях, связанных с умножением матриц, причем как плотных, так и Разреженная матрица (sparse matrix) — матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевая, матрица считается плотной, или заполненной (dense matrix). Для разреженных матриц существуют специальные форматы хранения, чтобы не тратить память компьютера на многочисленные нули, а для операций над ними разработаны специальные алгоритмы, исключающие эти нули из вычислений.</p><p></p>" data-abbr="разреженных">разреженных.
Зачем ускорять матричные операции на CPU в эпоху ускорителей?
Очень частое заблуждение, что все математически сложные алгоритмы уже давно выполняются только на специализированных ускорителях: графических (GPU), тензорных (TPU), нейронных (NPU) и так далее.
Безусловно, ускорители очень важны для повышения производительности вычислительно сложных алгоритмов. Но в жизни доля матричных нагрузок велика не только на суперкомпьютерах, кластерах и достаточно мощных пользовательских устройствах. Вы постоянно сталкиваетесь с матричными нагрузками на самых обычных смартфонах, когда обрабатываете фотографии или видео, на планшетах, ноутбуках и не самых мощных персональных компьютерах без видеокарт.
Кроме того, даже если на устройстве пользователя есть ускоритель, нельзя заранее предсказать, сколько у него параллельно идет других задач и насколько этот ускоритель в данный момент свободен. Если он уже загружен другими задачами, то ваша задача попадает на CPU, и, конечно, хотелось бы, чтобы на CPU она решалась настолько быстро, насколько это возможно.
Интересный факт: даже в сегменте суперкомпьютеров есть полностью гомогенные машины, то есть суперкомпьютеры, состоящие только из CPU. Яркий пример — японский гомогенный суперкомпьютер Fujitsu Fugaku на базе архитектуры Arm A64FX. В июне 2020 года он стал самым быстрым суперкомпьютером в мире в рейтинге Top500 и первым суперкомпьютером в истории, занявшим первое место сразу во всех основных суперкомпьютерных рейтингах — Top500, LINPACK, HPCG, HPL-AI и Graph500. До Fujitsu Fugaku ни один суперкомпьютер на базе архитектуры Arm не показывал столь высокой производительности.
Как ускоряли матричные операции на CPU до появления расширений?
Итак, для начала представим, что у нас нет не только ускорителей, но и расширений, и рассмотрим самую распространенную матричную операцию — умножение плотных матриц.

