
- •3. Обращение к памяти
- •3.1. Краткий обзор
- •3.2. Не спекулятивные обращения к памяти
- •3.2.1. Сохранения в память
- •3.2.2. Загрузки из памяти
- •3.2.3. Подсказки предвыборки данных
- •3.3. Зависимости инструкций
- •Раздел 3.4. Описывает определенные в архитектуре Itanium, особенности обращений к памяти, увеличивающие число зависимостей, которые могут быть удалены транслятором.
- •3.3.1. Зависимости по управлению
- •3.3.1.1. Планирование инструкций и зависимости по управлению
- •3.3.2. Зависимости по данным
- •3.3.2.1. Основы зависимости по данным
- •3.3.2.2. Зависимость по данным в архитектуре IntelItanium
- •3.3.2.3. Планирование инструкций и зависимости по данным
- •3.4. Использование спекулятивности в архитектуре IntelItaniumдля преодоления зависимостей
- •3.4.1. Модель спекулятивности в архитектуре IntelItanium
- •3.4.2. Использование спекуляции по данным в архитектуре IntelItanium
- •3.4.2.1. Примеры предварительных загрузок
- •3.4.2.2. Пример кода восстановления
- •3.4.2.3. Краткий обзор терминологии
- •3.4.3. Использование спекуляции по управлению в архитектуре IntelItanium
- •3.4.3.1. Бит NaT
- •3.4.3.2. Пример спекуляции по управлению
- •3.4.3.3. Сливания, заливания и регистр unat
- •3.4.3.4. Краткий обзор терминологии
- •3.4.4. Комбинирование спекуляций по данным и управлению
- •3.5. Оптимизация обращений к памяти
- •3.5.1. Соображения о спекуляции
- •3.5.2. Взаимное влияние данных
- •3.5.3. Оптимизация размера кода
- •3.5.4. Использование постинкрементных загрузок и сохранений.
- •3.5.5. Оптимизация циклов.
- •3.5.6. Минимизация кода проверки
- •3.6. Итоги
3.4. Использование спекулятивности в архитектуре IntelItaniumдля преодоления зависимостей
Оба типа зависимостей, и по данным, и по управлению, ограничивают оптимизацию кода программы. Архитектура Itaniumобеспечивает поддержку для двух основных методик, используемых для преодоления зависимостей:
Спекуляция по данным. Позволяет загрузку и возможно ее использование, для перемещения не смотря на неоднозначную запись памяти.
Спекуляция по управлению. Позволяет загрузку и возможно ее использование, для перемещения не смотря на переход в котором загрузка является зависимой по управлению.
Эти методики используются для сокрытия времени загрузок и уменьшения времени выполнения.
3.4.1. Модель спекулятивности в архитектуре IntelItanium
Ограничения, наложенные зависимостями при планировании инструкций, могут быть решены с помощью отделения загрузки данных от обработки исключений или подтверждения конфликтов данных. Для реализации этого, архитектура Itaniumподдерживает специальные спекулятивные версии инструкций:
Спекулятивные по управлению инструкции загрузки, задерживают исключения.
Спекулятивные по данным инструкции загрузки, сохраняют адресную информацию.
Специальные инструкции проверки, проверяют исключения или конфликты данных.
Спекулятивная загрузка Itaniumможет быть передвинута выше барьера зависимости (обозначенного пунктиром), как это показано на рис.3.2.
|
Рис. 3.2. Модель спекулятивности в архитектуре IntelItanium
Проверка обнаруживает отложенное исключение или конфликт с вмешательством сохранения и обеспечивает механизм для восстановления из не успешной спекуляции. С этой поддержкой спекулятивные загрузки и их использования могут быть запланированы ранее, чем не спекулятивные инструкции. В результате, задержки памяти этих загрузок могут быть скрыты легче, чем для не спекулятивных загрузок.
3.4.2. Использование спекуляции по данным в архитектуре IntelItanium
Спекуляция по данным в архитектуре Itaniumиспользует специальные инструкции загрузки (ld.a) называемые инструкциями предварительной загрузки (advancedload) и связанные с ними инструкции проверки (chk.aили ld.c) для проверки достоверности результатов спекуляции по данным.
Если выполняется инструкция ld.a, то выделяется элемент в аппаратной структуреALAT(AdvancedLoadAddressTable – таблица адресов предварительных загрузок). ЭлементALATиндексируется номером физического регистра и там записывает адрес загрузки, тип загрузки и размер загрузки.
Инструкция проверки должна быть выполнена до того, как результат предварительной загрузки может быть использован любой не спекулятивной инструкцией. В инструкции проверки должен быть указан тот же самый регистр, что и соответствующей предварительной загрузке.
Если выполняется инструкция проверки, то в ALATищется элемент с тем же самым номером и типом приемного физического регистра. Если элемент найден, то выполнение продолжается нормально, со следующей инструкции.
Если же соответствующий элемент не найден, то результаты спекуляции должны быть рассчитаны заново:
Используется chk.a, если загрузка или то, что она использовала, является спекулятивным. Инструкцияchk.aпереходит к сгенерированному компилятором коду восстановления для выполнения заново загрузки и зависимых инструкций.
Используется ld.c, если использование загрузки не являлось спекулятивным. Инструкцияld.cперезапускает загрузку.
Элементы удаляются из ALATиз-за:
Сохранений, которые записывают адреса, накладывающиеся на элементы ALAT.
Других предварительных загрузок, у которых приемник является тем же самым физическим регистром, который есть в элементе ALAT.
Аппаратно заданного выполнения или условий операционной системы необходимых для обслуживания корректности.
Ограничений вместимости, ассоциативности и соответствия алгоритму, используемому для данной реализации ALAT.