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