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

4.3.4. Улучшение выборки потока инструкций

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

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

4.3.4.1. Выравнивание потока инструкций.

Для многих процессоров, при переходе программы к новому месту, выборка инструкций выполняется из строк кэша инструкций. Если адресат перехода начинается не на границе строки кэша, то выборка из этого места, вероятно, не найдет полную строку кэша. Этой проблемы можно избежать, если программист выровняет группы инструкций объединяющих несколько связок так, чтобы группы инструкций не включали границы строк кэша. Однако «накачка» (padding) всех меток привела бы к недопустимому увеличению размера кода. Более практичный подход выравнивает только верхушки циклов и обычным образом входит в базисные блоки, когда первая группа инструкций занимает более одной связки. То есть если для некоторой меткиLистинны одновременно оба следующих условия, то рекомендуется, дополнить предыдущие группы так, чтобыLбыла выровнена на границу строки кэша:

  • Метка, обычно выполняет переход за строку. Примеры включают верхушки циклов и блоки else,которые обычно выполняются.

  • Группа инструкций, начинающаяся в метке L, занимает более одной связки.

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

L:

{ .mii

add r1=r2,r3

add r4=r5,r6

add r7=r8,r9

}

{ .mfb

ld8 r14=[r56] ;;

nop.f

nop.b

}

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

4.4. Подсказки перехода и предвыборки

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

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

Подсказки могут быть определены как окончания (completers) инструкций переходов (br) или перемещений регистры переходов (далее в этом тексте сокращениеmov2br, фактически означает мнемоникуmov br=xx). Подсказки в инструкциях переходов наиболее просты для использования, т.к. инструкция уже существует, а подсказка только дополняет ее. Инструкции типаmov2brиспользуются для косвенных переходов. Точная интерпретация этих подсказок определяется во время выполнения, хотя, как ожидается, общее поведение подсказок будет подобным для различных поколений процессоров.

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