Скачиваний:
69
Добавлен:
16.04.2013
Размер:
148.99 Кб
Скачать

Раздел 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не может быть передвинута вверх, из-за условного перехода в конце блока А.

Блок А

br

ld

Блок В

Рис. 3.1. Зависимость по управлению препятствующая движению кода.

3.3.2. Зависимости по данным

Зависимость по данным существует между инструкциями, которые обращаются к регистрам или местам памяти и другими инструкциями, которые изменяют те же самые регистры или места.

3.3.2.1. Основы зависимости по данным

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

WAW(writeafterwrite) – запись после записи. Зависимость между двумя инструкциями, которые записывают один и тот же регистр или место в памяти.

WAR (write after read) – запись после чтения. Зависимость между двумя инструкциями, где инструкция читает регистр или место в памяти, в которое последующая инструкция делает запись.

RAW(readafterwrite) – чтение после записи. Зависимость между двумя инструкциями, где инструкция записывает регистр или место в памяти, которое читается последующей инструкцией.

Неоднозначные зависимости памяти.Зависимости между загрузкой и сохранением, либо между двумя сохранениями, где невозможно определить обращаются ли эти инструкции к перекрывающимся областям. Неоднозначные обращения к памяти включают возможные зависимостиWAW,WARилиRAW.

Независимые обращения к памяти. Обращения с помощью двух или более инструкций памяти, про которые не известно – имеют ли они конфликтные обращения к памяти.