РАЗРЯДНОСТЬ - Число бит информации обрабатываемых процессором за одну операцию.
ТАКТОВАЯ ЧАСТОТА (БЫСТРОДЕЙСТВИЕ) - Частота тактового генеpатоpа (в МГц или ГГц), под управлением которого выполняет операции процессор.
СИСТЕМА КОМАНД - Совокупность всех операций выполняемых процессором и соответствующих им кодов.
СИСТЕМА ПРЕРЫВАНИЙ - Возможности процессора по переключению своей работы с выполнения одной задачи на другую при наступлении некоторого события.
РАЗРЯДНОСТИ СОВРЕМЕННЫХ ПРОЦЕССОРОВ:
32 бита - тридцатидвухразрядный процессор - четырехбайтный процессор
64 бита - шестидесятичетырехразрядный процессор - восьмибайтный процессор
128 бит - стодвадцативосьмиразрядный процессор - шестнадцатибайтный процессор
ТАКТОВАЯ ЧАСТОТА (БЫСТРОДЕЙСТВИЕ) - Частота тактового генеpатоpа (в МГц или ГГц), под управлением которого выполняет операции процессор. Процессор выполняет простейшие логические и арифметические операции над целыми числами. Свои действия он осуществляет в темпе задаваемом своеобразным "метрономом" - тактовым генератором. Генератор через равные промежутки времени посылает в процессор электрические импульсы. Промежуток времени между импульсами называется тактом. Любая операция выполняемая процессором реализуется за соответствующее число тактов. Очевидно, что "быстрыми", требующими для выполнения малое число тактов, являются логические операции и операция изменения знака числа (от 5 до 10 тактов). Наиболее "медленными" являются операции умножения и деления (от 30 до 50 тактов). Частота тактового генератора измеряется в мегагерцах(обозначается в России МГц, международное обзначение MHz) или в гигагерцах (обозначения - ГГц или GHz). Частоте 1МГц соответствует 1 миллион тактов в секунду (длительность такта 0,000001 секунды). Тактовые частоты современных персональных ЭВМ лежат в пределах 900МГц - 4000МГц (4ГГц). По заданной тактовой частоте можно приближенно оценить быстродействие процессора по той или иной операции. (Кстати, раньше использовалась характеристика быстродействия, однако при этом необходимо было указывать быстродействие по всем основным операциям).
СИСТЕМА КОМАНД - Совокупность всех операций выполняемых процессором и соответствующих им кодов. Термин "система команд" позволяет пользователю решить вопрос о совместимости ЭВМ. Очень часто мы слышим: "ЭВМ такая-то совместима с такой-то". Что стоит за этим? Рассмотрим пример. Пусть необходимо сложить содержимое двух регистров (вспомогательная память процессора) 3 и 5. Для ЭВМ фирмы DEC эта операция, записанная в кодах 16-ти разрядного процессора будет выглядить так:
0110010011010101,
а для ЭВМ фирмы IBM так:
0101010011010101
Обратите внимание, одинаковые операции в ЭВМ разных фирм кодируются различно. Это означает, что программа написанная на ЭВМ фирмы DEC не будет выполняться на ЭВМ фирмы IBM.
Две ЭВМ называются СОВМЕСТИМЫМИ, если операции процессоров и коды этих операций у ЭВМ СОВПАДАЮТ. Это означает, что любая программа исполняемая на одной ЭВМ будет обязательно выполняться на другой.
ЭВМ А называется СОВМЕСТИМОЙ СНИЗУ с ЭВМ Б, если операции процессора ЭВМ А и коды этих операций являются подмножеством операций и соответствующих им кодов ЭВМ Б. Это означает, что программа исполняемая на ЭВМ А обязательно будет выполняться на Б. Однако, программа исполняемая на А будет выполняться на Б, если будут использоваться только операции системы команд процессора ЭВМ Б.
СИСТЕМА ПРЕРЫВАНИЙ - Возможности процессора по переключению своей работы с выполнения одной задачи на другую при наступлении некоторого события. Под прерыванием понимают возникновение события, требующего реакции процессора. ОБРАБОТКА ПРЕРЫВАНИЯ заключается в том, что приостанавливается выполнение текущей задачи (программы) и процессор приступает к выполнению другой задачи, по завершении которой продолжает выполнение исходной. Очевидно, что разным событиям (прерываниям) соответствуют разныеПРОГРАММЫ ОБРАБОТКИ ПРЕРЫВАНИЙ.
Прерывания делятся на следующие категории:
ВНЕШНИЕ АППАРАТНЫЕ ПРЕРЫВАНИЯ, возникающие вне процессора и поступающие от различных устройств и блоков ЭВМ (нажатие клавиши, нарушения в работе оборудования и т.п.);
ВНУТРЕННИЕ АППАРАТНЫЕ ПРЕРЫВАНИЯ, вырабатываемые самим процессором (деление на ноль, переполнение разрядной сетки и т.п.)
ПРОГРАММНЫЕ ПРЕРЫВАНИЯ, инициируемые выполняемой программой. Эти прерывания задаются программистом в программе путем записи специальных команд.
Прерывания различаются по степени важности (приоритетам или уровням). Одновременное поступление в процессор прерываний одного уровня не допускается. Поэтому, максимальное число последовательно поступающих прерываний, которое может отложить, а затем обработать процессор - ЧИСЛО УРОВНЕЙ ПРЕРЫВАНИЙ.
15. Архитектура и микроархитектура процессора. Конвейеризация. Современные модели микропроцессоров для ПК.
Под архитектурой процессора понимается его программная модель, то есть программно-видимые свойства. В этой книге рассматриваются только процессоры х86 с архитектурой IA-32 (Intel Architecture 32 bit) 6-8-го поколений со всеми их мультимедийными, потоковыми и 64-битными расширениями (AMD х86-64 и Intel ЕМ64Т). Архитектура IA-64 (процессоры Itanium) в персональных компьютерах не используется и здесь не рассматривается.
Основные программно-видимые свойства процессора — это набор его регистров, система команд (определяющая также работу с памятью) и механизм обработки прерываний. Процессоры х86 являются явно выраженными представителями CISC-архитектуры: по сложности системы команд им нет равных, при этом базовых архитектурных регистров довольно мало. По мере развития семейства в процессоры вводят все более мощные команды, позволяющие сокращать число инструкций, требуемое для решения одних и тех же задач. Однако эти команды все сложнее исполнять. Количество архитектурных регистров увеличивается: появились блоки MMX, ХММ, а в 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.
Поясним основные понятия, относящиеся к конвейеризации и распараллеливанию выполнения инструкций (точнее, микроопераций).
Конвейеризация (pipelining) предполагает, что каждая инструкция обрабатывается за несколько этапов, причем каждый этап выполняется на своей ступени конвейера процессора. При выполнении инструкция продвигается по конвейеру по мере освобождения последующих ступеней. Таким образом, на конвейере одновременно может обрабатываться несколько последовательных инструкций.
В современных процессорах параллельно могут работать несколько конвейеров, так что производительность процессора можно оценивать темпом выхода выполненных инструкций со всех его конвейеров. Для достижения максимальной производительности процессора — обеспечения полной загрузки конвейеров — программа должна составляться с учетом микроархитектурных особенностей процессора. Конечно, и код, сгенерированный обычным способом, будет исполняться на более новых процессорах достаточно быстро (за счет более высокой тактовой частоты). Однако ряд программ на процессорах Pentium III работает быстрее, чем на Pentium 4, при одинаковых тактовых частотах: сверхдлинный конвейер Pentium 4 на «поворотах» непредсказуемо ветвящихся программ «заносит», что приводит к его простоям. Конвейер «классического» процессора Pentium имеет пять ступеней. Конвейеры процессоров Р6 с суперконвейерной архитектурой (superpipelined) имеют большее число ступеней (10-12), что позволяет упростить каждую из них и, следовательно, сократить время пребывания в них инструкций. Гиперконвейер Pentium 4 имеет уже 20 ступеней для повторно выполняемых участков программного кода (из кэша трасс), а если считать его полную длину (начиная с декодирования), то наберется около 30 ступеней.
Скалярным называют процессор с единственным конвейером, к этому типу относятся все процессоры Intel до класса 486 включительно. Суперскалярный (superscalar) процессор имеет более одного конвейера (Pentium — два); эти конвейеры способны обрабатывать инструкции параллельно.
Инструкции переходов и особенно ветвлений нарушают непрерывность работы начальных ступеней конвейера, поскольку они должны начинать выборку и декодирование инструкций с нового, заранее неизвестного адреса. Предсказание переходов (branch prediction) позволяет продолжать выборку и декодирование потока инструкций после выборки инструкции ветвления (условного перехода), не дожидаясь проверки самого условия. В процессорах прежних поколений инструкция перехода приостанавливала конвейер (выборку инструкций) до исполнения собственно перехода, на чем, естественно, терялась производительность. Предсказание переходов направляет поток выборки и декодирования по одной из ветвей, при этом используется ряд методов предсказания:
¦ При статическом предсказании (схема заложена в процессор) переходы по одним условиям, вероятнее всего, произойдут, а по другим — нет. Переходы назад скорее произойдут (это типичный цикл), вперед — нет (типично для обработки ошибок).
¦ Динамическое предсказание опирается на предысторию вычислительного процесса — для каждой конкретной команды перехода (ее адреса в памяти) накапливается статистика поведения, на основе которой предсказывается переход. Для динамического предсказания в процессор вводят таблицу ВТВ (Branch Table Buffer — буфер таблицы переходов), напоминающую кэш с ассоциативным поиском.
¦ Программные «намеки» (hints) — новые префиксы инструкций (появились в Р4), перекрывающие статическое предсказание. Намеки закладываются в программный код на этапе компиляции.
Конвейеризация в процессорах х86 осложняется архитектурными особенностями: большим разбросом инструкций по сложности и, соответственно, по времени выполнения. Для повышения производительности те ступени конвейера, на которых производится наиболее сложная работа, стараются распараллеливать. При этом в процессор вводится большое количество исполнительных элементов, которые могут одновременно обрабатывать разные инструкции (или разные части одной сложной инструкции, разбитой на несколько более простых).
Для того чтобы процессор мог параллельно обрабатывать несколько инструкций, программный код должен быть написан (скомпилирован) так, чтобы в «поле зрения» процессора (то есть на его конвейере) оказывалось побольше фактически независимых друг от друга инструкций. В процессорах RISC-архи- тектур, как правило, много универсальных регистров, что располагает к написанию кода, удобного для параллельного исполнения. Малое число и неравноправность основных регистров х86 не располагают к программированию с учетом параллельности исполнения. Однако если несколько инструкций, обращающихся к одному и тому же регистру, не имеют фактических зависимостей по данным (не используют результаты друг друга), их можно исполнять одновременно в разных физических регистрах процессора (архитектурно невидимых), которых может быть много. Это делается путем переименования регистров (register renaming) — временного сопоставления физических регистров логическим с отслеживанием правильной последовательности смены состояний архитектурных (логических) регистров.
Продвижение данных (data forwarding) подразумевает начало исполнения инструкции до готовности всех операндов. При этом выполняются все возможные действия, и декодированная инструкция с одним операндом помещается в исполнительное устройство, где дожидается готовности второго операнда, выходящего с другого исполнительного устройства.
При исполнении по предположению, называемом также спекулятивным (speculative execution), используется результат предсказаний переходов: инструкции по предсказанной ветви перехода не только декодируются, но и по возможности исполняются до проверки условия перехода. Если предсказание сбывается, то труд оказывается не напрасным; если не сбывается, приходится выполнять откат — в этом случае конвейер оказывается недогруженным и простаивает несколько тактов (как минимум столько, сколько ступеней у конвейера).
Исполнение с изменением последовательности инструкций (out-of-order execution), свойственное RISC-архитектуре, теперь реализуется и для процессоров х86. При этом изменяется порядок внутренних манипуляций данными, а внешние (шинные) операции ввода-вывода и записи в память выполняются, конечно же, в порядке, предписанном программным кодом. Однако эта способность процессора в наибольшей степени может блокироваться несовершенством программного кода (особенно 16-битных приложений), если он генерируется без учета возможности изменения порядка исполнения инструкций.
Описанные термины и технологии вкладываются в общее понятие «динамического исполнения» (dynamic execution), введенное фирмой Intel с появлением процессоров Р6. Улучшенное динамическое исполнение (enhanced dynamic exe
cution) отличается улучшениями различных сторон, в частности, улучшением предсказаний переходов.
Благодаря усложнению микроархитектуры от поколения к поколению возрастает производительность процессоров, причем этот рост обеспечивается двумя факторами. Во-первых, растет тактовая частота ядра. Во-вторых, увеличивается относительный темп выполнения инструкций. Так, в среднем процессоры 1-, 2-, 3-, 4-, 5-, 6- и 7-го поколений завершают очередную инструкцию с интервалом 12, 5, 4, 2, 1, 1/2 и 1/3 тактов. Полтакта и треть такта на инструкцию — звучит, конечно, странно. Но если вспомнить о 8-байтной шине данных, позволяющей за один такт загрузить фрагмент кода, содержащего несколько команд, и о нескольких исполнительных устройствах, одновременно приступающих к их выполнению, то вопросы рассеиваются. Конечно же, время, требующееся для полного прохождения инструкции от ее выборки до исполнения, измеряется десятками тактов (и растет с удлинением конвейера).