МПС

Микропроцессоры (Лекция)

 

ПЛАН ЛЕКЦИИ

– Классификация процессоров

– Общая организация современного микропроцессора

– Схема работы центрального процессора

 

Центральной микросхемой ПК является микропроцессор – интегральная схема, выполняющая функции центрального основного вычисляющего элемента ЭВМ.  Выполняемые микропроцессором команды предусматривают, обычно, арифметические действия, логические операции, передачу управления и перемещение данных между регистрами, оперативной памятью и портами ввода-вывода. С внешними устройствами микропроцессор сообщается благодаря своим шинам адреса, данных и управления, выведенным на специальные контакты корпуса микросхемы.

 

Классификация процессоров

По аппаратной реализации:

1.          Однокристальные МП (одна БИС)

2.          Многокристальные (несколько БИС)

3.          Секционные (несколько БИС с возможностью аппаратного наращивания разрядности процессора)

По архитектуре системы команд:

Двумя основными архитектурами набора команд, используемыми компьютерной промышленностью на современном этапе развития вычислительной техники, являются архитектуры CISC (CISC – Complete Instruction Set Computer) и RISC (RISC – Reduced Instruction Set Computer).

Для CISC-процессоров характерно: сравнительно небольшое число регистров общего назначения; большое количество машинных команд, некоторые из которых нагружены аналогично операторам высокоуровневых языков программирования и выполняются за много тактов; большое количество методов адресации; большое количество форматов команд различной разрядности; преобладание двухадресного формата команд; наличие команд обработки типа регистр-память.(IBM 360, IBM ES/9000, Intel x86 и модели архитектуры Pentium и AMD).

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

В типовых RISC-процессорах реализуются 32 или большее число регистров по сравнению с 8-16 регистрами в CISC-архитектурах, что позволяет большему объему данных храниться в регистрах на процессорном кристалле большее время и упрощает работу компилятора по распределению регистров под переменные.

В разработках компании Intel (Pentium P54C, P6), а также ее конкурентов (AMD R5, Cyrix M1, NexGen Nx586 и др.) широко используются идеи, реализованные в RISC-микропроцессорах, так что многие различия между CISC и RISC стираются.

Архитектура и система команд процессоров цифровой обработки сигналов (Digital Signal Processor) ориентирована на быстрое выполнение программ, реализующих определенный класс алгоритмов (цифровая фильтрация, свертка, корреляция, преобразование Фурье, адаптивная фильтрация, обработка изображений, анализ и синтез речи). Ключевые особенности: операция умножения с накоплением, выполняемая за один процессорный цикл, конвейерное выполнение программ, раздельные память программы и память данных, вспомогательные вычислительные блоки для вычисления адресов операндов за один машинный цикл.

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

 

Общая организация современного микропроцессора

В 1985 году фирма Intel выпустила 32-разрядный микропроцессор, ставший родоначальником семейства IA-32. Развитие этого семейства прошло ряд этапов, среди которых можно выделить следующие: реализация блока обработки чисел с плавающей запятой непосредственно на кристалле микропроцессора (I486), введение MMX-технологии обработки данных с фиксированной точкой по принципу SIMD – single instruction multi data (один поток команд – множество потоков данных) в микропроцессоре Pentium MMX и развитие этой технологии на числа с плавающей запятой (SSE – streaming SIMD Extention), появившееся впервые в МП Pentium III. Основные черты этой архитектуры вплоть до настоящего времени остаются неизменными.

Рис. 1.  Структура 32-разрядного микропроцессора

 

Большинство современных микропроцессоров относятся к классу конвейерных суперскалярных процессоров с внеочередным исполнением операций.

Конвейерная организация процессора означает, что многие сложные действия разбиваются на этапы с небольшим временем выполнения. Каждый этап выполняется в отдельном устройстве (блоке). Максимальная длина этапа определяет время такта процессора. Требование снижения времени такта влечёт за собой необходимость увеличения числа этапов при выполнении сложных действий. Можно выделить два наиболее важных проявления конвейерной организации процессора – прохождение инструкции (операции) от момента считывания из кэша инструкций до полного завершения (отставки), и прохождение операции через функциональное устройство. Первое проявление обычно называют «конвейером процессора» либо «конвейером не предсказанного перехода» (что более правильно). Длина этого конвейера влияет на производительность только в случае неправильного предсказания перехода в программе, когда происходит отмена работы, выполненной во всех этапах, начиная с этого перехода (сброс конвейера). Длина конвейера функционального устройства, в свою очередь, определяет время ожидания результатов операции другой операцией, использующей эти результаты в качестве операндов. Такое старт-стопное время выполнения операции в функциональном устройстве называют латентностью. Обращение к кэшам всех уровней и к оперативной памяти также производится конвейерным образом. Большинство простых операций целочисленной арифметики и логики имеют латентность, равную единице – то есть они выполняются в функциональных устройствах синхронно, без конвейеризации.

Суперскалярная организация означает, что на каждом этапе обрабатываются сразу несколько потоков инструкций (операций) в параллель – от выборки из кэша инструкций до полного завершения (отставки). Суперскалярность наряду с тактовой частотой является важнейшим показателем пропускной способности процессора. Уровень суперскалярности («ширина обработки», гарантированно обеспеченная на всех этапах) в современных производительных процессорах варьируется от 3 (P-III, P-4, K8) до 4-5 (P8, PPC970).

Внеочередное исполнение операций означает, что операции не обязаны выполняться в функциональных устройствах строго в том порядке, который определён в программном коде. Более поздние (по коду) операции могут исполняться перед более ранними, если не зависят от порождаемых ими результатов. Процессор должен лишь гарантировать, чтобы результаты «внеочередного» выполнения программы совпадали с результатами «правильного» последовательного выполнения. Механизм внеочередного исполнения позволяет в значительной степени сгладить эффект от ожидания считывания данных из кэшей верхних уровней и из оперативной памяти, что может занимать десятки и сотни тактов. Также он позволяет оптимизировать выполнение смежных операций, особенно при наличии сложных зависимостей между ними в условиях высокой латентности исполнения в устройствах и недостаточного количества регистров.

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

В различных процессорах эти промежуточные микрооперации обозначаются по-разному: uOP (Intel P-III, P-4, P8), MOP (AMD K8), IOP (IBM PPC970). Для унификации в дальнейшем эти микрооперации называются «МОПами» (либо просто «операциями»).

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

Поскольку исходная программа подразумевает последовательную модель исполнения, машинные инструкции должны считываться также последовательно. Кроме того, есть такое понятие, как «отставка» инструкции, которое подразумевает, что данная инструкция выполнена вместе со всеми инструкциями, которые ей предшествовали в коде программы. Таким образом, операции (инструкции) уходят в отставку строго последовательно, именно в том порядке, который задаётся программой.

Понятие отставки является ключевым в отображении внеочередного исполнения инструкций внутри процессора в чисто последовательное исполнение в «модели процессора», как она представляется пользователю. Может оказаться, что какая-то операция уже выполнилась в своём функциональном устройстве – но при этом не должна была выполняться, так как было неправильно предсказано направление условного перехода либо были считаны данные с неправильного адреса. Такое выполнение называется спекулятивным. Когда будет правильно исполнена предшествующая ей операция перехода или чтения данных, такая неверная спекулятивная ветвь будет отменена, и при необходимости инструкция будет выполнена вновь (либо выполнится другая ветвь). Процедура отставки инструкции гарантирует, что она была выполнена «правильно». Любые прерывания процессора (по вводу-выводу либо аварийному событию) могут происходить только в момент отставки инструкции, к которой это прерывание относится.

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

 

Схема работы центрального процессора

Подмножество кода программы, наиболее «активно» исполняемое в данный отрезок времени, размещено в кэше инструкций (I-кэше). В зависимости от организации процессора инструкции в этом кэше могут храниться в исходном неизменённом виде, либо в частично «предекодированном» виде, либо в полностью «декодированном» виде (то есть в виде готовых МОПов). В случае отсутствия в данном кэше нужных инструкций (исходных либо преобразованных) они считываются из кэша 2-го уровня (L2-кэша), при необходимости подвергаясь предварительному декодированию перед помещением в I-кэш.

 

 

Рис. 2. Структура процессора и взаимодействие его элементов при прохождении машинной инструкции

 

Инструкции считываются из I-кэша блоками, с опережающей предвыборкой. Текущий блок инструкций отправляется сразу в два устройства – декодер инструкций и предсказатель переходов. Декодер преобразует исходные (либо частично декодированные) инструкции в микрооперации (МОПы), а предсказатель переходов определяет, есть ли в обрабатываемом блоке инструкции перехода, будут ли эти переходы совершены и по каким адресам. Если какой-либо переход предсказывается как «совершённый», то немедленно считывается блок инструкций, находящийся по предсказанному адресу.

Тем временем вновь порождённая декодером группа МОПов поступает в устройство переименования регистров и выделения ресурсов (Rename/Allocate). Переименование (или переназначение) регистров – это выделение данному МОПу нового экземпляра внутреннего регистра процессора, куда будут помещены результаты выполнения этого МОПа. Все дальнейшие операции, зависящие от результатов данного МОПа, будут использовать этот регистр в качестве операнда. «Переименованный» регистр ставится в соответствие регистру, который указан в машинной инструкции (так называемому «архитектурному регистру»). Необходимость в переназначении регистров связана с тем, что архитектурных регистров обычно очень мало, и при использовании столь ограниченного числа регистров невозможно эффективно исполнить поток операций – каждая новая операция, использующая определённый регистр, была бы вынуждена ждать завершения всех предыдущих операций, которые к нему обращаются (даже если ей не нужны результаты этих операций). Наличие большого числа машинных (физических) регистров и механизма переименования позволяет обойти эту проблему. Информация о соответствии регистров хранится в специальных таблицах. В момент отставки МОПа будет произведено обратное преобразование физического регистра в архитектурный.

После преобразования и подготовки регистров поступившая группа МОПов записывается в конец буфера переупорядочения (ReOrder Buffer, ROB). Эта структура является ключевой в организации внеочередного исполнения операций. В ней хранятся все МОПы и необходимые вспомогательные данные от момента завершения декодирования и выделения ресурсов до момента отставки. Таким образом, длина буфера ROB ограничивает число операций, которые одновременно могут находиться в обрабатывающей части процессора (подсистеме внеочередного исполнения) – от самой «старой», которая ещё не завершена и поэтому не может «уйти в отставку», до самой «новой», которая только что поступила из декодера. В случае переполнения буфера переупорядочения, работа декодера приостанавливается до тех пор, пока не произойдёт отставка операций в начале очереди и освобождение места для новых МОПов.

Одновременно с попаданием в ROB новая группа МОПов передаётся в другую структуру данных – пункт резервирования (Reservation Station, RS), откуда МОПы будут отсылаться на исполнение непосредственно в функциональные устройства. Она представляет собой один или несколько буферов, к которым подсоединены эти функциональные устройства. В каждом такте в этих буферах производится поиск операций, которые готовы к исполнению (то есть аргументы которых уже вычислены либо вычисляются и будут готовы к моменту попадания операции в функциональное устройство) вне зависимости от порядка, в котором они записывались в буферы. Устройство, которое осуществляет этот поиск и запуск на исполнение, обычно называют планировщиком, а сами буферы – очередями планировщика. Планировщик отслеживает зависимости между операциями по данным и прогнозирует готовность операций к исполнению в устройствах.

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

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

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

К каждой очереди планировщика подсоединено одно или несколько специализированных функциональных устройств. Число операций, которые могут быть запущены на исполнение в каждом такте, обычно заметно превышает ширину остальных трактов процессора и варьируется от 5 (P-III) до 10 (PPC970), что позволяет сглаживать пиковую нагрузку и обеспечить высокую пропускную способность при неоднородной загрузке устройств.

Помимо арифметико-логических и адресных функциональных устройств, в каждом процессоре имеются также устройства загрузки и выгрузки (Load/Store), которые производят доступ к кэшам данных и к оперативной памяти. Эти устройства работают асинхронно от других, и их обычно не изображают на блок-схемах. Логически эти устройства связаны с устройствами вычисления адресов чтения/записи (AGU). Устройства загрузки и выгрузки конвейеризованы и могут одновременно обслуживать большое количество запросов. Эти устройства также осуществляют предварительную выборку из оперативной памяти (копирование в кэши тех данных, использование которых ожидается в ближайшее время). На Рис. 2 группа блоков процессора, образующих подсистему внеочередного исполнения, обведена пунктирной линией.

 

Рис. 3. Различные состояния, в которых могут находиться МОПы, помещённые в буфер переупорядочения

 

В хронологическом порядке, каждый МОП может проходить через следующие стадии:

1.    находится в очереди планировщика, но ещё не готов к исполнению;

2.    готов к исполнению (все аргументы операции вычислены);

3.    запущен на исполнение (диспетчеризован);

4.    исполнен и ждёт отставки либо отмены спекулятивной ветви;

5.    находится в процессе отставки.

Кроме того, в одной микроархитектуре (процессор P-4) перед попаданием в очереди планировщика, приписанные к группам функциональных устройств, все МОПы помещаются в предварительные очереди. Эти очереди выполняют амортизирующую роль, позволяя декодеру и аллокатору осуществлять опережающую подготовку операций.

Может оказаться, что буфер ROB не заполнен до конца – в этом случае в конце буфера (очереди) останется свободное место, куда могут в полном темпе поступать новые МОПы. Для этого необходимо, чтобы в очередях планировщика тоже оставалось свободное место для вновь поступающих МОПов.

Длина буфера переупорядочения в современных процессорах составляет несколько десятков элементов (от 40 в процессоре P-III до 126 в процессоре P-4). В случае если в начале очереди «застрянет» МОП, находящийся в процессе исполнения (например, ожидающий конца медленной операции или прихода данных из памяти), и новые МОПы будут поступать в полном темпе, буфер ROB заполнится за 20-40 тактов (P-III — за 13 тактов). На практике средний темп выполнения операций находится на уровне 50% от предельного или несколько ниже. Взяв такой же темп поступления МОПов, получим время заполнения на уровне 40-80 тактов. Это существенно меньше, чем время ожидания данных из оперативной памяти (200-300 тактов и более). Приведённые цифры показывают, что при большом числе обращений к данным, которых нет в кэшах и для которых не осуществляется эффективная предвыборка, буфер ROB будет, как правило, переполнен, и процессор будет простаивать в ожидании прихода данных из памяти. По существу, в каждый момент времени работу будет блокировать единственный МОП, находящийся в начале очереди и ожидающий загрузки данных. Размер буфера ROB в данном случае определяет, сколько МОПов, расположенных после этого, может быть помещено в ROB и исполнено (при условии, что они не зависят от загружаемых данных) до тех пор, пока процессор не остановится.