Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КС-ZAO / Лекции ЦЭВМруский вариант11.doc
Скачиваний:
189
Добавлен:
07.02.2016
Размер:
15.82 Mб
Скачать

Инструкция iretd

Инструкция IRETD аналогична инструкции IRET. Она извлекает из стека EIP, а затем CS, как двойное слово (отбрасывая старшее слово), после чего извлекает EFLAGS, как двойное слово.

Инструкции pushfd и popfd

Инструкция PUSHFD заносит в стек полный 32-разрядный регистр флагов процессора 80386. Инструкция POPFD извлекает из стека полный 32-разрядный регистр флагов.

Инструкции же PUSHF и POPF заносят в стек и извлекают из него только младшие 16 битов регистра флагов.

Инструкции pushad и popad

Инструкция PUSHAD заносит в стек восемь 32-разрядных общих регистров в следующем порядке: EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI. Значение, заносимое для регистра ESP, соответствует значению регистра ESP в начале инструкции PUSHAD. Инструкция POPAD извлекает из стека семь 32-разрядных общих регистров в следующем порядке: EDI, ESI, EBP, EBX, EDX, ECX и EAX. Все эти регистры можно сохранить в стеке с помощью инструкции PUSHAD, а затем восстановить с помощью инструкции POPAD. Регистр ESP инструкцией POPAD не восстанавливается. Вместо этого выполняется выполняется увеличение на 32, чтобы отбросить блок из восьми 32-разрядных общих регистров, ранее сохраненный в стеке. Сохраненное ранее значение ESP игнорируется.

Новые версии инструкции imul

Дополнительно к формам инструкции IMUL, предусмотренным для процессоров 8086/80186/80286 в процессоре 80386 предусмотрена возможно самая удобная форма инструкции IMUL: любой общий регистр или ячейку памяти можно умножать на любой общий регистр, при этом результат снова сохраняется в одном из исходных регистров. Например, инструкция:

imul ebx,[edi*4+4] умножает содержимое регистра EBX на значение размером в двойное слово, хранящееся по адресу памяти edi*4+4, а результат сохраняет снова в регистре EBX.

Как можно заметить, первый операнд в этой форме инструкции IMUL представляет собой целевой регистр. Этот операнд может быть любым 16- или 32-разрядным общим регистром. Второй операнд может задаваться любым 16- или 32-разрядным общим регистром или ячейкой памяти. Размеры двух операндов должны совпадать. Если результат, рассматриваемый, как значение со знаком, слишком велик, чтобы его можно было разместить в приемнике, то устанавливаются флаги переноса и переполнения.

Как можно ожидать, в процессоре 80386 имеются также расширенные формы инструкции IMUL для процессоров 8086/80186/80286, поддерживающие 32-разрядные операнды. Например, в следующем коде ECX умножается на 1000000000h, а результат сохраняется в регистре EBP:

Imul ebp,ecx,100000000h а следующая инструкция умножает ecx на ebx, записывая результат в edx:eax:

imul ebx

§20.Pentium Pro

C помощью разных приемов фир­ме Intel удавалось каждое новое поколение своих процессоров делать быстрее, чем предыдущее. Казалось, если разработчики смогут благодаря увеличению тактовой частоты выжать из Pentium-процессора несколько бо­льшую производительность, то будет достигнут предел: старая архитектура в этом случае не даст больше ничего.

Поэтому во многих отношениях Intel начал свою работу над новым процессором (известным в стадии разработки как Р6) практически за­ново. Внешними отличительными признаками Pentium Pro являются прямоугольный корпус с двумя встроенными кремниевыми чипами (сам микропроцессор и кристалл сверхскоростной кэш-памяти второго уровня), а также полностью изменен­ный внешний вид процессорного мо­дуля. То обстоятельство, что теперь в схеме коммутации чипа имеются три параллельных конвейера для непре­рывной обработки команд, еще не говорит ни о чем. Существенно то, что этот процессор отрабатывает программы совершенно иначе, чем все его предшественники. Проще го­воря, Pentium Pro раскладывает все поступающие к нему инструкции на небольшие фрагменты, которые он потом обрабатывает, но не по очере­ди, а пытается найти такую последо­вательность, которая привела бы к самому оптимальному варианту вы­полнения команд. Чтобы опериро­вать подобным образом, нет необхо­димости в новом программном обес­печении. Pentium Pro может работать с прежним набором команд для Intel-процессоров, являясь, таким обра­зом, совместимым с имеющимся программным обеспечением. Однако существуют моменты, когда то, что можно выжать из 486-го и Pentium-процессоров, не удается лиде­ру — Pentium Pro. To, что элегантно обеспечивало старым чипам плавную работу, приводит Pentium Pro к оста­новке. Он буквально захлебывается не­большими фрагментами инструкций, которые "Dynamic Execution" пытается обработать как на конвейере, чтобы выйти на предусмотренный темп. Пер­вые компьютеры с процессором Pentium Pro показывают, к чему это приводит: с приложениями под Windows они работают даже несколько медленнее, чем Pentium-ПК с анало­гичным оснащением.

Pentium Pro требует, прежде всего, 32-разрядных программ. Операцион­ная система также не должна быть тормозом: на компьютере уже должна быть инсталлирована настоящая 32-разрядная среда (например, Windows-NT).

Самые быстрые из тестируемых до сих пор ПК с Pentium Pro поступали от фирм Siemens-Nixdorf и IBM. При тактовой частоте процессора 150 МГц они работают вдвое быстрее систем на базе 120 МГц Pentium.

Чтобы понять этот скачок по мощ­ности, нужно уже вести разговор о би­тах и байтах, детально вникая в кон­струкцию и принцип действия Pentium Pro. Начнем с интегрирован­ной в корпусе процессора кэш-памяти второго уровня Second-Level-Cache (L1-Cache), являющейся основным отличительным признаком Pentium Pro. Она служит как буферная память для быстрого обмена данными, кото­рые многократно используются при транзакциях. Располагаясь в виде вто­рого модуля на той же подложке, L1-Cache, состоящий из 15,5 млн. тран­зисторов, дополняет чип процессора с его 5,5 млн. транзисторов (это почти вдвое больше, чем у Pentium — 3,1 млн.).

Эти цифры соответствуют процессору с вариантом кэш-памяти на 256 Кбайт, который сейчас представлен на рынке. Для серверов предусматри­вается кэш на 512 Кбайт, поэтому ко­личество интегрированных элементов памяти еще удвоится. Так как струк­туры кэш-памяти однообразны, она может быть очень плотно упакована на кремниевой подложке, благодаря чему блок Cache-Dual немного мень­ше, чем CPU. Задача кэш-памятиизбежать задержек, которые возника­ют при доступе к RAM. Типичные значения времени доступа для чипа DRAM, использующегося в качестве оперативной памяти, находятся в пределах от 60 до 80 нсек. Для про­цессора это слишком медленно. При тактовой частоте 150 Мгц он приблизительно через 7 нсек запускает но­вый рабочий цикл. Эффективно ра­ботающий процессор просто не мо­жет устанавливать слишком много циклов ожидания, поэтому часто ис­пользуемые команды и данные запо­минаются в кэш-памяти, к которой процессор имеет быстрый доступ. Начиная с 486-х машин, основная кэш-память (L1-Cache) интегрирова­на в корпусе процессора. Непосред­ственная близость к CPU, к ядру про­цессора, дает возможность для Pentium Pro реализовать обмен дан­ными между центральным блоком и L2-Cache на максимальной скорости процессора. Для первого Pentium Pro это 150 Мгц.

Обмен данными между CPU и L2-Cache реализован через 64-разрядный канал связи. Кроме того, эта кэш-па­мять организована таким образом, что она не блокируется. Процессор не ос­танавливается из-за операций с кэш-памятью, и транзакции в процессор­ной шине не замедляются.

Если, например, необходимые дан­ные отсутствуют в кэш-памяти, то по­является статус "Miss" (отсутствие) и процессор немедленно выполняет дру­гие инструкции. Одновременно он пытается извне, через шину памяти, ввести данные, которых нет в кэше. Каналом связи с внешней системной памятью также является 64-разрядная шина. Процессор, напротив, является "чистой" 32-разрядной машиной. То­лько что запущенные на выполнение инструкции снова могут привести к статусу "Cache-Miss" и вызвать после этого опять соответствующие проце­дуры. Pentium Pro одновременно мо­жет поддерживать до четырех таких транзакций.

Для 486- и Pentium-процессоров L2-Cache обычно размещается на мате­ринской плате в виде отдельного мо­дуля. То, что интегрированная в кор­пус процессора буферная память не только экономит место, но и работает значительно быстрее обычного кэша, показывает простой ЧИП-тест. В дан­ном случае работа велась с различными по размерам блоками данных, ко­торые использовали по очереди: ос­новную кэш-память (L1-Cache) объемом 16 Кбайт, находящуюся в CPU; L2-Cache и, наконец, рабочую память (RAM).

С помощью простых подпрограмм низкого уровня было показано, что обмен с L1-Cache для Pentium Pro проходит несколько быстрее, чем для Pentium. Если тестовый файл имеет размер 1 MB, то 256 KB кэш не может его целиком хранить и скорость для обоих процессоров в одинаковой сте­пени резко падает. Таким образом, объем L2-Cache представляет опреде­ленный интерес с точки зрения работы процессоров с файлами больших объемов.

Pentium Pro имеет скорость доступа к буферной памяти в несколько раз выше, чем старый Pentium. Тестирова­ние проводилось на компьютере Pentium Pro фирмы Siemens-Nixdorf (150 Мгц) и Pentium (120 Мгц) (см. диаграмму)."Dynamic Execution" — определе­ние, введенное фирмой Intel. За ним скрывается в сущности комбинация трех приемов, которые применяются для процессора Pentium Pro, чтобы ус­корить разработку данных:

прогноз операции перехода: про­цессор просматривает на несколько шагов вперед программное обеспечение и определяет, какие ветвления с большей вероятностью будут преобла­дать и следовательно, какие группы инструкций нужно обработать в следу­ющем цикле.

анализ потока данных: в следую­щем цикле процессор проверяет, ка­кие инструкции зависят от других ре­зультатов и данных. Таким образом, он устанавливает оптимальную оче­редность выполнения команд. Перво­начальная последовательность инструкций при таком подходе не дол­жна соблюдаться: "Out-of-Order-Execution" — непоследовательное ис­полнение. Для Pentium Pro это может означать отход от некоторой последо­вательности событий, которая обяза­тельно предписывает ему принудите­льные паузы, так как он должен вы­полнять это лишь шаг за шагом.

опережающее исполнение: на ос­новании временной диаграммы, команды выполняются в выбранном по­рядке таким образом, чтобы процес­сор был постоянно занят.

Для того чтобы реализовать "Dynamic Execution", Intel вынужден был искать новые решения. Это объясняется тем, что ограничения производительности Pentium-процес­сора были непреодолимы. Конвейер­ная архитектура Pentium состоит из пяти ступеней, для Pentium Pro она составляет четырнадцать ступеней.

Intel глубоко "запустил руку" в RISC-методы повышения производитель­ности (RISC — Reduced Instruction Set Computer). Если Pentium обрабатывает две инструкции в тактовом цикле, яв­ляясь, таким образом, первым суперскалярных процессором Intel, то Pentium Pro обрабатывает в трех па­раллельных конвейерах до трех ин­струкций за цикл. "Суперконвейерная" таким нес­колько необычным словом можно бы­ло бы назвать современную процес­сорную технологию. Это означает од­новременную обработку нескольких команд, разбитых на несколько ступе­ней независимо друг от друга. Линей­ная обработка всех входных команд с классическими фазами выборки и ис­полнения заменяется для Pentium Pro на так называемый "пул команд" (Instruction Pool). Здесь происходит улучшенная планировка команд, заме­на классической фазы "исполнение" на распределенную схему из новых фаз "Dispatch/ Execute" (планирова­ние/исполнение) и "Retire" (возврат), что позволило запускать команды в произвольном порядке, но завершать их в естественном порядке поступле­ния. В этом пуле могут быть, напри­мер, четыре команды, из которых пер­вая может сразу не выполняться из-за того, что в кэш-памяти отсутствуют необходимые данные, которые снача­ла должны быть получены из рабочей памяти. Если имеется вторая инструк­ция, которая зависит от первой, то обычный CPU должен сначала подож­дать. Pentium Pro, напротив, может с опережением обработать третью и чет­вертую команды, если для этого не понадобятся исполнения предыдущих результатов. Результаты этого процес­са снова возвращаются в пул команд и ожидают там дальнейшей обработки в правильной последовательности. Для отработки Cache-Miss требуется много рабочих тактов. В это время Pentium Pro просматривает от 20 до 30 ин­струкций вперед относительно прог­раммного счетчика. Среди них нахо­дится в среднем 5 ветвлений, которые требуется правильно спрогнозировать, чтобы не потерять преимущество в скорости. Недостатком суперскаляр­ной концепции является то, что неп­равильный прогноз может привести к ненормированным потерям времени. Поэтому уже подготовленные к вы­полнению инструкции при этих обстоятельствах аннулируются. Функци­ональная схема, представленная на следующей странице объясняет принцип действия процессора Pentium Pro. Instruction Fetch Unit (IFU) блок выборки команд содержит так называ­емую I-Cache. При необходимости CPU быстро извлекает из этой памяти свои инструкции. Необходимую ин­формацию об индексе поиска IFU уз­нает от Branch Target Buffer (BTB)буфера адресов перехода, задачей ко­торого является предсказание ветвле­ний. Для этого применен относитель­но сложный алгоритм, который дает возможность BTB выйти на 90%-ю точность предсказания. I-Cache захва­тывает по мере надобности кэш-стро­ку и передает декодеру 16 байт, кото­рые выровнены по границе слова. Так как программный код для инструкций Intel-архитектуры часто имеет ветвле­ния на середину или конец кэш-стро­ки, то всегда читаются две строки.

Задачей дешифратора инструкций (Instruction Decoder) является разло­жение команд для дальнейшей обра­ботки на небольшие фрагменты, так называемые Micro-Ops (микроопера­ции). Микрооперации (МО) представ­ляют собой "атомарные" блоки ин­струкций процессора Pentium Pro. Все МО имеют одинаковую длину и состо­ят, в зависимости от обстоятельств, из двух логических источников и одного логического приемника. Большинство инструкций конвертируются непос­редственно в одну МО, некоторые в 1-4 МО.

Комплексные инструкции требуют собственного микрокода (MIS-Microcode Instruction Sequenzer). Этот микрокод является лишь набором запрограммированных последовательнос­тей обычных МО. В каждом тактовом цикле из трех раздельных декодеров (DO, Dl, D2) генерируются три МО, из-за чего Pentium Pro обозначается также как суперскалярный процессор третьего уровня. Аналогичный прин­цип используют фирмы AMD для за­явленного процессора К5 и NexGen для Nx586.

МО выстраиваются в очередь и пе­редаются в Register Alias Table (RAT) таблицу переименования регистров. Здесь логические ссылки на регистры архитектуры Intel преобразуются в об­ращения к физическим регистрам Pentium Pro. Intel-архитектура распо­лагает относительно небольшим набо­ром регистров. Трудность представля­ет обработка инструкций в режиме пе­реупорядочивания ("out of order"), в этом случае появляются бесполезные циклы ожидания. МО снабжаются еще информацией о статусе, прежде чем они помещаются в ReOrder Buffer (ROB) буфер переупорядочивания, который и представляет пул команд. Здесь МО упорядочиваются таким об­разом, что в конце выполнения ко­манды снова образуется правильная последовательность, не нарушающая семантику программы.

Помимо этого из RAT МО поступа­ют в Reservation Station (RS) стан­цию резервирования, откуда они мо­гут посылаться в исполняющие ус­тройства (EUs — Execution Units). Предполагается, что по статусу можно определить наличие всех операндов микрооперации и что EU, отвечающее за определенные МО, обладает необ­ходимыми ресурсами. RS связана с ис­полнительными устройствами через пять портов и имеет выход на неско­лько ресурсов. С портом 0 связаны, прежде всего, различные устройства арифметики с плавающей запятой. Их объединяет необходимость в большой разрядности шины данных. Для чисел с плавающей запятой необходимо пре­дусмотреть 86 бит. Порт 1 состоит из устройства целочисленной арифмети­ки (IEU Integer Execution Unit) и устройства операций перехода (JEUJump Execution Unit). Порты 2, 3 и 4 необходимы для доступа через блок генерации адресов (AGU Address Generetion Unit) к основной памяти. Результат выполнения команд попада­ет снова как в RS, так и в ROB. Тем самым последующим операциям га­рантируется доступ к текущим дан­ным.

Пиковую скорость Pentium Pro раз­вивает при обработке пяти МО за такт, что соответствует наличию од­ной МО на один порт. В среднем обычно обрабатывается три МО за такт. В соответствии с требованиями к информационному потоку и при на­личии доступа к данным из исполня­ющих устройств, МО передаются да­лее, независимо от первоначальной последовательности, которая была за­ложена в программе.

В конце Retire Unit (устройство вы­вода из пула готовых инструкций) проверяет также статус МО в пуле инструкций. Оно отыскивает МО, кото­рые уже подготовлены к исполнению и могут быть удалены из пула. Поско­льку эти МО уже полностью исполь­зованы, то исходная задача переписы­вается Intel-архитектурой так же, как и для первоначальной группы ин­струкций. После этого Retire Unit вос­создает исходную программную пос­ледовательность. Это проделывается также при наличии: прерываний (Interrupts); реакций на особую ситуа­цию (Traps), вызывающих внутренние прерывания; отказов (Faults); контро­льных точек (Breakpoints), необходи­мых для отладки и ложных прогнозов.

Большинство из того, что происхо­дит в Pentium Pro, до определенного момента является чисто опережаю­щим процессом. Лишь в самом конце принимаются данные, в достовернос­ти которых имеются сомнения, и за­писываются в Retirement File Register (RFR) регистр удаляемых файлов. Устройство Retirement может прини­мать до трех МО за такт.

Вход и выход у Pentium Pro факти­чески выглядит так же как и у 486-го процессора. То, что внутри новый процессор функционирует совсем по-другому, пользователя, естественно, не беспокоит. Он может его рассмат­ривать как черный ящик. Сомнения появляются лишь тогда, когда этот технический шедевр получает сомни­тельное программное обеспечение, в результате чего не оправдываются воз­лагаемые на него надежды. Ключом к скорости Pentium Pro является его способность к Out-of-Order-Execution (непоследовательное выполнение ко­манд), которая постоянно поддержи­вается в процессе работы процессора.

В некоторых случаях команды нуж­но выполнять по очереди. Такие ин­струкции приводят суперконвейерную конструкцию Pentium Pro к остановке. Процессор должен приостановить все другие операции и при необходимости снова начать, обработав прежде спе­циальную инструкцию. Например, чтение полного регистра может оста­новить обработку команд, если соот­ветствующая инструкция следует за инструкцией записи для сегмента это­го регистра. Это как раз тот случай, когда записывается 8 бит 16-разрядного регистра. Иногда программисты на ассемблере используют половину ре­гистра, например AL, чтобы запом­нить один байт информации. К фатальной ошибке приводит попытка при­менить непосредственно в программе инструкцию чтения АХ, то есть 16-битного содержимого этого регистра Эти методы программирования восхо­дят еще из времен 286-х машин и DOS, когда адресное пространство было ограничено 64 Кбайтами.

Правда, такое использование регис­тров в 16-разрядном программном ко­де встречается не часто, однако когда это происходит, возникают значитель­ные задержки. За семь или больше тактовых циклов процессор может пе­рейти в состояние ожидания. За это время х86 мог бы выполнить, возмож­но, 20 следующих команд.

Компилятор фактически в состоя­нии минимизировать эту задачу, одна­ко, еще часто в ассемблерных кодах используются неполные регистры. Windows 3.1 и также часть Windows 95 содержат такие, написанные от руки коды. Это является причиной того, что даже 32-разрядные приложения для Windows 95 нельзя полностью ис­пользовать на Pentium Pro. Команды чтения полного регистра после ин­струкций записи для 8- или 16-разряд­ного регистра могут вызвать такие же проблемы, однако они встречаются значительно реже'. Intel с самого нача­ла оптимизировал Pentium Pro для 32-разрядного программного обеспече­ния.

Трудности в 16-разрядных програм­мах могут также вызывать команды ввода/вывода и операции с управляю­щими регистрами. Извлекая их из пу­ла команд, Pentium Pro не может вес­ти обработку в любой последователь­ности. Если процессор сталкивается с такими инструкциями, он должен за­вершить все команды, находящиеся в стадии выполнения, не приступая бо­льше к выполнению новых. Образно говоря, конвейер опустошается.

Для 32-разрядного программного обеспечения управление памятью, как правило, вызывает меньшие зат­раты, чем для 16-разрядных прог­рамм, так как в качестве адресного пространства может использоваться до 4 Гбайт памяти. Центральный процессор вследствие этого меньше загружен и может переключать свои ресурсы на выполнение, операций, требующих интенсивных вычисле­ний. Сравнив набор приложений Windows 3.1 (16 разрядов) с 32-раз­рядными приложениями для Win­dows 95, можно обнаружить, что ко­личество команд, приходящееся на управление памятью, снижено. Вследствие этого возможно одновре­менно выполнять больше операций, связанных с вычислениями (смотри диаграмму). В качестве операцион­ных систем, наиболее подходящих для Pentium Pro, в этом и следующем году Intel видит Windows NT и Unix. Если необходимо работать с Windows 3.1 или Windows 95, то рекомендует­ся, по-прежнему, Pentium-процес­сор. По календарному плану в нача­ле 1997 года появится для Pentium Pro и Windows 95. До этого периода, возможно, появятся еще более быс­трые процессоры Pentium Pro и бо­льшое количество 32-разрядных при­ложений.

Новый процессор несет в компью­тер также новый дизайн шины. Шина Pentium Pro предоставляет возмож­ность непосредственного подсоедине­ния последующих процессоров или высокоскоростных устройств вво­да/вывода. Процессорную шину нель­зя путать с PCI-шиной. Последняя, в свою очередь, может стыковаться с процессорной шиной посредством ин­терфейса PCI-BRIDGE.

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

Различные запросы и ответы могут одновременно находиться на шине. Большинство запросов процессор мо­жет посылать в память, не ожидая каждый раз ответ. Принцип действия процессора ста­новится понятным из схематичес­кой диаграммы, которая иллюс­трирует конвейерный подход к об­работке микроопераций, микроко­манд Pentium Pro. Конвейер этого процессора насчитывает 14 раз­личных ступеней.

Он состоит из трех отдельных час­тей, которые более или менее за­висят друг от друга. 14-ступенча-тый конвейер, состоящий из одной части, имеет существенный недос­таток: он не может работать быс­трее, чем его самая длинная сту­пень. В течение последующих 2,5 тактовых циклов происходит декодирование, при котором фор­мируются микрооперации. Далее идет переименование регистров.

Последняя ступень (запись в Reservation Station) обычно перек­рывается как минимум с одной ступенью в следующем сегменте конвейера.

Если в 16-разрядной программе появляются команды, которые Pentium Pro не может обработать в режиме "out-of-order", то при не­обходимости, операции могут быть стерты в нижних ступенях конвейера и затем возобновлены сначала.

Начало второй фазы ("Out-Of-Order Core") соответствует входу в К Reorder Buffer (ROB). Для идентификации микроопераций здесь предусмотрены две ступени и одна для исполнения одной микроо­перации. Операции для арифмети­ки с плавающей запятой имеют большую длительность.

В последней части конвейера (Retirement) обеспечивается про­цесс объединения микроопераций снова в одно целое.

Вследствие дальнейшего деления на части первоначально пятисту­пенчатого конвейера 486- и Pentium-процессоров, каждая еди­ничная ступень должна выполнять меньший объем работы. Следстви­ем этого является то, что ступени конвейера могут завершаться быс­трее. Тем самым можно добиться более высокого быстродействия. При одинаковой технологии изго­товления можно получить такто­вую частоту для Pentium Pro на треть больше, чем для Pentium. Первая часть конвейера в Pentium Pro состоит из восьми тактовых циклов и обозначается Intel как "In-Order Front End".

§21.PENTIUM processor

Соседние файлы в папке КС-ZAO