Как обрабатываются ошибочные прогнозы перед аппаратным прерыванием - PullRequest
0 голосов
/ 29 января 2019

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

Когда происходит прерывание, что происходит с инструкциями в конвейере?

Я прочитал это, и ясно, что решение состоит в том, чтобы немедленно очистить все от конвейера, чтобы этоне возникает, а затем генерирует инструкции для передачи RFLAGS, CS, RIP в местоположение стека ядра в TSS;однако возникает вопрос, как он знает (CS:) RIP, связанный с самым последним архитектурным состоянием, чтобы иметь возможность поместить его в стек (учитывая, что интерфейсный RIP теперь будет впереди).Это похоже на вопрос о том, как исполняемый модуль ветви ветвления на порту 0 знает (CS:) RIP того, что должно было быть выбрано, когда предикат взятия оказывается неверным - является ли адрес, закодированный в инструкции, а такжепрогноз?Та же самая проблема возникает, когда вы думаете о ловушке / исключении, ЦПУ необходимо передать адрес текущей инструкции (ошибки) или следующей инструкции (ловушки) в стек ядра, но как это работает с адресом этой инструкциикогда он находится на полпути вниз по конвейеру - это заставляет меня поверить, что адрес должен быть закодирован в инструкции и разработан с использованием информации о длине, и, возможно, все это делается на этапе предварительного кодирования.

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Процессор, по-видимому, отбрасывает содержимое ROB, возвращаясь к последнему состоянию отключения, прежде чем обслуживать прерывание.

Пропадание ветки в полете не меняет этого.В зависимости от ЦП (более старого / более простого) он, возможно, уже находился в процессе отката в исходное состояние и сбрасывался из-за пропадания ветви, когда пришло прерывание.

Как говорит @Hadi, ЦПв этот момент можно было выбрать выход из ветви (с прерыванием, нажимающим CS: RIP, указывающим на правильную цель перехода), вместо того, чтобы оставить его для повторного выполнения после возврата из прерывания.

Но это толькоработает, если инструкция ветки уже была готова к удалению: не было никаких инструкций старше, чем ветвь, все еще не выполненная.Поскольку важно обнаруживать пропуски в ветвях как можно раньше, я предполагаю, что восстановление веток начинается, когда во время выполнения обнаруживается ошибочный прогноз, а не в ожидании выхода на пенсию.(Это не похоже на другие виды сбоев: например, Meltdown и L1TF основаны на сбойной нагрузке , а не , запускающей #PF обработку сбоев до тех пор, пока она не выйдет на пенсию, поэтому процессор уверен, что действительноошибка на истинном пути выполнения. Вы не хотите запускать дорогостоящий сброс конвейера до тех пор, пока не убедитесь, что он не находится в тени ошибочного прогноза или более ранней ошибки.)

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

например, cmp [cache_miss_load], 123 / jeq неверно предсказываетно не будет обнаружен в течение длительного времени.Затем, в тени этого неверного прогноза, cmp eax, 1 / je на «неправильном» пути запускается и для него обнаруживается неправильный прогноз.При быстром восстановлении прошедшие операции сбрасываются, и извлечение / декодирование / выполнение с «правильного» пути может начаться до того, как будет обнаружен ранее ошибочный прогноз.


Чтобы поддерживать низкую задержку IRQ, ЦП некак правило, дают инструкции в полете дополнительное время для выхода на пенсию.Кроме того, любые удаленные хранилища, которые все еще хранят свои данные в буфере хранилища (еще не переданные в L1d), должны зафиксировать, прежде чем любые хранилища обработчиком прерывания смогут зафиксировать.Но прерывания сериализуются (я думаю), и любой MMIO или port-IO в обработчике, вероятно, будет включать в себя барьер памяти или строго упорядоченное хранилище, поэтому допущение удаления большего количества инструкций может повредить задержке IRQ, если они связаны с хранилищами.(После того, как магазин закрывается, это, безусловно, должно произойти, даже если его данные все еще находятся в буфере хранилища).


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

Ветви отличаются только тем, что имеют дополнительное отслеживание для быстрого восстановления (буфер порядка ветвлений в Nehalem и новее), потому что они ожидают , чтобы неправильно прогнозировать их с частотой, не пренебрежимо малой во время нормальной работы.См. Что именно происходит, когда процессор Skylake неправильно предсказывает ветвь? для некоторых деталей.Особенно цитата Дэвида Кантера:

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


(Этот ответ намеренно очень ориентирован на Intel, потому что вы пометили его , а не . Я предполагаю, что AMD делает что-то похожее, и, вероятно, большинство не в порядке длядругие ISA в целом схожи. За исключением того, что неправильное предположение о порядке следования памяти не имеет значения для процессоров с более слабой моделью памяти, где процессорам разрешено визуально изменять порядок загрузки.)


Сноска 1: Так можноdiv или любая инструкция FPU, если исключения FP не маскируются.А для ненормального результата FP может потребоваться помощь микрокода, даже если исключения FP замаскированы так, как они есть по умолчанию.

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

0 голосов
/ 29 января 2019

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

Если прерывание иНеправильное предсказание ветвления происходит в то же время, когда преподаватель может, например, выбрать обслуживание прерывания.В этом случае все инструкции, которые находятся на неверно предсказанном пути, должны быть сброшены.Процессор может также выбрать сброс других команд, которые находятся на правильном пути, но еще не удалились.Все эти инструкции находятся в ROB, и их адреса инструкций известны.Для каждой предполагаемой ветви есть тег, который идентифицирует все инструкции на этом предполагаемом пути, и все инструкции на этом пути помечены им.Если есть другая, более поздняя предполагаемая ветвь, используется другой тег, но он также упорядочен относительно предыдущего тега.Используя эти теги, процессор может точно определить, какие инструкции сбрасывать, когда любая из предполагаемых ветвей оказывается неверной.Это определяется после того, как соответствующая инструкция перехода завершает выполнение в модуле выполнения ветви.Филиалы могут завершить выполнение не по порядку.Когда вычисляется правильный адрес ветки с предсказанным ответом, он направляется в модуль выборки и модуль предсказания ветвления (BPU).Модуль выборки использует его для извлечения инструкций из правильного пути, а BPU использует его для обновления своего состояния прогнозирования.

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

...