Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Консп_АПЗ_ПК_12_1.doc
Скачиваний:
31
Добавлен:
23.11.2019
Размер:
624.13 Кб
Скачать

5.1. Архитектура и микроархитектура процессоров

Существует две основные архитектуры процессоров. Первая называется RISC (Reduced Instruction Set Computer) — компьютер с уменьшенным набором команд. Идея этой архитектуры основывается на том, что процессор большую часть времени тратит на выполнение ограниченного числа инструкций (например, переходов или команд присваивания), а остальные команды используются редко. Разработчики RISC-архитектуры создали «облегченный» процессор. Благодаря упрощенной внутренней логике (меньшему числу команд, менее сложным логическим контурам), значительно сократилось время выполнения отдельных команд и увеличилась общая производительность.

Вторая архитектура имеет сложную систему команд, она называется CISC (Complex Instruction Set Computer) — компьютер со сложной системой команд. Архитектура CISC подразумевает использование сложных инструкций, которые можно разделить на более простые. Все х86-совместимые процессоры принадлежат к архитектуре CISC.

Под архитектурой процессора понимается его программная модель, то есть программно-видимые свойства. Основные программно-видимые свойства процессора – это набор его регистров, система команд (определяющая также работу с памятью) и механизм обработки прерываний. Процессоры х86 являются явно выраженными представителями CISC-архитектуры: по сложности системы команд им нет равных, при этом базовых архитектурных регистров довольно мало. По мере развития семейства в процессоры вводят все более мощные команды, позволяющие сокращать число инструкций, требуемое для решения одних и тех же задач. Однако эти команды все сложнее исполнять. Количество архитектурных регистров увеличивается: появились блоки ММХ, ХММ, а в 64-битных расширениях еще и 8 дополнительных общих регистров.

Под микроархитектурой понимается внутренняя реализация программной модели. Для одной и той же архитектуры IA-32 разными фирмами и в разных поколениях применяются существенно различающиеся микроархитектурные реализации: при этом, естественно, стремятся к максимальному повышению производительности (скорости исполнения программ). Начиная с процессоров Р6 (и AMD К5), в микроархитектуре применяется RISC-ядро, исполняющее микрооперации (uOps), на которые раскладываются сложные инструкции х86. В результате производительность процессора (по скорости выполнения инструкций х86) зависит от способа разложения и скорости исполнения микроинструкций. При этом повышать производительность можно различными способами: ускорять выполнение микроопераций (за счет повышения тактовой частоты), по возможности распараллеливать выполнение микроопераций, сокращать число микроопераций, требуемых для исполнения одной инструкции х86. У лидеров «процессоростроения» – Intel и AMD – подходы к оптимизации различаются: при сопоставимой производительности процессоры AMD работают на более низких тактовых частотах. Однако заметим, что повышение производительности процессоров х86 обходится слишком дорого (по сравнению с «чистыми» RISC-архитектурами) – требует очень сложных управляющих устройств, на которые и уходит значительная часть транзисторов процессора и которые, к тому же, выделяют значительную мощность. Компьютеры на «чистых» RISC-процессорах (например, Power MAC) обеспечивают ту же прикладную производительность, что и IBM PC на Pentium 4, но при этом тактовая частота RISC-процессоров в несколько раз ниже частоты CISC-процессоров Pentium 4.

На рис.5.1 приведена общая структура современного процессора. Процессор содержит следующие блоки:

1) Декодер команд CISC - RISC – Instrution Decoder.

2) Блок предсказания переходов и таблица переходов – Prediction Table.

3) Блок распределения инструкций – Instrution Control (72–entry).

4) Регистры хранения декодированных команд TLB (Translation Lookside Buffer, буфер быстрого преобразования адреса).

5) Конвейеры с плавающей точкой FPU (MMX, SSE, 3Dnow!)

6) Регистры и блок их быстрого переименования – Stack Rename.

7) Конвейер целочисленных вычислений – Integer.

8) Блок выгрузки-загрузки данных – Load/Store.

9) L1 Tag – кэш 1-го уровня для хранения инструкций.

10) L1 Data – кэш 1-го уровня для хранения данных.

11) L2 – кэш 2-го уровня.

12) Интерфейс 64 бита - Interface.

Рис. 5.1. Структура современного процессора

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

Скалярным называют процессор с единственным конвейером, к этому типу относятся все процессоры Intel до класса 486 включительно. Суперскалярный (superscalar) процессор имеет более одного конвейера (Pentium – два); эти конвейеры способны обрабатывать инструкции параллельно.

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

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

  • Динамическое предсказание опирается на предысторию вычислительного процесса для каждой конкретной команды перехода (ее адреса в памяти) накапливается статистика поведения, на основе которой предсказывается переход. Для динамического предсказания в процессор вводят таблицу ВТВ (Branch Table Buffer буфер таблицы переходов), напоминающую кэш с ассоциативным поиском.

  • Программные «намеки» (hints) новые префиксы инструкций (появились в Р4), перекрывающие статическое предсказание. Намеки закладываются в программный код на этапе компиляции.

Для того, чтобы процессор мог параллельно обрабатывать несколько инструкций, программный код должен быть написан (скомпилирован) так, чтобы в «поле зрения» процессора (то есть на его конвейере) оказывалось побольше фактически независимых друг от друга инструкций. В процессорах RISC-архитектур, как правило, много универсальных регистров, что располагает к написанию кода, удобного для параллельного исполнения. Малое число и неравноправность основных регистров х86 не располагают к программированию с учетом параллельности исполнения. Однако если несколько инструкций, обращающихся к одному и тому же регистру, не имеют фактических зависимостей по данным (не используют результаты друг друга), их можно исполнять одновременно в разных физических регистрах процессора (архитектурно невидимых), которых может быть много. Это делается путем переименования регистров (register renaming) – временного сопоставления физических регистров логическим с отслеживанием правильной последовательности смены состояний архитектурных (логических) регистров.

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

При исполнении по предположению, называемом также спекулятивным (speculative execution), используется результат предсказаний переходов: инструкции по предсказанной ветви перехода не только декодируются, но и по возможности исполняются до проверки условия перехода. Если предсказание сбывается, то труд оказывается не напрасным; если не сбывается, приходится выполнять откат – в этом случае конвейер оказывается недогруженным и простаивает несколько тактов (как минимум столько, сколько ступеней у конвейера).

Исполнение с изменением последовательности инструкций (out-of-order execution), свойственное RISC-архитектуре, теперь реализуется и для процессоров х86. При этом изменяется порядок внутренних манипуляций данными, а внешние (шинные) операции ввода-вывода и записи в память выполняются, конечно же, в порядке, предписанном программным кодом. Однако эта способность процессора в наибольшей степени может блокироваться несовершенством программного кода (особенно 16-битных приложений), если он генерируется без учета возможности изменения порядка исполнения инструкций.