2017-02-10 34 views
5

От чтения this я наткнулся на следующие две цитаты:Как отменить предсказание ветви?

Первая цитата:

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

Вторая цитата:

Нет Ветвь означает не Mispredicts

Для моего проекта, я работаю на зависимых данные, и я выполнять множество if и switch заявления. Мой проект связан с Big Data, поэтому он должен быть максимально эффективным. Поэтому я хотел проверить его на данных, предоставленных пользователем, чтобы увидеть, действительно ли предсказание ветвлений замедляет мою программу или помогает. Начиная с чтения here:

Задержка ложного предсказания составляет от 10 до 20 тактов.

Что меня больше всего шокировало был:

Удаление ветви не только повышает производительность выполнения кода, он также помогает компилятору оптимизировать код.

Зачем использовать предсказание ветвления?

Есть ли способ заставить компилятор генерировать код сборки без веток? или отключить предсказание ветвлений, чтобы CPU? поэтому я могу сравнить оба результата?

+2

На ваш вопрос отвечает ответ на связанный вопрос. –

+5

Обратите внимание: если процессор поддерживает их, не каждое условие вызывает ветвь. Компиляторы довольно хороши в этом. Кстати, любой достойный CPU AFAIK не замедлит ваш код в случае неправильных прогнозов (измеримым и средним!), Он просто не ускорит его. Измерять? Подготовьте специальный набор данных –

+0

@GeorgeStocker Спасибо! использовал это, чтобы понять, что такое «предсказание ветвей», но не заметил внизу, он предоставил некоторую полезную информацию. –

ответ

8

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

предсказания ветвлений не замедляет программы. Когда люди говорят о стоимости пропущенных прогнозов, они говорят о том, насколько дороже неверно предсказанная ветвь сравнивается с правильно предсказанной ветвью.

Если предсказание ветвления не существует, все ветви будут такими же дорогими, как и неверно предсказанные.

То, что «задержка ложного предсказания составляет от 10 до 20 тактов», действительно означает, что успешное предсказание ветвей экономит от 10 до 20 циклов.

Удаление ветви не только улучшает производительность во время выполнения кода, он также помогает компилятору оптимизировать код.

Зачем использовать предсказание ветвления?

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

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

Есть ли способ заставить компилятор генерировать код сборки без веток?

оптимизирующий компилятор уже удалить ветви из программы, когда она может (без изменения семантики программы), но, если мы не говорим о очень простой int main() {return 0;} типа программы, что невозможно удалить все ветви. Для циклов требуются ветви (если они не разворачиваются, но это работает, только если вы знаете количество итераций раньше времени), и так делают большинство if- и switch-statements. Если вы можете свести к минимуму количество if s, switch es и циклов в вашей программе, отлично, но вы не сможете удалить все из них.

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

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

+0

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

+0

Спасибо за ответ. Промывает трубопровод бесплатно? Если это неверное предсказание, то оно будет вытащено. Я понимаю, что выигрыш попал в хит. Но если процессор промахивается, значит, это не значит, что мы по-прежнему платим некоторый цикл, чтобы очистить трубопровод? –

+1

@TonyTannous Это зависит от точной архитектуры процессора (как и большинство вещей, о которых мы говорим здесь, на самом деле), но я понимаю, что на современных процессорах нет никакого времени, затрачиваемого на промывку конвейера. Быстрый поиск в Google вызывает [эту статью] (http://www.realworldtech.com/sandy-bridge/3/), которая, кажется, подтверждает это («Как только обнаружено неверное предсказание филиала, ядро ​​может перезапустить декодирование как только будет известен правильный путь, в то же время, когда машина не по порядку очищает uops от неправильно спроектированного пути ... – sepp2k

5

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

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

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

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

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

+2

Один незначительный nitpick: даже безусловные переходы могут быть проблематичными, поскольку они могут быть переменными (подумайте о MIPS 'jar') или косвенными (например, x86' jmp [rbx] '). –