- •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. Описывает определенные в архитектуре Itanium, особенности обращений к памяти, увеличивающие число зависимостей, которые могут быть удалены транслятором.
3.3.1. Зависимости по управлению
Инструкция является зависимой по управлению, если принятие перехода прямо влияет на выполнение инструкции. В следующем коде инструкция загрузки зависима от перехода:
(p1) br.cond некая_метка
ld8 r4=[r5]
В следующих разделах приведены краткие обзоры зависимостей по управлению и их влияния на оптимизацию.
3.3.1.1. Планирование инструкций и зависимости по управлению
Нижеприведенный код содержит зависимость по управлению при наличии инструкции перехода:
add r7=r6,1 // Такт 0
add r13=r25,r27
cmp.eq p1,p2=r12,r23
(p1) br.cond некая_метка;;
ld4 r2=[r3];;// Такт 1
sub r4=r2,r11// Такт 3
Компилятор не может безопасно переместить инструкцию загрузки перед переходом, если при этом не может гарантировать, что перемещенная загрузка не вызовет фатальную ошибку программы, либо как-то еще разрушит состояние программы. Так как загрузка не может быть передвинута вверх, то планирование не может быть улучшено при нормальном движении кода. Таким образом, переход создает барьер для инструкций, выполнение которых зависит от него. На рис. 3.1, загрузка в блоке Bне может быть передвинута вверх, из-за условного перехода в конце блока А.
|
|
Рис. 3.1. Зависимость по управлению препятствующая движению кода.
3.3.2. Зависимости по данным
Зависимость по данным существует между инструкциями, которые обращаются к регистрам или местам памяти и другими инструкциями, которые изменяют те же самые регистры или места.
3.3.2.1. Основы зависимости по данным
Следующие основные термины описывают зависимости по данным между инструкциями:
WAW(writeafterwrite) – запись после записи. Зависимость между двумя инструкциями, которые записывают один и тот же регистр или место в памяти.
WAR (write after read) – запись после чтения. Зависимость между двумя инструкциями, где инструкция читает регистр или место в памяти, в которое последующая инструкция делает запись.
RAW(readafterwrite) – чтение после записи. Зависимость между двумя инструкциями, где инструкция записывает регистр или место в памяти, которое читается последующей инструкцией.
Неоднозначные зависимости памяти.Зависимости между загрузкой и сохранением, либо между двумя сохранениями, где невозможно определить обращаются ли эти инструкции к перекрывающимся областям. Неоднозначные обращения к памяти включают возможные зависимостиWAW,WARилиRAW.
Независимые обращения к памяти. Обращения с помощью двух или более инструкций памяти, про которые не известно – имеют ли они конфликтные обращения к памяти.

r

