Уровень 48: Прощай, аккумулятор!
Задание
Цель: сравнить две машины: аккумуляторную (каждая операция три раза гоняет данные через ACC) и регистровую (RegFile из 32 ячеек). Выполните все задания виджета — и попробуйте записать 42 в x0: он останется нулём.
Первый уровень RISC Lab — без схем и кода. Перед вами интерактивный виджет с двумя машинами: слева знакомый аккумуляторный процессор из части 2, справа — регистровая машина с файлом из 32 регистров по 32 бита. Выполните четыре задания виджета и ответьте на вопрос уровня.
В аккумуляторной архитектуре одна из сторон каждой арифметической операции привязана к регистру ACC. Команда ADD x5 читает ACC, складывает его с x5 и пишет результат обратно в ACC. Данные трижды за команду проходят через один и тот же регистр — в этом и узкое место.
В регистровой архитектуре команда явно указывает оба источника и место назначения. Трёхоперандная команда ADD x5, x6, x7 означает: прочитать x6, прочитать x7, сложить, записать сумму в x5. Ни один регистр не привилегирован — кроме одного.
Задания виджета:
- Прогнать сложение на аккумуляторной машине — счётчик проходов через ACC вырастет на 3.
- Записать 42 в x5 регистровой машины и прочитать значение обратно.
- Попробовать записать 42 в x0 — и убедиться, что он останется нулём.
- Прочитать x5 двумя портами одновременно — регистровый файл выдаёт оба операнда за один такт.
Решение для самопроверки
Сначала выполните эксперименты в виджете. Решение ниже поможет сверить понимание.
Что должно получиться: все четыре задания виджета выполнены: сложение прогнано (счётчик проходов через ACC вырос на 3), 42 записана в x5 и прочитана, запись в x0 оставила ноль, два порта чтения выдали x5 одновременно.
x0 — не регистр, а константа. Ноль в программах нужен так часто, что в RV32I его сделали «бесплатным»: биты x0 физически подключены к нулю, а декодер записи его никогда не выбирает. Запись в x0 не изменяет его значение — не потому, что процессор сбрасывает регистр каждый такт, а потому, что записывающего пути у x0 просто нет.
Два порта чтения. Регистровый файл выдаёт значения двух разных регистров одновременно — это необходимо командам вида ADD x5, x6, x7: оба операнда должны попасть в АЛУ за один такт.
Сравнение архитектур. Посчитайте проходы через ACC в короткой программе: каждая арифметическая команда добавляет три (чтение ACC, запись ACC, плюс чтение операнда из памяти или регистра). В регистровой машине данные идут напрямую из регистра в регистр — ACC в цепочке не участвует.
После всех четырёх заданий откроется концепт-чек: почему запись в x0 «пропадает»? Верный ответ — первый: x0 физически не существует как регистр, его биты заземлены.
Материалы по теме
- Хаб «Микроархитектура RISC» — карта всей части 5
- Уровень 18: ФИНАЛ — Компьютер Ершова — аккумуляторная машина, которую вы сегодня отправляете на покой
Проверь себя
Почему запись в x0 «пропадает», хотя он выглядит как обычный регистр?
У x0 нет записывающего пути: его биты физически заземлены, а декодер записи никогда его не выбирает. Константа ноль «бесплатна» в каждой команде — поэтому x5 через x0 обнуляется без лишних инструкций.