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

2.5. Предикация

Предикация – это условное выполнение инструкции основанное на квалифицирующем предикате. Квалифицирующий предикат – это предикатный регистр, значение которого определяет – будет ли процессор передавать результаты, вычисленные инструкцией.

Значения предикатных регистров устанавливаются в результате инструкций, таких как сравнение (cmp) и проверка бита (tbit). Если значение квалифицирующего предиката связанного с инструкцией есть истина (1), то процессор выполняет инструкцию, а результаты инструкции передаются. Если значение – ложь (0), то процессор отвергает любые результаты и не вызывает исключений. Рассмотрим следующий код языка С:

if (a) {

b = c + d;

}

if (e) {

h = i + j;

}

Этот код может быть реализован в Itaniumархитектуре использующей квалифицирующие предикаты так, что ветвление будет удалено. Указанный ниже псевдокод реализует выражение С без ветвей:

cmp.ne p1,p2=a,r0 // p1 <- a!=0

cmp.ne p3,p4=e,r0 ;;// p3 <- e!=0

(p1) add b=c,d // If a!=0 then add

(p3) sub h=i,j // If e!=0 then sub

Для детального обсуждения предикации см. ниже главу 4 «Предикация, поток управления и поток инструкций». Имеются несколько специальных случаев, где предикатные инструкции читают или записывают архитектурные ресурсы не зависимо от их квалифицирующих предикатов.

2.6. Архитектурная поддержка и вызовы процедур

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

2.6.1. Стековые регистры

Регистры от r0доr31называются глобальными или статическими регистрами и не являются частью стековых регистров. Стековые регистры пронумерованы отr32до максимумаr127, который может перенастраиваться пользователем.

Вызванная процедура задает размер ее нового стекового окна с помощью инструкции alloc. Процедура может использовать эту инструкцию для выделения до 96 регистров в окне, охватывающем входные, выходные и локальные значения. Когда делается запрос, выходные регистры вызывающей процедуры накладываются на входные регистры вызываемой процедуры, таким образом, параметры передаются без копирования или сливания регистров.

Физические регистры переименовываются аппаратно так, чтобы стековые регистры всегда упоминались в процедуре, начиная с r32.

2.6.2. Механизм регистрового стека

Управление стеком регистров осуществляется с помощью аппаратного механизма называемого механизмом регистрового стека (RegisterStackEngine–RSE).RSEперемещает содержимое физических регистров между файлом общих регистров и памятью без явного вмешательства программы. Это обеспечивает модель программирования, которая выглядит как не ограниченный стек физических регистров для компиляторов; однако, сохранение и восстановление регистров с помощьюRSEможет быть дорогостоящим, так что компиляторы должны пытаться минимизировать использование регистров.

2.7. Переходы и Подсказки

Так как переходы имеют основное воздействие на эффективность программы, то архитектура Itaniumвключает свойства для улучшения их эффективности:

  • Использование предикации уменьшает количество переходов в коде. Это улучшает выборку инструкций, поскольку имеется меньшее количество переключений потока управления, уменьшается количество неправильно предсказанных переходов (ведь переходов стало меньше), но увеличивает долю правильно предсказанных переходов (т.к. уменьшается борьба за ресурсы предсказания).

  • Обеспечиваются программные подсказки переходов для улучшения аппаратного использования предсказания и предвыборке ресурсов.

  • Предоставляется явная поддержка для программной конвейерной обработки циклов и предсказания выхода из счетных циклов.