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

4. Предикация, поток управления и поток инструкций

4.1. Краткий обзор

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

  • Раздел «Предикация» описывает преобразования условных конструкций, использование предикатов и планирование кодов для уменьшения воздействия переходов.

  • Раздел «Оптимизации потока управления» описывает оптимизации, которые сводят и сворачивают (collapse&converge) поток управления, с помощью использования параллельных сравнений, многоканальных переходов и множественных регистров, пишущих под предикатом.

  • Раздел «Подсказки переходов и предварительных выборок» описывает, как подсказки используются для улучшения эффективности переходов и предвыборок.

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

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

4.2.1. Стоимость эффективности переходов

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

4.2.1.1. Ресурсы предсказания

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

Это ограничение означает, что код интенсивного перехода может зря потратить большую часть своего времени выполнения из-за конкуренции за ресурсы предсказания. Более того, хотя размер предсказателей является первичным фактором в определении эффективности предсказания перехода, но некоторые переходы предсказываются лучше с разными типами предсказателей. Например, некоторые переходы лучше предсказываются статически, а другие напротив – предсказываются лучше динамически. Из этих динамических, некоторые, (например, циклические переходы) предсказываются лучше, чем другие.

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

if (r1)

r2 = r3 + r4;

else

r7 = r6 – r5;

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

cmp.eq p1,p2=r1,r0 // Такт 0

(p1) br.cond else_clause // Такт 0

add r2=r3,r4 // Такт 1

br end_if // Такт 1

else_clause:

sub r7=r6,r5 // Такт 1

end_if:

Учитывая вышеупомянутую информацию, в среднем, при выполнении этого кода будет затрачиваться пять тактов, хотя критический путь имеет только два такта (2 такта + (30% * 10 тактов) = 5 тактов). Если потери от неправильного предсказания перехода могут быть устранены (путем сокращения конкуренции за ресурсы, либо путем устранения самого перехода), то эффективность кодовой последовательности увеличится вдвое.