Cтруктура суперскалярного процессора
В настоящем параграфе для иллюстрации особенностей построения суперскалярных систем в качестве базовой используется архитектура суперскалярного процессора Пентиум фирмы Intel с системой команд типа CISС. Вызвано это следующими причинами:
Появление в структуре процессора более одного конвейера делает этот процессор суперскалярным.
Как правило, в суперскалярных процессорах в первую очередь увеличивают количество целочисленных конвейеров, так как статистика показывает, что в обычных пакетах прикладных программ для ПЭВМ около 80% команд - целочисленные, 15% - команды условных переходов, и только небольшой процент команд является командами с плавающей запятой.
Немедленно после введения второго или большего числа конвейеров возникают принципиально важные для суперскалярной структуры вопросы по организации и технической реализации вычислений:
Организация параллельного запуска команд предусматривает выполнение трех этапов: распараллеливание последовательной программы; планирование порядка выполнения команд для заданных ресурсов; представление спланированной программы в фор-ме, пригодной для исполнения аппаратурой.
В зависимости от способа реализации этих этапов методы формирования и запуска параллельных команд можно разделить на статические, динамические и смешанные. Считается, что статические способы предпочтительнее, поскольку анализ программы в процессе компиляции обеспечивает более глубокое выделение и планирование параллелизма, кроме того, исключает служебные команды управления параллелизмом из вычислительного процесса. Динамический же запуск позволяет более полно учитывать текущее состояние программы и ресурсов при исполнении программы.
Возможны следующие способы статического формирования параллельной команды:
Рис. 4.8.Представление СДК в памяти МП i860
В МП i860 только два конвейера, поэтому СДК имеет длину 2. Если в некоторой команде, например, Ki указан признак d (dual-двойной), это означает, что следующие две команды по списку, а именно, и образуют параллельную пару. Физически эта пара может быть расположена либо в одной ячейке параллельной памяти, либо в смежных ячейках последовательной памяти.
3. Описанные выше способы годятся для вновь разрабатываемых систем команд, поскольку на этапе разработки можно заложить средства, обеспечивающие объединение команд в СДК фиксированного формата. Однако эти способы нельзя применить к системам команд CISC-процессоров, которые нельзя "подкорректировать", поскольку для них уже существует большой объем написанного математического обеспечения.
В этом случае используются элементы смешанного формирования и запуска СДК. Рассмотрим это на примере суперскалярного МП Пентиум с двумя целочисленными конвейерами U и V, использующего систему команд i80x86 и имеющего те же ступени, что и на рис. 4.1.
Пусть имеется отрезок программы на ЯВУ и соответствующий ему ассемблерный вариант:
DO 1 I = 1, 10 |
M: |
mov edx, [eax + 40 + a] |
A (I) = A (I) + 1 |
|
mov ecx, [eax + 40 + b] |
1 B (I) = B (I) + 1 |
inc edx |
|
|
|
inc ecx |
|
|
mov [eax + 40 + a], edx |
|
|
mov [eax + 40 + b], ecx |
|
|
jnz M |
В этой программе команды расположены последовательно, никаких отметок о параллелизме команд нет, в МП Пентиум также отсутствует СДК фиксированного формата. Следовательно, программа для этого МП оформлена в памяти стандартным для всех МП 80x86 образом. Однако она существенно отличается от программ для МП 386/486, не являющихся суперскалярными. Отличие состоит в том, что на этапе компиляции скалярный параллелизм выявлен и команды переставлены так, что параллельные команды в программе являются смежными.
На ступени D1 целочисленных конвейеров аппаратно при последовательной выборке команд из памяти определяется текущий параллелизм. Проверка параллельности двух команд производится с учетом всех видов зависимостей по данным.
В результате потактного распараллеливания в конвейеры U и V будет загружена и исполнена следующая программа:
|
Конвейер U |
Конвейер V |
M: |
mov edx, [eax + 40 + a] |
mov ecx, [eax + 40 + b] |
|
inc edx |
inc ecx |
|
mov [eax + 40 + a], edx |
mov [eax + 40 + b], ecx |
|
add eax, 4 |
jnz M |
которая требует для своего исполнения всего 4 такта вместо 7 в исходном тексте.
Динамическое формирование и запуск СДК используются в тех случаях, когда имеется большой объем прикладного матобес-печения в виде двоичных кодов и не представляется возможным произвести распараллеливание этих кодов с помощью программных распараллеливателей. Тогда задача распараллеливания возлагается на аппаратуру на этапе исполнения программ.
Рассмотрим следующие варианты динамического распараллеливания:
Суть алгоритма пакетного формирования и запуска СДК состоит в том, что из блока в n инструкций, обычно составляющих ББ или часть ББ, выбирается и немедленно исполняется m инст-рукций. Во время их выполнения в исходный блок добавляется m новых инструкций и вновь повторяется поиск независимых инструкций. Таким образом, блок из n инструкций напоминает "скользящее окно", перемещаемое по программе по мере ее исполнения, а m параллельных команд составляют СДК.
Нетрудно видеть, что анализ на независимость блока из n команд требует много времени. С этой целью перед анализом на независимость команды преобразуются в форму, представленную на рис. 4.9. Здесь поля E и D содержат биты, установленные на номерах входных и выходного регистров, необходимых для выполнения данной команды. Следовательно, сравнение двух команд на зависимость сводится к побитному сравнению полей E и D, что может быть сделано быстро, и выбор m независимых команд может быть выполнен за время выполнения предыдущей СДК.
Рис.4.9. Модифицированный формат команды
Очевидно, что описанная схема, в отличие от ЭВМ CRAY, не требует предварительной перестановки команд ББ на этапе компиляции, что позволяет использовать традиционные компиляторы. Это является достоинством пакетной схемы. Однако большая длительность цикла формирования СДК аппаратурой снижает быстродействие процессора.
В качестве законченной структуры суперскалярного микропроцессора рассмотрим структуру МП Пентиум. Пентиум - это суперскалярный МП типа CISC семейства i80?86, следующий за МП 386 и 486. Он на 100% совместим на уровне двоичных кодов с МП 8086, 386DX, 486DX, 486SX и 486DX2. Структура Пентиума соответствует рис. 4.1, однако в нем содержится еще один целочисленный конвейер.
Таким образом, Пентиум содержит два целочисленных конвейера U и V и плавающий конвейер, входные ступени последнего (PF, D1, D2) являются общими с конвейером U. Назначение ступеней, особенности конвейеров описаны ранее в параграфах 4.2 и 4.3. При работе с плавающей запятой конвейеры U и V объединяются, создавая 64-разрядный обрабатывающий тракт.
Пентиум может запускать одну или две инструкции каждый такт. Чтобы запускать две инструкции одновременно, необходимо, чтобы они не содержали зависимостей по данным, были целочисленными и "простыми". Простые команды выполняются за один такт. Исключением являются команды с обращением к памяти типа mem, req и reg, mem, которые требуют два и три такта соответственно, однако имеется специальная аппаратура, чтобы позволить этим командам выполняться, как простым.
Простыми являются следующие команды:
1. mov reg, reg/mem/imm
2. mov mem, reg/imm
3. alu reg, reg/mem/imm
4. alu mem, reg/imm
5. inc reg/mem
6. dec reg/mem (4.9)
7. push reg/mem
8. pop reg
9. lea reg, mem
10. jmp/call/jcc near
11. nop
Кроме того, команда межрегистрового обмена FXCH может образовывать пары с другими плавающими командами. Это сделано, как уже говорилось выше, чтобы ослабить ограничения на параллельную обработку, вызванные стековой организацией файла РОН плавающих регистров.
Быстродействие суперскалярного процессора в значительной степени определяется стилем программирования. Из этого следует, что существующие компиляторы для ЭВМ, построенных на базе МП i386, i486 не будут эффективными для Пентиума, поскольку они построены в расчете на экономию памяти и РОН, что приводит к появлению искусственных зависимостей по данным между смежными командами и уничтожает параллелизм команд.
Для суперскалярных процессоров необходимы новые компиляторы распараллеливающего типа.
Конвейер МП Пентиум выполняет команды строго в порядке их следования в программе. Такой способ функционирования существенно снижает эффективность конвейера, поскольку конвейер вынужден останавливаться, когда на этапе EX выполняется многотактная команда. Кроме того, для загрузки двух целочисленных конвейеров используется параллелиз только пары смежных ко-манд, а он невелик, поэтому и вероятность совместной работы этих конвейеров невысока.
Повысить эффективность суперскалярной обработки можно, если допустить выполнение команд в порядке готовности их операндов. Такая архитектура использована в МП Р6 фирмы Intel, упрощенная структурная схема которого представлена на рис. 4.10. В МП Р6 используется та же система команд, что и во всех микропроцессорах i80x86.
Рис. 4.10. Структура МП с произвольным порядком выполнения команд
Функции блоков микропроцессора таковы:
1. Блок выборки и декодирования команд ВД обеспечивает чтение команд их КЭШ, их декодирование, преобразование и запись в буфер команд БК. Команды обрабатываются блоком ВД в порядке их следования в программе.
2. Буфер команд БК представляет собой ассоциативную память, в которой команды представлены в трехадресном формате.
Поскольку в системе команд i80x86 мало РОН (всего 8), то из-за этого между командами возникают ложные зависимости по данным. Для устранения этих зависимостей в МП Р6 введено 40 дополнительных регистров, которые недоступны программисту. Они используются аппаратурой для временного хранения результатов. Обозначим эти регистры временного хранения через V. То-гда на рис. 4.10 V1, V2 и VР обозначают соответственно номера регистров для хранения первого, второго операндов и результата. Преобразование команд системы i80x86 в трехадресный формат и переименование регистров производится блоком ВД.
Каждая команда в БК сопровождается блоком событий БС, в котором отмечаются следующие состояния команды: готовность каждого операнда, готовность команды к исполнению, готовность результата и др.
3. Центральным блоком МП Р6 является блок планирования и выполнения команд ПВ. Именно он выполняет команды в порядке их готовности. ПВ содержит несколько АЛУ и устройств обращения к памяти. За один такт ПВ способен одновременно запустить на исполнение до пяти команд и передать в БК до пяти результатов.
Выборка готовых команд из БК производится путем ассоциа-тивного опроса блока БС всех команд, а размещение нескольких команд по устройствам ПВ осуществляется в соответствии с определенным алгоритмом планирования. Одним из наиболее простых для аппаратной реализации является алгоритм FIFO (первым пришел - первым ушел).
При получении в ПВ каждого нового результата адрес его размещения используется как ассоциативный признак для полей V1, V2 буфера команд. Если одна или несколько команд откликнулись на этот признак, значит, эти команды завися по данным от выполненной команды. В блоках БС откликнувшихся команд устанавливаются биты и готовности операндов, а, если готовыми оказались оба операнда, то устанавливается и бит готовности для исполнения всей команды. Это позволяет сформировать очередной набор "готовых" команд для следующего такта работы ПВ.
Чтобы блок ПВ мог выполнять за один такт до 3...5 команд необходимо, чтобы в БК находилось до 20...30 команд. По статистике среди такого объема команд в среднем имеется 4...5 команд условных переходов. Следовательно в БК находится некоторая трасса выполнения команд. Выбор таких наиболее вероятных трасс является новой функцией МП с непоследовательным выполнением команд. Эта функция выполняется в блоке ВД на основе расширенного до 512 входов буфера истории переходов.
Поскольку реально вычисленный в ПВ адрес перехода не всегда совпадает с предсказанным в блоке ВД, то вычисление в ПВ выполняется условно, т. е. результат записывается в регистр временного хранения. Только после того, как установлено, что переход выполнен правильно, блок удаления команд УК выводит из БК все выполненные команды, расположенные за командой условного перехода, преобразует их в формат системы i80x86 и производит запись результатов по адресам, указанным в исходной программе.
Блоки ВД, ПВ и УК совместно составляют конвейер из 12 этапов, однако все три части этого конвейера работают практически независимо, взаимодействуя только через БК. Следовательно, такой конвейер можно считать неблокируемым, так как остановка любой его части не прекращает работу других частей.
Составлено по материалам книги Г.И. Шпаковский. Организация параллельных ЭВМ и суперскалярных процессоров