Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Boroda_2

.doc
Скачиваний:
7
Добавлен:
20.03.2015
Размер:
1.67 Mб
Скачать

Единственное эффективное решение проблемы — при разработке новых про­цессоров перейти от IA-32 к новой архитектуре команд. Именно такие планы строит компания Intel. Более того, предполагается запустить две новых линейки. Первая из них, называемая ЕМТ-64, представляет собой расширенную версию Pentium 4 с 64-разрядными регистрами и 64-разрядным же адресным простран­ством. В этой архитектуре решается проблема адресного пространства, но слож­ности реализации, свойственные Pentium 4, сохраняются. Ее можно назвать рас­ширенным вариантом архитектуры Pentium.

Еще одна архитектура, которую совместно разрабатывают компании Intel и Hewlett Packard, называется IA-64. Это уже полноценная 64-разрядная маши­на. Более того — она во многих отношениях разительно отличается от Pentium 4. Первоначально IA-64 предполагается вывести на рынок профессиональных сер­верных систем, но вполне возможно, что впоследствии эта архитектура укрепит­ся и в сегменте настольных компьютеров. В любом случае архитектура IA-64, впервые реализованная в линейке процессоров Itanium, настолько отличается от всего, что мы рассматривали ранее, что просто необходимо познакомиться с ней поближе. Итак, оставшаяся часть раздела посвящена архитектуре IA-64 как та­ковой и ее реализации в процессорах серии Itanium 2.

Проблема Pentium 4

Прежде чем переходить к детальному рассмотрению архитектуры IA-62 и про­цессора Itanium 2, полезно разобраться в том, чем, собственно, плох процессор Pentium 4 и какие проблемы компания Intel намеревается решить путем разра­ботки новой архитектуры. Основная проблема заключается в том, что IA-32 — это старая архитектура команд с совершенно неподходящими для современной техники свойствами. Это типичная CISC-архитектура с командами разной дли­ны и огромным количеством различных форматов, которые трудно декодировать быстро и «на лету». Современная техника лучше всего работает с RISC-архитек­турами, в которых команды одинаковы по размеру, а код операции имеет фикси­рованную длину, поэтому его легко декодировать. Хотя команды архитектуры IA-32 во время выполнения программы можно разделить на микрооперации на­подобие RISC-команд, но для этого требуется дополнительное аппаратное обес­печение (пространство на микросхеме), к тому же это занимает время и услож­няет разработку. Это первый недостаток.

IA-32 — это архитектура, ориентированная на двухадресные команды. В на­стоящее время популярны архитектуры команд типа загрузки/сохранения, в ко­торых обращения к памяти выполняются только для того, чтобы поместить опе­ранды в регистры, а все вычисления делаются с использованием трехадресных регистровых команд. Поскольку скорость работы процессора растет гораздо бы­стрее, чем памяти, положение дел с IA-32 со временем все больше ухудшается. Это второй недостаток.

Архитектура IA-32 содержит небольшой и нерегулярный набор регистров. Из-за малого числа регистров общего назначения (четыре или шесть, в зависимо­сти от того, куда отнести регистры ESI и EDI) постоянно приходится записывать в память промежуточные результаты, что ведет к дополнительным обращениям к памяти, даже когда они по логике вещей не нужны. Это третий недостаток.

Из-за недостаточного числа регистров возникает множество ситуаций зави­симостей, особенно WAR-зависимостей, поскольку промежуточные результаты нужно куда-то помещать, а дополнительных регистров нет. Из-за недостатка ре­гистров постоянно требуется их подмена (то есть использование скрытых реги­стров). Во избежание слишком частых кэш-промахов команды приходится вы­полнять не по порядку. Однако семантика архитектуры IA-32 определяет точные прерывания, поэтому команды, выполняемые не по порядку, должны записывать результаты в выходные регистры в строгом порядке. Все это очень сложно реа­лизовать аппаратно. Это четвертый недостаток.

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

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

Мы не будем перечислять недостатки дальше, поскольку и так ясно, что за ними кроется реальная проблема. А ведь мы еще не упомянули, что 32-разряд­ные адреса архитектуры IA-32 ограничивают размер отдельных программ значе­нием 4 Гбайт, что является серьезной проблемой для высокопроизводительных серверов. Допустим, эта проблема решается в архитектуре ЕМТ-64, но осталь­ные недостатки остаются.

Ситуацию с IA-32 можно сравнить с положением дел в небесной механике как раз перед появлением Коперника. В те времена в астрономии доминировала геоцентрическая теория, в соответствии с которой Земля является центром все­ленной и неподвижна, а планеты движутся вокруг нее. Однако новые наблюде­ния показывали все больше и больше несоответствий этой теории действитель­ности, что в конце концов привело к ее полной несостоятельности.

Компания Intel находится приблизительно в таком же положении. Множест­во транзисторов в процессоре Pentium 4 предназначено исключительно для пе­ределки CISC-команд в RISC-команды, разрешения конфликтов, прогнозирова­ния переходов, исправления неправильных предсказаний и решения многих других задач подобного рода, а для реальной работы, которая собственно и нуж­на пользователю, остается лишь незначительная часть этих транзисторов. Поэто­му компания Intel пришла к следующему выводу: нужно выбросить IA-32 на по­мойку и начать все заново (IA-64). Архитектура ЕМТ-64 призвана лишь выиграть некоторое время, оставляя проблему нерешенной.

Модель IA-64 — вычисления с явным параллелизмом команд

Основной принцип организации архитектуры IA-64 сводится к тому, чтобы пе­ренести нагрузку с периода выполнения в период компиляции. Процессор Pentium 4 в ходе выполнения переупорядочивает команды, подменяет регистры, распределяет функциональные блоки и выполняет множество других функций, что ведет к максимальной загрузке всех аппаратных ресурсов. В модели IA-64 эти задачи заранее решает компилятор. В результате он генерирует программу, которую можно выполнять без излишних манипуляций аппаратными средствами. К примеру, в Pentium 4 компилятор получает информацию о том, что в машине всего 8 регистров, хотя на самом деле их 128, в результате во время выполнения программы приходится как-то выкручиваться, чтобы избежать взаимозависимо­стей. Согласно архитектуре IA-64, компилятор получает достоверную информа­цию о количестве регистров в машине, а затем генерирует программу, в которой нет никаких конфликтов между регистрами. Кроме того, компилятор следит за загрузкой функциональных блоков и не запускает команды, в которых предпо­лагается обращение к занятым функциональным блокам. Модель, в которой аппаратный параллелизм является видимым для компилятора, называется EPIC (Explicitly Parallel Instruction Computing — вычисления с явным параллелизмом команд). В определенной степени модель EPIC можно считать развитием RISC-технологии.

Некоторые особенности IA-64 заметно повышают производительность. Среди них — сокращение числа обращений к памяти, планирование команд, сокраще­ние числа условных переходов и спекулятивные операции. Все эти особенности мы обсудим как с теоретической точки зрения, так и в контексте их реализации в Itanium 2.

Сокращение числа обращений к памяти

Модель памяти Itanium 2 довольно проста. Всего предусмотрено 264 байт линей- ной памяти. Имеющиеся команды позволяют обращаться к блокам памяти раз­мером 1, 2, 4, 8, 16 и 10 байт (последнее значение введено для совместимости с 80-разрядными числами с плавающей точкой стандарта IEEE 745). Категори­ческой необходимости в выравнивании обращений к памяти по естественным границам нет, однако без выравнивания производительность ниже. Память мо­жет быть как с прямым, так и с обратным порядком следования байтов; тот или иной формат устанавливается специальным битом в регистре, загружаемом опе­рационной системой.

Доступ к памяти в современных компьютерах считается узким местом. Свя­зно это с тем, что процессоры работают гораздо быстрее модулей памяти. Сокра­тить число обращений к памяти можно путем размещения большого кэша пер­вого уровня на микросхеме процессора и еще большего кэша второго уровня в непосредственной близости от микросхемы. Двумя модулями кэш-памяти осна­щаются все современные процессоры. В то же время существуют и другие мето­ды, позволяющие сократить объем взаимодействия с памятью, и некоторые из них реализованы в IA-64.

Лучший способ ускорить обращения к памяти — выполнять эту операцию в фоновом режиме. В процессоре Itanium 2 предусмотрено 128 64-разрядных ре­гистров общего назначения. Первые 32 из них являются статическими, а остав­шиеся 96 группируются в стек регистров, напоминающий регистровое окно UltraSPARC III. В отличие от UltraSPARC, количество доступных программе регистров меняется от одной процедуры к другой. В итоге каждая процедура по­лучает доступ к 32 статическим регистрам и некоторому (переменному) количе­ству регистров, распределяемых динамически.

При вызове процедуры указатель стека регистров смещается таким образом, чтобы входные параметры оказались видимыми в регистрах, но сами регистры не были распределены между локальными переменными. Процедура сама опре­деляет количество необходимых ей регистров и соответствующим образом пере­мещает указатель стека. Сохранять содержимое этих регистров при входе и вос­станавливать при выходе не требуется, хотя, если процедуре нужно изменить статический регистр, она должна сначала явно сохранить его прежнее значение, а впоследствии восстановить его. Поскольку количество регистров выражено доступной переменной и обуславливается требованиями каждой конкретной процедуры, неэффективное применение регистров исключается. Кроме того, увеличивается максимальная глубина вызова процедур, при которой регистры не требуется «сбрасывать» в память.

В Itanium 2 есть 128 регистров с плавающей точкой, организованных по стан­дарту IEEE 745 и не группируемых в стек. Большое количество регистров этого типа позволяет сохранять промежуточные результаты множества операций с пла­вающей точкой в регистрах, не перемещая их в память.

Кроме того, в Itanium 2 предусмотрено 64 1-разрядных предикатных регист­ра, 8 регистров ветвлений и 128 специализированных прикладных регистров, ко­торые используются для самых различных целей, в частности для обмена пара­метрами между прикладными программами и операционной системой. Общая схема регистров Itanium 2 представлена на рис. 5.29.

64 1-разрядных

Планирование команд

Один из наиболее серьезных недостатков Pentium 4 — сложность планирования команд для обработки в различных функциональных блоках без взаимозависи­мостей. Для решения этой проблемы в период выполнения задействуются очень сложные механизмы, аппаратная поддержка которых требует много места на микросхеме. В архитектуре IA-64 и ее реализации — Itanium 2 — эти проблемы решены путем передачи соответствующих функций компилятору. Каждая про­грамма теперь состоит из последовательности групп команд. Команды в рамках одной группы не конфликтуют друг с другом, не потребляют больше ресурсов и не обращаются к большему количеству функциональных блоков, чем предусмот­рено системой, не образуют RAW- и WAW-взаимозависимости (WAR-взаимо­зависимости допускаются в ограниченном объеме). Создается впечатление, что последовательные группы команд выполняются строго по порядку, хотя на са­мом деле, если это безопасно, процессор может запустить часть команд следую­щей группы до завершения предыдущей.

Таким образом, процессор может планировать выполнение команд внутри ка­ждой отдельно взятой группы в любом порядке, по возможности, — в параллель­ном режиме. При этом вероятность возникновения конфликтов между командами равна нулю. Если группа команд нарушает вышеуказанные правила

Команды объединяются в 128-разрядные пучки (bundles), подобные изобра­женному в верхней части рис. 5.30. В каждом пучке содержится три 41-разрядных команды и 5-разрядный шаблон. Количество пучков в группе команд не всегда выражается целым числом — в некоторых случаях группы начинаются и закан­чиваются посередине пучков.

Существует более 100 форматов команд. На рис. 5.30 представлен наиболее распространенный формат. В данном случае он применяется для выполнения при помощи АЛУ операции ADD, которая размещает сумму двух регистров в третьем. Поле группы операций определяет общий класс команды (например, целочис­ленная операция АЛУ). В поле типа операции указывается конкретная операция (например, ADD или SUB). Далее следуют три поля регистра. Последнее поле дан­ного формата — поле предикатного регистра — мы обсудим чуть позже.

Шаблон пучка указывает, какие функциональные блоки нужны для его обра­ботки, а также определяет положение границы группы команд (если таковая пре­дусмотрена). Основными функциональными блоками считаются целочисленные и нецелочисленные команды АЛУ, обращения к памяти, операции с плавающей точкой, ветвление и т. д. Очевидно, что при наличии 6 блоков и 3 команд для полной ортогональности требуются 216 базовых комбинаций плюс 3 х 216 до­полнительных комбинаций для определения маркеров группы после команд 0, 1 и 2. Поскольку доступно всего 5 бит, из всего разнообразия комбинаций допус­каются лишь некоторые. С другой стороны, если бы в состав пучка можно было включить сразу три команды с плавающей точкой, процессор просто не смог бы их одновременно запустить. Таким образом, допустимыми считаются фактиче­ски осуществимые комбинации.

Сокращение числа условных переходов — предикация

Еще одна особенность архитектуры IA-64 — новый способ обработки условных пе­реходов. Если бы была возможность избавиться от большинства из них, централь­ный процессор стал бы гораздо проще и работал бы гораздо быстрее. На первый взгляд может показаться, что устранить условные переходы невозможно, поскольку в программах всегда полно операторов if. Однако в архитектуре IA-64 используется специальная технология, названная предикацией (predication), которая позволяет сильно сократить их число [14, 98]. Кратко опишем эту технологию.

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

Чтобы понять, как работает предикация, рассмотрим простой пример (листин­ги 5.9-5.11), в котором показано условное выполнение команд (условное выпол­нение — предтеча предикации). В листинге 5.9 мы видим оператор if. В листин­ге 5.10 после его трансляции получилось три команды: сравнения, условного перехода и перемещения. В листинге 5.11 мы избавились от условного перехода, используя новую команду CM0VZ, которая является командой условного перемеще­ния. Эта команда проверяет, равен ли третий регистр R1 нулю. Если да, то коман­да копирует R3 в R2. Если нет, то команда не выполняет никаких действий.

Листинг 5.9. Оператор if

if (R1—0)

R2 = R3;

Листинг 5.10. Код на ассемблере для листинга 5.9

CMP R1.0 BNE L1 MOV R2, R3 L1:

Листинг 5.11. Условная команда

CMOVZ R2.R3.R1

Если у нас есть команда, которая может копировать данные, когда какой-ли- бо регистр равен нулю, значит, у нас может быть и такая команда, которая копи­рует данные, если какой-нибудь регистр не равен нулю. Пусть это будет команда CM0VN. При наличии обеих команд мы уже на пути к полному условному выпол­нению. Представим оператор i f с несколькими операторами присваивания в час­ти then и несколькими операторами присваивания в части el se. Весь этот фраг­.

1 На самом деле подобные коллизии не столь уж и редки из-за того, что при страничном способе орга­низации виртуальной памяти и параллельном выполнении нескольких заданий страницы как бы «перемешиваются». Разбиение программы на страницы осуществляется случайным образом, поэто­му и «локальность кода» может быть нарушена. — Примеч. научн. ред.

1 Автор не совсем прав: здесь речь должна идти о номере прерывания. Каждому типу прерывания соот­ветствует свой номер. Термин «вектор прерываний» используется в случае, когда по номеру прерыва­ния находится адрес программы обработки прерывания, и этот адрес представляется не одним значе­нием, а несколькими, то есть приходится инициализировать более одного регистра. Другими словами, адрес представляется не скалярной величиной, а многомерной, векторной. — Примеч. научн. ред.

Продолжение &

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]