- •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. Обращение к памяти
3.1. Краткий обзор
Время ожидания памяти – это главный фактор в определении производительности целочисленных приложений. Для уменьшения эффектов времени ожидания памяти, архитектура Itanium явно поддерживает программную конвейерную обработку, большие файлы регистров и спекуляцию, управляемую компилятором. Эта глава обсуждает особенности и оптимизацию связанные со спекуляцией, управляемой компилятором. Для полного обсуждения использования программной конвейерной обработки см. главу 5 «Программная конвейерная обработка и поддержка циклов».
Начальные разделы данной главы рассматривают не спекулятивные загрузку и сохранение в архитектуре Itanium, а также терминологию и общие концепции, связанные с зависимостями по данным. Представленная концепция спекулятивности сопровождается обсуждениями и примерами того, как используется спекулятивность. В остальной части главы описывается несколько важных оптимизаций, связанных с доступом к памяти и планированием инструкций.
3.2. Не спекулятивные обращения к памяти
Архитектура Itanium поддерживает не спекулятивные загрузки и сохранения, также как и инструкции явных подсказок памяти.
3.2.1. Сохранения в память
В Itanium, целочисленные инструкции запоминания могут записывать 1, 2, 4 или 8 байтов, а инструкции запоминания с плавающей точкой – 4, 8 или 10 байтов. Например, инструкция st4 запишет в память первые четыре байта регистра.
Хотя архитектура Itanium использует, по умолчанию, упорядочивание байт по убыванию, но программа может изменить упорядочивание байт, путем установки в маске пользователя (UM) бита упорядочивания (be).
3.2.2. Загрузки из памяти
Целочисленные инструкции загрузки Itanium, могут читать 1, 2, 4 или 8 байтов, в зависимости от типа используемой загрузки. При загрузке 1, 2 или 4 байтов, перед записью в приемный регистр, данные расширяются нулями до 64 битов.
Хотя загрузки обеспечиваются для различных типов данных, но основной тип данных учетверенное слово (8 байт). Кроме нескольких исключений, все целочисленные операции выполняются над 8-байтовыми данными. Это может быть особенно важно, когда имеем дело с целыми знаковыми числами и 32-битными обращениями, либо с любыми обращениями, которые короче, чем 64 бита.
3.2.3. Подсказки предвыборки данных
Инструкция lfetch предназначена для перемещения строк между различными уровнями иерархии памяти. Подобно всем инструкциям подсказки определенным в архитектуре Itanium, lfetch не влияет на правильность программы и любая реализация микроархитектуры может проигнорировать эту инструкцию.
3.3. Зависимости инструкций
Зависимости по управления и данным являются фундаментальными факторами в оптимизации и планировании инструкций. Такие зависимости могут препятствовать планированию транслятором инструкций в порядке, который вырабатывал бы более короткие критические пути и лучшее использование ресурса, т.к. они ограничивают размещение инструкций относительно других инструкций, от которых они являются зависимыми.
Вообще, обращения к памяти – это главный источник зависимостей по данным и управлению, которые не могут быть нарушены из-за получения неправильного ответа (если нарушена зависимость по данным) или вызывается ошибка, которая не должна быть вызвана (если нарушена зависимость по управлению). Этот раздел описывает:
Фоновый материал по зависимостям обращений к памяти
Описание того, как зависимости ограничивают планирование кода в традиционных архитектурах.
