Гениальность микропроцессоров RISC-V

Войны между RISC и CISC, проходившие в конце 1990-х, уже давно отгремели, и сегодня считается, что разница между RISC и CISC совершенно не имеет значения. Многие заявляют, что наборы команд несущественны.
Однако на самом деле наборы команд важны. Они накладывают ограничения на типы оптимизаций, которые можно легко добавлять в микропроцессор.
Недавно я подробнее изучил информацию об архитектуре набора команд (instruction-set architecture, ISA) RISC-V и вот некоторые из аспектов, которые по-настоящему впечатлили меня в ISA RISC-V:
- Это небольшой и простой в изучении набор команд RISC. Очень предпочтителен для тех, кому интересно получать знания о микропроцессорах.
- Благодаря своей простоте, открытости и связи с университетскими профессорами он с большой вероятностью будет доминировать как архитектура, выбираемая для обучения процессорам в вузах.
- Его продуманная структура позволяет разработчикам CPU создавать высокопроизводительные микропроцессоры на основе ISA RISC-V.
- Благодаря отсутсвию лицензионных отчислений и нацеленности на простую аппаратную реализацию увлечённый любитель может, в принципе, создать за приемлемое время собственную конструкцию процессора RISC-V.
Месть RISC
Когда я начал понимать RISC-V лучше, то осознал, что RISC-V оказался радикальным возвратом к тому, что многие считали давно прошедшей эпохой вычислений. С точки зрения конструкции, RISC-V подобен перемещению на машине времени к классическому Reduced Instruction Set Computer (RISC, «компьютеру с набором коротких команд») начала 80-х и 90-х.
В последние годы многие заявляли, что разделение на RISC и CISC больше не имеет смысла, поскольку в процессоры RISC наподобие ARM добавили так много команд, и при этом многие из них довольно сложны, что на текущем этапе это скорее гибрид, чем чистый процессор RISC. Похожие рассуждения применялись и к другим процессорам RISC, например, PowerPC.
RISC-V же, напротив, является действительно «хардкорным» представителем процессоров RISC. Если вы почитаете в Интернете обсуждения RISC-V, то найдёте людей, утверждающих, что RISC-V был разработан какими-то олдскульными RISC-радикалами, отказывающимися двигаться в ногу со временем.
Бывшая инженер ARM Эрин Шеперд несколько лет назад написала интересную критику RISC-V:
ISA RISC-V слишком стремился к минимализму. В нём есть сильный упор на минимизацию количества команд, нормализацию кодирования и т.д. Это стремление к минимализму привело к ложным ортогональностям (например, использованию одной и той же команды для ветвления, вызовов и возвратов) и требованию избыточных команд, влияющих на плотность кода с точки зрения размера и количества команд.
Вкратце приведу немного контекста. Малый размер кода даёт преимущество в производительности, поскольку так проще хранить выполняемый код внутри высокоскоростного кэша процессора.
Критика здесь заключается в том, что проектировщики RISC-V слишком сосредоточились на обеспечении малого набора команд. В конце концов, это ведь одна из исходных целей RISC.
По словам Эрин, следствием этого стало то, что реальной программе для выполнения задач потребуется гораздо больше команд, то есть она займёт больше места в памяти.
Традиционно долгие годы считалось, что в процессор RISC нужно добавить больше команд, чтобы он стал более похожим на CISC. Идея заключается в том, что более специализированные команды могут заменить использование множественных общих команд.
Сжатие команд и Macro-Operation Fusion
Однако в архитектуре процессоров присутствуют две инновации, из-за которых эта стратегия добавления более сложных команд во многих смыслах оказывается избыточной:
- Сжатые команды — команды сжимаются в памяти и распаковываются на первой стадии процессора.
- Macro-operation Fusion — две или несколько простых команд считываются процессором и сливаются в одну более сложную команду.
Однако тут есть тонкость: RISC-V получает из этих двух стратегий гораздо больше выгод по двум важным причинам:
- Сжатые команды были добавлены изначально. В других архитектурах, например, в ARM, об этом подумали позже, и прикрутили их довольно поспешным образом.
- Здесь оправдывает себя одержимость RISC малым количеством уникальных команд. Для добавления сжатых команд просто остаётся больше места.
ADD x1, x4, x8 ; x1 ← x4 + x8
Она складывает содержимое регистров x4 и x8 , сохраняя результат в x1 . Требуемое для кодирования этой команды количество битов зависит от количества имеющихся регистров. У RISC-V и ARM есть 32 регистра. Число 32 можно выразить 5 битами:
Так как в команде нужно указать три разных регистра, то для кодирования операндов (входящих данных для операции сложения) требуется в сумме 15 бит (3 × 5).
Следовательно, чем больше возможностей мы хотим поддерживать в наборе команд, тем больше битов мы займём из доступных нам 32 бит. Разумеется, мы можем перейти к 64-битным командам, но при этом потратится слишком много памяти, а значит, пострадает производительность.
Агрессивно стремясь к сохранению малого количества команд, RISC-V оставляет больше места для добавления битов, обозначающих, что мы используем сжатые команды. Если процессор видит, что в команде заданы определённые биты, то он понимает, что её нужно интерпретировать как сжатую.
Это означает, что вместо засовывания внутрь 32 бит одной команды мы можем уместить две команды по 16 бит шириной каждая. Естественно, не все команды RISC-V можно выразить в 16-битном формате. Поэтому подмножество 32-битных команд выбирается на основании их полезности и частоты использования. Если несжатые команды могут получать 3 операнда (входящих данных), то сжатые команды — только 2 операнда. То есть сжатая команда ADD будет выглядеть так:
C.ADD x4, x8 ; x4 ← x4 + x8
В ассемблерном коде RISC-V используется префикс C. , сообщающий, что команду нужно преобразовать ассемблером в сжатую команду.
По сути, сжатые команды уменьшают количество операндов. Три регистра-операнда заняли бы 15 бит, оставив на указание операции всего 1 бит! Таким образом, при использовании двух операндов для указания опкода (выполняемой операции) у нас остаётся 6 бит.
На самом деле это близко к тому, как работает ассемблер x86, когда зарезервировано недостаточно битов для использования трёх регистров-операндов. Процессор x86 при этом тратит биты, чтобы позволить, например, команде ADD считывать входящие данные и из памяти, и из регистров.
Однако истинную выгоду мы получаем, объединив сжатие команд с Macro-operation fusion. Когда процессор получает 32-битное слово, содержащее две сжатые 16-битные команды, он может слить их в одну более сложную команду.
Звучит, как чушь — мы что, вернулись к тому, с чего начинали?
Нет, поскольку мы минуем необходимость заполнения спецификации ISA кучей сложных команд (то есть стратегии, которой придерживается ARM). Вместо этого мы, по сути, выражаем целое множество сложных команд косвенно, через различные сочетания простых команд.
В обычных условиях Macro-fusion вызвало бы проблему: хотя две команды заменяются одной, они всё равно занимают в два раза больше памяти. Однако при сжатии команд мы не занимаем никакого лишнего места. Мы пользуемся преимуществами обеих архитектур.
Давайте рассмотрим один из примеров, приведённых Эрин Шеперд. В своей критической статье о ISA RISC-V она показывает простую функцию на C. Чтобы было понятнее, я взял на себя смелость переписать её:
int get_index(int *array, int i)
На x86 это скомпилируется в следующий ассемблерный код:
mov eax, [rdi+rsi*4] ret
При вызове функции в языке программирования аргументы обычно передаются функции в регистре согласно установленному порядку, который зависит от используемого набора команд. На x86 первый аргумент помещается в регистр rdi , второй — в rsi . По стандарту возвращаемые значения должны помещаться в регистр eax .
Первая команда умножает содержимое rsi на 4. Он содержит переменную i . Почему умножает? Потому что array состоит из элементов integer, разделённых друг от друга 4 байтами. Следовательно, третий элемент массива находится в смещении 3 × 4 = 12 байт.
Далее мы прибавляем это к rdi , который содержит базовый адрес array . Это даёт нам окончательный адрес i -того элемента array . Мы считываем содержимое ячейки памяти по этому адресу и сохраняем его в eax : задача выполнена.
На ARM всё происходит похожим образом:
LDR r0, [r0, r1, lsl #2] BX lr ;return
Здесь мы не умножаем на 4, а сдвигаем регистр r1 на 2 бита влево, что эквивалентно умножению на 4. Вероятно, это более верное описание и того, что происходит на x86. Сомневаюсь, что можно умножать на что-либо, не являющееся кратным 2, поскольку умножение — это довольно сложная операция, а сдвиг малозатратен и прост.
Из моего описания x86 об остальном можно только догадываться. Теперь давайте перейдём к RISC-V, где начинается настоящее веселье! (точкой с запятой начинаются комментарии)
SLLI a1, a1, 2 ; a1 ← a1
На RISC-V регистры a0 и a1 являются просто псевдонимами x10 и x11 . Именно в них помещаются первый и второй аргументы вызова функции. RET — это псевдокоманда (сокращение):
JALR x0, 0(ra) ; sp ← 0 + ra ; x0 ← sp + 4 ignoring result
JALR выполняет переход к адресу, хранящемуся в ra , который относится к адресу возврата. ra — это псевдоним x1 .
И всё это выглядит совершенно ужасно, правда? Вдвое больше команд для такой простой и часто используемой операции, как выполнение поиска по индексу в таблице и возврат результата.
Это действительно выглядит плохо. Именно поэтому Эрин Шеперд чрезвычайно критически отнеслась к проектировочным решениям, сделанным разработчиками RISC-V. Она пишет:
Упрощения RISC-V делают более простым декодер (т.е. фронтенд процессора), однако за это приходится расплачиваться бо́льшим количеством команд. Однако масштабирование ширины конвейера — это сложная задача, в то время как декодирование немного (или сильно) необычных команд хорошо изучено (основные сложности возникают, когда определение длины команды нетривиально — из-за своих бесконечных префиксов особо запущенным случаем является x86).
Однако благодаря сжатию команд и macro-op fusion можно изменить ситуацию к лучшему.
C.SLLI a1, 2 ; a1 ← a1
Теперь команды занимают ровно столько же места в памяти, что и пример для ARM.
Так, а теперь давайте выполним Macro-op fusion!
Одно из условий RISC-V для разрешения слияния операций в одну — это совпадение целевого регистра. Это условие выполняется для команд ADD и LW (load word, «загрузить слово»). Поэтому процессор превратит их в одну команду.
Если бы это условие выполнялось и для SLLI, то мы могли бы слить в одну все три команды. То есть процессор бы увидел нечто, напоминающее более сложную команду ARM:
LDR r0, [r0, r1, lsl #2]
Но почему мы не могли прописать эту сложную макро-операцию непосредственно в коде?
Потому что в ISA нет поддержки такой макро-операции! Вспомним, что у нас есть ограниченное количество битов. Тогда сделаем команды длиннее! Нет, это займёт слишком много памяти и быстрее переполнит драгоценный кэш процессора.
Однако если вместо этого мы будем изготавливать эти длинные полусложные команды внутри процессора, то никаких проблем не возникает. У процессора никогда не бывает одновременно в наличии более нескольких сотен команд. Поэтому если мы потратим на каждую команду, допустим, 128 бит, то это не создаст затруднений. Кремния по-прежнему будет хватать на всё.
Когда декодер получает обычную команду, он обычно превращает её в одну или несколько микро-операций. Такие микро-операции и есть команды, с которыми на самом деле работает процессор. Они могут быть очень широкими и содержат множество дополнительной полезной информации. Приставка «микро» звучит иронично, ведь они оказываются шире. Однако на самом деле «микро» означает, что они имеют ограниченное количество задач.
Macro-operation fusing немного переворачивает работу декодера вниз головой: вместо превращения одной команды в несколько микро-операций, мы берём много операций и превращаем их в одну микро-операцию.
То есть происходящее в современном процессоре может выглядеть довольно странно:
- Сначала он объединяет две команды в одну с помощью сжатия.
- Затем он разделяет их на две с помощью распаковки.
- Далее комбинирует их обратно в одну операцию при помощи macro-op fusion.
Ключевым аспектом перехода к микро-операциям является нужный уровень сложности:
- Не слишком сложные, потому что в противном случае они не смогут завершиться за фиксированное количество тактов, выделенных на каждую команду.
- Не слишком простые, потому что иначе мы просто потратим ресурсы процессора впустую. Выполнение двух микро-операций займёт в два раза больше времени, чем выполнение всего одной.
Получаемые преимущества
Мы обсудили множество подробностей, поэтому сейчас вам, должно быть, трудно понять, в чём смысл всех этих трудов. Зачем нужны все эти сжатия и слияния? Похоже, что из-за них выполняется много лишней работы.
Во-первых, сжатие команд совершенно не походит на сжатие zip. Слово «сжатие» немного неверное, потому что мгновенное сжатие или распаковка команды выполняются абсолютно просто. На это не тратится времени.
То же самое относится к macro-operation fusion. Хотя этот процесс может казаться сложным, подобные системы уже используются в современных микропроцессорах. Поэтому затраты, которые добавляет вся эта сложность, уже были оплачены.
Однако в отличие от проектировщиков ARM, MIPS и x86, приступая к проектированию своего ISA, создатели RISC-V знали о сжатии команд и macro-ops fusion. Благодаря различным тестам с первым минимальным набором команд они сделали два важных открытия:
- Программы RISC-V обычно занимают примерно столько же или меньше места в памяти, чем любая другая процессорная архитектура. В том числе и x86, который должен эффективно использовать память, учитывая, что это ISA CISC.
- Ему требуется выполнять меньше микро-операций, чем другим ISA.
Это заставило коллектив разработчиков RISC-V удвоить усилия по реализации macro-operation fusion как фундаментальной стратегии RISC-V. В руководстве по RISC-V есть множество примечаний о том, с какими операциями можно выполнять слияние. Также в него внесены правки, упрощающие слияние команд, встречающихся в частых паттернах.
Благодаря малому ISA его проще изучать студентам. А это означает, что изучающему процессорные архитектуры студенту проще спроектировать собственный процессор, работающий на командах RISC-V. Стоит помнить, что и сжатие команд, и macro-op fusion использовать необязательно.
RISC-V имеет небольшой фундаментальный набор команд, реализация которого обязательна. Однако все остальные команды реализуются как части расширений. Сжатые команды — это просто дополнительное расширение.
Macro-op fusion — это просто оптимизация. Она не меняет поведения в целом, а поэтому её необязательно реализовывать в собственном процессоре RISC-V.
Стратегия проектирования RISC-V
RISC-V взял всё, что мы знаем сегодня о современных процессорах, и использовал эти знания в проектировании процессоров ISA. Например, мы знаем, что:
- Сегодня у процессорных ядер есть сложная система прогнозирования ветвления.
- Процессорные ядра суперскалярны, то есть выполняют множество команд параллельно.
- Для обеспечения суперскалярности используется выполнение команд с изменением очерёдности (Out-of-Order execution).
- Они имеют конвейеры.
Изначально условное выполнение создавалось для того, чтобы избегать ветвлений, потому что они плохо влияют на конвейеры. Для ускорения работы процессора он обычно заранее получает следующие команды, чтобы сразу после выполнения предыдущей на первой стадии процессора можно было подхватить следующую.
При условном ветвлении мы не можем заранее знать, где будет следующая команда, когда начинаем заполнять конвейер. Однако суперскалярный процессор может просто выполнять обе ветви параллельно.
Именно из-за этого RISC-V не имеет и регистров состояния, ведь они создают зависимости между командами. Чем более независима каждая команда, тем проще выполнять её параллельно с другой командой.
По сути, стратегия RISC-V заключается в том, что мы можем сделать ISA как можно более простым, а минимальную реализацию процессора RISC-V как можно более простой без необходимости принятия конструкторских решений, из-за которых невозможно будет создать высокопроизводительный процессор.
На правах рекламы
Наша компания предлагает серверы не только с CPU от Intel, но и серверы с процессорами AMD EPYC. Как и для других типов серверов, огромный выбор операционных систем для автоматической установки, есть возможность установить любую ОС с собственного образа. Попробуйте прямо сейчас!
RISC-V: архитектура, которую будут развивать в РФ. Перспективы и возможности в России и мире

RISC-V — это архитектура набора команд (ISA) для микропроцессоров, которая за последние пару лет стала весьма упоминаемой в СМИ и технологических дайджестах. Весной этого года мы уже писали о мифах в отношении архитектуры RISC-V и чипов на ее основе. Сейчас, насколько можно понять, эта архитектура продолжает развиваться, и один из регионов, где это происходит — Россия. На днях была создана ассоциация разработчиков на RISC-V, которая и будет развивать отечественные технологии и саму архитектуру. Подробности — под катом.
Что за ассоциация и зачем она нужна
Это объединение, которое называют еще и альянсом, ставит своей целью развивать архитектуру RISC-V в России, включая выпуск новых систем на базе этой архитектуры. В ассоциацию вошли достаточно крупные игроки, включая Yadro и «Байкал электроникс», а также разработчик ОС Astra Linux группа «Астра», разработчик технологической программно-аппаратной платформы Vostok и НИУ «Московский институт электронной техники». Стоит отметить, что первые две организации уже занимаются разработкой чипов на базе этой архитектуры. Называется ассоциация «Альянс RISC-V».
Участники, имея неплохой опыт в отрасли RISC-V, планируют развивать экосистему отечественных решений. В частности, планируется обеспечить совместимость этих решений, создание полигона для их тестирования, а также создать общую базу, доступ к которой получат все члены ассоциации.

«Кроме того, работа альянса будет сосредоточена на развитии и адаптации отраслевых стандартов на основе RISC-V, обеспечении ускоренного запуска разработок в массовое промышленное использование, экспертной поддержке разработчиков программного обеспечения, обучении студентов работе с технологиями на базе архитектуры RISC-V», — заявили партнеры того объединения.
А почему именно эта архитектура?
Дело в том, что она позволяет создавать гетерогенную вычислительную среду с ядрами, оптимизированными для различных типов вычислений, работающих вместе, что непривычно для людей. Стоит отметить, что идея не самая новая. Так, чип
Playstation 3 имел аналогичную архитектуру под названием Cell с ядром общего назначения Power Processor Element (PPE) и векторными процессорами специального назначения Synergistic Processing Elements (SPE).
Кроме того, у RISC-V — открытый исходный код, лицензионных платежей, которые нужны при использовании многих других архитектур, нет. Так что при должном старании архитектуру можно сделать санкционно независимой, поставив во главе угла отечественной электроники.
Однако PPE и SPE имели разные наборы команд, что осложняло работу с архитектурой Cell. У современных систем RISC-V преимущество в одинаковом базовом наборе команд и регистров для ядер всех типов.

Развивается архитектура около 10 лет. В 2015 году ее развитие достигло уже таких высот, что понадобилось даже учредить международную некоммерческую организацию RISC-V Foundation, в которую входят более 1000 членов в 50 странах. Правда, российский альянс не связан с международной организацией.
При поддержке ассоциации «Ростех» в сотрудничестве с Yadro к 2025 г. планирует создать отечественный процессор на базе указанной архитектуры.

Где взять деньги?
Весьма кстати правительство запустило программу выделения субсидий на строительство и развитие технопарков в сфере электроники. В 2023-2025 гг. на эти цели должны выделить около 7,2 млрд рублей. На разработку отечественных RISC-V чипов планируется выделить почти 28 млрд руб.
Что касается технопарков, то компании получают возможность частично возместить затраты на проектирование, а также на строительство, модернизацию, приобретение оборудования, плюс подключение к инженерным сетям. Средства будут направляться регионам, примерно по 300 млн рублей ежегодно в течение трех лет.
Благодаря этому проекту правительство ожидает создание в стране не менее 150 тыс. кв. м современных производственных площадей и до 3 тыс. рабочих мест.
Не Россией единой

Очень активно развивают у себя RISC-V архитектуру и Китай. В частности, уже создан процессор, а на его основе — первый ноутбук, который работает на процессоре с архитектурой RISC-V. Ноутбук Roma предназначен для разработчиков, которые создают и тестируют софт для платформы RISC-V.
Летом этого года стало известно о «системе на модуле» (SOM), которая объединяет чип RISC-V с четырьмя вычислительными ядрами, графический акселератор и нейропроцессорный блок (NPU). Все это необходимо для ускорения и оптимизации выполнения операций, связанных с искусственным интеллектом и машинным обучением.
Кроме того, летом 2022 года стало известно о том, что в Китае разрабатывается архитектура RISC-X, которая, как можно понять по названию, базируется на RISC-V. При этом, как и основа, новая технология будет открытой и бесплатной, причем не только для китайцев, но и для компаний из любых других стран. Китайцы мыслят масштабно, поэтому новая архитектура для них — запасной вариант на случай, если США попытается при помощи санкций «отлучить» их и от RISC-V, несмотря на открытость этой технологии.
Китайцы взяли за основу RISC-V по той простой причине, что это открытая технология, а значит, на ее основе можно разрабатывать собственные решения, какие угодно. Сейчас центром разработки RISC-V является некоммерческая организация RISC-V International. В нее входит около 1000 разных компаний из 50 стран мира. На данный момент RISC-V используется, в основном, в микроконтроллерах, но на ее основе можно разрабатывать и более производительные решения.

Как китайские, так и зарубежные эксперты считают, что если торговая война будет расширяться, то КНР и ее партнеры потеряют доступ к RISC-V. Ну а значит, единственный вариант продолжения работы с ней — создание похожей технологии, которая будет считаться отдельной разработкой. Освоив эту технологию, Китай сможет создавать любые собственные решения, не боясь санкций.
Ну и да, Индия тоже работает над развитием собственной архитектуры RISC-V. Летом 2022 года правительство страны разработало и анонсировало дорожную карту для проектирования и производства полупроводниковых компонентов, которые базируются на архитектуре RISC-V. Поставлять чипы мирового класса в больших объемах компания собирается к лету следующего года.
Что дальше?
Пока что главная проблема отечественной электроники — не архитектура, а изготовление современных чипов внутри страны, по собственным технологиям и с собственным оборудованием. На сегодняшний день эта задача выглядит достаточно сложно реализуемой, если вообще выполнимой. К выпуску отечественных чипов по 28 нм техпроцессу правительство рассчитывает перейти не ранее 2030 года. Хотелось бы надеяться, что новая ассоциация сможет ускорить реализацию этого проекта хотя бы немного.
- Блог компании Selectel
- Исследования и прогнозы в IT
- Производство и разработка электроники
- Компьютерное железо
- Процессоры
RISC-V

RISC-V — открытая и свободная система команд и процессорная архитектура на основе концепции RISC для микропроцессоров и микроконтроллеров.
2023
Российские разработчики готовят чипы на архитектуре RISC-V
11 октября 2023 года стало известно о том, что «Альянс RISC-V», в правление которого входят представители компаний «Байкал Электроникс», «Синтакор» и «Аквариус», подготовил дорожную карту развития архитектуры RISC-V в России. Ожидается, что отечественные разработчики начнут пробный выпуск таких микрочипов в 2025 году. Появление этих изделий позволит снизить зависимость от зарубежных процессоров, поставки которых в РФ ограничены в связи со сложившейся геополитической обстановкой.
Как сообщает газета «Коммерсантъ», речь идет о создании отечественных высокопроизводительных чипов с открытой архитектурой RISC-V для вычислительной и телекоммуникационной техники. Организовать производство подобных чипов намерены как минимум три российские компании, включая Yadro и «Байкал Электроникс». Серийный выпуск планируется начать в 2026 году.
![]()
«Альянс RISC-V» подготовил дорожную карту развития архитектуры RISC-V в России
Компании, проектирующие микроэлектронику на базе RISC-V, участвуют в альянсах, в частности, RISC-V International, для синхронизации разработки. Однако ряд конгрессменов оказывает давление на администрацию президента США Джо Байдена с целью ввести меры экспортного контроля в отношении технологии RISC-V. Если ограничения распространятся на Россию, отечественные разработчики могут потерять возможность принимать участие в международных альянсах RISC-V и в заседаниях технических комитетов. А это означает, что отечественные дизайн-центры будут вынуждены соблюдать технические стандарты, принятые без их участия.
Вместе с тем участники рынка полагают, что разработчики из РФ найдут способ обойти возможные ограничения. Так, гендиректор «Бештау» Олег Осипов отмечает, что если представителя российского разработчика перестанут допускать к участию в технических комитетах, «ничего не помешает учредить в Гонконге формально не связанное с ним юрлицо и делегировать в комитеты международных альянсов представителя уже этой компании». [1]
Крупнейшие в мире производители чипов создал компанию для развития открытой архитектуры RISC-V
4 августа 2023 года компании Qualcomm, NXP Semiconductors, Infineon Technologies, Nordic Semiconductor и Bosch объявили о формировании альянса по развитию открытой процессорной архитектуры RISC-V. Подробнее здесь.
2022
«Аквариус» займется разработкой процессоров на архитектуре RISC-V
10 октября 2022 года стало известно о планах «Аквариуса» заняться разработкой процессоров на открытой архитектуре RISC-V. Компания намерена получить субсидии Минпромторга. Подробнее здесь.
В России создан альянс разработчиков ПО и оборудования на основе микроархитектуры RISC-V
В конце сентября 2022 года стало известно о создании в России Ассоциации независимых разработчиков программного обеспечения и вычислительной техники на основе микроархитектуры RISC-V (Альянс RISC-V). Учредителем организации, согласно данных из ЕГРЮЛ, выступила президент Ассоциации больших данных Анна Серебряникова, бывший топ-менеджер и член совета директоров ПАО «МегаФон». Подробнее здесь.
В России планируют создать национальный центр компетенций процессорной архитектуры RISC-V
При дизайн-центре микроэлектроники полного цикла Mephius, который должен быть запущен на базе НИЯУ МИФИ в сентябре 2022 года, планируется создать национальный центр компетенций процессорной архитектуры RISC-V. Об этом 8 июня на подписании соглашения с ИТ-компаниями о создании дизайн-центра рассказал его замдиректора Владислав Самойлов.

Предпосылками к этому стало то, что на российском рынке сейчас немногие компании занимаются RISC-V, в то время как эта архитектура приобретает всё большую актуальность: она одна из немногих, с которыми сейчас можно работать в России, особенно ввиду перекрытия доступа местным разработчикам процессоров к архитектуре ARM на фоне санкций [2] . Российский рынок мобильных приложений для бизнеса и госсектора: крупнейшие игроки, тенденции и перспективы. Обзор TAdviser
Центр компетенций планируется создать для аккумуляции экспертизы в области RISC-V, разработки отдельных образовательных программ по этой архитектуре, для трансфера технологий, пояснил Владислав Самойлов.
![]()
В условиях санкций в России ещё больше вырос интерес к RISC-V
RISC-V – это открытая архитектура набора команд, которую можно свободно использовать, в отличие от того же ARM, требующего оплату лицензий. Проект зародился в 2010 году в Калифорнийском университете в Беркли, и с тех пор набирал популярность в мире. Проект RISC-V теперь поддерживают многие крупные компании, включая Google, Nvidia и Western Digital.
С разработчиками RISC-V взаимодействуют некоторые участники дизайн-центра микроэлектроники, который создаётся в НИЯУ МИФИ. Например, «Байкал Электроникс», разработчик процессоров «Байкал». В его новых процессорах используется одно из RISC-V ядер, которые разрабатывает российская компания CloudBEAR, как было озвучено на мероприятии, посвящённом подписанию соглашения о создании дизайн-центра. Группа «Вартон», которая в середине 2021 года приобрела контроль в «Байкал Электроникс», в сентябре того же года купила в CloudBEAR долю в 34%.
Также «Байкал Электроникс» плотно сотрудничал с Esperanto Technologies, где присутствуют сами основатели RISC-V. Они уже выпустили собственный энергоэффективный 1000-ядерный чип для искуственного интеллекта.
В июле 2021 года СМИ писали об интересе к RISC-V со стороны «Ростеха». Госкорпорация собиралась разработать новый отечественный процессор на базе этой архитектуры для использования в компьютерах для школ, вузов и больниц. Работать над чипом специалисты «Ростеха» собирались вместе с сотрудниками российской компании Yadro, которая, помимо прочего, занимается разработкой серверов и систем хранения данных [3] . Впрочем, с тех пор о проекте ничего больше слышно не было.
А в ноябре 2021-го компания «Микрон» выпустила экспериментальную партию отечественного микроконтроллера на архитектуре RISC-V [4] .
Российские процессорные разработки на базе RISC-V может поддержать государство. Так, за день до того, как в НИЯУ МИФИ были озвучены планы по созданию центра компетенций RISC-V, глава Минцифры Максут Шадаев выразил уверенность в том, что государство в ближайшее время выделит серьезный бюджет на поддержку отечественных процессорных разработок на этой архитектуре [5] .
Надо сказать, что, несмотря на открытость RISC-V, риск того, что России могут попытаться ограничить доступ к ней в том или ином виде, тоже существует. 7 мая в интервью The Register на это прямо намекнула Калиста Редмонд (Calista Redmond), CEO некоммерческой организации RISC-V International. Она заявила, что организация «не обязана блокировать чье-либо участие», но если дела пойдут по пути введения более жестких санкций на уровне страны, то, возможно, придётся изменить подход [6] .
C блокировкой со стороны Open Source ресурсов на фоне санкций российские разработчики уже сталкивались. В марте в сообществе начались споры о том, стоит ли ограничивать россиянам доступ к GitHub, а уже в апреле GitHub начал блокировать аккаунты российских компаний и разработчиков [7] .
Примечания
- ↑RISC-V столкнулась с рисками
- ↑Разработчиков российских процессоров Baikal и «Эльбрус» лишили доступа к архитектуре Arm
- ↑Разработчики «железа» для «закона Яровой» создают российский процессор за десятки миллиардов рублей
- ↑«Микрон» начал выпуск российского микроконтроллера для промышленности и интернета вещей
- ↑Минцифры: Власти крупно поддержат деньгами российских разработчиков процессоров на RISC-V
- ↑RISC-V CEO seeks 'world domination' by winning over the likes of Intel
- ↑В GitHub начали блокировать разработчиков из России, включая Сбер, «Альфа-банк» и частников
Создание процессора со свободной архитектурой RISC-V. Часть 1.
RISC-V — это свободная архитектура набора команд. Проект зародился в Калифорнийском университете в Беркли в 2010 году. Важную роль в его успехе сыграла открытость кода и свобода использования, что резко отличалось от многих других архитектур. Возьмите ARM: чтобы создать совместимый процессор, вы должны заплатить авансовый сбор от $1 млн до $10 млн, а также выплачивать роялти 0,5−2% с продаж. Свободная и открытая модель делает RISC-V привлекательным вариантом для многих, в том числе для стартапов, которые не могут оплатить лицензию на ARM или другой процессор, для академических исследователей и (очевидно) для сообщества open source.
Стремительный рост популярности RISC-V не остался незамеченным. ARM запустила сайт, который пытался (довольно безуспешно) подчеркнуть предполагаемые преимущества ARM над RISC-V (сайт уже закрыт). Проект RISC-V поддерживают многие крупные компании, включая Google, Nvidia и Western Digital.
Система команд
В архитектуре RISC-V имеется обязательное для реализации небольшое подмножество команд (набор инструкций I — Integer) и несколько стандартных опциональных расширений.
В базовый набор входят инструкции условной и безусловной передачи управления/ветвления, минимальный набор арифметических/битовых операций на регистрах, операций с памятью (load/store), а также небольшое число служебных инструкций.
Операции ветвления не используют каких-либо общих флагов, как результатов ранее выполненных операций сравнения, а непосредственно сравнивают свои регистровые операнды. Базис операций сравнения минимален, а для поддержки комплементарных операций операнды просто меняются местами.
Базовое подмножество команд использует следующий набор регистров: специальный регистр x0 (zero), 31 целочисленный регистр общего назначения (x1 — x31), регистр счётчика команд (PC, используется только косвенно), а также множество CSR (Control and Status Registers, может быть адресовано до 4096 CSR).
Для встраиваемых применений может использоваться вариант архитектуры RV32E (Embedded) с сокращённым набором регистров общего назначения (первые 16). Уменьшение количества регистров позволяет не только экономить аппаратные ресурсы, но и сократить затраты памяти и времени на сохранение/восстановление регистров при переключениях контекста.
При одинаковой кодировке инструкций в RISC-V предусмотрены реализации архитектур с 32, 64 и 128-битными регистрами общего назначения и операциями (RV32I, RV64I и RV128I соответственно).
Разрядность регистровых операций всегда соответствует размеру регистра, а одни и те же значения в регистрах могут трактоваться целыми числами как со знаком, так и без знака.
Нет операций над частями регистров, нет каких-либо выделенных «регистровых пар».
Операции не сохраняют где-либо биты переноса и/или переполнения, что приближено к модели операций в языке программирования C. Также аппаратно не генерируются исключения по переполнению и даже по делению на 0. Все необходимые проверки операндов и результатов операций должны производиться программно.
Целочисленная арифметика расширенной точности (большей, чем разрядность регистра) должна явно использовать операции вычисления старших битов результата. Например, для получения старших битов произведения регистра на регистр имеются специальные инструкции.
Размер операнда может отличаться от размера регистра только в операциях с памятью. Транзакции к памяти осуществляются блоками, размер в байтах которых должен быть целой неотрицательной степенью 2, от одного байта до размера регистра включительно. Операнд в памяти должен иметь «естественное выравнивание» (адрес кратен размеру операнда).
Архитектура использует только little-endian модель — первый байт операнда в памяти соответствует наименее значащим битам значений регистрового операнда.
Для пары инструкций сохранения/загрузки регистра операнд в памяти определяется размером регистра выбранной архитектуры, а не кодировкой инструкции (код инструкции один и тот же для RV32I, RV64I и RV128I, но размер операндов 4, 8 и 16 байт соответственно), что соответствует размеру указателя, типам языка программирования C size_t или разности указателей.
Для всех допустимых размеров операндов в памяти, меньших, чем размер регистра, имеются отдельные инструкции загрузки/сохранения младших битов регистра, в том числе для загрузки из памяти в регистр есть парные варианты инструкций, которые позволяют трактовать загружаемое значение как со знаком (старшим знаковым битом значения из памяти заполняются старшие биты регистра) или без знака (старшие биты регистра устанавливаются в 0).
Инструкции базового набора имеют длину 32 бита с выравниванием на границу 32-битного слова, но в общем формате предусмотрены инструкции различной длины (стандартно — от 16 до 192 бит с шагом в 16 бит) с выравниванием на границу 16-битного слова. Полная длина инструкции декодируется унифицированным способом из её первого 16-битного слова.
Для наиболее часто используемых инструкций стандартизовано применение их аналогов в более компактной 16-битной кодировке (C — Compressed extension).
Операции умножения, деления и вычисления остатка не входят в минимальный набор инструкций, а выделены в отдельное расширение (M — Multiply extension). Имеется ряд доводов в пользу разделения и данного набора на два отдельных (умножение и деление).
Стандартизован отдельный набор атомарных операций (A — Atomic extension).
Поскольку кодировка базового набора инструкций не зависит от разрядности архитектуры, то один и тот же код потенциально может запускаться на различных RISC-V архитектурах, определять разрядность и другие параметры текущей архитектуры, наличие расширений системы инструкций, а потом автоконфигурироваться для целевой среды выполнения.
Спецификацией RISC-V предусмотрено несколько областей в пространстве кодировок инструкций для пользовательских «X-расширений» архитектуры, которые поддерживаются на уровне ассемблера, как группы инструкций custom0 и custom1.
Список наборов команд
| Сокращение | Наименование | Версия | Статус |
|---|---|---|---|
| Базовые наборы | |||
| RV32I | Базовый набор с целочисленными операциями, 32-битный | 2.0 | Frozen |
| RV32E | Базовый набор с целочисленными операциями для встраиваемых систем, 32-битный, 16 регистров | 1.9 | Open |
| RV64I | Базовый набор с целочисленными операциями, 64-битный | 2.0 | Frozen |
| RV128I | Базовый набор с целочисленными операциями, 128-битный | 1.7 | Open |
| Стандартные расширеные наборы | |||
| M | Целочисленное умножение и деление (Integer Multiplication and Division) | 2.0 | Frozen |
| A | Атомарные операции (Atomic Instructions) | 2.0 | Frozen |
| F | Арифметические операции с плавающей точкой над числами одинарной точности (Single-Precision Floating-Point) | 2.0 | Frozen |
| D | Арифметические операции с плавающей точкой над числами двойной точности (Double-Precision Floating-Point) | 2.0 | Frozen |
| G | Сокращеное обозначение для комплекта из базового и стандартного наборов команд | н/д | н/д |
| Q | Арифметические операции с плавающей точкой над числами четвертной точности | 2.0 | Frozen |
| L | Арифметические операции над числами с фиксированной точкой (Decimal Floating-Point) | 0.0 | Open |
| C | Сокращённые имена для команд (Compressed Instructions) | 2.0 | Frozen |
| B | Битовые операции (Bit Manipulation) | 0.36 | Open |
| J | Двоичная трансляция и поддержка динамической компиляции (Dynamically Translated Languages) | 0.0 | Open |
| T | Транзакционная память (Transactional Memory) | 0.0 | Open |
| P | Короткие SIMD-операции (Packed-SIMD Instructions) | 0.1 | Open |
| V | Векторные расширения (Vector Operations) | 0.2 | Open |
| N | Инструкции прерывания (User-Level Interrupts) | 1.1 | Open |
В 32-битных микроконтроллерах и для других встраиваемых применений используется набор RV32EC. В 64-битных процессорах может быть набор групп RV64GC, то же самое в полной записи – RV64IMAFDC.
Форматы машинных команд
Формат 32-битной машинной команды (признаки – младшие биты всегда «11» и 2-4 биты ≠ «111» )
Регистры
RISC-V имеет 32 (или 16 для встраиваемых применений) целочисленных регистра. При реализации вещественных групп команд, 32 вещественных регистра.
Для операций над числами в бинарных форматах плавающей точкой используется набор дополнительных 32 регистров FPU (Floating Point Unit), которые совместно используются расширениями базового набора инструкций для трёх вариантов точности: одинарной — 32 бита (F extension), двойной — 64 бита (D — Double precision extension), а также четверной — 128 бит (Q — Quadruple precision extension).
Доступ к памяти
Как и многие проекты RISC, RISC–V является архитектурой load-store: инструкции адресуют только регистры, а инструкции load и store передаются в память и из памяти.
Большинство инструкций загрузки и хранения включают 12-битное смещение и два идентификатора регистра. Один регистр является базовым регистром. Другой регистр является источником (для записи) или местом назначения (для чтения.)
Смещение добавляется в базовый регистр для получения адреса. Формирование адреса в виде Базового регистра плюс смещение позволяет отдельным инструкциям получить доступ к структурам данных. Например, если базовый регистр указывает на вершину стека, отдельные инструкции могут обращаться к локальным переменным подпрограммы в стеке. Аналогичным образом инструкции загрузки и хранения могут обращаться к структуре стиля записи или устройству ввода-вывода с отображением в памяти. Использование постоянного нулевого регистра в качестве базового адреса позволяет отдельным командам обращаться к памяти вокруг нулевого адреса.[1]
Память адресуется как 8-битные байты, причем слова находятся в порядке little-endian.[1] Слова, вплоть до размера регистра, могут быть доступны с инструкциями загрузки и хранения.
Адреса доступной памяти не обязательно должны быть выровнены по ширине слова, но доступ к выровненным адресам может быть быстрее; например, простые процессоры могут реализовывать доступ к не выровненным данным с помощью программной эмуляции, которая вызвается в прерывании сбоя выравнивания, естественно это будет работать медленнее, чем аппаратная реализация.[1]
RISC-V управляет системами памяти, которые совместно используются процессорами или потоками, обеспечивая, чтобы поток выполнения всегда видел свои операции памяти в запрограммированном порядке. Но между потоками и устройствами ввода-вывода RISC-V упрощен: он не гарантирует порядок операций с памятью, за исключением конкретных инструкций, таких как fence.
Инструкция fence гарантирует, что результаты предшествующих операций видны для последующих операций других потоков или устройств ввода-вывода. Инструкция fence может гарантировать порядок комбинаций как орпераций работы с памятью, так и операций ввода-вывода с отображением в памяти. Например, он может разделять операции чтения и записи памяти, не влияя на операции ввода-вывода. Или, если система может работать устройства ввода / вывода параллельно с памятью, fence не заставляет их ждать друг друга. Один процессор с одним потоком может декодировать fence как nop.
Как и многие наборы команд RISC (и некоторые сложные наборы команд компьютера (CISC), такие как x86 и IBM System/360 семейств), RISC-V не имеет адресных режимов, которые записывают lданные обратно в регистры. Например, не предусмотрено команд с автоинкрементом адресных регистров.[1]
RISC-V мало похож на другие знакомые, успешные процессорные архитектуры, например, x86. Этот факт также уменьшает сложность процессора и немного уменьшает стоимость, потому что он читает все размеры слов в том же порядке. Например, набор инструкций RISC-V декодирует, начиная с самого младшего адресованного байта инструкции. Спецификация оставляет открытой возможность нестандартных систем big-endian или bi-endian.[1]
Некоторые процессоры RISC (такие как MIPS, PowerPC, DLX и Berkeley's RISC-I) размещают 16 бит смещения в теле команд load и store. Они устанавливают верхние 16 бит с помощью инструкции верхнего слова загрузки. Это позволяет легко устанавливать значения верхнего полуслова без сдвига битов. Тем не менее, в большинстве случаев использование инструкции верхнего полуслова создает 32-битные константы, такие как адреса. RISC-V использует SPARC-подобную комбинацию 12-битных смещений и 20-битных верхних кодов инструкций. Меньшее 12-битное смещение помогает компактным 32-битным командам загрузки и сохранения выбрать два из 32 регистров, но при этом все еще имеет достаточно битов для поддержки кодирования команд переменной длины RISC-V.[1]
Непосредственная адресация
RISC-V обрабатывает 32-битные константы и адреса с помощью инструкций, которые устанавливают старшие 20 бит 32-битного регистра. Инструкция непосредственной загрузки lui, загружает 20 бит в биты от 31 до 12. Затем вторая инструкция, такая как addi, может установить нижние 12 бит.
Этот метод расширен для того чтобы позволить создавать положение-независимый код путем добавление инструкции, например auipc которая генерирует 20 старших битов адреса путем добавления смещения к счетчику программы и сохранения результата в базовом регистре. Это позволяет программе генерировать 32-разрядные адреса, используя смещение относительно счетчика программы.
Базовый регистр часто можно использовать как есть с 12-битными смещениями для команд load и store. При необходимости addi может установить нижние 12 бит регистра. В 64-битных и 128-битных ISA lui и auipc расширяют результат, чтобы получить больший адрес.[1]
Некоторые быстрые процессоры могут интерпретировать комбинации инструкций как одиночные слитые инструкции. lui или auipc могут быть хорошими кандидатами для слияния с addi, load или store.
Вызовы подпрограмм, переходы и ветвления
Вызов подпрограммы RISC-V jal (jump and link) помещает свой обратный адрес в регистр. Это быстрее во многих компьютерных архитектурах, потому что это экономит доступ к памяти по сравнению с системами, которые сохраняют обратный адрес непосредственно на стеке в памяти. JAL имеет 20-битный знак (дополнение до 2) смещение. Смещение умножается на 2, а затем добавляется к счетчику программ PC, чтобы сгенерировать относительный адрес для 32-битной инструкции. Если результат не находится на 32-разрядном адресе (т. е. равномерно делится на 4), процессор может вызвать исключение.[1]
Процессоры RISC-V переходят к вычисляемым адресам с помощью jump и link-регистров, инструкции jalr. jalr похожи на jal, но получает свой адрес назначения, добавляя 12-битное смещение к базовому регистру. (В отличие от этого, jal добавляет большее 20-битное смещение к счетчику программ PC.)
Битовый формат jalr похож на регистр-относительные команды load и store. Как и они, jalr может использоваться с инструкциями, которые устанавливают верхние 20 бит Базового регистра, чтобы сделать 32-разрядные адреса условного перехода, либо абсолютные адреса (используя lui), либо относительно счетчика программ PC (используя auipc для позиционно-независимого кода). (Использование постоянного нулевого базового адреса позволяет создавать однокомандные вызовы с небольшим фиксированный положительным или отрицательным смещением адреса.)
RISC-V перерабатывает команды jal и jalr для получения безусловных 20-разрядных переходов относительно счетчика программ PC и безусловных 12-разрядных переходов на основе регистров. Переходы просто устанавливают регистр связи 0, чтобы обратный адрес не сохранялся.[1]
RISC-V также использует команду jalr для возврата из подпрограммы: для этого базовый регистр команды jalr устанавливается как регистр связи, сохраненный jal или jalr. Если смещение jalr и регистр связи рвны нулю, то смещение отсутствует, и обратный адрес не сохраняется.
Как и многие проекты RISC, в вызове подпрограммы компилятор RISC-V должен использовать отдельные инструкции для сохранения регистров в стеке при запуске, а затем для восстановления их из стека при выходе. RISC-V не имеет инструкций сохранения или восстановления нескольких регистров. Считалось, что они делают процессор слишком сложным и, возможно, медленным.[59] такая реализация может занять больше места в коде. Дизайнеры архитектуры планировали уменьшить размер кода с помощью библиотечных процедур для сохранения и восстановления регистров.[60]
RISC-V не имеет регистра кодов условия или бита переноса. Разработчики считали, что коды условий делают быстрые процессоры более сложными, заставляя взаимодействовать между инструкциями на разных этапах выполнения. Этот выбор делает арифметику повышенной точности более сложной. Кроме того, такое решение требуют больше энергии.[1]
Вместо этого, RISC-V использует инструкции условного перехода с коротким смещением, которые выполняются при соблюдении условия сравнения: равно, не равно, меньше, беззнаковое меньше, больше или равно и без знаковое больше или равно. Десять операций сравнения-ветвления выполняются используя только шесть инструкций, путем изменения порядка операндов в ассемблере. Например, ветвление при условии если операнд больше чем, может быть сделано с использованием иснструкции меньше-чем с обратным порядком операндов.[1]
Инструкции ветвления-сравнения имеют двенадцатиразряднное знаковое смещение и переходят относительно счетчика программ PC.[1]
ISA RISC-V требует предсказания ветвлений по умолчанию для проектируемых процессоров: Условные ветви с переходом назад должны быть предсказаны. Условные ветви с переходом вперед прогнозировать не берутся. Предсказания легко декодировать в конвейерном процессоре: адреса перехода- это знаковые числа в коде дополнения до 2, которые прибавляются к счетчику программ PC. Ветви с переходом назад имеют отрицательные смещения ареса в коде дополнения до 2, и, таким образом, имеют 1 в старшем значащем бите адреса. Ветви с переходом вперед имеют 0. Самый старший значащий бит находится в фиксированном месте в коде операции для ускорения конвейера. Сложные процессоры могут добавлять предсказатели ветвей, чтобы хорошо работать даже с необычными данными или ситуациями.
Руководство ISA рекомендует оптимизировать программное обеспечение, чтобы избежать остановок конвеера, используя прогноз ветвлений по умолчанию. Это позволяет повторно использовать старший значащий бит знакового относительного адреса в качестве бита подсказки, чтобы предсказать, будет ли выполнен условный переход или нет. Таким образом, никакие другие биты подсказки не требуются в кодах операций ветвления RISC-V. Эта особенность дает возможность использовать больше битов в кодах операций ветвления. Простые, недорогие процессоры могут просто следовать прогнозам по умолчанию и по-прежнему хорошо работать с оптимизирующими компиляторами. Компиляторы по-прежнему могут выполнять статистическую оптимизацию пути выполнения программы, если это необходимо.[1]
Чтобы избежать ненужной загрузки блока предсказания ветвления (и, следовательно, ненужных остановок конвейера), сравниваемые коды ветвления никогда не должны использоваться для безусловных переходов.[1]
RISC-V не поддерживает предикацию (условное выполнение инструкций), поскольку ее разработчики утверждают, что процессоры без предикации легче проектировать, а оптимизирующие компиляторы менее склонны ошибочно использовать предикацию там, где она не должна использоваться. Дизайнеры утверждают, что очень быстрые, out-of-order CPU все равно делают предикацию, выполняя ветвь сравнения и условный код параллельно, а затем отбрасывая эффекты неиспользуемой ветви. Они также утверждают, что даже в более простых процессорах предикация менее ценна, чем предсказание ветвей, что может предотвратить большинство остановок конвеера, связанных с условными ветвями. Код без предикации больше, с большим количеством ветвей, но они также утверждают, что сжатый набор команд (например, набор RISC-V версия C) решает эту проблему в большинстве случаев.[1]
Многие проекты RISC включали слот задержки ветвления, позицию после инструкции ветвления, которая может быть заполнена инструкцией, которая выполняется независимо от того, занята ли ветвь. Эта функция может повысить производительность конвейерных процессоров, поглощая часть времени, потраченного впустую, если процессор неправильно предсказывает работу условной ветви, и конвейер процессора останавливается. RISC-V пропускает слот задержки ветви, потому что он усложняет многоцикловые процессоры, суперскалярные процессоры и длинные конвейеры. Динамические предикторы ветвей достаточно хорошо работают, чтобы уменьшить потребность в отложенных ветвях.[1]
Арифметические и логические наборы команд
RISC-V разделяет математику на минимальный набор целочисленных инструкций (set I) с добавлением, вычитанием, сдвигом, битовой логикой и ветвлением со сравнением. Реализации могут имитировать большинство других наборов инструкций RISC-V с помощью программного обеспечения. (Атомарные инструкции являются заметным исключением.) RISC-V в настоящее время не хватает счетчика ведущих нулей и операций над битовым полем, которые обычно используются для ускорения программного обеспечения с плавающей точкой в процессоре с чистыми целочисленными инструкциями.
Целочисленные инструкции умножения (набор M) включают в себя знаковое и беззнаковое умножение и деление. Целочисленные операции умножения и деления двойной точности включены, как умножения и деления, которые вычисляют старшее слово результата. В документе ISA рекомендуется, чтобы разработчики процессоров и компиляторов объединяли стандартизированную последовательность команд умножения и деления старших и младших разрядов комбинировали в одну операцию, если это возможно.[1]
Инструкции с плавающей точкой (набор F) включают арифметику с одинарной точностью, а также условные переходы, аналогичные целочисленной арифметике. Для этого требуется дополнительный набор из 32 регистров с плавающей точкой. Они отделены от целочисленных регистров. Инструкции с плавающей точкой двойной точности (набор D) обычно предполагают, что регистры с плавающей точкой являются 64-разрядными (т. е. двойной длины), и подмножество F совместимо с набором D. Также определяется 128-битный ISA (Q) с плавающей точкой с квадратичной точностью. Процессоры RISC-V без плавающей точкой могут использовать библиотеку программной эмуляции работы с плавающей точкой.[1]
RISC-V не вызывает исключений по арифметическим ошибкам, включая переполнение, исчезновение значащих разрядов, субнормализацию и деление на ноль. Вместо этого как целочисленная, так и арифметика с плавающей точкой выдают разумные значения по умолчанию и устанавливают биты состояния. Деление на ноль может быть обнаружено одной ветвью после деления. Биты состояния могут быть проверены операционной системой или периодическим прерыванием.[1]
Атомарные операции с памятью
RISC-V поддерживает компьютеры, которые совместно используют память между несколькими процессорами и потоками. Стандартной моделью согласованности памяти RISC-V является согласованность освобождения. То есть операции load и store могут быть в целом переупорядочены, но некоторые операции load могут быть обозначены как операции выделения, которые должны предшествовать более поздним обращениям к памяти, а некоторые операции store могут быть обозначены как операции release, которые должны следовать за более ранними обращениями к памяти.[1]
Базовый набор команд включает в себя минимальную поддержку в виде команды fence для обеспечения упорядочения памяти. Хотя этого достаточно (операции fence r, rw обеспечивают выделение и fence rw, w обеспечивает освобождение), хотя комбинированные операции могут быть более эффективными.[1]
Расширение atomic memory operation extension поддерживает два типа атомарных операций памяти для обеспечения release consistency. Во-первых, он предоставляет универсальные инструкции load-reserved lr и store-conditional sc. lr выполняет загрузку и пытается зарезервировать этот адрес для своего потока. Выполняющаяся позднее операция store-conditional sc для записи в зарезервированный адрес будет выполнена только в том случае, если резервирование не будет нарушено промежуточной операцией store из другого источника. Если операция store выполнена успешно, ноль помещается в сохраненный регистр. Если запись не удалась, ненулевое значение указывает, что программное обеспечение должно повторить операцию. В любом случае бронирование аннулируется.[1]
Вторая группа атомарных инструкций выполняет последовательности чтения-изменения-записи: load (которая необязательно является load-acquire) в регистр назначения, затем операция между загруженным значением и исходным регистром, затем store результата (которое может необязательно быть store-release). Создание дополнительных барьеров памяти позволяет комбинировать операции. Дополнительные операции включаются с помощью битов acquire и release, которые присутствуют в каждой атомарной инструкции. RISC-V определяет девять возможных операций: swap (непосредственно использовать значение исходного регистра); add; побитовое and, or и exclusive-or; и знаковый и беззнаковый минимум и максимум.[1]
Конструкция системы может оптимизировать эти совмещенные операции больше чем lr и sc. Например, если регистр назначения для swap является постоянным нулем, загрузка может быть пропущена. Если сохраненное значение не изменено с момента загрузки, store может быть пропущено.[1]
IBM System/370 и его преемники, включая Z / Architecture и x86, реализуют инструкцию compare-and-swap (cas), которая проверяет и условно обновляет местоположение в памяти: если местоположение содержит ожидаемое старое значение, cas заменяет его заданным новым значением; затем он возвращает указание о том, внес ли он изменение. Однако простая инструкция типа load обычно выполняется перед cas для извлечения старого значения. Классическая проблема заключается в том, что если поток читает (загружает) значение A, вычисляет новое значение C, а затем использует (cas) для замены A на C, он не может знать, заменила ли программа в другом потоке какое-либо другое значение B, а затем восстановила A между ними. В некоторых алгоритмах (например, в тех, в которых значения в памяти являются указателями на динамически выделенные блоки) эта проблема ABA может привести к неверным результатам. Наиболее распространенное решение использует инструкцию cas двойной ширины для обновления указателя и смежного счетчика; к сожалению, такая инструкция требует специального формата инструкции для указания нескольких регистров, выполняет несколько операций чтения и записи и может иметь сложную операцию шины.[1]
Альтернатива использования lr/sc инструкций более эффективна. Обычно требуется только одна операция загрузка памяти, так как желательно минимизировать медленные операции с памятью. Это также точно: он контролирует все обращения к ячейке памяти, а не просто обеспечивает битовый шаблон. Однако, в отличие от cas, он может разрешить livelock, в котором два или более потоков неоднократно вызывают сбой инструкций друг друга. RISC-V гарантирует поступательное продвижение (без livelock), если код следует правилам о времени и последовательности инструкций: 1) он должен использовать только подмножество I. 2) чтобы предотвратить повторяющиеся промахи кэша, код (включая цикл повтора) должен занимать не более 16 последовательных инструкций. 3) оно не должен включать никакие инструкции system или fence, или выполнение обратных ветвлений между lr и sc. 4) Обратная ветвь цикла повторения должна соответствовать исходной последовательности. [1]
В спецификации приведены примеры использования этого подмножества для блокировки структуры данных.[1]
Сокращенные команды
Стандарт RISC-V ISA указывает, что все инструкции являются 32-битными. Это делает особенно простой реализацию, но, как и другие процессоры RISC с таким кодированием команд, приводит к большему размеру кода, чем в других наборах команд.[1] [59] для компенсации 32-разрядные инструкции RISC-V на самом деле составляют 30 бит; 3⁄4 пространства кода операции зарезервировано для дополнительного (но рекомендуемого) сжатого набора команд переменной длины, RVC, который включает 16-разрядные инструкции. Как и ARM's Thumb и MIPS16, сжатые инструкции являются просто псевдонимами для подмножества более крупных инструкций. В отличие от ARM's Thumb или сжатого набора MIPS, пространство было зарезервировано с самого начала, поэтому нет отдельного режима работы. Стандартные и сжатые инструкции могут быть смешаны свободно.[1] [59] (ревизия С)[60]
Поскольку (как Thumb-1 и MIPS16) сжатые инструкции являются просто альтернативными кодировками (псевдонимами) для выбранного подмножества более крупных инструкций, сжатие может быть реализовано в ассемблере, и компилятору не обязательно даже знать об этом.
Прототип RVC был протестирован в 2011 году.[59] код прототипа был на 20% меньше, чем сжатый код x86 PC и MIPS, и на 2% больше, чем код ARM Thumb-2.[59] Это также существенно уменьшило как необходимую кэш-память, так и оценочное энергопотребление системы памяти.[59]
Исследователи намеревались уменьшить двоичный размер кода для небольших компьютеров, особенно встроенных компьютерных систем. Прототип включал 33 наиболее часто используемые инструкции, перекодированные в виде компактного 16-битного формата с использованием кодов операций, ранее зарезервированных для сжатого набора.[59] сжатие было сделано в ассемблере, без изменений в компиляторе. Сжатые инструкции пропускали поля, которые часто равны нулю, использовали небольшие непосредственные значения или обращались к подмножествам (16 или 8) регистров. Операция addi очень распространена и часто сжимается.[59]
Большая часть разницы в размере по сравнению с набором Arm's Thumb произошла из-за того, что RISC-V и прототип не имеют инструкций по сохранению и восстановлению нескольких регистров. Вместо этого компилятор генерирует обычные инструкции, которые обращаются к стеку. Затем прототип RVC assembler часто преобразовывал их в сжатые формы, которые были вдвое меньше. Однако это по-прежнему занимало больше места в коде, чем инструкции ARM, которые сохраняют и восстанавливают несколько регистров. Исследователи предложили модифицировать компилятор для вызова библиотечных подпрограмм для сохранения и восстановления регистров. Эти процедуры, как правило, остаются в кэше кода и, таким образом, выполняются быстро, хотя, вероятно, не так быстро, как команда сохранения нескольких регистров.[59]
Стандарт RVC требует переодического использования 32-разрядных инструкций. Несколько нестандартных реализаций RVC являются полными, не требующими 32-разрядных инструкций, и, как говорят, имеют более высокие плотности, чем стандартные RVC.[61] [62] Другая реализация основывается на них и утверждает, что также использует меньший диапазон кодирования.[63]
Команды для встраиваемых применений
Набор команд для самых маленьких встроенных процессоров (набор E) сокращается другими способами: поддерживаются только 16 из 32-разрядные целочисленные регистры. Инструкции с плавающей точкой не должны поддерживаться (спецификация запрещает это как неэкономичное), поэтому должна использоваться библиотека программного обеспечения с плавающей точкой.[1] Рекомендуется использовать сжатый набор C. Привилегированный набор команд поддерживает только машинный режим, пользовательский режим и схемы памяти, которые используют перемещение базовых и связанных адресов.[18]
Происходило обсуждение профиля микроконтроллера для RISC-V, чтобы упростить разработку глубоко встроенных систем. Оно сосредоточено на более быстрой, простой поддержке языка C для прерываний, упрощенных режимах безопасности и упрощенном двоичном интерфейсе приложений POSIX.[64]
Корреспонденты также предложили меньшие нестандартные 16-битные ISA RV16E: в нескольких серьезных предложениях использовались бы 16-битные инструкции C с 8 × 16-битными регистрами. [66] [67] В качестве первоапрельской шутки предложили очень практичную схему: использовать 16 × 16-битные целочисленные регистры со стандартными Eimc ISAs (включая 32-битные инструкции.) Шутка состояла в том, чтобы предложить регистры с переключением банков, когда 32-битный процессор будет явно лучше..[67]
Привелегированные набор команд
ISA RISC-V включает отдельную привилегированную спецификацию набора инструкций. По состоянию на август 2019 года, версия 1.11 ратифицирована фондом.[2][18]
Версия 1.11 спецификации поддерживает несколько типов компьютерных систем:
- Системы, которые имеют только машинный режим, возможно, для встроенных систем,
- Системы как с машинным режимом (для супервизора), так и с пользовательским режимом для реализации операционных систем, запускающих ядро в привилегированном режиме.
- Системы с машинным режимом, гипервизорами, несколькими супервизорами и пользовательскими режимами под каждым супервизором.
Они примерно соответствуют системам реализации С- максимум с четырьмя кольцами привилегий и безопасности: машина, гипервизор, супервизор и пользователь. Каждый уровень также должен иметь тонкий слой стандартизированного поддерживающего программного обеспечения, которое взаимодействует с более привилегированным уровнем или аппаратным обеспечением.[18]
Общий план для этого ISA состоит в том, чтобы сделать режим гипервизора ортогональным режимам пользователя и супервизора.[68] Основная функция-это бит конфигурации, который либо разрешает коду уровня супервизора обращаться к регистрам гипервизора, либо вызывает прерывание при доступе. Этот бит позволяет режиму супервизора напрямую обрабатывать аппаратное обеспечение, необходимое гипервизору. Это упрощает гипервизор типа 2, размещенный в операционной системе. Это популярный режим для запуска warehouse-scale компьютеров. Для поддержки типа 1, неустановленных гипервизоров, бит может вызвать прерывание этих обращений к гипервизору. Бит упрощает вложенность гипервизоров, в которых гипервизор работает под гипервизором. Также говорится, что это упрощает код супервизора, позволяя ядру использовать свои собственные функции гипервизора с собственным кодом ядра. В результате форма гипервизора ISA поддерживает пять режимов: машина, супервизор, пользователь, супервизор под гипервизором и пользователь под гипервизором.
Спецификация набора привилегированных инструкций явно определяет аппаратные потоки. Несколько аппаратных потоков являются обычной практикой в более продвинутых компьютерах. Когда один поток останавливается, ожидая доступ к памяти, другие потоки иногда могут продолжать. Аппаратные потоки могут помочь лучше использовать большое количество регистров и исполнительных блоков в быстрых процессорах вне порядка. Наконец, аппаратные потоки могут быть простым и мощным способом обработки прерываний: не требуется сохранение или восстановление регистров, просто выполняется другой аппаратный поток. Однако единственным аппаратным потоком, необходимым для компьютера RISC-V, является нулевой поток.[18]
Существующие определения регистров управления и состояния поддерживают исключения ошибок и памяти RISC-V, а также небольшое количество прерываний. Для систем с большим количеством прерываний спецификация также определяет контроллер прерываний. Прерывания всегда начинаются на самом высоком привилегированном машинном уровне, и управляющие регистры каждого уровня имеют явные биты пересылки для маршрутизации прерываний в менее привилегированный код. Например, гипервизор не должен включать программное обеспечение, которое выполняется на каждом прерывании для пересылки прерывания в операционную систему. Вместо этого, при настройке, он может установить биты для переадресации прерывания.[18]
В спецификации поддерживается несколько систем памяти. Физический - только подходит для самых простых встроенных систем. Существует также три системы виртуальной памяти в стиле UNIX для кэширования памяти в системах массового хранения. Системы виртуальной памяти имеют три размера, с адресами размером 32, 39 и 48 бит. Все системы виртуальной памяти поддерживают 4 страницы KiB, многоуровневые деревья таблиц страниц и используют очень похожие алгоритмы для обхода деревьев таблиц страниц. Все они предназначены для аппаратного или программного обхода страниц. Чтобы дополнительно снизить стоимость переходов по таблицам страниц, сверхразмерные страницы могут быть конечными страницами на более высоких уровнях дерева таблиц страниц системы. SV32 имеет двухслойное дерево таблиц страниц и поддерживает 4 MiB суперстраницы. SV39 есть три таблицы на уровне страницы, и поддерживает 2 MiB суперстраницы и 1 GiB гигастраницы. SV48 требуется для поддержки SV39. Он также имеет 4-уровневую таблицу страниц и поддерживает 2 MIB суперстраницы, 1 GiB гигастраницы и 512 GiB террастраницы. Суперстраницы выравниваются по границам страницы для следующего самого низкого размера страницы.[18]
Битовые операции
Была проделана существенная работа по созданию предварительного, хотя и не одобренного, набора инструкций ISA битовых манипуляций (B) для RISC-V. Исполнение набора инструкций хорошее, подмножество битовых манипуляций может помочь криптографическим, графическим и математическим операциям. Критерии для включения, задокументированные в проекте, заключались в соблюдении принципов RV5 и форматов ISA, существенном улучшении плотности или скорости кода (т. е., по крайней мере, сокращение инструкций 3 к 1) и существенных реальных приложениях, включая уже существующую поддержку компилятора. Версия 0.37 включала в себя [69] бесспорные инструкции для подсчета ведущих нулей, подсчета одного бита, выполнения и дополнения, сдвига, поворота, обобщенного битового реверса и перетасовки, байтовых свопов, битовых экстрактов и депозитов и некоторых битовых манипуляций для сжатого набора (not, neg и reverse). Он также включает в себя спорное предложение по извлечению и размещению битового поля, используя нестандартный 48-битный формат инструкций.
Компактный набор команд для SIMD
Для простых, экономичных систем RISC-V предлагается использовать биты регистров с плавающей точкой для выполнения параллельной одиночной инструкции, с множественными данными (SIMD). Это широко используется для ускорения мультимедиа и приложений цифровой обработки сигналов.[1] По состоянию на 2016 год этот ISA не определен, но может напоминать мультимедийные инструкции PA-RISC: Multimedia Acceleration eXtensions. Помимо родной 64-битной математики, процессор PA-RISC MAX2 может выполнять арифметику сразу по четырем 16-битным подсловам с несколькими методами переполнения. Он также может перемещать подслова в разные позиции. MAX2 PA-RISC был намеренно упрощен. Ему не хватало поддержки 8-битных или 32-битных подслов. 16-битный размер подслова был выбран для поддержки большинства задач цифровой обработки сигналов. Эти инструкции были недорогими для проектирования и производства. Тем не менее, они увеличили производительность процессора на задачах цифровой обработки сигналов более чем в 48 раз, что позволило на практике запускать видеокодеки в реальном масштабе времени в 1995 году.[70] [71]
Операции с векторами
Предлагаемый набор команд векторной обработки может сделать набор packed SIMD устаревшим. Проектировщики надеются получить достаточную гибкость, чтобы процессор мог реализовать векторные инструкции в регистрах стандартного процессора. Это позволит обеспечить минимальные реализации с аналогичной производительностью для мультимедийного ISA, как указано выше. Однако истинный векторный сопроцессор может выполнять тот же код с более высокой производительностью.[72]
По состоянию на 29 июня 2015 года предложение по векторной обработке представляет собой консервативную, гибкую конструкцию универсального векторного процессора смешанной точности, пригодного для выполнения вычислительных ядер. Код будет легко переноситься на процессоры с разной длиной вектора, в идеале без перекомпиляции.[72]
Напротив, короткие SIMD-расширения менее удобны. Они используются в x86, ARM и PA-RISC. В них изменение ширины слова вызывает изменение набора команд для расширения векторных регистров (в случае x86 - с 64-битных регистров MMX до 128-битных потоковых SIMD-расширений (SSE) на 256-битные расширенные Векторные расширения (AVX) и AVX-512). Результатом является растущий набор команд и необходимость переносить рабочий код в новые инструкции..
В векторном ISA RISC-V вместо фиксирования длины вектора в архитектуре доступна команда (setvl), которая принимает запрашиваемый размер и устанавливает длину вектора равной минимуму аппаратного предела и запрашиваемого размера. Таким образом, предложение RISC-V больше похоже на длинно-векторный дизайн Cray. То есть каждый вектор, содержащий до 32 векторов, имеет одинаковую длину.[72]
Приложение задает общую ширину вектора, которая ему требуется, а процессор определяет длину вектора, которую он может предоставить с помощью доступных внутрикристальных ресурсов. Реализация принимает форму инструкции (vsetcfg) с четырьмя непосредственными операндами, указывающими количество векторных регистров каждой необходимой ширины. Общая сумма должна быть не более адресуемого ограничения в 32, но может быть меньше, если приложение не требует их всех. Длина вектора ограничена доступным хранением на кристалле, деленным на количество байтов памяти, необходимых для каждой записи. (Могут также существовать дополнительные аппаратные ограничения, что, в свою очередь, может позволить реализации в стиле SIMD.)[72]
За пределами векторных циклов приложение может запрашивать регистры с нулевым вектором, что позволяет операционной системе сохранять их при переключении контекста.[72]
Длина вектора не только архитектурно изменчива, но и предназначена для изменения во время выполнения. Для достижения такой гибкости набор инструкций, вероятно, будет использовать пути данных переменной ширины и операции переменного типа с использованием полиморфной перегрузки.[72] план состоит в том, что они могут уменьшить размер и сложность ISA и компилятора.[72]
Последние экспериментальные векторные процессоры с трактами данных переменной ширины также показывают прибыльное увеличение операций в секунду (скорость), площадь (более низкая стоимость) и Ватт (более длительный срок службы батареи).[73]
В отличие от типичного современного графического процессора, не планируется предоставлять специальное оборудование для поддержки предикации ветвей. Вместо этого будет использоваться более дешевая предикация на основе компилятора.[72] [74]
Команды для отладки
Существует предварительная спецификация для аппаратного отладчика RISC-V. Отладчик будет использовать транспортную систему, такую как Joint Test Action Group (JTAG) или Universal Serial Bus (USB) для доступа к отладочным регистрам. Стандартный аппаратный интерфейс отладки может поддерживать либо стандартизированный абстрактный интерфейс, либо подачу команд.[75] [76]
По состоянию на январь 2017 года точная форма абстрактного интерфейса остается неопределенной, но предложения включают систему отображения памяти со стандартизированными адресами для регистров отладочных устройств или регистром команд и Регистром данных, доступным для системы связи.[75] корреспонденты утверждают, что подобные системы используются интерфейсом фонового режима отладки Freescale (BDM) для некоторых процессоров, ARM, OpenRISC и LEON Aeroflex.[75]
При подаче инструкций ЦП будет обрабатывать исключение отладки для выполнения отдельных инструкций, записанных в регистр. Это может быть дополнено регистром передачи данных и модулем для прямого доступа к памяти. Подача инструкций позволяет отладчику получать доступ к компьютеру точно так же, как и программное обеспечение. Это также сводит к минимуму изменения в процессоре и адаптируется ко многим типам процессоров. Говорят, что это особенно подходит для RISC-V, потому что он разработан специально для многих типов компьютеров. Регистр передачи данных позволяет отладчику записывать цикл перемещения данных в ОЗУ, а затем выполнять цикл для перемещения данных в или из компьютера со скоростью, близкой к максимальной скорости канала данных системы отладки. [76] Корреспонденты утверждают, что подобные системы используются MIPS Technologies MIPS, Intel Quark, Xensa от Tensilica и интерфейсом фонового режима отладки (BDM) процессоров Freescale Power ISA.[75]
Ссылки
1) Waterman, Andrew; Asanović, Krste. "The RISC-V Instruction Set Manual, Volume I: Base User-Level ISA version 2.2" University of California, Berkeley. EECS-2016-118. Retrieved 25 May 2017.
4) "Contributors" riscv.org. Regents of the University of California. Retrieved 25 August 2014.
12) Patterson, David A.; Ditzel, David R. (October 1980). "The Case for the Reduced Instruction Set Computer". ACM SIGARCH Computer Architecture News. 8 (6): doi:10.1145/6419