Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MProc / M9 / Оптимизация часть 4..doc
Скачиваний:
19
Добавлен:
16.04.2013
Размер:
124.42 Кб
Скачать

4.2.4.2. Случай 1

Предположим, что if-блок выполняется 50% времени и переход никогда не предсказывается ошибочно. Тогда, среднее число тактов для:

  • Не предикатного кода: (2 такта * 50%) + (18 тактов * 50%) = 10 тактов

  • Предикатного кода: (5 тактов * 50%) + (18 тактов * 50%) = 11.5 тактов

В этом случае, преобразование типа ifувеличилобы стоимость выполнения кода.

4.2.4.3. Случай 2

Предположим, что if-блок выполняется 70% времени и переход предсказывается ошибочно в 10%, причем ошибочное предсказание стоит 10 тактов. Тогда, среднее число тактов для:

  • Не предикатного кода:

(2 такта * 70%) + (18 тактов * 30%) + (10 тактов * 10%) = 7.8 тактов

  • Предикатного кода:

(5 тактов * 70%) + (18 тактов * 30%) = 8.9 тактов

В этом случае, преобразование типа ifувеличилобы стоимость выполнения кода.

4.2.4.4. Случай 3

Предположим, что if-блок выполняется 30% времени и переход предсказывается ошибочно в 30%. Тогда, среднее число тактов для:

  • Не предикатного кода:

(2 такта * 30%) + (18 тактов * 70%) + (10 тактов * 30%) = 16.2 тактов

  • Предикатного кода:

(5 тактов * 30%) + (18 тактов * 70%) = 14.1 тактов

В этом случае, преобразование типа ifуменьшилобы стоимость выполнения более чем на два такта, в среднем.

4.2.4.5. Использование наложения ресурсов

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

Нижеприведенный код получен из оператора if-then-else. Данная семейственная модель машины имеет для загрузки/сохранения только два устройства (типа М). Если компилятор предикатирует и объединит эти два блока, то размер пригодности ресурса в этом блоке будет четыре такта, т.к. это – минимальное количество времени необходимое для использования восьми операций памяти:

then_clause: // группа then

ld r1=[r21] // Такт 0

ld r2=[r22] // Такт 0

st [r32]=r3 // Такт 1

st [r33]=r4;; // Такт 1

br end_if

else_clause: // группа else

ld r3=[r23] // Такт 0

ld r4=[r24] // Такт 0

st [r34]=r5 // Такт 1

st [r35]=r6;; // Такт 1

end_if:

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

4.2.4.6. Случай 1

Предположим, что промах предсказания условного перехода 10% времени и, что предикатный код требует для выполнения четырех тактов. Тогда, среднее число тактов для:

  • Не предикатного кода: (10 тактов * 10%) + 2 такта = 3 такта

  • Предикатного кода: 4 такта

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

4.2.5. Рекомендации по удалению ветвей

Следующие рекомендации для преобразований типа if, применяются для случаев, где известны только локальное поведение кода и его профиль выполнения:

  1. Размеры потоковой зависимости и доступности ресурсов обоих путей, должны рассматриваться при решении – применять предикацию или нет.

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

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

  4. Если размеры потоковых зависимостей путей, после преобразования типа if, являются почти равными и имеются достаточные ресурсы для одновременного выполнения обоих потоков, то преобразования типаifявляется часто выгодным.

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