Intel: сериализация инструкций и предсказание ветвлений - PullRequest
2 голосов
/ 19 ноября 2011

Руководство разработчика архитектуры Intel (Vol3A, раздел 8-26), гласит:

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

Что это значит?

Звучит очень-очень плохо. Это похоже на сериализационную инструкцию, такую ​​как CPUID нарушает предсказание ветвлений (или наоборот), но это кажется маловероятным. Могут ли люди из ASM помочь мне понять, что означает «недетерминированный» в этом контексте.

* Отредактировано для ясности

Ответы [ 4 ]

3 голосов
/ 19 ноября 2011

Это очень запутанно сформулировано, но я считаю, что его фактическое значение простое: «ветви не (обязательно) сериализуют выполнение». Мы принимаем это как должное сегодня, но это было не всегда так.

2 голосов
/ 19 ноября 2011

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

1 голос
/ 19 февраля 2012

Современные суперскалярные процессоры, как правило, делают выполнение команд полностью детерминированным и упорядоченным с точки зрения чего-либо за пределами ЦП. Внутренне, он выбирает инструкции впереди, спекулятивно выполняет инструкции и выполняет их в любом порядке, наиболее эффективном. Но все, что не должно было быть выполнено (например, неправильно предсказанная ветвь), не фиксируется, и обращения к памяти обычно возвращаются в правильном порядке, прежде чем покинуть ЦП. Конец конвейера ЦП называется «буфером переупорядочения», потому что его задача - отслеживать выполнение инструкций и только постоянно фиксировать их результаты в программном порядке. Это важно для правильного поведения программы, особенно перед такими вещами, как неправильное прогнозирование ветвлений и исключения; если возникает исключение (например, делить на ноль), последующие инструкции могут быть декодированы и выполнены, и их необходимо правильно удалить из ROB и сбросить счетчик программ перед передачей исключения ОС.

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

1 голос
/ 19 ноября 2011

Ошибочно предсказанная ветвь - это инструкция сериализации, правильно предсказанная ветвь - нет.

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

Возможно, вы могли бы построить угловой случай с обращениями к памяти до и после условной ветви, где поведение кода зависит от того, была ли ветвь предсказана правильно или нет. (т.е. была ли ветвь сериализованной или нет.)

...