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

4.2.1.2. Планирование инструкций

Переходы ограничивают способность транслятора к перемещению инструкций, которые изменяют состояние памяти либо могут вызывать исключения, поскольку инструкции в программе являются зависимыми по управлению на всех лексически ограниченных переходах. Дополнительно, к зависимостям по управлению, составные условия могут брать несколько тактов для вычислений и могут самостоятельно требовать промежуточных переходов в таких языках как C, которые требуют вычислений по укороченной схеме (short-circuitevaluation).

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

4.2.2. Предикация в архитектуре IntelItanium

Теперь, после описания значимости эффективности переходов, в этом разделе кратко рассмотрим использование такого первичного механизма оптимизации в архитектуре Itanium, как предикация.

Почти все Itaniumинструкции могут быть помечены блокирующим (guarding) предикатом. Если во время выполнения, значение блокирующего предиката ложно, то блокируются архитектурные изменения предикатной инструкции, а инструкция ведет себя какnop. Если предикат – истина, то инструкция ведет себя так, как будто бы она без предиката. Имеется небольшое количество инструкций, у которых квалифицирующий предикат работает не так, как указано выше, это такие инструкции как: безусловное сравнение, вычисление квадратного корня с плавающей точкой, инструкции аппроксимации обратной величины. Для дополнительной информации см. ЧастьI«Руководство по прикладной архитектуре».

В следующей последовательности показан набор предикатных инструкций:

(p1) add r1=r2,r3

(p2) ld8 r5=[r7]

(p3) chk.s r4,recovery

Чтобы установить значение предсказывающего регистра, архитектура обеспечивает инструкции сравнение и проверки, типа тех, что показаны ниже.

cmp.eq p1,p2=r5,r6

tbit p3,p4=r6,5

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

cmp.eq p1,p2=r1,r2 ;;

(p1) add r1=r2,r3

Единственное исключение из этого правила включает инструкции целочисленного сравнения или проверки, которые устанавливают предикат, используемый как условие для последующей инструкции перехода:

cmp.eq p1,p2=r1,r2 // Не требуется stop

(p1) br.cond some_target

4.2.3. Оптимизация эффективности программы использующей предикацию

Этот раздел описывает оптимизацию, связанную с предикацией, ее использование и основные методы анализа эффективности. Далее описываются оптимизации, включая преобразование типа if, устранение ошибочных предсказаний, предикацию вне пути (offpath), перемещение кода вверх и перемещение кода вниз.

4.2.3.1. Применение преобразования типа if

Одна из наиболее важных оптимизаций допускаемых предикацией – это полное удаление переходов в некоторых программных последовательностях. Без предикации, приведенный ниже псевдокод, потребовал бы инструкцию перехода для обхода кода if-блока:

if (r4) {

add r1=r2,r3

ld8 r6=[r5]

}

С использованием предикации последовательность может быть записана без перехода:

cmp.ne p1,p0=r4,0 ;;// Установка предикатного регистра

(p1) add r1=r2,r3

(p1) ld8 r6=[r5]

Процесс предикации инструкций и удаление переходов упоминается как «преобразование типа if» (if-conversions). Однократное выполнение преобразование типаifпозволяет более свободное планирование инструкций, потому что теперь меньше переходов ограничивают подвижность кода, и меньшее количество переходов конкурируют за использование слотов.

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

if (r1)

r2 = r3 + r4;

else

r7 = r6 - r5;

может быть переписана без переходов в ассемблерном коде типа Itaniumтак:

cmp.ne p1,p2 = r1,0;;

(p1) add r2 = r3,r4

(p2) sub r7 = r6,r5

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

Так как переходы были удалены, то невозможно ошибочное предсказание перехода и не будет никаких конвейерных «пузырьков» (bubbles) из-за принятых переходов. Такие эффекты существенны во многих больших приложениях и эти преобразования могут существенно снижать простои и перезагрузки конвейера, вызываемые переходами.

Таким образом, сравнение стоимости вышеприведенного кода с не предикатной версией, показывает что:

  • Не предикатный код требует: 2 такта + (30% * 10 тактов) = 5 тактов.

  • Предикатный код требует: 2 такта.

В этом случае предикат сохраняет в среднем 3 такта.