- •5. Программная конвейерная обработка и поддержка циклов
- •5.1. Краткий обзор
- •5.2. Терминология циклов и основная поддержка циклов
- •5.3. Оптимизация циклов
- •5.3.1. Развертывание цикла
- •5.3.2. Программная конвейерная обработка
- •5.4. Особенности поддержки циклов в архитектуре Intel Itanium
- •5.4.1. Ротация регистров
- •5.4.3. Переходы циклов с программной конвейерной обработкой
- •5.4.3.1. Переходы счетных циклов
- •5.4.2. Замечание об инициализации ротации предикатов
- •5.4.3.2. Пример счетного цикла
- •5.4.3.3. Переходы while-циклов
- •5.4.4. Краткий обзор терминологии
- •5.5. Оптимизация циклов в архитектуре Intel Itanium
- •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.2. Замечание об инициализации ротации предикатов
В этом разделе для инициализации ротации предикатов используется инструкция mov pr.rot = immed. Эта инструкция игнорирует значение CFM.rrb.pr. Таким образом, примеры в этой главе написаны в предположении, что CFM.rrb.pr является всегда нулем до инициализации предикатных регистров, используя mov pr.rot = immed.
5.4.3. Переходы циклов с программной конвейерной обработкой
Специальные переходы циклов с программной конвейерной обработкой позволяют компилятору генерировать очень компактный код программных конвейерных циклов, с помощью поддержки ротации регистров и с помощью управления заполнением и опустошением программного конвейера в течение фаз пролога и эпилога. Вообще говоря, каждый раз, когда выполняется переход программного конвейерного цикла, имеют место следующие действия:
Делается решение о том, продолжить ли выполнение ядерного цикла.
р16 устанавливается в значение для управления выполнением стадий программного конвейера (р63 записан переходом, а после ротации это значение окажется в р16).
Ротируются регистры (регистры rrb ротируются).
Прикладные регистры LC (счетчик цикла) и EC (счетчик эпилогов) выборочно декрементируются.
Имеется два типа переходов программных конвейерных циклов - счетный и типа while.
5.4.3.1. Переходы счетных циклов
На рис.5.1 показана блок-схема модульно планируемых переходов счетных циклов.
ctop, |
cexit |
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|||
|
L |
==0 |
(epilog) |
|
|
|
|
|
||||
|
|
|
|
|
|
(специальные неразворачива- |
||||||
(пролог, ядро) |
0 |
|
|
>1 |
E |
==0 |
|
емые циклы) |
||||
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
==1 |
|
|
|
|
|
LC -- |
|
LC = LC |
|
LC = LC |
|
LC = LC |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
EC=EC |
|
EC -- |
|
EC -- |
|
EC = EC |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PR[63]=1 |
|
PR[63]=0 |
|
PR[63]=0 |
|
PR[63]=0 |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
RRB -- |
|
RRB -- |
|
RRB -- |
|
RRB=RRB |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
ctop: переход |
|
|
|
|
|
|
|
ctop: проскок |
||||
cexit : проскок |
|
|
|
|
|
|
|
cexit : переход |
||||
Рис. 5.1. Поток выполнения инструкций ctop и cexit.
В течение фаз пролога и ядра, решение продолжать выполнение ядерного цикла означает, что начата новая исходная итерация. Ротация регистров должна произойти так, чтобы новая исходная итерация не перезаписала регистры, которые используются другими исходными операциями, все еще находящимися в конвейере. Регистр р16 устанавливается в 1 для разрешения стадий новых исходных итераций. Регистр LC декрементируется для обновления счетчика переименования исходных итераций. Регистр EC не изменяется.
В течение фазы эпилога, решение продолжать выполнение цикла означает, что программный конвейер еще не полностью опустошен и процесс выполнения исходных итераций должен быть продолжен. Ротация регистров должна продолжаться потому, что оставшиеся исходные итерации все еще записывают результаты, а потребители ожидают, что ротация произойдет. Теперь р16 устанавливается в 0, поскольку больше нет новых исходных итераций и инструкций, соответственно не существующие исходные итерации должны быть заблокированы. Регистр EC содержит счетчик оставшихся стадий выполнения для последней исходной итерации и декрементируется в течение эпилога. Для большинства циклов, когда переход программного конвейерного цикла выполняется при ЕС равном 1, то это указывает на то, что конвейер пуст и делается решение о выходе из цикла. Специальный случай, когда переход программного конвейерного цикла выполняется при ЕС равном 0, может произойти в развернутом программном конвейерном цикле, если адресат инструкции перехода cexit установлен на следующую последовательную связку.
Для счетных циклов, имеется два типа циклических переходов программной конвейерной обработки. Переход br.ctop принимается, когда делается решение о продолжения ядерного цикла. Он используется там, где решение о продолжении цикла располагается внизу цикла. Переход br.exit не принимается, когда делается решение о продолжения ядерного цикла. Он используется там, где решение о продолжении цикла располагается где угодно, но только не внизу цикла.

C?
C?