Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1 / Lectures / ГосЭк2.doc
Скачиваний:
68
Добавлен:
28.05.2015
Размер:
790.53 Кб
Скачать

12. Особенности эвм с конвейерными архитектурами

Конвейерная (pipeline) обработка команд используется для повышения производительности ЭВМ. Принцип такой обработки заключается в совмещении во времени выполнения различных этапов последовательных команд программы.

В общем случае в выполнении каждой команды можно выделить несколько этапом. Причем сделать это можно несколько различными способами, например, выделив четыре этапа:

  • выборка команды из памяти (fetch, prefetch – предварительная выборка)

  • декодирование команды и выборка операндов из памяти (decode)

  • выполнение заданной в команде операции (execute)

  • запись результата в память (write)

Выполнение команд при этом можно представить так, как показано на рис.

Выполнение действий на каждой ступени конвейера должно, по возможности, занимать одинаковое время. В пределе – это один такт. Поэтому чем на большее количество этапов разделено исполнение команды, тем короче и проще могут быть эти этапы и тем большее количество команд одновременно находится в обработке. А это влечет за собой и повышение производительности и возможность поднять рабочую частоту ядра процессора.

Но за этим кроются и большие проблемы, поэтому увеличение количества этапов (длины конвейера) выше некоторых значений в ряде случаев не приводит к повышению производительности при прочих равных условиях (пример, Pentium III и Pentium IV).

Выполнение команд по указанной схеме лучше всего производится при одинаковом времени осуществления отдельных этапов. Однако это далеко не всегда имеет место по следующим причинам:

  • обращение к памяти, как правило, занимает значительно больше времени, чем собственно выполнение операций

  • в качестве данных для следующей команды могут использоваться результаты выполнения предыдущей команды

  • выполнение некоторых операций, например, деления, требует больше времени, чем для большинства других операций

  • адрес следующей команды может зависеть от результатов выполнения предшествующей команды (условные переходы).

Для учета и, по возможности, исключения влияния названных факторов используются следующие механизмы.

Команды и данные хранятся в кэш памяти, к которой и обращается процессор. Кэш может работать на частоте процессора, обеспечивая необходимую для конвейера длительность соответствующих этапов обработки команды. Обращения непосредственно к оперативной памяти производятся только при отсутствии информации в кэш-памяти. Таким образом, задержки в работе конвейера из-за большого времени обращения к памяти имеют место только в таких случаях.

Задержки из-за зависимости (конфликтов) по данным, возникающие при использовании командой результата выполнения предшествующей команды, исключаются (при операциях, выполняемых за один такт) за счет непосредственной передачи результата на обработку этой команде одновременно с началом записи результата (в регистр).

(Исключить влияние подобной зависимости без аппаратных средств, передающих результат непосредственно следующей команде, может и компилятор, вставляя в соответствующие места программы пустые операции, но это не устраняет задержек.).

Задержки в запуске такта выборки команды из-за зависимости адреса следующей команды (направления перехода) от результата исполнения предыдущей, можно уменьшить посредством начала выборки команды наиболее вероятной ветви перехода до завершения выполнения предыдущей. Однако, задержка будет исключена только если переход пойдет именно по выбранному направлению. В противном случае, все выполненные, начиная с выборки команды, следующей за переходом, действия, придется игнорировать и начать выполнение нужной ветви. Выбор направления перехода осуществляет, так называемый, механизм предсказания переходов.

Для сокращений задержек, обусловленных выборкой команды из точки перехода, помимо различных вариантов буферизации [Цилькер, Орлов] в случае условных переходов используется один из следующих вариантов:

- формирование обеих ветвей перехода до того момента, когда значение условия перехода станет вычисленным

- игнорирование факта перехода и продвижение по программе как в его отсутствие

- выбор наиболее вероятного направления перехода.

Первый путь прост, но недостаточно эффективен. Второй – малоприменим на разветвляющихся участках программ со следующими друг за другом переходами. Поэтому часто используется третий путь, в котором выбор направления перехода осуществляет, так называемый, механизм предсказания переходов.

Существуют различные алгоритмы предсказания переходов, которые делятся на две большие группы: статические и динамические. Первые из них основаны на определенных предположениях (например, переход выполняется всегда, вероятность перехода зависит от кода команды, вероятность перехода зависит от направления вперед или назад, вероятность перехода определяется компилятором и т.п.), которые не изменяются в процессе выполнения программ. Динамические алгоритмы, напротив, анализируют результаты переходов в процессе выполнения программы и могут изменять в соответствии с ними предсказываемые направления переходов [Цилькер, Орлов]. Хорошие алгоритмы (обычно, динамические) могут в определенных случаях правильно предсказывать переходы в 95-97 % случаев.

Дальнейшее развитие конвейерной архитектуры с использованием нескольких исполнительных блоков (нескольких АЛУ), позволяющих выполнять одновременно несколько операций. Такие системы получили название систем с суперскалярной конвейерной архитектурой.

Стремление более полно использовать возможности нескольких исполнительных блоков (все или часть которых, как правило, специализируется на выполнении отдельны типов операций: с фиксированной точкой, с плавающей точкой, коротких операций, деления и пр.), привело к появлению механизма изменения порядка выполнения команд для наилучшей загрузки операционных блоков. Это потребовало добавления соответствующих механизмов переупорядочения/диспетчеризации.

Типичным представителем суперскалярной конвейерной архитектуры являлись процессоры семейства P6 фирмы Intel, показанной на рис. 4.19. Эта архитектура была названа трехканальной, что означало возможность для процессора в среднем декодировать, обработать и завершить выполнение трех команд за один рабочий цикл. Для достижения такого уровня пропускной способности, в процессорах использовался 12-ступенчатый конвейер, поддерживающий неупорядоченное (out-of order) исполнение команд, оптимизирующее обращения к памяти и использование операционных блоков.

Схематически этот конвейер делится на 4 функциональных блока (блок выборки/декодирования, блок диспетчирования/выполнения, блок завершения и пул команд). Команды и данные поступают в эти блоки через блок интерфейса с шиной.

Рис 4.19. Функциональные блоки процессоровIntelсемействаP6

Для обеспечения непрерывной подачи команд и данных в конвейер обработки команд, архитектура процессоров семейства P6 включает два уровня кэша. Кэш первого уровня (L1) включает в себя кэш команд, емкостью 8 Кбайт и кэш данных, емкостью также 8-Кбайт. Оба они тесно связаны с конвейером. Кэш второго уровня (L2) имеет емкость 256 Кбайт, 512 Кбайт или 1 Мбайт статической памяти, и связан с процессором 64-битной шиной кэша, работающей на полной частоте ядра. (Впоследствии кэш и его связь с процессором были модифицированы.)

Функциональным центром процессоров семейства P6 является механизм неупорядоченного выполнения (команд), названный “динамическим выполнением”, использующий следующие принципы обработки: глубокое предсказание переходов, анализ динамических потоков данных, предварительное выполнение команд.

В процессорах семейства P6 блок выборки/декодирования команд используется оптимизированный алгоритм предсказания переходов, позволяющий определять направления переходов при многоуровневых ветвлениях, вызовах процедур и возвратов из них.

Анализ динамических потоков данныхпредполагает анализ потоков данных через процессор в реальном масштабе времени для определения зависимостей между данными и регистрами и выявления возможностей для неупорядоченного выполнения команд. Блок диспетчирования/исполнения процессоров семействаP6 может одновременно осуществлять мониторинг многих команд и выполнять их в том порядке, оптимизирующем использование нескольких исполнительных блоков процессора, поддерживая при этом целостность данных. Такое неупорядоченное исполнение обеспечивает занятость исполнительных блоков даже при отсутствии нужной информации в кэше и наличии зависимостей между командами.

Предварительное исполнениеотносится к способности процессора выполнять команды прежде, чем на них укажет счетчик команд, но, в конечном счете, формировать результаты в соответствии с исходным порядком потока команд. Для того чтобы обеспечить возможность предварительного исполнения, в процессорах семействаP6 диспетчирование и выполнение команд отделены от записи результатов. Блок диспетчирования/исполнения процессора использует анализ потоков данных для выполнения всех доступных команд из пула команд и сохраняет результаты во временных регистрах. Затем блок завершения линейно просматривает пул команд, в поисках команд, не имеющих более зависимостей по данным с другими командами или необработанными предсказаниями переходов. Когда такие команды обнаруживаются, блок завершения записывает результаты из выполнения в память и/или в регистры процессора (8 регистров общего назначения и 8 регистров с плавающей точкой) в том порядке, в котором они должны выполняться по программе, и удаляет эти команды из пула команд.

Рассматриваемая архитектура лежит в основе процессоров Pentium Pro, Pentium II и Pentium III. Процессоры Pentium 4 имеют некоторые архитектурные отличия от своих предшественников. Эти отличия оформлены в, так называемой, пакетно-сетевой (netburst) архитектуре, используемой в данных процессорах, и состоят в следующем:

- ариметико-логические блоки работают на удвоенной частоте процессора;

- конвейер имеет 20 ступеней, что позволяет повысить частоту работы процессора;

- кэш команд, преобразован в кэш трассы и хранит декодированные команды, в обработке может находиться до 126 команд;

- строка кэша увеличена до 128 байт (позже до 256 байт);

- системная шина работает на счетверенной частоте;

- улучшен алгоритм предсказания переходов, что необходимо для длинного конвейера, буфер предсказания переходов может работать на 4096 направлений (т.е. обрабатывает до 12 вложенных разветвлений).

Однако впоследствии от более длинного конвейера разработчики в архитектуре Coreотказались.

Микроархитектура процессоров семейства P6

Микроархитектурой семейства процессоров P6 стала трехканальная суперскалярная конвейерная архитектура. Термин “трехканальная суперскалярная” означает, что, используя параллелизм, процессор, в среднем, может декодировать, обработать и завершить выполнение трех команд за один рабочий цикл. Для достижения такого уровня пропускной способности, процессоры семействаP6 используют 12-ступенчатый несвязанный суперконвейер, который поддерживает неупорядоченное (out-oforder) выполнение команд.

Предсказание переходов используется в большинстве больших ЭВМ и в высокопроизводительных микропроцессорных архитектурах. Оно позволяет процессору декодировать команды, расположенные в программе после ветвления для того, чтобы держать конвейер команд заполненным. В процессорах семейства P6 блок выборки/декодирования команд использует высоко оптимизированный алгоритм предсказания переходов, чтобы определять направления переходов при многоуровневых ветвлениях, вызовах процедур и возвратов из них.

Описание блоков микроархитектуры процессоров семейства P6

Подсистема памяти

Подсистема памяти процессоров семейства P6 состоит из основной системной памяти, кэша первого уровня (L1) и кэша второго уровня (L2). Блок интерфейса с шиной обеспечивает доступ к системной памяти через внешнюю системную шину. Эта 64-битная ориентирована на транзакции, что означает, что каждое обращение к ней обрабатывается как отдельная операция запроса и ответа. Пока блок интерфейса с шиной ожидает ответа на один запрос шины, она может сформировать еще множество дополнительных запросов. Блок интерфейса с шиной обеспечивает доступ к кэшу второго уровня через 64-битную шину кэша. Эта шина также ориентирована на транзакции, поддерживает до четырех одновременных операций доступа к кэшу и работает на полной частоте процессора.

Доступ к кэшу первого уровня осуществляется через внутренние шины также на частоте процессора. 8-Кбайтный кэш команд первого уровня – 4-х канальный наборно-ассоциативный; 8-Кбайтный кэш данных первого уровня – двухпортовый двухканальный наборно-ассоциативный, обеспечивающий выполнение одной записи и одного чтения за такт.

Соответствие данных (когерентность) кэшей и системной памяти поддерживается использованием протокола кэша MESI(modified,exclusive,shared,invalid– изменен, монопольный, разделенный, недействителен). Этот протокол способствует когерентности кэша и одно- и многопроцессорных системах. Он также может обнаруживать проблемы когерентности, возникающие при использовании самомодифицирующихся кодов.

Обращения к памяти со стороны исполнительных блоков процессора проходят через блок интерфейса с шиной и буфер переупорядочения памяти. Эти блоки спроектированы для обеспечения равномерности потока обращений к памяти через кэш и иерархию системной памяти и предупреждения блокировки доступа к памяти. Кэш данных первого уровня автоматически направляет пропуски в кэш второго уровня, а затем, если необходимо, блок интерфейса с шиной направляет пропуски кэша L2 в системную память.

Обращения к кэшу второго уровня или к системной памяти проходят через буфер переупорядочения памяти, который действует как станция диспетчирования. Этот блок поддерживает весь поток запросов к памяти и может изменять порядок некоторых запросов для предупреждения блокировок памяти и повышения ее пропускной способности. Например, буфер переупорядочения позволяет операциям загрузки регистров производиться без записи в память. Он также запускает предварительные операции загрузки. (Операции записи всегда выполняются в правильном порядке, а предварительные записи никогда не производятся.)

Блок выборки/декодирования (Fetch/Decode Unit)

Блок выборки/декодирования считывает поток команд процессора из кэша команд первого уровня и преобразует (декодирует) их в более простые операции, называемые “микроинструкциями”. Затем поток этих микроинструкций (пока еще соответствующий исходному порядку команд) посылается в пул команд.

Блок выборки команд извлекает одну 32-байтовую строку из кэша команд за один такт. Он отмечает начала и концы команд процессора в строке кэша и передает 16 выровненных байтов в дешифратор.

Блок выборки команд устанавливает счетчик команд, основываясь на данных буфера направлений переходов, состояния исключения/прерывания и индикации неправильно предсказанных переходов целочисленным исполнительным блоком. Наиболее важной составляющей этого процесса является предсказание переходов, выполняемое буфером направлений переходов. Используя расширение алгоритма Йеха, буфер направлений переходов на 512 позиций просматривает множество команд следующих за счетчиком удаления. В пределах этого окна команд могут иметься многочисленный разветвления, вызовы процедур и возвраты, которые должны быть правильно предсказаны, чтобы блок диспетчирования/исполнения выполнял полезную работу.

Дешифратор команд включает в себя три параллельных дешифратора: два для простых команд и один для сложных. Каждый дешифратор преобразует команду процессора в одну или более трехместных микроинструкций (два логических источника данных и один логический приемник данных на микроинструкцию). Микроинструкции представляют собой примитивные команды, которые выполняются параллельно шестью исполнительными блоками процессора. Многие команды процессора непосредственно преобразуются в одну микроинструкцию дешифраторами простых команд, а некоторые требуют от одной до четырех микроинструкций. Более сложные команды процессора преобразуются в заранее запрограммированные последовательности микроинструкций, извлекаемые из секвенсора микрокодов команд. Дешифраторы команд также обрабатывают префиксы команд и циклические операции. Дешифраторы команд могут сгенерировать до шести микроинструкций за цикл (по одной – каждый дешифратор простых команд и четыре – дешифратор сложных команд).

Набор регистров процессора может приводить к потере скорости из-за зависимостей между регистрами. Для решения этой проблемы в процессоре имеется 40 регистров общего назначения, которые используются для фактических вычислений. Эти регистры могут работать с величинами как с фиксированной, так и с плавающей точкой. Для выделения внутренних регистров ставящаяся в очередь микроинструкция из дешифратора команд посылается в блок таблицы переименования (алиасов) регистров, в котором ссылки на логические регистры архитектуры процессор преобразуются в ссылки на физические внутренние регистры.

На конечной фазе процесса дешифрации узел размещения блока переименования регистров добавляет биты состояния и флаги к микроинструкциям, чтобы подготовить их к неупорядоченному выполнению, и пересылает получившиеся микроинструкции в пул команд.

Пул команд (Instruction Pool), или буфер переупорядочения (Reorder Buffer)

Прежде чем попасть в пул команд (известный формально, как буфер переупорядочения) поток микроинструкций имеет тот порядок, который определяется потоком команд процессора, посылаемым в дешифратор команд. Никакого переупорядочения команд нет.

Буфер переупорядочения представляет собой массив ассоциативной памяти, состоящей из 40 регистров микроинструкций. Он содержит микроинструкции, ожидающие исполнения, а также выполненные микроинструкции, результаты которых еще не зафиксированы в состоянии процессора. Блок диспетчирования/исполнения может выполнить микроинструкции из этого буфера в любом порядке.

Блок диспетчирования/исполнения (Dispatch/Execute Unit)

Блок диспетчирования/исполнения является неупорядоченным блоком, который определяет порядок и исполняет микроинструкции, расположенные в буфере переупорядочения в соответствии с зависимостями по данным и доступными ресурсами и запоминает во временной памяти результаты этого предварительного исполнения.

Определение порядка исполнения и диспетчирование микроинструкций из буфера переупорядочения производится станцией резервирования. Она постоянно просматривает буфер переупорядочения на предмет выявления микроинструкций, которые готовы к исполнению (т.е., для них имеются все операнды) и отправляет их на в свободный исполнительный блок. Результат выполнения микроинструкции возвращается в буфер переупорядочения и хранится вместе с самой микроинструкцией до ее удаления. Такой процесс определения порядка и диспетчирования поддерживает классическое неупорядоченное исполнение, при котором микроинструкции отправляются на исполнение в прямом соответствии с ограничениями потока данных и доступностью исполнительных ресурсов без учета первоначального порядка команд. Когда две или более микроинструкций одного и того же типа (например, целочисленные операции) могут быть выполнены одновременно, то они исполняются в псевдо-FIFO(firstin–firstoutили первый пришел – первый обслужен) порядке их в буфере переупорядочения.

Исполнение микроинструкций производится двумя целочисленными блоками, двумя блоками с плавающей точкой и одним блоком интерфейса с памятью, обеспечивая обработку до пяти микроинструкций за такт.

Два целочисленных блока могут обрабатывать две целочисленных микроинструкции параллельно. Один из них также обрабатывает микроинструкции разветвления. Этот блок может обнаруживать неправильно предсказанные переходы и указывать буферу направлений перехода на необходимость перезапустить конвейер. Это действие выполняется следующим образом. Дешифратор команд помечает каждую микроинструкцию разветвления обоими адресами перехода (предсказанным переходом и пропускаемым переходом). Когда целочисленный блок выполняет микроинструкцию разветвления, он может определить, какой переход в действительности должен быть выполнен: предсказанный или пропускаемый. Если выполняется предсказанный переход, то предварительно выполненные микроинструкции помечаются как используемые и выполнение продолжается по предсказанному пути. Если же предсказанный переход не должен выполняться, то узел перехода в целочисленном блоке изменяет состояние всех микроинструкций, следующих за переходом так, чтобы удалить их из пула команд. Затем он помещает правильный переход в буфер направлений перехода, а последний, в свою очередь, перезапускает конвейер с новым адресом перехода.

Блок интерфейса с памятью обрабатывает микроинструкции загрузки и записи. При загрузке нужно указать только адрес память, поэтому ее можно закодировать одной микроинструкцией. При записи надо указать и адрес и данные, которые должны быть записаны, поэтому запись кодируется двумя микроинструкциями. Та часть блока интерфейса с памятью, которая обрабатывает запись, имеет два порта, позволяющих обрабатывать адрес и данные микроинструкций одновременно. Таким образом, блок интерфейса с памятью может выполнить как загрузку, так и запись одновременно за один процессорный цикл.

Блок операций с плавающей точкой подобен используемому в процессорах Pentium. В процессорах семействаP6 были добавлены несколько команд с плавающей точкой для потоковых ветвлений и пересылок.

Блок завершения (Retirement Unit)

Блок завершения фиксирует результаты предварительно выполненных микроинструкций в состоянии машины и удаляет эти микроинструкции и буфера переупорядочения. Подобно станции резервировании, блок завершения непрерывно контролирует состояние микроинструкций в буфере переупорядочения, обнаруживая те, которые уже выполнены и более не имеют зависимостей с микроинструкциями в пуле команд. В этом случае он удаляет завершенные микроинструкции в их первоначальном порядке, учитывая прерывания, исключения, отладочные точки и неправильно предсказанные ветвления.

Блок завершения может удалять до трех микроопераций за такт. Удаляя микроинструкции, блок записывает результаты в файл регистров удаления и/или в память. Файл регистров удаления содержит регистры архитектуры IA(8 регистров общего назначения и 8 регистров с плавающей точкой). После того, как результаты были зафиксированы в состоянии процессора, микроинструкции удаляются из буфера переупорядочения.

Соседние файлы в папке Lectures