
- •Развитие микропроцессорных архитектур
- •Введение ……………………………………………….........................................4
- •С благодарностью
- •Введение
- •1. История развития микропроцессоров фирмы Intel
- •2. Микропроцессоры класса cisc
- •Можно отметить следующие основные черты архитектуры amd64:
- •4. Микропроцессоры класса risc
- •5. Повышение производительности микропроцессоров
- •6. Конвейерная работа микропроцессоров
- •7. Метод переименования регистров (регистровые окна)
- •8.Принцип обработки операндов simd
- •8.1. Архитектура mmx
- •8.2 Технология sse
- •8.3 Технология sse2
- •9. Обзор simd-команд
- •9.1. Команды передачи данных
- •9.2 Арифметические команды
- •9.2.2 Команды упакованного/скалярного умножения и деления
- •9.2.3 Команды упакованого/скалярного вычисления квадратных корней
- •9.2.4. Команды упакованного/скалярного нахождения максимума и минимума
- •9.2.5 Команды сравнения
- •9.3. Команды преобразования типов данных
- •9.4. Логические команды
- •9.5. Дополнительные команды simd над целочисленными операндами
- •9.6. Команды перестановки
- •9.7. Команды управления состоянием
- •9.8. Команды технологии sse3
- •1. Преобразование чисел с плавающей запятой в целые числа. В эту подгруппу входит одна-единственная инструкция, которая работает на уровне арифметического сопроцессора x87 fpu.
- •3. Загрузка невыровненных переменных. Данную подгруппу представляет инструкция lddqu.
- •Команда monitor устанавливает диапазон адресов памяти (обычно используется одна строка кэша), по которому будет осуществляться отслеживание записей по стандартному протоколу write-back.
- •10. Технология Hyper-Threading
- •11. Vliw (epic) микропроцессор
- •Литература
- •Замковец Сергей Всеволодович Развитие микропроцессорных архитектур
- •119333, Москва, ул. Вавилова, д. 44, кор. 2
6. Конвейерная работа микропроцессоров
Если взять техническую документацию на микропроцессор 80386, то в этой документации указывается время выполнения (в тактах) каждой инструкции. Например, для команды ADD r8, r8 (сложение двух операндов, находящихся в 8-разрядных регистрах) время выполнения равняется двум тактам, а для команды ADD r8,m8 (сложение двух операндов, один из которых находится в регистре, а второй операнд находится в памяти) время выполнения равняется 7 тактам. Для микропроцессоров Pentium подобные данные отсутствуют и это связано с тем, что в этом микропроцессоре используются конвейеры. Идею конвейера и его реализацию можно рассмотреть на следующем примере.
Анализ работы команд микропроцессора показал, что выполнение команд можно разделить на некоторое количество этапов (стадий):
PF - предварительная выборка – на этом этапе команды выбираются из памяти или кэш и устанавливаются в очередь;
D1 - декодирование команд – на этом этапе команды декодируются и разделяются на отдельные компоненты – код операции и операнды;
D2 – генерация адреса – на этом этапе рассчитывается адрес операнда, если этот операнд находится в памяти;
EX – процессор выполняет действия, требуемые для выполнения команды;
WB – завершение выполнения команды, а данные, которые должны быть записаны в память, посылаются в буфер записи.
Если микропроцессор устроен таким образом, что работа каждого этапа выполнения команды производится в определенном месте со своими аппаратными ресурсами, а после выполнения этой работы команда передается на следующий этап (а, значит на следующее определенное место), то получается, что каждая команда обрабатывается на конвейере. В этом случае время выполнения каждой команды равно времени нахождения этой команды на конвейере, а если считать, что время нахождения каждой команды на ступени равно, например, одному такту, то результат выполнения каждой команды появляется на выходе с конвейера каждый такт. Нормальная работа конвейера показана в таблице 1.
При использовании конвейерной обработки команд в показанном примере общее время выполнения каждой команды будет составлять 5 тактов, а в каждом такте аппаратура будет выполнять пять различных команд. В представленном примере конвейер имеет всего пять ступеней. Если же конвейер состоит из гораздо большего количества ступеней, то это означает, что на каждой ступени аппаратные средства выполняют меньше работы и эту работу они выполняют за меньшее время. Таким образом, за счет увеличения количества ступеней в конвейере можно увеличить частоту работы микропроцессора. Так, если в микропроцессоре Pentium длина конвейера составляла 5 ступеней (при максимальной тактовой частоте 200 МГц), то в Pentium-4 - уже 20 ступеней (при максимальной тактовой частоте 3,4 ГГц).
Таблица 1. Выполнение команд на стадиях конвейера
Этапы
Такты PF D1 D2 EX WB
1 I1 Старт 1 команды
2 I2 I1 Старт 2 команды
3 I3 I2 I1 Старт 3 команды
4 I4 I3 I2 I1
5 I5 I4 I3 I2 I1 Финиш 1 команды
6 I6 I5 I4 I3 I2 Финиш 2 команды
7 I7 I6 I5 I4 I3 Финиш 3 команды
Большое преимущество микроархитектур с конвейерной обработкой перед последовательной обработкой наблюдается в идеальном конвейере, в котором отсутствуют конфликты. Конфликты - это такие ситуации при работе конвейера, которые препятствуют последовательному выполнению очередной команды в предназначенном для нее такте. Конфликты, возникающие в конвейере можно разделить на три группы:
- структурные конфликты;
- конфликты по управлению;
- конфликты по данным.
Структурные конфликты возникают в тех случаях, когда аппаратные средства конвейера микропроцессора не могут поддерживать для всех команд одинаковое время нахождения на какой-либо ступени конвейера. Чаще всего такая ситуация возникает на ступени выполнения инструкции. В этом случае работа конвейера приостанавливается до тех пор, пока команда не будет обработана на этой ступени.
Со структурными конфликтами можно бороться двумя способами. Во-первых, можно увеличить время такта до такого значения, при котором все этапы всех инструкций выполняются за один такт. Конечно, при этом существенно снижается эффект конвейерной обработки, поскольку при этом уменьшается тактовая частота работы микропроцессора.
Второй способ преодоления структурного конфликта предполагает применение таких аппаратных решений, которые позволяют снизить затраты времени на выполнение данного этапа (например, использование специальных схем умножения). Однако, такой способ может привести к значительному усложнению схемы микропроцессора. Поскольку такие конфликты в работе конвейера возникают при выполнении команд, относительно редко встречающихся в программах, то обычно при разработке ищут компромисс между увеличением длительности такта и усложнением схемы микропроцессора.
Конфликты по управлению возникают в тех случаях, когда в конвейере находятся команды переходов или другие команды, изменяющие значение счетчика команд. Под переходом понимается запланированное алгоритмом изменение последовательного характера выполнения программы. При выполнении команды перехода возникает необходимость сброса конвейера, поскольку должна выполняться не та команда, которая находится в конвейере, а абсолютно другая команда. В соответствии со статистикой в типичной программе на каждые 6-8 команд приходится 1 команда перехода и последствия выполнения перехода очевидны: при наличии конвейера через каждые 6-8 команд его необходимо очищать и заполнять заново в соответствии с новым адресом. Таким образом, все преимущества конвейеризации теряются.
Возникновение конфликтов по управлению можно показать на примере команд условного перехода. Пусть в программе команда i+1 является командой условного перехода, формирующей адрес следующей команды в зависимости от результата выполнения команды i. Если конвейер является пятиступенчатым, то команда i завершит свое выполнение в такте 5, т.е. сформирует адрес перехода только в конце выполнения данной команды. В то же время команда i+1 условного перехода должна прочитать необходимые ей признаки в такте 3, чтобы правильно сформировать адрес следующей команды. Таким образом, конвейер должен остановиться, чтобы команда i+1 смогла сформировать требуемый адрес. Если же конвейер имеет большее количество ступеней, то промежуток времени между формированием признака результата и тактом, где он анализируется, может быть еще большим.
Другим примером конфликта по управлению может служить команда безусловного перехода с косвенным адресом, при встрече с которой возникает необходимость сбрасывать конвейер, так как в счетчике команд появляется абсолютно непредсказуемый адрес следующей команды.
В случае конфликта по управлению, возникающего с командами условного перехода, для снижения потерь работы конвейера в процессорах используется метод предсказания переходов. Основная идея этого метода заключается в том, что в процессоре используется специальный блок, который определяет наиболее вероятное направление перехода, не дожидаясь формирования признаков, на основании анализа которых этот переход реализуется. После этого процессор выполняет команды по предсказанной ветви программы (так называемое спекулятивное выполнение). Чтобы обеспечить корректное выполнение программы, процессор не записывает получаемые результаты в память или регистры, а записывает их в специальный буфер. Если направление перехода предсказано правильно, то процессор продолжает выполнять программу дальше, а полученные результаты переписываются из буфера по местам назначения. В случае неправильного предсказания направления перехода результаты выполнения данного участка программы уничтожаются.
Обычно для прогнозирования переходов учитывают направление переходов, реализовавшиеся этой командой ранее при выполнении программы. Например, подсчитывается количество переходов, выполненных ранее по различным направлениям, и на основании этого предсказывается направление перехода при следующем выполнении данной команды. В современных микропроцессорах вероятность правильного предсказания направления переходов достигает 90-95 %.
Схема предсказания для команд условного перехода вводится в состав процессора, с тем, чтобы обойти присущий фон-Неймановской архитектуре недостаток и попытаться компенсировать некоторое количество тактов времени, необходимых для продвижения команды от головы конвейера (счетчика команд) до ступени проверки условия в команде условного перехода. Задача решается тем, что схема предсказания запоминает предысторию выполнения команд перехода в программе и загружает адрес следующей за переходом команды в счетчик команд из предположения, что будет выбрана ветвь, которая чаще всего выполнялась в ближайшем прошлом. При этом вероятность правильного предсказания во многом зависит от алгоритма программы и обрабатываемых ею данных. Так, для циклов с большим числом итераций схема будет почти всегда правильно предсказывать направление перехода.
В микропроцессоре Pentium выполняется упреждающая обработка переходов при помощи буфера целевых переходов BTB (branch target buffer) и двух буферов предварительной выборки. Один буфер используется для предварительной выборки в предположении, что перехода нет, а второй буфер выполняет предвыборку команд, используя содержимое буфера BTB, которое было запомнено при первом переходе. Буфер BTB может хранить до 256 результатов переходов, что позволяет прогнозировать вложенные циклы. Работа буферов предварительной выборки организована так, что в каждый момент времени осуществляется выборка команд только в один из буферов. При обнаружении в потоке команд операции перехода вычисленный адрес перехода сравнивается с адресами, хранящимися в буфере BTB. В случае совпадения предсказывается, что переход будет выполнен, и разрешается работа другого буфера предварительной выборки, который начинает выдавать команды для выполнения в соответствующий конвейер. При несовпадении считается, что переход выполняться не будет, и буфер предварительной выборки не переключается, продолжая обычный порядок выдачи команд. Это позволяет избежать простоев конвейеров при правильном прогнозе направления перехода. Окончательное решение о направлении перехода естественно принимается на основании анализа кода условия. При неправильно сделанном прогнозе содержимое конвейеров сбрасывается, и выдача команд начинается с необходимого адреса.
Конфликты по данным возникают в случаях, когда выполнение одной команды зависит от результата выполнения предыдущей команды. Например, команда i предшествует команде j, и команда j должна использовать операнд, который формирует команда i. Если эти команды находятся достаточно близко в конвейере, то может возникнуть ситуация, при которой предшествующая команда не успевает записать значение этого операнда.
Другими словами можно сказать, что конфликт возникает всегда, когда имеет место зависимость между командами, и они расположены в конвейере по отношению друг к другу достаточно близко так, что совмещение операций, происходящее при конвейеризации, может привести к изменению порядка обращения к операндам. Однако, если все обращения к памяти выполняются в строгом порядке, то появление такого типа конфликтов предотвращается.
Можно выделить три возможных конфликта по данным в зависимости от порядка операций чтения и записи. Рассмотрим две команды i и j, при этом i предшествует j. Возможны следующие конфликты:
RAW (Read After Write - чтение после записи) - j пытается прочитать операнд-источник данных прежде, чем i туда запишет. Таким образом, j может некорректно получить старое значение. Это наиболее общий тип конфликтов;
WAR (Write After Read - запись после чтения) - j пытается записать результат в приемник прежде, чем он считывается оттуда командой i, так что i может некорректно получить новое значение. Этот тип конфликтов, как правило, не возникает в системах с централизованным управлением потоком команд, обеспечивающим выполнение команд в порядке их поступления, так как последующая запись всегда выполняется позже, чем предшествующее считывание. Однако конфликты такого рода могут возникать в системах, допускающих выполнение команд не в порядке их расположения в программном коде.
WAW (Write After Write - запись после записи) - j пытается записать операнд прежде, чем будет записан результат команды i, т.е. записи заканчиваются в неверном порядке, оставляя в приемнике значение, записанное командой i, а не j. Этот тип конфликтов присутствует только в конвейерах, которые выполняют запись со многих ступеней (или позволяют команде выполняться даже в случае, когда предыдущая приостановлена).
Для борьбы с конфликтами по данным в современных микропроцессорах используется метод внеочередного исполнения команд (out-of-order). Впервые этот метод был использован в 1990 году в микропроцессоре POWER1. Логическая сложность реализации этого метода явилась основной причиной того, что он слабо использовался в вычислительных машинах. Другая причина заключалась в том, что для использования этой парадигмы требовалась большая площадь на кристалле. Подробно метод внеочередного исполнения команд будет представлен ниже.
Наличие конфликтов может привести к значительному снижению производительности микропроцессора. Некоторые типы конфликтов требуют приостановки конвейера. При этом останавливается выполнение всех команд, находящихся на различных стадиях обработки. В других случаях конфликты, например, при неверном предсказанном направлении перехода, ведут к необходимости полной перезагрузки конвейера. Потери будут тем больше, чем более длинный конвейер используется в микропроцессоре. Такая ситуация явилась одной из причин сокращения числа ступеней в микропроцессорах последних моделей. Так, в микропроцессоре Itanium конвейер содержит всего 10 ступеней.
Борьба с конфликтами в конвейерах проводится путем увеличения количества однотипных функциональных устройств, которые могут одновременно выполнять одни и те же или схожие функции. Например, в современных микропроцессорах часто используется Гарвардская архитектура, в которой разделяют кэш-память для хранения команд и кэш-память данных. Во многих микропроцессорах используют многопортовую схему доступа к регистровой памяти, при которой к регистрам можно одновременно обращаться по одному каналу для записи, а по другому - для считывания информации. Конфликты из-за исполнительных устройств обычно сглаживаются введением в состав микропроцессора дополнительных блоков.
Таким образом, возникла идея применить в одном микропроцессоре несколько конвейеров, а процессоры, имеющие в своем составе более одного конвейера, называются суперскалярными. Впервые несколько конвейеров были реализованы в RISC-микропроцессорах, а первым суперскалярным CISC-микропроцессором стал Pentium. Однако необходимо отметить, что конвейеры в микропроцессоре Pentium были неравнозначными, и если в одном конвейере обрабатывались все команды, то во втором – только некоторые. Отбором команд для их включения в конвейеры занималась специальная аппаратная часть.
Недостатком суперскалярных микропроцессоров является необходимость синхронного продвижения команд в каждом из конвейеров. В представленной ниже таблице 2 представлена последовательность выполнения команд в микропроцессоре, имеющем два конвейера, при условии, что команде I1 требуется 3 такта на этапе EX.
Таблица 2 Выполнение команд в двух конвейерах
Этап |
Такты | |||||||||||||||||||
1 |
2 |
3 |
4 |
5 |
6 |
7 | ||||||||||||||
IF |
I1 |
I2 |
I3 |
I4 |
I5 |
I6 |
I7 |
I8 |
I7 |
I9 |
I7 |
I10 |
I11 |
I12 | ||||||
ID |
|
|
I1 |
I2 |
I3 |
I4 |
I5 |
I6 |
I5 |
I8 |
I5 |
I9 |
I7 |
I10 | ||||||
OR |
|
|
|
|
I1 |
I2 |
I3 |
I4 |
I3 |
I6 |
I3 |
I8 |
I5 |
I9 | ||||||
EX |
|
|
|
|
|
|
I1 |
I2 |
I1 |
I4 |
I1 |
I6 |
I3 |
I8 | ||||||
WB |
|
|
|
|
|
|
|
|
|
I2 |
|
I4 |
I1 |
I6 |
При этом команды будут завершаться в следующей последовательности:
I2 -I4 -I1 -I6 -...
т.е. последовательность выполнения команд будет нарушена.
Следовательно, для обеспечения правильной работы суперскалярного микропроцессора при возникновении конфликта, требующего остановки в одном из конвейеров, должны приостанавливать свою работу и другие. В противном случае может нарушиться исходный порядок завершения команд программы. Но такие приостановки существенно снижают быстродействие процессора. Разрешение этой ситуации состоит в том, чтобы дать возможность выполняться командам в одном конвейере вне зависимости от ситуации в других конвейерах. Это приводит к неупорядоченному выполнению команд. При этом команды, стоящие в программе позже, могут завершиться ранее команд, стоящих впереди. Аппаратные средства микропроцессора должны гарантировать, что результаты выполненных команд будут записаны в приемник в том порядке, в котором команды записаны в программе. Для этого в микропроцессоре результаты этапа выполнения команды обычно сохраняются в специальном буфере восстановления последовательности команд. Запись результата очередной команды из этого буфера в приемник результата проводится лишь после того, как выполнены все предшествующие команды и записаны их результаты.
Для решения этой проблемы используется способ внеочередного выполнения команд (Out-of-Order - OoO) - в процессорах после этапа декодирования прямо перед исполнительными устройствами появляются специальные блоки-диспетчеры (dispatcher), которые накапливают подготовленные к исполнению инструкции, отслеживают выполнение ранее запущенных инструкций и по мере освобождения исполнительных устройств отправляют на них новые инструкции. Даже, если исполнение займет много тактов, внутренняя очередь диспетчера позволит в большинстве случаев не останавливать подготавливающий все новые и новые инструкции конвейер. Так в процессоре возникает разделение на две независимо работающие подсистемы: Front-end (блоки, занимающиеся декодированием инструкций и их подготовкой к исполнению) и Back-end (блоки, собственно исполняющие инструкции).
В первых микропроцессорах выполнение команд осуществлялось в следующем порядке:
1. выборка инструкций;
2. если операнды готовы (например, находятся в регистрах) то команда отправляется в соответствующий функциональный блок. Если же один или более операндов не доступны во время текущего такта (например, они должны быть вызваны из памяти), то процессор останавливается;
3. команда выполняется соответствующим функциональным блоком;
4. функциональный блок записывает результат выполнения команды обратно в регистровый файл.
При использовании новой парадигмы выполнение команды осуществляется следующим образом:
выборка инструкции;
инструкция направляется в специальную очередь (которая иногда называется буфером команд или станцией резервации);
инструкция остается в очереди до тех пор, пока не будут готовы входные операнды, необходимые для выполнения этой команды. После этого команда может покинуть очередь перед более ранней инструкцией;
инструкция попадает в соответствующий функциональный блок и выполняется;
результат заносится в очередь; только после того, как все более старые команды запишут результаты в регистровый файл, результат данной команды запишется обратно в регистровый файл. Это называется окончанием или стадией окончания.
Основной парадигмой OoO обработки является возможность разрешить процессору избежать остановки конвейера, которая должна произойти, когда данные, необходимые для выполнения команды, являются недоступными. Процессор заполняет эти “промежутки времени” другими командами, которые готовы для выполнения, затем переупорядочивает результаты, чтобы на выходе они появлялись в нормальном порядке. Для преобразования из программного порядка в порядок, в котором команды обрабатываются на самом деле, требуется достаточно сложная схемотехника.
Достоинства ОоО обработки вырастают по мере увеличения глубины конвейеров и увеличения разрыва в быстродействии между процессором и памятью.