- •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.4.3.3. Переходы while-циклов
На рис.5.2. показана блок-схема переходов while-циклов.
Есть несколько отличий в работе переходов while-циклов по сравнению с переходами счетных циклов. Переходуwhile-цикла не нуженLC, вместо этого поведение определяет предикат перехода. В течение фаз ядра и эпилога, предикат перехода равен единице и нулю, соответственно. В течение фазы пролога, предикат перехода может быть либо 0, либо 1, в зависимости от схемы используемой для программыwhile-цикла. Кроме того, после ротациир16всегда устанавливается в ноль. Причины этих различий связаны с сущностьюwhile-циклов и будут объяснены подробнее на примере в разделе далее.
|
wtop, wexit |
|
|
|
|
|
|
|
| ||||
|
|
|
|
|
|
|
|
|
|
| |||
|
|
P |
==0 (prolog/epilog) |
|
|
|
|
| |||||
|
|
|
|
|
|
|
(специальные неразворачива- | ||||||
|
(пролог, ядро) |
==1 |
|
|
>1 |
E |
==0 |
|
емые циклы) | ||||
|
|
|
|
(prolog/epilog) |
|
|
|
|
|
| |||
|
|
|
|
|
|
|
(epilog) |
= |
|
|
|
| |
|
|
EC=EC |
|
EC -- |
|
EC -- |
|
EC = EC |
| ||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PR[63]=0 |
|
PR[63]=0 |
|
PR[63]=0 |
|
PR[63]=0 |
| ||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
RRB -- |
|
RRB -- |
|
RRB -- |
|
RRB=RRB |
| ||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
wtop: переход |
|
|
|
|
|
|
|
wtop: проскок | ||||
|
wexit
: |
|
|
|
|
|
|
|
wexit :переход | ||||
Рис. 5.2. Поток выполнения инструкций wtopиwexit.
5.4.4. Краткий обзор терминологии
В предыдущих разделах представлены следующие термины:
Интервал инициализации (ИИ) – Initiation Interval (II). Количество тактов между началами последовательных исходных итераций в программном конвейерном цикле.
Пролог – Prolog. Первая фаза программного конвейерного цикла, в которой конвейер заполняется.
Ядро – Kernel. Вторая фаза программного конвейерного цикла, в которой конвейер полон.
Эпилог – Epilog. Третья фаза программного конвейерного цикла, в которой конвейер опустошается.
Исходная итерация – Source Iteration. Итерация первоначального исходного кода цикла.
Ядерная итерация – Kernel Iteration. Итерация цикла, осуществляемого программным конвейером.
Переменная индукции – Induction Variable. Значение, которое инкрементируется или декрементируется в каждой итерации один раз и на одно и то же значение.




R[qp]?



C?


=1










проскок