ПОД (пособие) (1184372), страница 20
Текст из файла (страница 20)
Например, компиляторне может точно знать какая из ветвей после оператора перехода будет выполняться, когдазапланированный код пройдет базовые блоки и какой из путей графа будет выбран. Крометого, обычно невозможно создать статический план, который одновременно оптимизируетвсе пути в программе. Неоднозначность также возникает и в тех случаях, когда компиляторне может решить, будут ли ссылки указывать на одно и то же место в памяти. Если да, тообращение к ним должно осуществляться последовательно; если нет, то их можнозапланировать в произвольном порядке. При такой неоднозначности часто наиболеевероятен некий конкретный результат.
Одним из важнейших принципов EPIC в даннойситуации является возможность разрешения компилятору оперировать вероятностнымиоценками — он создает и оптимизирует POE для наиболее вероятных случаев. Однако EPICобеспечивает архитектурную поддержку, такую как спекулятивное выполнение поуправлению и по данным (Control and Data Speculation), с тем, чтобы гарантироватькорректность программы, даже если исходные предположения были не верны. Когдапредположение оказывается неверным, совершенно очевидно падение производительностипри выполнении программы. Такой эффект производительности иногда виден на планепрограммы, к примеру, в тех случаях, когда существует высоко оптимизированнаяпрограммная область, а код исполняется в менее оптимизированной. Также падениепроизводительности может возникнуть в моменты «остановки» (Stall), которые на планепрограммы не видны — определенные операции, подпадающие под наиболее вероятный и,следовательно,оптимизированныйслучай,выполняютсяпримаксимальной60производительности, но приостанавливают процессор для того, чтобы гарантироватькорректность, если возникнет менее вероятный, не оптимизированный случай.После того, как создан план, компилятор передает его аппаратному обеспечению.
Для этогоISA должен обладать возможностями достаточно богатыми, чтобы сообщить решениякомпилятора о том, когда инициировать каждую операцию и какие ресурсы использовать (вчастности, должен существовать способ указать, какие операции инициируютсяодновременно). В качестве альтернативного решения компилятор мог бы создаватьпоследовательную программу, которую процессор динамически реорганизует с тем, чтобыполучить требуемую запись. Но в таком случае цель, сводимая к освобождениюаппаратного обеспечения от динамического планирования, не достигается. При передачеPOE аппаратному обеспечению крайне важно своевременно предоставить необходимуюинформацию. Примером этому может служить операция перехода, которая, в случае ееиспользования, требует, чтобы по адресу перехода команды выбирались с упреждением,заведомо до того, как будет инициирован сам переход.
Вместо того, чтобы решение о том,когда это нужно сделать и какой адрес перехода отдавать на откуп аппаратномуобеспечению, такая информация в соответствии с основными принципами EPIC передаетсяаппаратному обеспечению точно и своевременно через код. Микроархитектура принимает идругие решения, не связанные напрямую с выполнением кода, но которые влияют на времявыполнения.
Один из таких примеров — управление иерархией кэш-памяти исоответствующие решения о том, какие данные нужны для поддержки иерархии, а какиеследуетзаменить.Такиеправилаобычнопредусматриваютсяалгоритмомфункционирования контроллера кэша. EPIC расширяет принцип, утверждающий, что планвыполнения компилятор создает так, чтобы тоже иметь возможность управлять этимимеханизмами микроархитектуры.
Для этого обеспечиваются архитектурные возможности,позволяющие осуществлять программный контроль механизмами, которыми обычноуправляет микроархитектура.Стандарт IA-64.Для большей конкретности рассмотрим кратко IA-64 как один из примеров воплощенияVLIW. Со временем эта архитектура способна вытеснить x86 (IA-32) не только на рынке, новообще как класс, хотя это уже удел далекого будущего.
Тем не менее, необходимостьразработки для IA-64 весьма сложных компиляторов и трудности с созданиемоптимизированных машинных кодов может вызвать дефицит специалистов, работающих наассемблере IA-64, особенно на начальных этапах, как самых сложных.Наиболее кардинальным нововведением IA-64 по сравнению с RISC является явныйпараллелизм команд (EPIC), вносящий некоторые элементы, напоминающие архитектурусверхдлинного командного слова, которые назвали связками (bundle). Так, в обеихархитектурах явный параллелизм представлен уже на уровне команд, управляющиходновременной работой функциональных исполнительных устройств (или функциональныхмодулей, или просто функциональных устройств, ФУ).В данном случае связка имеет длину 128bit и включает в себя 3 поля для команд длиной41bit каждое, и 5-разрядный слот шаблона.
Предполагается, что команды связки могутвыполняться параллельно разными ФУ. Возможные взаимозависимости, препятствующиепараллельному выполнению команд одной связки, отражаются в поле шаблона. Неутверждается, впрочем, что параллельно не могут выполняться и команды разных связок.Хотя, на основании заявленного уровня параллельности исполнения, достигающего шестикоманд за такт, логично предположить, что одновременно могут выполняться как минимумдве связки.61Шаблон указывает какого непосредственно типа команды находятся в слотах связки. Вобщем случае однотипные команды могут выполняться в более чем одном типефункциональных устройств. Шаблоном задаются так называемые остановки,определяющие слот, после начала выполнения команд которого инструкции последующихполей должны ждать завершения. Порядок слотов в связке (более важные справа) отвечаети порядку байт (Little Endian), однако данные в памяти могут располагаться и в режиме BigEndian (более важные слева), который устанавливается специальным битом в регистремаски пользователя.Вращение регистров является в некотором роде частным случаем переименованиярегистров, применяемого во многих современных суперскалярных процессорах свнеочередным спекулятивным («умозрительным») выполнением команд.
В отличие от них,вращение регистров в IA-64 управляется программно. Использование этого механизма в IA64 позволяет избежать накладных расходов, связанных с сохранением/восстановлениембольшого числа регистров при вызовах подпрограмм и возвратах из них, однакостатические регистры при необходимости все-таки приходится сохранять ивосстанавливать, явно кодируя соответствующие команды.К слову, система команд IA-64 довольно уникальна. Cреди принципиальных особенностейследует отдельно отметить спекулятивное выполнение команд и применение предикатов —именно это подмножество и определяет исключительность IA-64.
Все подобные командыможно подразделить на команды работы со стеком регистров, целочисленные команды,команды сравнения и работы с предикатами, команды доступа в память, команды перехода,мультимедийные команды, команды пересылок между регистрами, «разные» (операции надстроками и подсчет числа единиц в слове) и команды работы с плавающей запятой.Аппаратная реализация VLIW-процессора очень проста: несколько небольшихфункциональных модулей (сложения, умножения, ветвления и т.д.), подключенных к шинепроцессора, и несколько регистров и блоков кэш-памяти. VLIW-архитектура представляетинтерес для полупроводниковой промышленности по двум причинам. Первая — теперь накристалле больше места может быть отведено для блоков обработки, а не, скажем, дляблока предсказания переходов.
Вторая причина — VLIW-процессор может бытьвысокоскоростным, так как предельная скорость обработки определяется тольковнутренними особенностями самих функциональных модулей. Привлекает и то, что VLIWпри определенных условиях может реализовать старые CISC-инструкции эффективнееRISC. Это потому, что программирование VLIW-процессора очень напоминает написаниемикрокода (исключительно низкоуровневый язык, позволяющий всестороннепрограммировать физический слой, синхронизируя работу логических вентилей с шинамиобмена данными и управляя передачей информации между функциональными модулями).В те времена, когда память для ПК была дорогостоящей, программисты экономили ее,прибегая к сложным инструкциям процессора x86 типа STOS и LODS (косвеннаязапись/чтение в/из памяти). CISC реализует такие инструкции, как микропрограммы,зашитые в постоянную память (ROM) и выполняемые процессором. Архитектура RISCвообще исключает использование микрокода, реализуя инструкции чисто аппаратнымпутем — фактически, инструкции RISC-процессора почти аналогичны микрокоду,используемому в CISC.
VLIW делает по-другому — изымает процедуру генерированиямикрокода из процессора (да и вообще стадии исполнения) и переносит его в компилятор,на этап создания исполняемого кода. В результате эмуляция инструкций процессора x86,таких как STOS, осуществляется очень эффективно, поскольку процессор получает дляисполнения уже готовые макросы.