Boroda_2
.docПод изображенной на рис. 4.31 подсистемой памяти находится блок предварительной обработки, который выбирает команды из L2 и декодирует их в порядке выполнения команд программы. Каждая команда на уровне ISA разбивается на последовательность RISC-подобных микроопераций. Для упрощения команд блок выборки-декодирования определяет, какие микрооперации необходимы для решения внутренних задач. В более сложных случаях производится поиск последовательности микроопераций в памяти микрокоманд. В любом случае команда уровня ISA процессора Pentium 4 преобразуется в последовательность микроопераций, подлежащих исполнению RISC-ядром микросхемы. Этот механизм позволяет «навести мосты» между устаревшим набором CISC-команд и современным трактом данных RISC.
Декодированные микрооперации отправляются в кэш трасс (trace cache), в роли которого выступает кэш команд первого уровня. Поскольку кэшируются не исходные команды, а декодированные микрооперации, необходимость в повторном декодировании при извлечении команды из кэша трасс отпадает. В этом заключается одно из наиболее существенных расхождений между микроархитектурами NetBurst и Р6 (в последней команды Pentium удерживались в кэше команд первого уровня). Здесь же выполняется прогнозирование ветвлений.
Команды передаются из кэша трасс планировщику команд в порядке, определяемом программой, но при их выполнении возможно отступление от этого порядка. При обнаружении микрооперации, которую нельзя выполнить, планировщик команд удерживает ее, одновременно продолжая обрабатывать поток команд — запускаются все последующие команды, которые не предусматривают обращение к занятым ресурсам (регистрам, функциональным блокам и т. д.). Здесь же выполняется подмена регистров, благодаря чему WAR- и WAW-взаи- мозависимые команды могут выполняться без задержки.
Как уже отмечалось, очередность запуска команд может не соответствовать предусмотренной в программе. В то же время требование архитектуры Pentium, касающееся точных прерываний, говорит о том, что ISA-команды должны возвращать результаты без отступления от заданной программой последовательности. За реализацию этого требования отвечает блок пересортировки.
В верхней правой части рисунка изображен блок исполнения, объединяющий специализированные блоки исполнения, которые непосредственно осуществляют целочисленные операции, операции с плавающей точкой и специализированные команды. Существует несколько блоков исполнения, работающих параллельно. Данные они получают из регистрового файла и кэша данных первого уровня.
Конвейер NetBurst
На рис. 4.32 приводится более подробная схема микроархитектуры NetBurst, в том числе ее конвейер. В верхней части схемы изображен блок предварительной обработки, ответственный за выборку команд из памяти и их подготовку к выполнению. Этот блок получает новые инструкции Pentium из кэша второго уровня порциями по 64 бит. Они декодируются в микрооперации и помещаются в кэш трасс. Емкость кэша трасс составляет 12 ООО микроопераций, и по своей производительности он сопоставим с традиционным кэшем первого уровня на 8 или 16 Кбайт.
В кэше трасс каждые шесть микроопераций объединяются в группу, занимающую одну строку. Микрооперации из одной строки выполняются без нарушения последовательности, хотя они могут быть образованы из ISA-команд Pentium, отстоящих друг от друга на тысячи байтов. Для формирования более протяженных последовательностей микроопераций практикуется объединение трассируемых строк.
Если для выполнения ISA-команды Pentium требуется более четырех микроопераций, она не декодируется и не помещается в кэш трасс. Вместо этого она снабжается специальным маркером, заставляющим систему провести поиск микроопераций в памяти микрокоманд. Таким образом, логика исполнения с изменением последовательности получает микрооперации путем извлечения из кэша трасс ранее декодированных ISA-команд или оперативного поиска сложных ISA-команд (например, команды смещения строки) в памяти микрокоманд.
Встретившись с командой безусловного перехода, блок декодирования ищет предсказанный объект перехода в буфере объектов перехода (Branch Target Buffer, ВТВ) первого уровня и продолжает декодирование с соответствующего адреса. В кэше буфера объектов перехода первого уровня сохраняются 4000 последних переходов. Если необходимая команда перехода отсутствует в таблице, применяется статическое прогнозирование. При этом подразумевается, что обратный переход, во-первых, является частью цикла, во-вторых, не занят. Точность статического прогноза в этом случае очень высока. Прямой переход считается незанятым и входящим в структуру оператора if. Точность статического прогноза в случае прямых переходов значительно ниже, чем в случае обратных. Для прогнозирования микроопераций перехода применяется буфер трасс объектов перехода, или ВТВ трасс.
Второй компонент конвейера — логика исполнения с изменением последовательности — получает данные из кэша трасс емкостью 12 ООО микроопераций. При поступлении из блока предварительной обработки каждой последующей микрооперации (а за цикл их поступает три) блок распределения и подмены регистрирует ее в таблице, состоящей из 128 записей и называемой буфером пере- упорядочивания команд (ReOrder Buffer, ROB). В этом буфере хранятся данные о состоянии микрооперации, вплоть до пересортировки ее результатов. Затем блок распределения и подмены проводит проверку на предмет доступности ресурсов, необходимых для выполнения микрооперации. Если ресурсы свободны, микрооперация устанавливается в одну из очередей на выполнение. Для микроопераций, исполняемых в памяти и вне памяти, предусмотрены отдельные очереди. Если выполнение микрооперации в данный момент невозможно, она откладывается, однако обработка последующих микроопераций продолжается; таким образом, микрооперации часто выполняются вне их исходной последовательности. Этот принцип позволяет поддерживать загрузку всех функциональных блоков на максимально высоком уровне. В каждый отдельно взятый момент могут одновременно обрабатываться до 126 команд, причем 48 из них могут загружаться из памяти, а 24 — сохраняться в памяти.
Иногда микрооперации простаивают. Это происходит в тех случаях, когда к одному и тому же регистру для чтения или записи пытаются обратиться несколько микроопераций; соответственно, одной из них это удается, а остальным — нет. Такие конфликты, как мы уже выяснили, называются WAR- и WAW-взаи- мозависимостями. Подмена целевого регистра позволяет записать результаты выполнения микрооперации в один из 120 временных регистров, а значит, выполнить эту микрооперацию немедленно. Если же все временные регистры недоступны или микрооперация попадает в ситуацию RAW-взаимозависимости (обойти которую нельзя), планировщик указывает характер возникшей проблемы в виде записи в буфере ROB. Впоследствии, после освобождения всех необходимых ресурсов, микрооперация устанавливается в одну из очередей на выполнение.
Блок распределения и подмены помещает готовые к выполнению операции в одну из двух очередей. Четыре планировщика ответственны за извлечение микрокоманд из очередей. Каждый планировщик регламентирует обращения к тем или иным ресурсам:
-
Планировщик 1 — АЛУ 1 и блок смещения операций с плавающей точкой.
-
Планировщик 2 — АЛУ 2 и блок исполнения операций с плавающей точкой.
-
Планировщик 3 - команды загрузки.
-
Планировщик 4 — команды сохранения.
Поскольку планировщики и АЛУ работают на скорости, вдвое превышающей номинальную тактовую частоту, первые два планировщика могут передавать по две микрооперации за цикл. Учитывая то, что два целочисленных АЛУ тоже работают на удвоенной скорости, процессор Pentium 4 с тактовой частотой 3 ГГц способен выполнять 12 млрд целочисленных операций в секунду. В силу столь высокой скорости блок контроля исполнения с изменением последовательности испытывает некоторые трудности с загрузкой АЛУ. Команды загрузки и сохранения проходят через один блок исполнения, работающий на удвоенной частоте, который в течение одного цикла может вызывать по одной команде обоих типов. Таким образом, в лучшем случае (при отсутствии операций с плавающей точкой) за цикл может быть вызвано 6 целочисленных микроопераций.
Два целочисленных АЛУ не одинаковы. АЛУ 1 выполняет любые арифметические и логические операции и переходы. АЛУ 2 способно выполнять только команды сложения, вычитания, сдвига и циклического сдвига. Не идентичны и два блока исполнения операций с плавающей точкой. Первый из них выполняет только сдвиги и SSE-команды. Второй поддерживает арифметические операции с плавающей точкой, а также ММХ- и SSE-команды.
АЛУ и блоки исполнения операций с плавающей точкой получают данные от двух регистровых файлов емкостью по 128 записей. Один из этих файлов отводится для целых чисел, другой — для чисел с плавающей точкой. В них содержатся все операнды, необходимые для исполнения команд; кроме того, они играют роль хранилища результатов. В силу подмены регистров восемь из них содержат регистры, доступные на уровне архитектуры команд (ЕАХ, ЕВХ, ЕСХ, EDX и т. д.), однако расположение «реальных» значений в каждом конкретном случае зависит от изменений в отображении, происходящих в ходе выполнения.
Кэш данных первого уровня является одним из компонентов высокоскоростной (2х) схемы. При емкости 8 Кбайт в нем хранятся целые числа, числа с плавающей точкой и другие типы данных. В отличие от кэша трасс, эти данные никоим образом не декодируются. Функция кэша данных сводится к хранению копий байтов, находящихся в памяти. Что касается его характеристик, то кэш данных первого уровня представляет собой 4-входовую ассоциативную кэшпамять с емкостью строки 64 байт. Он поддерживает сквозную запись; иными словами, при изменении строки кэша она незамедлительно копируется обратно в кэш второго уровня. В течение цикла кэш данных первого уровня обрабатывает по одной операции чтения и записи. Если затребованное слово не удается обнаружить в кэше первого уровня, отправляется запрос в кэш второго уровня; последний в такой ситуации может ответить либо сразу, либо после выборки соответствующей строки из памяти. В любой момент в состоянии исполнения могут находиться до четырех запросов, направленных из кэша первого уровня в кэш второго уровня.
Так как микрооперации выполняются вне исходной последовательности, сохранение в кэше первого уровня возможно только после пересортировки результатов всех команд, предшествующих команде сохранения. Такую пересортировку результатов с их трассировкой (отслеживанием того, где они находятся) выполняет блок пересортировки. В случае прерывания прекращается обработка всех команд, еще не прошедших пересортировку результатов; таким образом, обеспечивается соблюдение требования, согласно которому при прерывании должны быть завершены все команды до определенной точки в программе.
Если команда сохранения прошла пересортировку результатов, но предшествующие команды еще обрабатываются, из-за невозможности обновления кэша первого уровня результаты их выполнения передаются в буфер незавершенных команд. В этом буфере можно единовременно разместить до 24 команд сохранения. Если одна из последующих команд загрузки попытается считать сохраненные данные, она из буфера незавершенных команд будет перенаправлена непосредственно к команде, которая в этот момент еще не помещена в кэш данных первого уровня. Этот процесс называется перенаправлением для загрузки (store- to-load forwarding).
Итак, достаточно очевидно, что Pentium 4 обладает сложной микроархитектурой, проектное решение которой определено необходимостью поддержки унаследованного набора команд Pentium на современном RISC-ядре с высоким уровнем конвейеризации. Эта цель достигается путем деления команд Pentium на микрооперации, их кэширования и передачи (по три микрооперации за раз) конвейеру, где они выполняются с помощью нескольких АЛУ, которые в оптимальных условиях обрабатывают до шести микроопераций за цикл. Микрооперации выполняются с отклонением от исходной последовательности, но возвращаются и сохраняются в кэш-памяти первого и второго уровней в заданном порядке. Более подробные сведения о микроархитектуре NetBurst представлены в работе [94].
Микроархитектура процессора UltraSPARC III Си
Серия процессоров UltraSPARC, произведенная компанией Sun, — это реализация версии 9 архитектуры SPARC. На первый взгляд все модели очень похожи и различаются главным образом по производительности и цене. В то же время, на уровне микроархитектуры они существенно различаются. В этом разделе мы обсудим процессор UltraSPARC III Си. Аббревиатура «Си» в названии модели говорит о том, что проводники микросхемы сделаны из меди — в отличие от алюминиевых проводников, применявшихся в предыдущих моделях. Сопротивление меди ниже сопротивления алюминия, за счет этого провода становятся тоньше, а быстродействие — выше.
UltraSPARC III Си — это 64-разрядная машина с 64-разрядными регистрами и 64-разрядным трактом данных, но в целях совместимости с машинами версии 8 (которые являются 32-разрядными) она может работать с 32-разрядными операндами, а программное обеспечение, написанное для 32-разрядных версий SPARC, изменять не нужно. Хотя во внутренней архитектуре машины используются 64 разряда, ширина шины памяти составляет 128 бит, аналогично процессору Pentium II с 32-разрядной архитектурой и 64-разрядной шиной памяти. В обоих случаях в одну систему устанавливаются шина и процессор разных поколений.
В отличие от Pentium 4, процессор UltraSPARC изначально проектировался как полноценная RISC-система. Следовательно, необходимости в сложном механизме преобразования старых CISC-команд в микрооперации в данном случае не было. Команды ядра представляют собой готовые микрооперации. Ситуация несколько осложняется появлением в последние годы новых команд обработки графических и мультимедийных данных, для выполнения которых требуются специальные устройства.
Общий обзор системы UltraSPARC III Си
Структурная схема UltraSPARC III Си представлена на рис. 4.33. В целом, она значительно проще микроархитектуры NetBurst, применяемой в системах Pentium 4, что объясняется менее изощренной архитектурой системы команд UltraSPARC. Тем не менее по некоторым базовым компонентам сходство с Pentium 4 прослеживается. В первую очередь, это обусловлено технологическими и экономическими факторами. К примеру, в период проектирования этих микросхем объем кэшей данных первого составлял от 8 до 16 Кбайт. Этому стандарту соответствовали обе рассматриваемые микросхемы. Когда производство кэш-памя- ти первого уровня емкостью 64 Мбайт станет обоснованным с технологической и экономической точек зрения, все процессоры будут оснащаться уже новыми кэшами. Различия между Pentium 4 и UltraSPARC III Си связаны по большей части с тем, что в первом случае разработчикам пришлось обеспечить поддержку унаследованного набора CISC-команд, а во втором такой задачи не ставилось.
В левой верхней части рис. 4.33 изображен 4-входовый ассоциативный кэш команд емкостью 32 Кбайт с 32-байтными строками. Поскольку большинство команд UltraSPARC занимают 4 байта, в этом кэше можно одновременно разместить около 8000 команд. По этому признаку UltraSPARC III Си несколько уступает кэшу трасс NetBurst.
Блок вызова команд подготавливает для выполнения до четырех команд за цикл. В случае неудачного обращения в кэш-память первого уровня количество вызываемых команд уменьшается. При обнаружении условного перехода происходит обращение к таблице переходов емкостью 16 ООО записей; на основе ее содержания принимается решение о вызове следующей команды или команды, расположенной по целевому адресу. Повышать надежность прогнозирования ветвлений помогают дополнительные биты, связываемые с каждым словом в кэше команд. Подготовленные команды поступают в 16-командный буфер, который сглаживает направленный в конвейеры поток команд.
Как показано на рис. 4.33, из буфера команд команды попадают в блок исполнения целочисленных операций, блок исполнения операций с плавающей точкой и блок загрузки/сохранения. Блок исполнения целочисленных операций состоит из двух АЛУ и короткого конвейера для обработки команд перехода. Кроме того, здесь есть регистры ISA и временные регистры.
Блок исполнения операций с плавающей точкой состоит из 32 регистров и трех независимых АЛУ, предназначенных для выполнения операций сложения/вычитания, умножения и деления, соответственно. Этот же блок выполняет графические операции.
Блок загрузки/сохранения, как явствует из его названия, ответственен за обработку разнообразных команд загрузки и сохранения. Содержащиеся в нем тракты данных обеспечивают соединение с тремя кэшами. Кэш данных представляет собой традиционную предназначенную для обработки данных 4-входовую ассоциативную кэш-память первого уровня емкостью 64 Кбайт с длиной строки 32 байт. Кэш предвыборки емкостью 2 Кбайт нужен по той причине, что на уровне архитектуры команд UltraSPARC предусмотрены команды упреждающей выборки, которые позволяют компилятору вызывать слова еще до того, как в них возникнет необходимость. Если компилятор полагает, что через некоторое время ему потребуется то или иное слово, он запускает команду предвыборки. В результате соответствующая строка с упреждением загружается в кэш предвыборки, и через несколько команд обращение к этой строке происходит существенно быстрее, чем если бы она не была загружена. В некоторых ситуациях проводится и аппаратная предвыборка, позволяющая повысить скорость работы устаревших программ, не поддерживающих программную предвыборку. Кэш записи представляет собой небольшой по объему (2 Кбайт) блок кэш-памяти, предназначенный для объединения результатов записи, а следовательно, оптимизации потребления ресурсов широкой (256-разрядной) шины, ведущей к кэшу второго уровня. Единственное назначение кэша записи состоит в повышении производительности.
В микросхеме UltraSPARC III Си также предусмотрена логика управления доступом к памяти. Она состоит из трех компонентов: системного интерфейса, контроллера кэша второго уровня и контроллера памяти. Системный интерфейс обеспечивает взаимодействие с памятью по 128-разрядной шине. Через этот интерфейс проходят все запросы вовне, за исключением запросов к кэшу второго уровня. Теоретически при использовании 43-разрядных адресов физической памяти объем основной памяти может доходить до 8 Тбайт, однако размер печатной платы, на которой устанавливается процессор, ограничивает этот показатель значением 16 Гбайт. Проектное решение интерфейса позволяет подключать к одному модулю памяти сразу несколько процессоров UltraSPARC, за счет чего формируется мультипроцессор. О мультипроцессорах речь пойдет в главе 8.
Контроллер кэша второго уровня сопряжен с объединенным кэшем второго уровня, который расположен вне микросхемы процессора. При внешнем размещении кэша второго уровня его объем может составлять 1, 4 или даже 8 Мбайт. Длина строки зависит от объема кэша (от 64 байт в кэше объемом 1 Мбайт до 512 байт в кэше объемом 8 Мбайт). Напомним, что кэш второго уровня Pentium 4 расположен на микросхеме, и из-за нехватки на ней свободного места его объем ограничен значением 1 Мбайт. Таким образом, в UltraSPARC обеспечивается значительно более высокий коэффициент кэш-попаданий, чем в Pentium (что объясняется большим объемом кэша), однако скорость доступа здесь ниже (потому что кэш расположен вне микросхемы).
Контроллер памяти преобразует 64-разрядные виртуальные адреса в 43-разряд- ные физические адреса. UltraSPARC поддерживает виртуальную память (см. главу 6) с размерами страницы 8, 64 и 512 Кбайт, а также 4 Мбайт. Для ускорения процесса преобразования предусмотрены специальные таблицы, называемые буферами быстрого преобразования (Translation Lookaside Buffers, TLB). Они сравнивают текущий виртуальный адрес с адресами, по которым производились обращения в недавнем прошлом. Три такие таблицы обеспечивают гибкое управление размерами страниц данных, а еще две обрабатывают команды преобразования.
Конвейер UltraSPARC III Си
Конвейер UltraSPARC III Си из 14 ступеней в упрощенной форме изображен на рис. 4.34. В левой части рисунка ступени обозначены буквами от А до D. Рассмотрим каждую из них в отдельности. Открывает конвейер ступень A (Address generation — формирование адреса). Здесь определяется адрес каждой последующей команды, которую предполагается выбрать. Как правило, он совпадает с адресом следующей команды, однако в некоторых случаях последовательная организация нарушается, например, если предыдущая команда является командой спрогнозированного перехода, перехвата исключения или прерывания, которое необходимо обработать. Так как прогнозирование ветвления за один цикл невозможно, команда, непосредственно следующая за условным переходом, выполняется в любом случае, вне зависимости от целевого объекта перехода.
Исходя из определенного ранее адреса на ступени Р (Preliminary fetch — предварительная выборка) вызываются команды из кэша команд первого уровня (до четырех за цикл). Для выявления условных переходов и проверки правильности прогноза производятся обращения к таблице переходов. На ступени F (Fetch — выборка) завершается выборка команд и их передача в кэш команд.
На ступени В (Branch target — обнаружение объекта перехода) происходит декодирование выбранных команд. Если среди них обнаруживаются спрогнозированные переходы, они передаются обратно на ступень А для непосредственной выборки соответствующих команд.
На ступени I (Instruction group formation — группировка команд) входящие команды сортируются по группам, в зависимости от того, к каким из шести функциональных блоков они обращаются:
-
АЛУ 1 для выполнения целочисленных операций.
-
АЛУ 2 для выполнения целочисленных операций.
-
АЛУ 1 для выполнения операций с плавающей точкой и графических операций.
-
АЛУ 2 для выполнения операций с плавающей точкой и графических операций.
-
Конвейер переходов (на рис. 4.34 не представлен).
-
Операции загрузки и хранения, а также специальные операции.
Ощутимые различия есть как между АЛУ для выполнения целочисленных операций, так и между АЛУ для выполнения операций с плавающей точкой и графических операций. В обоих случаях различаются наборы команд, которые способны выполнять те или иные АЛУ. Сортировка команд по блокам проводится на ступени I.
На ступени J (Instruction stage grouping — извлечение команды из очереди) команды подготавливаются к отправке в блок выполнения во время следующего цикла. В течение одного цикла на ступень R можно передать до четырех команд. Выбор команд ограничен доступностью функциональных блоков. К примеру, единовременно можно вызвать две команды выполнения целочисленной операции, одну команду выполнения операции с плавающей точкой и одну команду загрузки или сохранения. Однако запустить за один цикл три команды выполнения целочисленных операций невозможно.
На ступени R (Register — регистр) производится поиск регистров, необходимых для обработки команд выполнения целочисленных операций. Запросы на предоставление регистров с плавающей точкой перенаправляются в соответствующий регистровый файл. Здесь же проводятся проверки на предмет взаимозависимостей. Если необходимый регистр оказывается недоступным по причине его занятости предыдущей командой, текущая команда приостанавливается, а все последующие команды — блокируются. В отличие от Pentium 4, в UltraSPARC III Си команды вне исходной последовательности не выполняются.
Ступень Е (Execution — выполнение) предназначена для непосредственного выполнения целочисленных команд. Для выполнения большинства арифметических и булевых операций, а также операций сдвига, обработкой которых занимаются целочисленные АЛУ, достаточно одного цикла. Сразу по завершении выполнения команды соответствующим образом обновляется регистровый файл рабочего регистра. Некоторые сложные целочисленные команды передаются в специальный блок. Что касается команд загрузки и сохранения, то на данной ступени их выполнение только начинается, но не заканчивается. Операнды для выполнения команды с плавающей точкой извлекаются из соответствующего регистрового файла. На ступени Е, помимо обработки команд условного перехода, определяется их направление (переход/без перехода). В случае неверного прогноза сигнал отправляется обратно на ступень А, и конвейер освобождается.
На ступени С (Cache — кэш) завершается доступ к кэш-памяти первого уровня. Здесь же определяются результаты команд, предусматривающих чтение данных из памяти (например, команд загрузки).
На ступени М (Miss — промах) производится обработка слов, запрошенных, но не найденных в кэш-памяти первого уровня. Сначала выполняется поиск в кэше второго уровня, а в случае кэш-промаха осуществляется обращение к памяти, занимающее несколько циклов. Здесь же выполняются операции знакового расширения и выравнивания для байтов, четвертинок слов и половинок слов, найденных в кэше первого уровня. Для операций загрузки с плавающей точкой, у которых в кэше предвыборки имеет место кэш-попадание, на этом этапе удается получить результаты. По соображениям синхронизации кэш предвыборки при обработке целочисленных данных не задействуется.
На ступени W (Write — запись) результаты извлекаются из специального блока и записываются в регистровый файл рабочего регистра.
На ступени X (eXtend — продленное выполнение) завершается большинство графических команд и команд с плавающей точкой. Перед формальной пересортировкой результатов, происходящей на ступени Д результаты этих команд предоставляются последующим командам путем перенаправления для загрузки.
На ступени Т (Trap — перехват) перехватываются исключения, связанные с целочисленными командами и командами с плавающей точкой. Именно эта ступень отвечает за перехват исключений и обработку прерываний. Иными словами, после возникновения исключения или прерывания состояние машины должно отвечать определенным требованиям; в частности, все ранее запущенные команды должны быть завершены, а запуск последующих отменен.
На ступени D состояние целочисленных регистров и регистров с плавающей точкой фиксируется в соответствующих архитектурных регистровых файлах. При возникновении исключения или прерывания видимыми становятся именно эти значения, а не содержимое рабочих регистров. Операция записи регистра в архитектурный файл соответствует операции пересортировки результатов в процессорах Pentium. Кроме того, на ступени D результаты всех завершенных команд сохранения записываются в кэш записи (вместо кэша данных первого уровня). В конечном итоге строки этого кэша переписываются в кэш второго уровня, минуя кэш первого уровня (его содержимое не пересекается с содержимым кэша второго уровня). Эта схема упрощает задачу сборки мультипроцессоров UltraSPARC.