Импортозамещение в ЕС
Николай Терновой [https://t.me/cpu_design]Слово импортозамещение у всех на слуху, особенно в области полупроводников и складывается ложное ощущение, что это явление присуще только России и Китаю, пока остальные страны наслаждаются всеми прелестями глобализации.
Давайте сегодня рассмотрим проект под названием EPI (European processor initiative). И разберемся, что же это такое.
На сайте EPI проект описывают так:
”The European Processor Initiative (EPI) is a project currently implemented under the second stage of the Framework Partnership Agreement signed by the Consortium with the European Commission, whose aim is to design and implement a roadmap for a new family of low-power European processors for extreme scale computing, high-performance Big-Data and a range of emerging applications. The European Processor Initiative (EPI) is a project currently implemented under the second stage of the Framework Partnership Agreement signed by the Consortium with the European Commission, whose aim is to design and implement a roadmap for a new family of low-power European processors for extreme scale computing, high-performance Big-Data and a range of emerging applications.”
Основной посыл я воспринимаю так: в рамках ЕС есть проекты, где требуются микропроцессоры. Почему бы не инвестировать деньги в европейские дизайн центры? Инвестиции в собственную микропроцессорную школу, привлечение новых кадров, выпуск собственных чипов на еврофабе. По данной ссылке можно ознакомиться со списком участников EPI.
Проект начался в 2019-м году и его roadmap расписан сейчас до 2025-го года. В данном посте мы коснемся только части данного проекта, а именно рассмотрим два направления в проектировании чипов в рамках EPI, а именно general purpose processor и accelerator processor.

Тут у меня возникают вопросы к данному проекту. В чем идея разделения процессоров на два и почему в качестве gp cpu выбрана идея с лицензированием ARM ядра? Пока что из идей приходит, что программная экосистема ARM более предпочтительна для нужд ЕС и есть потребность в получении кадров с опытом проектировании SoC на базе IP от ARM.
Подробнее о ARM чипе можно почитать в соответствующем разделе проекта EPI.
European Processor Accelerator (EPAC). Он же ускоритель на базе RISC-V. Рассмотрим основные компоненты ускорителя:
1) VPU для EPAC разработан силами BSC и University of Zagreb. Ссылка на презентацию о проектировании VPU и ссылка на доклад с RISC-V Summit 2021.

Из интересных особенностей VPU длинные вектора, содержащие до 256 DP-элементов, то есть 256*64=16384 bit на вектор. Любители длинных инструкций, ой, векторов на месте?
2) Драйвер VPU - in-order ядро Avispado с набором команд RV64GCV от Испанской компании Semidynamics, которое может работать с 3’d party VPU по OVI (открытому векторному интерфейсу). Avispado можно назвать специализированным ядром для управления кастомными 3'd party VPU IP по интерфейсу OVI. Виртуальная память соответствует SV48, думаю в этом году увидим грейд до SV57.

3) Variable precision processor/unit (VRP), разработанный в CEA. Зачем этот VRP нужен? VRP направлен на применение в научных областях с широким применением итерационных алгоритмов. Уравнения физики, химии, моделирования всеми любимого shallow water equation. Почему VRP важен и эффективен для итерационных алгоритмов? Все из-за аппаратной поддержки формата данных переменной точности. Как утверждают разработчики блока, когда блок стандартной точности (тут подразумевается классический скалярный FPU) не может достичь требуемой точности, все вычисления переводятся на VRP. Одновременно разгружаются вычислительные ресурсы скалярного ядра, а за счет динамической точности и расширенных до 512 бит мантисс.

4) STX (stencil/tensor accelerator) разработан на базе ядра RISC-V Snitch.
На мой взгляд — это один самых интересных компонентов процессора EPAC. С VRP, VPU я поработать успел, а STX tile для меня оказался новинкой. И чтобы хотя бы понять идею и функционал данного блока пришлось сначала прослушать часовую лекцию от сотрудников Цюрихского университета, а затем ознакомиться с презентацией аспиранта того же ETH Zurich.
Проблема, которую решает STX tile - это минимизация эффекта от von Neumann bottleneck. Вкратце - это проблема в ограничении пропускной способности процессорной системы со стороны иерархии памяти. Подробнее можно прочитать по ссылке выше.
Задача блока STX - максимально загрузить вычислительные FPU юниты, минимизировав операции обращения к памяти. Какое решение предлагают инженеры из Цюриха?
- Контроллером системы должно быть простейшее ядро на базе RS32I, in-order, single-issue.
- Основным вычислительным блоком должен быть HPC FPU с поддержкой fp64, а также поддержкой вычисления 2 результатов fp32 за один прогон FPU конвейера (2x fp32 SIMD) и.т.д
Для увеличения загрузки FPU юнитов вводится механизм Stream Semantic Registers (SSR). Вам тоже кажется, что в названии нового блока регистров не хватает слова Unique вначале?

Информации по тому, как именно работает SSR мало, но давайте попробуем разобраться. Не всегда удается эффективно загрузить вычислительный unit, в данном случае FPU за счет времени выгрузки новых данных из основной памяти. Как же нам избавить от долгих load/store операций при вычислении fp операций? Идея в следующем - необходимо разработать некоторый loop detector, который будет обозначать что на данном участке программы развернут цикл N вложенных циклов. Далее необходимо узнать размер массива данных, над которыми будут производиться арифметические операции. Зная данную величину и величину слова, с которым мы работаем 16/32/64 бита - можно понять объем и адреса данных, которые необходимо выгрузить.

В модуле AGUs (address generation unit) & HWLoops 5 loop counters, каждый разрядностью 16 бит и 3 AGU - для двух ReadAddr и один для StoreAddr. То есть пары rs1/2 и rd. Хотя в операции fmadd подразумевают 3 источника - множитель, множитель и слагаемое. Значит, FMA работает в режиме сложения/вычитания или умножения. Для умножения слагаемое всегда определяется как нуль, а для сложения/вычитания второй множитель определяется как единица. Пять счетчиков циклов предоставляют возможность отслеживать аппаратно границы и значение текущей итераций для 5 вложенных циклов.

Рассмотрим пример ускорения dot-product вычислений на наборе > 1000 элементов. Справа представлен классический код на базе RV32IF, каждая вычислительная операция сопровождается выгрузкой операндов из памяти, над которыми будут производиться вычисления. Фактически каждая итерация цикла исполняет дополнительные 2 инструкции выгрузки операндов из памяти, для fma операции. По итогу данный цикл на классическом RV32IF наборе разложится в 3000 команд.
При имплементации SSR - добавляются конфигурационные инструкции. И тут у меня возникает диссонанс и куча вопросов. Если есть аппаратный детектор цикла, то зачем дополнительно конфигурировать SSR программно? Или это автогенерируемый код, когда модифицированный компилятор перед каждым циклом добавляет такую конфигурацию SSR? В чем тогда идея loop-detector'a и как по итогу определяются границы массива для ее предвыгрузки для наиболее эффективной загрузки FPU?
Ответа на данный вопрос я найти не смог, с удовольствием обсужу с вами эту тему в комментариях к посту.
Полезный комментарий дал Максим Маслов по поводу аппаратных детекторов циклов, наличие которых я ошибочно предположил.
Нет никакого аппаратного детектора циклов, есть аппаратная поддержка неявной загрузки из памяти в регистры, параметры коей конфигурируются программно, для чего простыня в начале цикла и нужна. Что-то подобное есть в е2к, кстати.
И привар от такого функционала не в скрытии латенси по памяти, а 1) уменьшении размера кода, что позволяет уменьшить ширину фронтенда и несколько упростить внутренности конвейера 2) позволить упростить/отказаться от префетча для таких случаев. Честно говоря, как по мне, плюсы от такого решения крайне специфичны, по крайней мере для более-менее серьёзных CPU ядер в этом толку мало
Теперь давайте смотреть на это, как на некий black-box и оценим результат. Видно, что пропали l/s инструкции, что позволило нам загрузить по максимуму FPU конвейер.

Ниже приведены количественные характеристики, демонстрирующие прирост производительности системы с поддержкой SSR.

Резюмируем результаты - STX демонстрирует интересное решение по уменьшению простоя вычислительных блоков из-за ограничений пропускной способности подсистемы памяти и LSU. Не до конца понятна идея с программно-аппаратной реализацией. Зачем по итогу нужны дополнительные конфигурационные инструкции и в чем тогда задача loop-detector'a?
STX программируется с использованием пакета OpenMP, есть возможность выгрузки операций на STX из системы ARM general purpose или с RISC-V + VPU.
Теперь зная из каких блоков состоит процессор можно сделать вывод о сфере его применения. Avispado in-order ядро выбранное в качестве драйвера vpu, vrp говорит о том, что это не gp cpu, а именно ускоритель. Уменьшая площадь, энергопотребления скалярного ядра дается площадка под специализированные ускорители в лице vpu, vrp, stx намекают на числодробилку в задачах ml/ai, vrp дает широкие возможности для моделирования различных алгоритмов с заданной кастомной точностью. Для полного комплекта не хватает только аппаратной поддержки Posit, но об этом позже.

Подробнее об ускорители можно прочитать тут.
Ниже представлено распределение блоков на чипе EPAC:
- Four RISC-V Vector (RVV) tiles composed of the scalar, two-way in order Avispado core and 8-lane Vector Processing Unit (VPU) implementing v0.7 of RISC-V Vector extension ISA.
- Two STX tiles consisting of Stencil/Tensor Accelerator cores.
- One VRP tile consisting of Variable floating point precision core.

Проект EPI идет в соответствии с намеченным планом и дедлайнами. Ознакомиться с результатами по первому этапу EPI от 20 декабря 2021-го года можно в этом отчете.

Чтобы понять уровень заинтересованности Евросоюза в программно-аппаратной поддержки решений на базе RISC-V можете ознакомиться с данной новостью. €270 миллионов много или мало - решайте сами. Для сравнения новость 2021-го о инвестиции 27,8 млрд рублей в проект компании Yadro. Суммы в целом одного порядка, но в России они выше. Забавное совпадение, что EPI и Yadro датой завершения проекта определили 2025-й год. Так что в 25-м году будет интересно сравнить продукты, полученные в по сути идентичных проектах ЕС и РФ, с оговоркой что ЕС делает accelerator core на базе RISC-V, который будет сопроцессором в связке с ARM для gp решений, в то время как Yadro на базе RISC-V делает gp cpu для серверных решений.
Что невероятно нравится в EPI - это открытость и отчетность. Все суммы расписаны на сайте, roadmap представлен. По каждому этапу компании участники проекта отчитываются различным образом. Будь то заметка для пресс-релиза, выступление на конференции с q&a сессией. Приятно, что есть возможность следить за развитием проекта и отслеживать ее историю по старым прессрелизам, которые заботливо собраны на отдельной странице сайта EPI.
p.s. И на десерт для меня. В рамках EPI исследуется возможность применения Posit арифметики в задачах ML. Подробнее смотри в документе от EPI партнеров.