Э. Таненбаум - Архитектура компьютера (1127755), страница 20
Текст из файла (страница 20)
Декодирование команд позволяет определить, какие ресурсы им необходимы и какие действия нужно выполнить. Полезно все, что способствует упрощению этого процесса. Например, можно использовать единообразные команды с фиксированной длиной и с небольшим количеством полей. Чем меньше разных форматов команд, тем лучше. + К памяти должны обращаться только команды загрузки и сохранения. Один из самых простых способов разбить операцию на отдельные шаги— сделать так, чтобы операнды большей части команд брались из регистров и возвращались туда же. Операция перемещения операндов из памяти в регистры и обратно может осуществляться в разных командах.
Поскольку доступ к памяти занимает много времени, причем длительность задержки не поддается прогнозированию, выполнение этих команд могут взять на себя друтие команды, единственное назначение которых — перемещение операндов между регистрами и памятью. То есть к памяти должны обращаться только команды загрузки и сохранения (ЕОЯО и 5ТОКЕ). + Регистров должно быть много. Поскольку доступ к памяти происходит довольно медленно, в компьютере должно быть много регистров (по крайней мере, 32). Если слово однажды вызвано из памяти, при наличии большого числа регистров оно может содержаться в регистре до тех пор, пока не потребуется. Возвращение слова из регистра в память и новая загрузка этого же слова в регистр нежелательны. Лучший способ избежать излишних перемещений — наличие достаточного количества регистров.
Параллелизм на уровне команд Разработчики компьютеров стремятся к тому, чтобы повысить производительность своих машин. Один из способов заставить процессоры работать быстрее— повышение их тактовой частоты, однако при этом существуют некоторые технологические ограничения, связанные с конкретным историческим периодом.
Поэтому большинство разработчиков для повышения производительности при данной тактовой частоте процессора используют параллелизм (выполнение двух или более операций одновременно). Существует две основные формы параллелизма: параллелизм на уровне команд и параллелизм на уровне процессоров. В первом случае параллелизм Процессоры 79 реализуется за счет запуска большого количества команд каждую секунду. Во втором случае над одним заданием работают одновременно несколько процессоров. Каждый подход имеет свои преимущества. В этом разделе мы рассмотрим параллелизм на уровне команд, а в следующем — параллелизм на уровне процессоров.
Конвейеры С2 С4 С5 Блок выборки команд Блок выборки операндов Блок выполнения команд Блок обратной записи Блок декодирования Д51 Д4 ДДз Д2 И Д2 и Дз] Д2 Д1 Д4 Дз Д2 Д1 Дб Дб Д4 Дз Д2 Д7 Дб Дб Д4 Дз Дв Д7 Дб Дб Д4 Д9 Дв Д7 Дб Д5 С2 С5 1 2 3 4 5 6 Время— б 7 8 9 Рис. 2.3. Пятиступенчатый конвейер (а); состояние каждой ступени в зависимости от количества пройденных циклов (б).
Показана 9 циклов Уже много лет известно, что главным препятствием высокой скорости выполнения команд является необходимость их вызова из памяти. Для разрешения этой проблемы можно вызывать команды из памяти заранее и хранить в специальном наборе регистров. Эта идея использовалась еще в 1959 году при разработке компьютера ВггегсЬ компании 1ВМ, а набор регистров был назван буфером выборки с упреждением. Таким образом, когда требовалась определенная команда, она вызывалась прямо из буфера, а обращения к памяти не происходило.
В действительности при выборке с упреждением комацда обрабатывается за два шага: сначала происходит вызов команды, а затем — ее выполнение. Еще больше продвинула эту стратегию идея конвейера. При использовании конвейера команда обрабатывается уже не за два, а за большее количество шагов, каждый из которых реализуется определенным аппаратным компонентом, причем все эти компоненты могут работать параллельно. На рис. 2.3, а изображен конвейер из пяти блоков, которые называются ступенями.
Первая ступень (блок С1) вызывает команду из памяти и помещает ее в буфер, где она хранится до тех пор, пока не потребуется. Вторая ступень (блок С2) декодирует эту команду, определяя ее тип и тип ее операндов. Третья ступень (блок СЗ) определяет местонахождение операндов и вызывает их из регистров или из памяти. 80 Глава 2. Организация компьютерных систем Четвертая ступень (блок С4) выполняет команду, обычно проводя операнды через тракт данных (см. рис. 2.2).
И наконец, блок С5 записывает результат обратно в нужный регистр. На рис. 2.3, б мы видим, как действует конвейер во времени. Во время цикла 1 блок С1 обрабатывает команду 1, вызывая ее из памяти. Во время цикла 2 блок С2 декодирует команду 1, в то время как блок С1 вызывает из памяти команду 2. Во время цикла 3 блок СЗ вызывает операнды для команды 1, блок С2 декодирует команду 2, а блок С1 вызывает команду 3. Во время цикла 4 блок С4 выполняет команду 1, СЗ вызывает операнды для команды 2, С2 декодирует команду 3, а С1 вызывает команду 4. Наконец, во время цикла 5 блок С5 записывает результат выполнения команды 1 обратно в регистр, тогда как другие ступени конвейера обрабатывают следующие команды. Чтобы лучше понять принципы работы конвейера, рассмотрим аналогичный пример.
Представим себе кондитерскую фабрику, на которой выпечка тортов и их упаковка для отправки производятся раздельно. Предположим, что в отделе отправки находится длинный конвейер, вдоль которого располагаются 5 рабочих (или ступеней обработки). Каждые 10 секунд (это время цикла) первый рабочий ставит пустую коробку для торта на ленту конвейера. Эта коробка отправляется ко второму рабочему, который кладет в нее торт. После этого коробка с тортом доставляется третьему рабочему, который закрывает и запечатывает ее. Затем она поступает к четвертому рабочему, который ставит на ней штамп. Наконец, пятый рабочий снимает коробку с конвейерной ленты и помещает ее в большой контейнер для отправки в супермаркет.
Примерно таким же образом действует компьютерный конвейер: каждая команда (в случае с кондитерской фабрикой— торт) перед окончательным выполнением проходит несколько ступеней обработки. Возвратимся к нашему конвейеру на рис. 2.3. Предположим, что время цикла у этой машины — 2 нс. Тогда для того, чтобы одна команда прошла через весь конвейер, требуется 10 нс. На первый взгляд может показаться, что такой компьютер будет выполнять 100 млн команд в секунду, в действительности же скорость его работы гораздо выше.
В течение каждого цикла (2 нс) завершается выполнение одной новой команды, поэтому машина выполняет не 100, а 500 млн команд в секунду! Конвейеры позволяют добиться компромисса между временем запаздывания (время выполнения одной команды) и пропускной способностью процессора (количество команд, выполняемых процессором в секунду). Если время обращения составляет Т не, а конвейер имеет и ступеней, время запаздывания составит пТ нс. Поскольку одна команда выполняется за одно обращение, а за одну секунду таких обращений набирается 10з/Т, количество команд в секунду также составляет 10"/Т.
Скажем, если Т = 2 нс, то каждую секунду выполняется 500 млн команд. Для того чтобы получить значение М1РЗ, нужно разделить скорость выполнения команд на 1 миллион; таким образом, (10э/Т)/10з = 1000/Т М1РЗ. В принципе, скорость выполнения команд можно измерять и в миллиардах операций в секунду (В)11юп 1пзггцсг1опз Рег Бесопд, В1РЗ), но так никто не делает, и мы не будем. Процессоры 81 Суперскалярные архитектуры Один конвейер — хорошо, а два — еще лучше.
Одна из возможных схем процессора с двумя конвейерами показана на рис. 2 4. В ее основе лежит конвейер, изображенный на рис. 2.3. Здесь общий блок выборки команд вызывает из памяти сразу по две команды и помещает каждую из них в один из конвейеров. Каждый конвейер содержит АЛУ для параллельных операций. Чтобы выполняться параллельно, две команды не должны конфликтовать из-за ресурсов (например, регистров), и ни одна из них не должна зависеть от результата выполнения другой. Как и в случае с одним конвейером, либо компилятор должен гарантировать отсутствие нештатных ситуаций (когда, например, аппаратура не обеспечивает проверку команд на несовместимость и при обработке таких команд выдает некорректный результат), либо за счет дополнительной аппаратуры конфликты должны выявляться и устраняться непосредственно в ходе выполнения команд. С5 сз С2 Сл Рис.
2.4. Сдвоенный пнтиступенчатый конвейер с общим блокам выборки команд Сначала конвейеры (как сдвоенные, так и обычные) использовались только в К18С-компьютерах. У процессора 386 и его предшественников их не бьгло. Конвейеры в процессорах компании 1пье! появились, только начиная с модели 486'. Процессор 486 имел один пятиступенчатый конвейер, а Репг1шп — два таких конвейера.
Похожая схема изображена на рис. 2.4, но разделение функций между второй и третьей ступенями (они назывались декодер 1 и декодер 2) было немного другим. Главный конвейер (~-конвейер) мог выполнять произвольные команды. Второй конвейер (у-конвейер) мог выполнять только простые команды с целыми числами, а также одну простую команду с плавающей точкой (гхСН), Имеются сложные правила определения, является ли пара команд совместимой в отношении возможности параллельного выполнения.
Если команды, входящие в пару, были сложными или несовместимыми, выполнялась только одна из них (в ц-конвейере). Оставшаяся вторая команда составляла затем пару со следующей командой. Команды всегда выполнялись по порядку. Таким образом, процессор Реп1шш содержал особые компиляторы, которые объединяли совместимые команды в пары и могли порождать программы, выполняющиеся быстрее, чем в предыдущих версиях. Измерения показали, что программы, в которых ' Необходимо отметить, что параллельное функционирование отдельных блоков процессора имело место и в предыдущем микропроцессоре (886).