- •5. Программная конвейерная обработка и поддержка циклов
- •5.1. Краткий обзор
- •5.2. Терминология циклов и основная поддержка циклов
- •5.3. Оптимизация циклов
- •5.3.1. Развертывание цикла
- •5.3.2. Программная конвейерная обработка
- •5.4. Особенности поддержки циклов в архитектуре IntelItanium
- •5.4.1. Ротация регистров
- •5.4.2. Замечание об инициализации ротации предикатов
- •5.4.3. Переходы циклов с программной конвейерной обработкой
- •5.4.3.1. Переходы счетных циклов
- •5.4.3.2. Пример счетного цикла
- •5.4.3.3. Переходы while-циклов
- •5.4.4. Краткий обзор терминологии
- •5.5. Оптимизация циклов в архитектуре IntelItanium
- •5.5.1. While-циклы
- •5.5.2. Циклы с инструкциями, имеющими предикаты
- •5.5.3. Циклы с множеством выходов
- •5.5.3.1. Преобразование циклов с несколькими выходами в циклы с одним выходом.
- •5.5.3.2. Конвейерная обработка с явными многократными выходами
- •5.5.4. Соображения о программной конвейерной обработке
- •5.5.5. Программная конвейерная обработка и предварительные загрузки
- •5.5.5.1. Ограничения емкости
- •5.5.5.2. Конфликты в alat
- •5.5.6. Предварительное разворачивание циклов для программной конвейерной обработки
- •5.5.7. Осуществление сокращений
- •5.5.8. Явный пролог и эпилог
- •5.5.9. Устранение избыточной загрузки в циклах
- •5.6. Итоги
5.5.9. Устранение избыточной загрузки в циклах
Иногда, развертывание цикла необходимо для удаления операций копирования, созданных оптимизацией цикла. Далее дается пример устранения избыточной загрузки. В коде ниже, каждая итерация загружает два значения, одно из которых уже было загружено предыдущей исходной итерацией:
add r8 = r5,4;;
L1: ld4 r4 = [r5],4 // a[i]
ld4 r9 = [r8],4 ;; // a[i+1]
add r7 = r4,r9 ;;
st4 [r6] = r7,4
br.cloop L1 ;;
Избыточная загрузка может быть устранена путем добавления перед циклом копии первой загрузки и замены загрузки на копирование (mov):
add r8 = r5,4
ld4 r9 = [r5],4;; // a[i]
L1: mov r4 = r9 // a[i] = предыдущее a[i+1]
ld4 r9 = [r8],4;; // a[i+1]
add r7 = r4,r9 ;;
st4 [r6] = r7,4
br.cloop L1 ;;
В традиционных архитектурах, инструкция movможет быть удалена только развертыванием цикла вдвое. Одна инструкция удаляется из цикла, за счет расширения кода в два раза. ВItaniumархитектуре, свойство ротации регистров может использоваться для устранения инструкцииmovбез развертывания цикла:
add r8 = r5,4
ld4 r33 = [r5],4;; // a[i]
L1: ld4 r32 = [r8],4;; // a[i+1]
add r7 = r33,r32;;
st4 [r6] = r7,4
br.ctop L1 ;;
5.6. Итоги
Примеры в этой главе показывают, как можно использовать свойства архитектуры Itaniumдля оптимизации циклов без расширения кода, требуемого традиционными архитектурами. Ротация регистров, предикация и переходы программной конвейерной обработки циклов – все содействует этой способности. Спекуляция по управлению увеличивает перекрытие итерацийwhile-циклов. Спекуляция по данным увеличивает перекрытие итераций циклов, имеющих загрузки и сохранения, которые не могут не быть двусмысленными.