Подтвердить что ты не робот

Может ли предсказание ветвления вызывать незаконную инструкцию?

В следующем псевдокоде:

if (rdtscp supported by hardware) {
    Invoke "rdtscp" instruction
} else {
    Invoke "rdtsc" instruction
}

Скажем, CPU не поддерживает инструкцию rdtscp, поэтому мы отступаем от инструкции else.

Если CPU неправильно предсказывает ветвь, возможно ли, чтобы конвейер команд попытался выполнить rdtscp и выбросил ошибку Illgal Instruction?

4b9b3361

Ответ 1

Он явно задокументирован для ловушки #UD (Invalid Opcode Execution) в Руководствах для процессоров Intel, том 3A, глава 6.15:

В процессорах Intel 64 и IA-32, реализующих микроархитектуры вне очереди, это исключение не является генерируется до тех пор, пока не будет предпринята попытка убрать результат выполнения недействительной команды; то есть декодирование и спекулятивно попытка выполнить недопустимый код операции не генерирует это исключение. Аналогично, в Pentium процессор и более ранние процессоры IA-32, это исключение не генерируется в результате предварительной выборки и предварительной декодирование недействительной команды.

Ответ 2

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

EDIT: хорошо, хорошо. Из руководства разработчика программного обеспечения Intel, том 3A:

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

Ответ 3

Это зависит от того, как вы определяете "причину". Может ли он иметь некоторый наблюдаемый эффект? да.

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

Однако возможно, что неверно предсказанный путь кода повлияет на состояние микроархитектуры более тонкими способами, у вас могут быть загруженные нагрузки и кэширование, прохождение страниц и различные другие микро-архитектурные события - короче говоря, вся тяжелая работа ваш процессор делает, пока вы небрежно ходите и неправильно предсказываете какую-то ветку (что немаловажно в процессорах ООО). Я очень сомневаюсь, что любой процессор там пойдёт и выломит все эти вещи из ваших кэшей /TLB, поэтому учтите, что эти вещи могут впоследствии повлиять на производительность вашей программы (навсегда или хуже), просто не по функциональному поведению.

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