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

5.4. Особенности поддержки циклов в архитектуре IntelItanium

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

5.4.1. Ротация регистров

Ротация регистров переименовывает регистры путем добавления к номеру регистра значения регистра rrb(registerrenamebase– база переименования регистров) содержащегося вCFM. Регистрrrbдекрементируется, когда в конце каждой итерации ядра, выполняется некий специальный переход программной конвейерной обработки цикла. Декрементация регистра приводит к тому, что значение регистра Х кажется передвинутым в регистр Х+1. Если Х является наибольшим номером ротируемого регистра, то его значение циклически оборачивается к наименьшему номеру ротируемого регистра.

Для ротации определены области фиксированного размера в файлах предикатных регистров и регистров с плавающей точкой (p16-p63иf32-f127), а также область программируемого размера в файле общих регистров. Размер ротируемой области в файле общих регистров задается непосредственным значением в инструкцииallocи должен быть числом кратным восьми, в диапазоне от 0 до 96. Наименьший номер ротируемого регистра в файле общих регистров – этоr32. Регистрrrbподдерживается для каждого из трех ротируемых файлов:CFM.rrb.gr– для общих регистров;CFM.rrb.fr – для регистров с плавающей точкой;CFM.rrb.pr– для предикатных регистров. Переходы программной конвейерной обработки одновременно уменьшают все регистрыrrb.

Ниже дан пример ротации регистров. Псевдоинструкция swp_branchпредставляет собой переход программной конвейерной обработки цикла:

L1: ld4 r35 = [r4],4 // постинкремент на 4

st4 [r5] = r37,4 // постинкремент на 4

swp_branch L1 ;;

Значение, которое записывается загрузкой в r35, через две итерации ядра (и через две ротации), читается сохранением какr37. За это время выполнятся еще две загрузки. Из-за ротации регистров их результаты запишутся в различные регистры и не изменят значение необходимое для сохранения.

Ротация предикатных регистров служит двум целям. Первая – избежать перезаписи значения предиката, которое всё еще необходимо. Вторая цель состоит в том, чтобы управлять заполнением и опустошением конвейера. Для этого программист назначает каждой стадии программного конвейера предикат, для управления выполнением инструкций на этой стадии. Этот предикат называется предикатом стадии. Для счетных циклов, р16 архитектурно определен как предикат для первой стадии, р17 определен как предикат для второй стадии и т.д. Ниже показан концептуальный вид исходной конвейерной итерации дляисходногопримера счетного цикла. Каждая стадия имеет длину в один такт, здесь же показаны предикаты стадий:

стадия 1:(p16) ld4 r4 = [r5],4

стадия 2:(p17) --- // пустая стадия

стадия 3:(p18) add r7 = r4,r9

стадия 4:(p19) st4 [r6] = r7,4

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