Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MProc / M9 / Архитектура часть 4..doc
Скачиваний:
42
Добавлен:
16.04.2013
Размер:
430 Кб
Скачать

4.5.1. Поддержка модульно планируемых циклов.

Поддержка программной конвейерной обработки циклов обеспечивается с помощью ротации регистров и специальных типов циклических переходов. Программная конвейерная обработка циклов организована аналогично аппаратной конвейерной обработке функционального устройства. Тело цикла разделено на несколько стадий, а в каждой стадии может быть несколько инструкций или не быть ни одной. Модульно планируемые циклы имеют три фазы: пролог, ядро и эпилог. В течение фазы пролога, при каждом проходе, запускаются новые циклические итерации (заполнение программного конвейера). В течение фазы ядра конвейер полон. Новая итерация начинается, а другая завершается при каждом проходе. В течение фазы эпилога, не начинается никаких новых итераций, а предыдущие итерации завершаются (освобождение программного конвейера).

Предикат назначается для каждой стадии, для управления активацией инструкций на этой стадии (этот предикат называется «предикат стадии»). Для поддержки конвейерного эффекта для предикатов и регистров в стадии программного конвейерного цикла, задаются для ротации, области фиксированного размера предикатных регистров (PR16-PR63) и регистров с плавающей точкой (FR32-FR127), а также область программируемого размера из файла основных регистров. Размер ротационной области в файле основных регистров задается непосредственно в инструкции alloc. Это непосредственное значение должно быть нулевым, либо кратным 8. Область ротации основных регистров определена так, что она начинается от GR32 и накладывается на локальную и выходную области, в зависимости от их относительных размеров. Предикаты стадии располагаются в ротационной области файла предикатных регистров. Для счетных циклов, PR16 архитектурно определен как предикат первой стадии, а предикаты последующих стадий распространяются в предикатные регистры с большими номерами. Для while-циклов предикат первой стадии может быть любым ротационным предикатом, предикаты последующих стадий распространяются в предикатные регистры с большими номерами. Программное обеспечение должно инициализировать ротационные предикаты стадий до входа в цикл. Инструкция alloc не может изменять размер ротационной части окна стека регистров, если не все базы ротационных регистров (rrb) в CFM являются нулями. Все поля rrb могут быть обнулены с помощью инструкции clrrrb. Форма clrrrb.pr может использоваться для очистки только rrb для предикатных регистров. Инструкция clrrrb должна быть последней в группе инструкций.

Регистры ротируются в сторону больших номеров, образуя замкнутое кольцо. Например, значение в регистре Х после одной ротации будет помещено в регистр Х+1. Если Х – самый последний доступный ротационный регистр, то его значение будет перенесено в самый первый доступный ротационный регистр. Ротация осуществляется путем переименования номеров регистров на основании значения базы ротации регистров (rrb) содержащейся в CFM. Для каждого из трех файлов ротационных регистров задаются rrb независимо: для основных регистров – rrb.gr, для регистров с плавающей точкой – rrb.fr, а для предикатных регистров – rrb.pr. Основные регистры ротируются только тогда, когда размер области ротации не равен нулю. Регистры с плавающей точкой и предикатные регистры ротируются всегда. Когда происходит ротация, то два или все три rrb синхронно декрементируются. Каждое поле rrb декрементируется модульно, в соответствии с размерами ротационных областей (например, 96 для rrb.fr). В остальном, работа механизма переименования ротационных регистров не видима для программы. Список инструкций модифицирующих rrb дан в табл.4.25.

Табл.4.25. Инструкции, модифицирующие поля rrb

Мнемоника

Действие

clrrrb

Очищает все rrb

clrrrb.pr

Очищает rrb.pr

br.call, brl.call

Очищает все rrb

cover

Очищает все rrb

br.ret

Восстанавливает CFM.rrb из PFM.rrb

rfi

Восстанавливает CFM.rrb из IFM.rrb, если IFM.v==1

br.ctop, br.cexit, br.wtop, br.wexit

Декрементирует все rrb

Есть две категории переходов в программных конвейерных циклах: счетный и типа while. Обе категории имеют по две формы top и exit. Вариант “top” используется тогда, когда условие выхода из цикла расположено ниже тела цикла. Принятый переход продолжит цикл, а не принятый переход приведет к выходу из цикла. Вариант “exit” используется тогда, когда условие выхода из цикла расположено не в подножии цикла, а где-то в другом месте. Здесь, не принятый переход приведет к продолжению цикла, а принятый переход приведет к выходу из цикла. Кроме того, вариант “exit” используется для промежуточных точек в развернутом конвейерном цикле.

Условие перехода в переходе счетного цикла задается указанием типа счетного цикла (ctop или cexit), значением прикладного регистра счетчика цикла (LC) и значением прикладного регистра счетчика эпилогов (EC). Заметим, что переходы счетных циклов не используют вычисление предикатов. Регистр LC инициализируется значением на единицу меньшим, чем количество итераций счетного цикла, а EC инициализируется числом стадий, на которые делится тело цикла. Пока LC будет больше нуля, направление перехода будет продолжать цикл, LC будет декрементироваться, регистры будут ротироваться (поля rrb - декрементируются), а PR16 будет устанавливаться в 1 после ротирования. (При каждом циклическом переходе, в PR63 было некое значение, а после ротации это значение окажется в PR16).

Выполнение перехода счетного цикла при LC равном нулю сигнализирует о начале эпилога. Пока выполняется эпилог и пока EC больше 1, направление перехода будет продолжать цикл, EC будет декрементироваться, регистры будут ротироваться, а после ротации PR16 будет устанавливаться в 0. Выполнение перехода счетного цикла при LC равном нулю и EC равном единице сигнализирует об окончании цикла; направление перехода будет на выход из цикла, EC будет декрементироваться, регистры будут ротироваться, а после ротации PR16 будет установлен в 0. Если при выполнении перехода счетного цикла, и LC равно 0, и EC равно 0, то направление перехода будет на выход из цикла. LC, EC и все поля rrb не будут изменяться (нет ротации), а PR63 будет установлен в 0. LC и EC могут оказаться равными нулю при некоторых типах оптимизации, разворачивания программных конвейерных циклов, если адресат перехода cexit установлен на следующую последовательную связку инструкций, а счетчик прохода циклов (trip) не является равномерно повторяющимся в процессе развертки.

Направление циклического перехода типа while задается указанием типа цикла while (wtop или wexit), значением вычисленного предиката и значением EC. Циклические переходы типа while не используют LC. Пока вычисленный предикат равен 1, направление перехода будет продолжать цикл, регистры будут ротироваться, а после ротации PR16 будет устанавливаться в 0. Пока вычисленный предикат равен 0 и пока EC больше 1, направление перехода будет продолжать цикл, EC будет декрементироваться, регистры будут ротироваться, а после ротации PR16 будет устанавливаться в 0. Вычисленный предикат является единицей в течение стадии ядра и – нулем в течение стадии эпилога. В течение пролога вычисленный предикат может быть либо 0, либо 1, в зависимости от схемы используемой программой конвейеризации while-цикла. Выполнение перехода while-цикла со значением вычисленного предиката равным 0 и EC равном единице, сигнализирует об окончании цикла; направление перехода будет на выход из цикла, EC будет декрементироваться, регистры будут ротироваться, а после ротации PR16 будет установлен в 0. Если при выполнении перехода while-цикла со значением вычисленного предиката равным 0, и EC равно 0, то направление перехода будет на выход из цикла. EC и все поля rrb не будут изменяться (нет ротации), а PR63 будет установлен в 0.

Для while-циклов, инициализация EC зависит от схемы используемой программой конвейеризации while-цикла. Часто первое правильное условие для перехода while-цикла не вычисляется в течение нескольких стадий пролога. Поэтому программные конвейеры для while-циклов, часто имеют несколько спекулятивных стадий пролога. В течение этих стадий, вычисленный предикат может быть установлен в 0 или 1, в зависимости от схемы используемой в программе. Если вычисленный предикат равен единице в течение пролога, то EC будет декрементирован только в течение фазы эпилога и инициализируется в значение на единицу большее, чем количество стадий эпилога. Если вычисленный предикат равен нулю в течение спекулятивных стадий пролога, то EC будет декрементироваться в течение этих частей пролога, а инициализируемое для EC соответственно увеличивается.