|
Курс лекций
по
"Вычислительные машины, системы и сети"
Темы с
36
по
40
36. Суперскалярные архитектуры
Процессор с
единственным конвейером называется скалярным;
одновременно на ступень декодирования (вблизи начала конвейера)
может попасть только одна команда. Более совершенные
процессоры с несколькими конвейерами носят название
суперскалярных. Эти процессоры могут выполнять за один такт
более одной команды, поэтому при той же тактовой частоте они
способны обработать большее число команд, чем скалярные (см.
диаграмму «Двухпотоковая суперскалярная архитектура»).
Диаграмма «Двухпотоковая суперскалярная архитектура»
|
Ступень |
Такты |
1,2-й результат |
3,4-й результат |
5,6-й результат |
|
Запись результата |
|
|
|
|
|
|
|
|
1 |
2 |
3 |
4 |
5 |
6 |
|
Исполнение |
|
|
|
|
|
|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
|
Операнды |
|
|
|
|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
|
Декодирование |
|
|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
|
Выборка |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
Не все
суперскалярные процессоры построены одинаково. Микропроцессоры
Pentium фирмы Intel и М1 фирмы Cyrix могут обрабатывать по две
команды, поступающие в два конвейера, поэтому они называются
двухпотоковыми (dual-issue). Центральный процессор (ЦП) К5
фирмы AMD — это четырехпотоковый (quad-issue)
процессор. Nx586 фирмы NexGen лишь с натяжкой южно считать
суперскалярным: он может выдавать лишь по одной команде х86 за
такт, но эти команды преобразуются в несколько команд USC86,
которые могут выполняться одновременно.
Ни один из
рассматриваемых процессоров не может при любых обстоятельствах
обрабатывать одновременно максимальное допустимое для его
архитектуры число команд. В процессоре Pentium, например,
наложены строгие ограничения на типы команд, которые могут
обрабатываться одновременно (см. диаграмму «Ограничения на
одновременное исполнение»). Процессоры Ml фирмы Cyrix и К5 фирмы
AMD более либеральны в этом отношении, но также
имеют свои ограничения.
Диаграмма «Ограничения
на одновременное исполнение»
|
Ступень |
Такты |
1-й результат |
2,3-й результат |
4-й результат |
|
Запись результата |
|
|
|
|
|
|
|
|
1 |
- |
2 |
3 |
4 |
- |
|
Исполнение |
|
|
|
|
|
|
1 |
- |
2 |
3 |
4 |
- |
5 |
6 |
|
Операнды |
|
|
|
|
1 |
- |
2 |
3 |
4 |
- |
5 |
6 |
7 |
- |
|
Декодирование |
|
|
1 |
- |
2 |
3 |
4 |
- |
5 |
6 |
7 |
- |
8 |
9 |
|
Выборка |
1 |
2 |
2 |
3 |
4 |
5 |
5 |
6 |
7 |
8 |
8 |
9 |
10 |
11 |
37.
Неупорядоченное выполнение
Увеличение среднего
числа команд, обрабатываемых за такт, принципиально важно для
достижения максимальной производительности ЦП. В наиболее
прямолинейных реализациях суперскалярной архитектуры скорость
ЦП существенно уменьшается в некоторых ситуациях, когда на
одном из его конвейеров происходит «затор», или «зависание».
Диаграмма «Влияние
«заторов» на конвейере»
|
Ступень |
Такты
затор затор |
1-й результат |
|
2,3-й результат |
затор |
|
Запись результата |
|
|
|
|
|
|
1 |
- |
- |
- |
2 |
3 |
- |
- |
|
Исполнение |
|
|
1 |
- |
1 |
- |
- |
- |
2 |
3 |
4 |
- |
4 |
- |
|
Операнды |
1 |
- |
2 |
3 |
2 |
3 |
2 |
3 |
4 |
- |
5 |
6 |
5 |
6 |
|
Декодирование |
2 |
3 |
4 |
- |
4 |
- |
4 |
- |
5 |
6 |
7 |
- |
7 |
- |
|
Выборка |
4 |
5 |
5 |
6 |
5 |
6 |
5 |
6 |
7 |
8 |
8 |
9 |
8 |
9 |
В процессорах типа
Pentium, использующих упорядоченное поступление и обработку
(in-order issue) и упорядоченное завершение
(in-order completion), все, что затрудняет завершение команды в
одном конвейере, останавливает и другой, так как команды должны
покидать конвейеры точно в том же порядке, в каком поступали на
них. (Другими словами, конвейеры «шагают в ногу»; см. диаграмму
«Влияние «заторов» на конвейере».) Это представляется
рациональным способом конструирования процессора, однако может
оказаться далеко не самым эффективным с точки зрения
производительности.
Архитектуры с
неупорядоченным завершением (out-of-order completion)
позволяют одному из конвейеров продолжать работать при «заторе»
в другом. При этом команды, стоящие в программе позже, могут
быть фактически выполнены раньше предыдущих, «застрявших» в
другом конвейере. Естественно, процессор должен гарантировать,
что результаты не будут записаны в память, а регистры
модифицироваться в неправильной последовательности, поскольку
при этом могут получиться ошибочные результаты. Процессоры M1,
K5 и Nx586 имеют средства неупорядоченного завершения
(называемого также неупорядоченным исполнением —
out-of-order execution).
Неупорядоченная
обработка (out-of-order issue) развивает эту концепцию дальше,
позволяя процессору выдавать и обрабатывать команды также не в
порядке их следования по программе. Для реализации
неупорядоченной обработки обычно требуется буфер команд, или
окно команд (instruction window), между ступенями
декодирования и исполнения конвейера. В некоторых процессорах
используется центральное окно команд, буферизующее все
декодированные команды, которые направляются во все
исполнительные блоки. Если такой процессор определяет, что в
данный момент текущая команда исполняться не может, он
посылает в исполнительный блок следующую команду, вместо того
чтобы давать всему идти своим чередом.
Другие конструкции
процессоров используют небольшие окна команд, называемые
накопителями (reservation stations), перед входом в каждый
исполнительный блок. Как только исполнительный блок заканчивает
выполнение одной команды, он принимает следующую из накопителя.
Процессор
посылает команды в накопитель по порядку, но после прохождения
через функциональные блоки их порядок может нарушиться, так как
одни накопители будут освобождаться быстрее других. Такой
подход применяется в ЦП К5 фирмы
AMD; каждому из
шести функциональных блоков процессора предшествует накопитель,
в котором могут находиться две команды. Процессор Nx586 фирмы
NexGen использует аналогичный подход, но с гораздо более емкими
накопителями на 14 команд перед каждым функциональным блоком.
38.
Переименование регистров
На пути
повышения параллелизма вычислений стоит такое ограничение:
сколько бы команд одновременно ни способен был в принципе
выполнить процессор, его производительность будет ограничена
из-за того, что некоторые операции просто нельзя завершить до
выполнения других. Например, если вы хотите вычислить на машине
значение выражения
,
вам не удастся
выполнить умножение и сложение одновременно, даже если процессор
это позволяет; правила арифметики диктуют, что сначала должно
быть выполнено умножение. Такая ситуация называется истинной
взаимозависимостью данных (true
data dependency), или взаимозависимостью «чтение после
записи» (read-after-write dependency). Это означает, что
входные данные для задачи сложения зависят от результата задачи
умножения.
Производительность
может снижаться также ложными взаимозависимостями (false
dependency) двух видов. Например, если две следующие друг за
другом команды выполняют отдельные вычисления, но записывают
свои результаты в один и тот же регистр, выполнение второй
команды перед первой может привести к взаимозависимости по
выходу (output dependency), или взаимозависимости «запись
после записи» (write-after-write dependency), между второй и
первой командами. Она возникает из-за того, что процессор
должен гарантировать правильность модификации регистра, даже
если команды, модифицирующие его, выполняются не по порядку.
Второй тип ложной взаимозависимости, антивзаимозависимостъ
(antidependency), или взаимозависимость «запись после
чтения» (write-after-read dependency), возникает, когда
вторая команда может испортить данные, необходимые в качестве
входных для первой.
Особенно сильно эти
взаимозависимости влияют на производительность процессоров
семейства х86, имеющих ограниченное число регистров,
расположенных на кристалле областей временного хранения данных.
Архитектура х86 предусматривает только восемь регистров общего
назначения, что намного меньше, чем у большинства
RISC-процессоров. Из-за этого часто используются одни и те же
регистры, что приводит к возникновению взаимозависимостей и
снижению производительности.
Можно повысить
производительность, избегая множества ложных взаимозависимостей
путем переименования регистров (register renaming). Процессоры
с переименованием регистров фактически имеют больше восьми
регистров, определяемых архитектурой х86. При этом, если
какой-либо команде требуется использовать регистр, процессор
динамически ставит в соответствие этому логическому
(архитектурному) регистру один из более многочисленных
физических регистров. Если другая команда пытается обратиться
к тому же логическому регистру, процессор для предотвращения
конфликта может поставить ему в соответствие другой физический
регистр. Такие переименования действуют, пока команды
продвигаются по конвейерам.
Такой процесс можно
сравнить с посылкой вашего «геноинженерного двойника» на
официальную встречу, где вы не можете присутствовать сами; если
«двойник» все делает правильно, то впоследствии может
создаться впечатление, что вы были в двух местах одновременно.
Принцип переименования регистров тот же самый: работая с
несколькими копиями логических регистров внутри ЦП, программа
может пользоваться одним и тем же регистром в нескольких
одновременных вычислениях.
Процессор Pentium не
выполняет переименования регистров (во всяком случае фирма Intel
не сообщает такого факта). Во всех остальных процессорах
класса Pentium используется этот метод: ЦП Ml фирмы Cyrix имеет
32 физических регистра, которые могут ставиться в соответствие
восьми программно-видимым регистрам; в ЦП К5 фирмы AMD 40
регистров, а в Nx586 фирмы NexGen — 22.
39. Обходы и
продвижения данных
Переименование
регистров не может совсем исключить возникновение истинных
взаимозависимостей данных, однако есть другие методы,
называемые обходами (data bypassing) и, продвижениями
данных (data forwarding), которые помогают уменьшить их
влияние. (Два этих термина часто подменяют друг друга.) При
обходах результаты выполнения одной команды сразу пересылаются
следующей, так что исключаются задержки на модификацию и
повторное чтение из регистра или памяти. Продвижение данных
позволяет процессору выполнять некоторые команды параллельно,
немедленно передавая результаты одной из них в другую, которой
они не потребуются до более поздней ступени конвейерной
обработки.
Фирма Intel не
сообщает, реализованы ли в ЦП Pentium обходы и продвижения,
однако все остальные процессоры класса Pentium имеют такие
средства. Микропроцессор К5 выполняет обходы и продвижения
данных; M1 — продвижение операндов и результатов, а также
обходы регистров и памяти; Nx586 может продвигать данные из
очередей памяти и выполнять обходы на различных ступенях
конвейера. Фирма Cyrix относит большую часть 30%-ного
превосходства в производительности процессора M1 перед ЦП
Pentium на счет схем обходов и продвижения данных.
40. Метод
прогнозирования переходов
От всех этих приемов
по увеличению производительности — суперскалярных архитектур,
неупорядоченной обработки, продвижения данных — мало
проку, если разработчик процессора не занялся проблемой
процедурных взаимозависимостей (procedural dependencies),
вытекающей из наличия переходов в программе. Переход — это
изменение последовательности выполнения команд. Переход может
зависеть от результата сравнения (например, если х > 0,
сделать то-то), в этом случае он называется условным. Переходы
могут также быть обязательным, или безусловными (как в обычном
операторе goto).
Переходы встречаются
в среднем через каждые шесть команд х86. Поскольку условные
переходы (ветвления) обычно разрешаются только на
исполнительной ступени конвейера, процессор не знает, какие
команды следует направлять в конвейер непосредственно вслед за
командой перехода. (Если в приведенном выше примере х > 0,
процессор должен выполнить одну последовательность команд, а
если х < 0 — другую.)
Лучший вариант
действия процессора, встретившего команду условного перехода,
— сделать предположение о пути ветвления; такой метод
называется прогнозированием ветвления (branch prediction).
Без этого процессору пришлось бы выбрасывать частично
выполненные команды из конвейеров при каждом переходе. Это
особенно неприятно в суперскалярных процессорах, поскольку в
конвейере на различных стадиях исполнения может быть достаточно
много команд.
Процессор может
предсказать, произойдет или не произойдет переход. В любом
случае процессор начинает выборку команд с предсказанного им
адреса перехода еще до того, как он узнает, верным ли был его
прогноз. Процессор может даже начать выполнение некоторых из
этих команд до разрешения условия перехода — метод, называемый
исполнением по предположению (speculate execution). (Процессор,
однако, не может модифицировать архитектурные регистры или
память до однозначного разрешения перехода.) Некоторые
процессоры обеспечивают несколько уровней предположений,
прогнозируя дополнительные ветвления до разрешения первого.
Иногда процессор
делает неправильное предположение — неверно прогнозирует
ветвление. Когда это происходит, он должен отменить все
выполненные по предположению команды и очистить конвейеры.
Вообще говоря, неправильно предсказанные ветвления очень
заметно снижают производительность, поэтому во всех ЦП класса
Pentium приняты меры, чтобы свести их число к минимуму.
Как Pentium, так и
Ml используют для прогнозирования ветвлений буфер адреса
перехода (branch target buffer) на 256 позиций. Чтобы помочь
сделать прогноз, этот буфер отслеживает и хранит данные о
результатах 256 последних ветвлений. Прогнозирование ветвлений
в архитектуре процессора Ml фирмы Cyrix идет еще дальше,
дополняя систему стеком возвратов (return stack), который
специально отслеживает переходы, происходящие в паре команд
CALL/RETURN.
В процессоре К5
фирмы AMD применяется совершенно другой подход к прогнозированию
ветвлений. Вместо того чтобы использовать специальный буфер
адреса перехода, К5 добавляет информацию о переходах к каждой
из 1024 16-байт строк имеющейся на кристалле кэш-памяти команд.
Здесь приводится адрес первого перехода в строке кэш-памяти и
указывается, как следует прогнозировать ветвление — как
выполняемое или невыполняемое. Небольшой недостаток этого
подхода состоит в том, что нельзя сохранить информацию о более
чем одном переходе в строке кэш-памяти.
Фирма
NexGen
не раскрывает подробности своего запатентованного механизма
прогнозирования ветвлений. Исследование, выполненное журналом
Microprocessor
Report
на основе изучения патентной информации, показало, что в ЦП
Nx586
используется кэш-память адресов переходов на 96 элементов,
каждый из которых представляет собой 24-байтную команду, начиная
с адреса перехода.
|