Современные RISC-архитектуры
CISC vs RISC
Традиционно, когда речь заходит об архитектуре процессоров вплывает несколько понятий, являющихся причиной споров, разногласий, а в академическо-студенческой среде еще и причиной микротрагедий). Многие эти термины слышали, или так или иначе с ними встречались.
Если говорить о "глобальной" архитектуре вычислительной машины (ЭВМ), то здесь фигурируют понятия "Фон-Неймановская архитектура (или Пристонская)" и "Гарвардская архитектура" (иногда называемая "Новой Гарвардской архитектурой", справедливо порождающей вопрос-на-засыпку бедному студенты - а какова же тогда была "старая Гарвардская архитектура").
Формально - архитектура фон Неймана (Принстонская архитектура) характеризуется использованием общей оперативной памяти для хранения программ, данных, а также для организации стека. Для обращения к этой памяти используется общая системная шина, по которой в процессор поступают и команды, и данные.
Недостатком такой архитектуры является то, что и данные и команды из памяти должны передаваться в процессорному ядру и обратно. Даже тот факт, что современные процессоры имеют несколько уровней кэша непосредственно в ядре процессора, не решает проблему.
Гарвардская архитектура была разработана с целью увеличить скорость выполнения вычислительных операций и оптимизировать работу памяти. Она характеризуется физическим разделением памяти программ и памяти данных. Каждая память соединяется с процессором отдельной шиной, что позволяет одновременно с чтением-записью данных при выполнении текущей команды производить выборку и декодирование следующей команды. Также иногда выделяют отдельный стек для хранения адресов возврата из функций и подпрограмм.
За счет разделения потоков команд и данных реализуется потенциально более высокая производительность, чем при использовании архитектуры Фон-Неймана.
Недостатки Гарвардской архитектуры связаны с необходимостью проведения большего числа шин, а также с фиксированным объемом памяти, выделенной для команд и данных, назначение которой не может оперативно перераспределяться в соответствии с требованиями решаемой задачи.
При разделении каналов передачи команд и данных на кристалле процессора последний должен иметь почти вдвое больше интерфейсных выводов, так как шина адреса и шина данных составляют основную часть выводов микропроцессора. Способом разрешения этой проблемы стала идея использовать общие шину данных и шину адреса для всех внешних данных, а внутри процессора использовать шину данных, шину команд и две шины адреса. Такую концепцию стали называть модифицированной гарвардской архитектурой.
Подобная схемотехника применяется в современных сигнальных процессорах. Ещё дальше по пути уменьшения стоимости пошли при создании однокристальных микроЭВМ - микроконтроллеров. В них одна шина команд и данных применяется и внутри кристалла.
Часто требуется выбрать три составляющие: два операнда и инструкцию (в алгоритмах цифровой обработки сигналов это наиболее распространенная задача в БПФ, КИХ и БИХ-фильтрах). Для этого существует кэш-память. В ней может храниться инструкция - следовательно, обе шины остаются свободными и появляется возможность передать два операнда одновременно. Использование кэш-памяти вместе с разделёнными шинами получило название "Super Harvard Architecture" ("SHARC") - расширенная гарвардская архитектура.
Архитектурные особенности процессора раскрываются понятиями CISC, RISC, MISC - характеризующие общие черты системы команд и общей организации процессора.
CISC (Complete Instruction Set Computing) - тип архитектуры процессора с полным набором команд. При этом подходе выполнение любой сколь угодно сложной команды из системы команд процессора реализовывается аппаратно внутри самого процессора.
Основную идею CISC-архитектуры отражает ее название - "полный набор команд". В данной архитектуре стремятся иметь отдельную машинную команду для каждого возможного (типового) действия по обработке данных. ((написанного преимущественно вручную на ассемблере) видели постоянно повторяющиеся паттерны инструкций, они стремились в следующей итерации архитектуры внести такие паттерны в архитектуру в виде новых инструкций).
В общие черты организации CISC-процессоров:
- большое количество различных машинных команд (сотни), каждая из которых выполняется за несколько тактов центрального процессора;
- устройство управления с программируемой логикой;
- небольшое количество регистров общего назначения;
- различные форматы команд с разной длиной;
- преобладание двухадресной адресации;
- развитый механизм адресации операндов, включающий различные методы косвенной адресации.
RISC (Restricted (Reduced) Instruction Set Computer - компьютер с сокращенным набором команд) - архитектура процессора, в которой быстродействие увеличивается за счет упрощения инструкций, чтобы их декодирование было более простым, а время выполнения - короче. В процессорах с RISC-архитектурой используется ограниченный набор быстрых команд. Каждая команда RISC-процессора должна выполняться за один машинный такт.
Для технологии RISC характерна сравнительно простая структура устройства управления. Площадь, выделяемая на кристалле микросхемы для его реализации, существенно меньше. Как следствие, появляется возможность разместить на кристалле большое число регистров ЦП. Кроме того, остается больше места для других узлов ЦП и для дополнительных устройств: кэш-памяти, блока арифметики с плавающей запятой, части основной памяти, блока управления памятью, портов ввода/вывода.
Унификация набора команд, ориентация на конвейерную обработку, унификация размера команд и длительности их выполнения, устранение периодов ожидания в конвейере - все эти факторы положительно сказываются на общем быстродействии.
Недостатки RISC прямо связаны с некоторыми преимуществами этой архитектуры. Принципиальный недостаток - сокращенное число команд: на выполнение ряда функций приходится тратить несколько команд вместо одной в CISC. Это удлиняет код программы, увеличивает загрузку памяти и трафик команд между памятью и ЦП. Исследования показали, что RISC-программа в среднем на 30% длиннее CISC-программы, реализующей те же функции.
MISC-архитектура (Minimal Instruction Set Computer) является процессором с минимальным набором команд. Она отличается ещё большей простотой и используется для ещё большего снижения энергопотребления и итоговой стоимости процессора. MISC-архитектура применяется в IoT-сегменте и компьютерах малой стоимости вроде роутеров.
MISC-архитектура для проектирования процессора, которая отличается наилучшей эффективностью и простотой в сравнении с CISC и RISC. Может содержать в себе блок RISC, обрабатывающий в себе от 10 базовых команд (+, -, /, *, if, else & etc), из которых формируются более сложные операции над значениями, методом ветвления полученных результатов в ПЗУ. С точки зрения быстродействия, время выполнения инструкции, скорость записи и передачи данных в память, сократилось бы в разы, так как не нужно было бы ожидать, пока заполнится и очистится конвейер, а выполнять всё "потоково" без задержек.
Исторически первыми в массовом доступном коммерческом сегменте были CISC-процессоры. CISC-подход позволяет получить достаточно высокую плотность кода, что для того времени было одним из критических факторов.
Из истории
К началу восьмидесятых однокристальные микропроцессоры освоились в 16-разрядной нише и наметился переход к 32 разрядам. Это уже была область компьютеров среднего класса мощности со своими лидерами, традициями, инструментами, опытом, … но также тупиками и накопленными ошибками. [2]
В то же самое время компьютеры среднего класса стремительно дешевели, так, Interdata представила в 1973 г. первый 32-разрядный мини-компьютер (IBM 360 совместимый) дешевле 10 000 долларов.
Предпосылки к массовому внедрению RISC-подхода.
Во-первых. На тот момент уже существовала свободно распространяемая (~ по цене магнитной ленты) переносимая операционная система (UNIX) с переносимым системным языком С. Причем, они еще не успели обрасти мышцами и накопить жирка, так что добавление новой архитектуры или учет её изменений не были слишком дорогостоящими.
Во-вторых, произошла тихая революция в компиляторах. Условной точкой отсчета можно считать 1981 год, когда математиком Грегори Хайтином (Gregory Chaitin) был предложен [3, 4] способ распределения регистров.
Речь идет о той стадии компиляции [5], когда программа преобразована во внутреннее представление в виде трёхадресного кода и до стадии кодогенерации. Трёхадресный код - фактически код для процессора с бесконечным количеством регистров. Но в конечной архитектуре количество регистров ограничено и требуется решить, какие значения можно оставить в регистрах, а какие следует переместить в память (грубо).
До того момента эта стадия компиляции выполнялась эмпирически, с помощью набора разнообразных рецептов/приёмов, которые следовало применять в тех или иных ситуациях, качество такого кода зачастую оказывалось сомнительным. Грегори Хайтин пришел к выводу, что задача распределения регистров сводится к задаче раскраски графа. Про эту задачу известно, что она NP-полная, т.е. стоимость ее решения экспоненциально зависит от числа вершин (исходных регистров, которые надо распределить). К счастью, в данном случае это не приговор, поскольку была также предложена приемлемая эвристика.
На первый взгляд, сколь-нибудь существенным элементом новизны в RISC процессорах было лишь увеличение числа регистров общего назначения. Однако это увеличение имеет и побочные эффекты помимо ускорения доступа к данным. В частности, использование трёхадресного кода. Не очень удобно использовать три регистра в одной инструкции, когда этих регистров всего восемь. Сравните с тридцатью двумя.
В RISC архитектуре компилятор при прочих равных имеет возможность задействовать больше регистров, чтобы уменьшить количество конфликтов конвейера.
Не только количество регистров, а и двухоперандность (переиспользование регистра как для чтения так и для записи результата), флаги результатов после всех операций (порождает больше конфликтов), одновременный доступ к памяти с арифметикой в одной инструкции, а также увеличение сложности при обработке исключений и спекулятивном выполнении (в том случае если мы превращаем cisc инструкцию в микроинструкции, так как исключения относятся к целой инструкции).
При равной производительности CISC сложнее, выделяют больше энергии, в них приходится раньше прибегать к трюкам вроде переименования регистров ... Тем не менее, одновременно существовали ветки RISC и CISC архитектур с близкой производительностью.
Технологическое преимущество RISC - регистры было нивелировано внутри-кристальным кэшем, обе стороны наращивали его объем, тактовую частоту и сложность конвейеров, интегрировали сопроцессоры с плавающей точкой … В какой-то момент микропроцессоры (в том числе и RISC) научились переименовывать регистры, переставлять микро-инструкции, спекулятивно исполнять код … и тут на сцену вышли суперскалярные микропроцессоры, которым стало (по большому счету) всё равно, какого типа - RISC или CISC у них набор внешних инструкций. С этого момента понятие RISC - не более, чем название раскрученного брэнда, которое используется преимущественно по инерции (либо маркетологами).
Архитектура
Существует фиксированное количество команд, которые понимает каждый конкретный процессор.
Каждый конкретный процессор имеет определенный набор внутренних элементов для выполнения операций, хранения переменных и элементов внутреннего состояния.
Архитектура набора команд (instruction set architecture, ISA) - часть архитектуры компьютера, определяющая программируемую часть ядра микропроцессора.
На этом уровне определяются:
- архитектура памяти;
- взаимодействие с внешними устройствами ввода/вывода;
- режимы адресации;
- регистры;
- машинные команды;
- различные типы внутренних данных (например, с плавающей запятой, целочисленные типы и т. д.);
- обработчики прерываний и исключительных состояний.
Микроархитектура
Описывает модель, топологию и реализацию ISA на микросхеме микропроцессора. Фактически - каждый разработчик может предлагать свою микроархитетуру, свое видение реализации ISA, оптимизируя те или иные аспекты архитектуры
На этом уровне определяется:
- конструкция и взаимосвязь основных блоков ЦП,
- структура ядер, исполнительных устройств, АЛУ, а также их взаимодействия,
- блоков предсказания переходов,
- организация конвейеров,
- организация кэш-памяти,
- взаимодействие с внешними устройствами.
В рамках одного семейства микропроцессоров микроархитектура со временем расширяется путём добавления новых усовершенствований и оптимизации существующих команд с целью повышения производительности, энергосбережения и функциональных возможностей микропроцессора. При этом сохраняется совместимость с ISA.