
RISC-V: детальна критика архітектури від інженера
Інженер Дмитро Грінберг опублікував велике есе, у якому доводить, що RISC-V не може бути найкращою ані для мікроконтролерів, ані для серверних ядер, а її необов'язкові розширення роблять відповідність стандарту майже беззмістовною.
Інженер Дмитро Грінберг опублікував на своєму блозі dmitry.gr велике есе під назвою «RISC-V: They Should Have Known Better», зібравши в одному тексті всі аргументи, через які він скептично ставиться до відкритої архітектури набору інструкцій. За його словами, текст написано для того, щоб наступного разу відповідати на запитання про свою позицію простим посиланням.
Одна архітектура не може обслуговувати всіх
Жоден набір інструкцій не може бути найкращим для всіх випадків: потреби високопродуктивного ядра й дешевого мікроконтролера прямо протилежні. Грінберг очікує, що RISC-V зрештою займе місце 8051 у сегменті дешевих одноразових мікроконтролерів — але не завдяки своєму дизайну, а всупереч йому. Показовий приклад — обробка переривань: шлях, сумісний зі специфікацією, вимагає розширення Zicsr та регістрів mscratch або sscratch, і, за підрахунками автора, коштує щонайменше 44 такти до того, як обробник на C почне працювати. Cortex-M0 входить у переривання за 15 тактів і виходить за 12, тобто за 27, бо зберігає регістри апаратно. Навіть варіант RV32E із меншою кількістю регістрів сягає 38 тактів — більш ніж на третину повільніше. Існування CLIC і власних «швидких IRQ» від виробників — це додатковий докір: базова ISA змушує будувати нестандартний кремній, щоб наздогнати десятирічне ядро.
Стиснені інструкції та доступ до масивів
Дизайн стиснених інструкцій автор вважає особливо слабким. 16-бітна інструкція запису байта кодує лише зсуви від нуля до трьох, запис півслова — нуль або два, запис слова — від нуля до 124. Cortex-M0 дозволяє зсуви від нуля до 31 для байтів і до 62 для півслів. До того ж інструкції запису байта й півслова належать не до розширення C, а до окремого Zcb. Друга проблема — індексна адресація: у x86 є [ebx + esi * 4], в ARM — [R0, R1, LSL #2], а в RISC-V доступ до елемента масиву потребує трьох інструкцій. Виправдання, ніби швидкі ядра об'єднають їх в одну, слабке: жодне відоме ядро не зливає більше ніж дві послідовні інструкції. Розширення Zba з інструкціями SHxADD ратифікували лише 2021 року — більш ніж через два роки після базової специфікації.
Усе необов'язкове
Грінберг порівнює RISC-V із USB-C і RCS: заяви про відповідність стандарту майже нічого не означають, бо майже все там необов'язкове. Множення — необов'язкове. Ділення — необов'язкове. Режими користувача й супервізора, CSR-регістри, стиснені інструкції — теж. CSR, які спочатку входили до базового набору, винесли в окреме розширення Zicsr, тож базова ISA сьогодні не має ні стандартного способу обробляти переривання, ні розділення привілеїв. Регістр, покликаний відповідати, чи реалізовано функцію, — це misa, сам CSR, підтримка якого необов'язкова, і він може читатися як самі нулі. Те саме стосується системного таймера, відображеного в пам'ять за визначеною реалізацією адресою, і обох режимів векторизації переривань, жоден з яких не є обов'язковим.
SiTech — веброзробка з підтримкою AI
Створюємо швидкі та сучасні сайти й інтегруємо AI у бізнес-процеси. Маєте проєкт чи запитання? Із задоволенням допоможемо.