Э. Таненбаум - Архитектура компьютера (1127755), страница 99
Текст из файла (страница 99)
Более того, минимизация размера команд может усложнить нх декодирование и перекрытие. Следовательно, стремление уменьшить размер команд должно уравновегпиваться стремлением сократить время их декодирования и выполнения. Есть еще одна очень важная причина минимизации длины команд, и она становится все важнее с увеличением скорости работы процессоров: пропускная способность памяти (число битов в секунду, которое память может предоставлять).
Значительное повышение быстродействия процессоров за последнее десятилетие не соответствует увеличению пропускной способности памяти. Ограничения здесь связаны с неспособностью системы памяти передавать команды и операнды с той же скоростью, с которой процессор может их обрабатывать. Пропускная способность памяти зависит от технологии разработки. Встречаемые на этом пути трудности имеют отношение не только к основной памяти, но и ко всем видам кэш-памяти. Если пропускная способность кэш-памяти команд составляет г бит/с, а средняя длина команды — г бит, то кэш-память способна передавать самое большее Форматы команд 397 г/г команд в секунду. Отметим, что это — верхний предел скорости, с которой процессор может выполнять команды, хотя в настоя|цее время предпринимаются попытки преодолеть данный барьер.
Ясно, что скорость, с которой могут выполняться команды (то есть быстродействие процессора), может ограничиваться длиной команд. Чем короче команды, тем быстрее работает процессор. Поскольку современные процессоры способны выполнять несколько команд за один цикл, то вызов нескольких команд за цикл обязателен. Этот аспект применения кэш-памяти команд делает размер команд важным критерием, который нужно учитывать при разработке.
Еще один критерий — достаточный обьем пространства в формате команды для представления всех требуемых операндов. Машина, поддерживающая 2" операций и длину команды менее и бит, невозможна. В этом случае в коде операции было бы недостаточно места для того, чтобы указать, какая нужна команда. К тому же история снова и снова доказывает, что обязательно нужно оставлять большое количество свободных кодов операций для будущих дополнений набора команд. Третий критерий связан с числом битов в адресном поле. Рассмотрим проект машины с 8-разрядными символами и основной памятью, которая должна содержать 2зз символов. Разработчики вольны были приписать последовательные адреса блокам по 8, 16, 24 или 32 бита. Представим, что бы случилось, если бы команда разработчиков разбилась на две воюющие группы, одна из которых утверждает, что основной единицей памяти должен быть 8-разрядный байт, а другая требует, чтобы основной единицей памяти было 32-разрядное слово.
Первая группа предложила бы память из 2з' байт с номерами О, 1, 2, 3, ..., 4 294 967 295. Вторая группа предложила бы память из 2зз слов с номерами О, 1, 2, 3, ..., 1 073 741 823. Первая группа скажет, что для того, чтобы сравнить два символа при организации по 32-разрядным словам, программе приходится не только вызывать из памяти слова, содержащие эти символы, но и выделять соответствующий символ из каждого слова для сравнения. А это потребует дополнительных команд и, следовательно, дополнительного пространства. 8-разрядная организация, напротив, обеспечивает адресацию каждого символа, что значительно упрощает процедуру сравнения.
Сторонники 32-разрядной организации скажут, что их проект требует всего лишь 2зз отдельных адресов, что дает длину адреса всего 30 бит, тогда как при 8-разрядной организации требуется целых 32 бита для обращения к той же самой памяти. Если адрес короткий, то и команда будет более короткой. Она займет меньше пространства в памяти, и к тому же для ее вызова потребуется меньше времени. В качестве альтернативы они могут сохранить 32-разрядный адрес для обращения к памяти в 16 Гбайт вместо каких-то там 4 Гбайт. Этот пример демонстрирует, что для получения оптимальной дискретности памяти требуются более длинные адреса и, следовательно, более длинные команды.
Одна крайность — это организация памяти, при которой адресуется каждый бит (например, Виггоп8Ьз В1700). Другая крайность — это память, состоягцая из очень длинных слов (например, серия СРС СуЪег содержала 60-разрядные слова). 398 Глава 5. Уровень архитектуры набора команд Современные компьютерные системы пришли к компромиссу, который, в каком-то смысле, объединил в себе худшие качества обоих вариантов.
Они требуют, чтобы адреса были у отдельных байтов, но при обралцении к памяти всегда считываются одно, два, а иногда даже четыре слова сразу. В результате считывания одного байта из памяти на машине ()!ггаБРАКС П1 единовременно вызываются минимум 16 байт (см. рис. 3.44), а иногда и вся строка кэш-памяти размером 64 байта. Расширение кода операций В предыдущем подразделе мы увидели, что короткие адреса препятствуют удачной дискретности памяти.
В этом разделе мы рассмотрим компромиссы, связанные с кодами операций и адресами. Рассмотрим команду размером п л- 1л бит с кодом операции в )л бит и одним адресом в п бит. Такая команда допускает 2 различных операций и 2" адресуемых ячеек памяти. В качестве альтернативы те же п л- )л бит можно разбить на код операции в )л — 1 бит и адрес в п + 1 бит.
При этом будет либо в два раза меньше команд, но в два раза больше памяти, либо то же количество памяти, но дискретность вдвое выше. Код операции в й + 1 бит и адрес в п — 1 бит дает большее количество операций, но ценой этого является либо меньшее количество ячеек памяти, либо не очень удачная дискретность при том же объеме памяти. Наряду с подобными простыми компромиссами между битами кода операции и битами адреса существуют и более сложные. Обсуждаемый здесь механизм называется расширением кода операций. Понятие расширения кода операций можно пояснить на примере.
Рассмотрим машину, в которой длина команд составляет 16 бит, а длина адресов — 4 бита, как показано на рис. 5.8. Это вполне разумно для машины, содержащей 16 регистров (а следовательно, 4-разрядный адрес регистра), с которыми совершаются все арифметические операции. Один из возможных вариантов— включение в каждую команду 4-разрядного кода операции и трех адресов, что дает 16 трехадресных команд. 1с 14 13 12 11 10 9 В 7 6 З 4 3 2 1 Код операции Адрес 1 Адрес 2 Адрес 3 Рис. 8.8. Команда с 4-разрядным кодом операции и тремя 4-разрядными адресными полями Если разработчикам нужно 15 трехадресных команд, 14 двухадресных команд, 31 одноадресная команда и 16 безадресных команд, они могут использовать коды операций от 0 до 14 в качестве трехадресных команд, а код операции 15 уже интерпретировать по-другому (рис. 5.9).
Форматы команд 399 16 бит 4-битный код операци 15 трехадресных команд 8-разрядный код операции 14 двухадресных команд 12-разрядный код операции 31 одноадресная команда 16-разрядный код операции 16 безадресных команд 15 12 11 8 7 4 3 О Номер бита Рис. 6.9. Расширение кода операции обеспечивает 15 трехадресных команд, ! 4 двухадресных команд, 31 одноадресную команду и 16 безадресних команд. Поля хххх, уууу и зззз — зто 4-разрядные адресные поля Зто значит, что код операции 15 содержится в битах с 8-го по 15-й, а не с 12-го по 15-й.
Биты с О-го по 3-й и с 4-го по 7-й, как и раньше, формируют два адреса. Все 14 двухадресных команд содержат число 1111 в старших четырех битах 400 Глава 5. Уровень архитектуры набора команд и числа от 0000 до 1101 в битах с 8-го по 11-й. Команды с числом 1111 в старших четырех битах и числом 1110 или 1111 в битах с 8-го по 11-й рассматриваются особо.
Они трактуются так, как будто их коды операций находятся в битах с 4-го по 15-й. В результате получаем 32 новых кода операций. А поскольку требуется всего 31 код, то код 111111111111 означает, что действительный код операции находится в битах с 0-го по 15-й, что дает 16 безадресных команд. Как видим, код операции становится все длиннее и длиннее: трехадресные команды имеют 4-разрядный код операции, двухадресные команды — 8-разрядный, одноадресные команды — 12-разрядный, а безадресные команды — 16-разрядный.
Идея расширения кода операций наглядно демонстрирует компромисс между пространством для кодов операций и пространством для другой информации. Однако на практике все не так просто и понятно, как в нашем примере. Есть только два способа изменения размера кода операций. С одной стороны, можно иметь все команды одинаковой длины, приписывая самые короткие коды операций тем командам, которым нужно болыпе всего битов для спецификации чего-либо другого.
С другой стороны, можно свести к минимуму средний размер команды, если выбрать самые короткие коды операций для часто используемых команд и самые длинные — для редко используемых. Если довести эту идею до конца, можно свести к минимуму среднюю длину команды, закодировав каждую команду, чтобы максимально уменьшить число требуемых битов. К сожалению, это ведет к наличию команд разных размеров, причем не выровненных в границах байтов. Пока существуют архитектуры команд с таким свойством (например, !псе! 432), выравнивание будет иметь большое значение для быстрого декодирования команд.
Тем не менее, эта идея часто применяется на уровне байтов. Далее мы рассмотрим архитектуру )ЧМ-команд, чтобы показать, как можно менять форматы команд, чтобы максимально уменьшить размер программы. Форматы команд процессора Репбит 4 Форматы команд процессора Репапш 4 очень сложны и нерегулярны. Они содержат до шести полей разной длины, пять из которых не обязательны (общая модель показана на рис. 5.10). Такая ситуация сложилась из-за того, что архитектура развивалась на протяжении нескольких поколений, и ранее в нее были включены не очень удачные варианты команд.
Из-за требования обратной совместимости позднее их нельзя было изменить. Например, если один из операндов команды находится в памяти, то другой не может там находиться. В результате, существуют команды сложения двух регистров, команды прибавления регистра к слову памяти, команды прибавления слова памяти к регистру, но не существует команд для прибавления одного слова памяти к другому слову памяти. В первых архитектурах !пте! все коды операций были размером 1 байт, хотя для изменения некоторых команд часто использовался так называемый пре- Форматы команд 401 фиксный байт. Префиксный байт — это дополнительный код операции, который ставится перед командой, чтобы изменить ее действие.
Примером применения префиксного байта может служить команда И10Е в машинах 1)НМ. К сожалению, в какой-то момент компания 1пге! исчерпала запасы кодов операций, и один код операции, ОхГГ, стал кодом смены алфавита и использоваться для разрешения второго байта команды. 0-4 0-4 0-1 0-1 1-2 Байты 0 - 5 Биты 2 3 3 Рис. 5.10. Форматы команд процессора Реп1шт 4 Отдельные биты в кодах операций процессора Репг!пш 4 дают довольно мало информации о команде. Единственной структурой такого рода в поле кода операции является младший бит в некоторых командах, который указывает, что именно вызывается — слово или байт, а также соседний бит, который указывает, является ли адрес памяти (если он вообще есть) источником или приемником. Таким образом, в большинстве случаев код операции нужно полностью декодировать, чтобы установить, к какому классу относится выполняемая операция и, следовательно, какова длина команды.