«Что значит имя? Роза пахнет розой...»
RISC-архитектура
Эдуард Пройдаков
В нелегком 1990-м Владимир Голев, руководитель нашей небольшой группы, делавшей в ту пору встраиваемые контроллеры для ультразвуковых дефектоскопов, спросил меня, знаю ли я систему команд какого-нибудь RISC-процессора и можем ли мы быстренько разработать архитектуру такого процессора для промышленного применения. Кстати, в отличие от обычных процессоров, проектирование RISC-процессора на порядок проще и требует по разным оценкам около 12 человеко-месяцев работы.
Постановка задачи была абсолютно правильна и как всегда на много лет опережала то, что в итоге было сделано на Западе. Литературы на русском языке по RISC-процессорам я не встречал ни тогда, ни сейчас. Справочная система научно-технической библиотеки (ГПНТБ), "крутившаяся" на ЕС ЭВМ, выдала мне список из трех десятков журнальных статей. Сегодня благодаря Интернет все стало намного проще... и сложнее. Вы получаете море ссылок, но чтобы найти нужное описание, придется потратить немало времени.
Готовя тематический обзор, посвященный современным процессорам, я вспомнил про изыскания тех лет и подумал, что неплохо было бы, не вдаваясь в многочисленные детали, просто рассказать о том, что такое RISC-архитектура.
Итак, что значит имя?
Термин RISC – акроним английского названия этой архитектуры "компьютер с сокращенным набором команд" и антоним термина CISC, обозначающего компьютер со сложным набором команд.
До 80-х годов большинство процессоров строилось на базе CISC-архитектуры. Это означало, что они имели обширный набор команд разной длины. Так, в системе команд мини-ЭВМ М-7000, выпускавшейся в Северодонецке, насколько я помню, состоял из нескольких тысяч машинных команд. В ней можно было самому сложным образом закодировать инструкцию из разных комбинаций сдвигов. При написании отладчика для этой машины мне пришлось сделать специальный интерпретатор таких инструкций. Однако для набора машинных команд действует пресловутый закон 80:20, т. е. из всего набора программист использует немногим более 20% команд.
Этот факт и желание удешевить процессор и повысить его производительность привели к созданию архитектуры с очень небольшим числом команд. Классический пример: в первых процессорах SPARC использовалось всего 32 команды.
Часто говорят об ортогональности (симметричности) набора команд. Это когда каждая операция может иметь любой операнд, например, в команде может быть указан любой из регистров. Понятно, что набор команд CISC-процессоров неортогонален, так как определенные команды используют фиксированный набор регистров, который нельзя изменить. Это вызывает дополнительные сложности при разработке компиляторов для CISC-процессоров. Компиляторы для RISC-процессоров писать намного проще. Но из-за того, что набор команд у них меньше, получающийся в результате компиляции объектный код занимает больший (до 50%) объем. Однако при этом соотношение эффективности откомпилированной программы на Си и программы, написанной на ассемблере, составляет около 90%, а для CISC-процессоров оно может быть ниже 45%.
Напомню, что все операции внутри процессора, как и в компьютере, синхронизованы с помощью генератора тактовой частоты, выдающего трапециевидной формы синхросигналы. Только обычно внутренняя тактовая частота процессора в 2–4 раза выше, чем внешняя. Это связано с тем, что при высоких тактовых частотах (больше 20 МГц) начинают резко возрастать помехи, приходится бороться с длиной проводников на плате, делать плату многослойной и т. д. Слово "синхронизованы" означает, что каждая операция начинается в строго определенный момент времени, например при поступлении переднего фронта волны синхросигнала.
Замечу, что программист имеет дело с процессором как с некоторой математической машиной, заданной описанием регистрового файла и набора машинных команд, при этом ему нет необходимости думать, каким образом это устройство реализовано физически. На самом же деле из-за переходных процессов у каждой схемы может быть еще бесконечное множество промежуточных состояний, и только в моменты синхронизации мы уверены в том, что состояние процессора полностью отвечает его математической модели.
В соответствии с синхросигналами вся работа процессора разбита на такты: на каждом такте в обычном процессоре выполняется определенная работа или ожидание. По числу тактов, которое требуется для исполнения машинных команд, последние делятся на длинные и короткие. Редко удается написать программу, которая была бы и короткой и занимала мало места в памяти, обычно чем-то приходится жертвовать. Так, программируя системы реального времени, мы пользовались таблицей длин команд и выбирали те из них, время выполнения которых было короче.
По существу, каждый процессор – интерпретатор. Когда он считывает из программы очередную команду, сначала выполняется ее разбор, так называемое декодирование. После того как декодировщик выделил из команды код операции и определил, что команда допустима, управление передается соответствующей микропрограмме, выполняющей данную команду. Микропрограмма пишется на совершенно другом языке, оперирующем внутренними регистрами и флагами процессора, разрядами его арифметико-логического устройства и другими устройствами, обычно известными только разработчикам данного кристалла.
Выигрышей в сокращенном наборе команд много. Чем меньше набор команд, тем меньше времени нужно потратить на декодирование команды, т. е. на выделение ее кода операции и переход на микропрограмму, которая данную инструкцию выполняет. Чем меньше команд и чем они проще, тем проще микропрограммирование, т. е. программирование микропрограмм, выполняющих машинные команды. Тем соответственно проще тестирование микропрограмм. Требование совместимости снизу вверх всех процессоров 80x80 корпорации Intel убивает меня необходимостью хранить громадный объем микропрограмм. Микрокод занимает у некоторых CISC-процессоров до 70% площади кристалла. У всех на памяти постоянные сообщения о том, что в очередном CISC-процессоре найдена очередная ошибка. В RISC-процессорах для повышения производительности обычно не используется микрокод, выполнение инструкций реализуется аппаратно, поэтому зона управления занимает на кристалле менее 1% его площади. Уменьшение же площади самого кристалла позволило почти в два раза поднять тактовую частоту RISC-процессоров.
Для повышения быстродействия в процессорах используется конвейеризация (pipelining). Она позволяет процессору обрабатывать сразу несколько команд. Пока одна команда выполняется, следующая уже декодируется, третья выбирается из памяти. Существует множество сложных схем конвейеризации. Но это более узкая тема. Отмечу только, что процессоры, в которых это реализовано, называются суперскалярными.
На самом деле RISC-архитектура – это не только сокращенное число машинных команд. (Замечу, что в более поздних процессорах, например в PowerPC корпорации IBM, их число перевалило за сотню).
Есть несколько признаков процессора с RISC-архитектурой.
- Постоянное (обычно один такт) время выполнения большинства машинных команд. Это очень важно для упрощения процесса конвейеризации обработки команд.
- Использование большого регистрового файла. Большое количество регистров позволяет уменьшить число пересылок между регистрами и оперативной памятью и увеличить быстродействие.
- Запрет на использование косвенной адресации и арифметико-логических операций типа регистр – память. Поэтому для пересылок между регистрами и ОЗУ можно обойтись всего двумя командами: "записать в память" и "прочитать (загрузить) из памяти". Например, нельзя сразу выполнить сложение содержимого регистра и ячейки памяти, а только предварительно считав содержимое этой ячейки в регистр. На самом деле в современных RISC-процессорах добавлены еще две команды: групповой записи регистров в память и группового чтения из памяти.
- Постоянная длина команды. В CISC-процессорах ПК команды имеют длину от 1 до 6 байт. В RISC-процессорах она зависит от размера адресного пространства, но, как правило, сейчас используются четырехбайтовые команды.
Самое забавное, что производители CISC-процессоров для повышения их быстродействия широко используют внутри них RISC-архитектуру (например, в K6).
RISC-архитектура развивается. Посмотрите описание постRISC по адресу: http://www.egr.msu.edu/~crs/papers/postrisc2/, а также talks/postrisc/.
Сегодня практически все производители компьютеров прилагают большие усилия для производства RISC-процессоров.
История, с которой я начал эти заметки, завершилась весьма банально: у заказчика – крупного автомобильного завода – в тот момент возникли трудности с деньгами, и договор на разработку не был подписан. Но может быть, повезет кому-нибудь из прочитавших эти строки?
Статья опубликована в PC Week/RE № 42 от 28.10.1997 г., стр. 49.