- •3. Обращение к памяти
- •3.1. Краткий обзор
- •3.2. Не спекулятивные обращения к памяти
- •3.2.1. Сохранения в память
- •3.2.2. Загрузки из памяти
- •3.2.3. Подсказки предвыборки данных
- •3.3. Зависимости инструкций
- •3.3.1.1. Планирование инструкций и зависимости по управлению
- •3.3.2. Зависимости по данным
- •Раздел 3.4. Описывает определенные в архитектуре Itanium, особенности обращений к памяти, увеличивающие число зависимостей, которые могут быть удалены транслятором.
- •3.3.1. Зависимости по управлению
- •3.3.2.1. Основы зависимости по данным
- •3.3.2.2. Зависимость по данным в архитектуре Intel Itanium
- •3.3.2.3. Планирование инструкций и зависимости по данным
- •3.4. Использование спекулятивности в архитектуре Intel Itanium для преодоления зависимостей
- •3.4.1. Модель спекулятивности в архитектуре Intel Itanium
- •3.4.2. Использование спекуляции по данным в архитектуре Intel Itanium
- •3.4.2.1. Примеры предварительных загрузок
- •3.4.2.2. Пример кода восстановления
- •3.4.2.3. Краткий обзор терминологии
- •3.4.3. Использование спекуляции по управлению в архитектуре Intel Itanium
- •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. Использование спекулятивности в архитектуре Intel Itanium для преодоления зависимостей
Оба типа зависимостей, и по данным, и по управлению, ограничивают оптимизацию кода программы. Архитектура Itanium обеспечивает поддержку для двух основных методик, используемых для преодоления зависимостей:
Спекуляция по данным. Позволяет загрузку и возможно ее использование, для перемещения не смотря на неоднозначную запись памяти.
Спекуляция по управлению. Позволяет загрузку и возможно ее использование, для перемещения не смотря на переход в котором загрузка является зависимой по управлению.
Эти методики используются для сокрытия времени загрузок и уменьшения времени выполнения.
3.4.1. Модель спекулятивности в архитектуре Intel Itanium
Ограничения, наложенные зависимостями при планировании инструкций, могут быть решены с помощью отделения загрузки данных от обработки исключений или подтверждения конфликтов данных. Для реализации этого, архитектура Itanium поддерживает специальные спекулятивные версии инструкций:
Спекулятивные по управлению инструкции загрузки, задерживают исключения.
Спекулятивные по данным инструкции загрузки, сохраняют адресную информацию.
Специальные инструкции проверки, проверяют исключения или конфликты данных.
Спекулятивная загрузка Itanium может быть передвинута выше барьера зависимости (обозначенного пунктиром), как это показано на рис.3.2.
|
Рис. 3.2. Модель спекулятивности в архитектуре Intel Itanium
Проверка обнаруживает отложенное исключение или конфликт с вмешательством сохранения и обеспечивает механизм для восстановления из не успешной спекуляции. С этой поддержкой спекулятивные загрузки и их использования могут быть запланированы ранее, чем не спекулятивные инструкции. В результате, задержки памяти этих загрузок могут быть скрыты легче, чем для не спекулятивных загрузок.
3.4.2. Использование спекуляции по данным в архитектуре Intel Itanium
Спекуляция по данным в архитектуре Itanium использует специальные инструкции загрузки (ld.a) называемые инструкциями предварительной загрузки (advanced load) и связанные с ними инструкции проверки (chk.a или ld.c) для проверки достоверности результатов спекуляции по данным.
Если выполняется инструкция ld.a, то выделяется элемент в аппаратной структуре ALAT (Advanced Load Address Table – таблица адресов предварительных загрузок). Элемент ALAT индексируется номером физического регистра и там записывает адрес загрузки, тип загрузки и размер загрузки.
Инструкция проверки должна быть выполнена до того, как результат предварительной загрузки может быть использован любой не спекулятивной инструкцией. В инструкции проверки должен быть указан тот же самый регистр, что и соответствующей предварительной загрузке.
Если выполняется инструкция проверки, то в ALAT ищется элемент с тем же самым номером и типом приемного физического регистра. Если элемент найден, то выполнение продолжается нормально, со следующей инструкции.
Если же соответствующий элемент не найден, то результаты спекуляции должны быть рассчитаны заново:
Используется chk.a, если загрузка или то, что она использовала, является спекулятивным. Инструкция chk.a переходит к сгенерированному компилятором коду восстановления для выполнения заново загрузки и зависимых инструкций.
Используется ld.c, если использование загрузки не являлось спекулятивным. Инструкция ld.c перезапускает загрузку.
Элементы удаляются из ALAT из-за:
Сохранений, которые записывают адреса, накладывающиеся на элементы ALAT.
Других предварительных загрузок, у которых приемник является тем же самым физическим регистром, который есть в элементе ALAT.
Аппаратно заданного выполнения или условий операционной системы необходимых для обслуживания корректности.
Ограничений вместимости, ассоциативности и соответствия алгоритму, используемому для данной реализации ALAT.

о
данным или управлению
астоящая
загрузка