Реклама:

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

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

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

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

Рис. 5.30. Пучок в архитектуре 1А-64 состоит из трех команд

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

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

Сокращение числа обращений к памяти || Оглавление || Сокращение числа условных переходов - предикация