, чтобы увидеть, если предсказания ветвлений на самом деле замедляет мою программу или помогает
предсказания ветвлений не замедляет программы. Когда люди говорят о стоимости пропущенных прогнозов, они говорят о том, насколько дороже неверно предсказанная ветвь сравнивается с правильно предсказанной ветвью.
Если предсказание ветвления не существует, все ветви будут такими же дорогими, как и неверно предсказанные.
То, что «задержка ложного предсказания составляет от 10 до 20 тактов», действительно означает, что успешное предсказание ветвей экономит от 10 до 20 циклов.
Удаление ветви не только улучшает производительность во время выполнения кода, он также помогает компилятору оптимизировать код.
Зачем использовать предсказание ветвления?
Зачем использовать предсказание ветвей над удалением ветвей? Вы не должны. Если компилятор может удалить ветви, он будет (при условии, что оптимизация включена), и если программисты могут удалять филиалы (при условии, что это не наносит вреда читаемости или это критически важная часть кода), они должны.
Это вряд ли делает предсказание ветви бесполезным. Даже если вы удаляете как можно больше филиалов из программы, оно все равно будет содержать много и много ветвей. Поэтому из-за этого и из-за того, насколько дорогими непредсказуемыми филиалами, прогнозирование ветвлений имеет важное значение для хорошей производительности.
Есть ли способ заставить компилятор генерировать код сборки без веток?
оптимизирующий компилятор уже удалить ветви из программы, когда она может (без изменения семантики программы), но, если мы не говорим о очень простой int main() {return 0;}
типа программы, что невозможно удалить все ветви. Для циклов требуются ветви (если они не разворачиваются, но это работает, только если вы знаете количество итераций раньше времени), и так делают большинство if- и switch-statements. Если вы можете свести к минимуму количество if
s, switch
es и циклов в вашей программе, отлично, но вы не сможете удалить все из них.
или отключить предсказание ветвления, чтобы процессор? поэтому я могу сравнить оба результата?
Насколько я знаю, невозможно отключить предсказание ветвления на процессорах x86 или x86-64. И, как я уже сказал, это никогда не улучшит производительность (хотя это может сделать его предсказуемым, но обычно это не требование в тех контекстах, где используются эти процессоры).
На ваш вопрос отвечает ответ на связанный вопрос. –
Обратите внимание: если процессор поддерживает их, не каждое условие вызывает ветвь. Компиляторы довольно хороши в этом. Кстати, любой достойный CPU AFAIK не замедлит ваш код в случае неправильных прогнозов (измеримым и средним!), Он просто не ускорит его. Измерять? Подготовьте специальный набор данных –
@GeorgeStocker Спасибо! использовал это, чтобы понять, что такое «предсказание ветвей», но не заметил внизу, он предоставил некоторую полезную информацию. –