С одной стороны, Википедия пишет об этапах исполнения испорченных: принестиВыполнение инструкции вне порядка: сохраняется заказ фиксации?
- Инструкции.
- Отправка инструкции в очередь команд (также называемая буфером команд или станциями резервирования).
- Команда ждет в очереди до тех пор, пока не будут доступны ее входные операнды. Затем команде разрешается покидать очередь до более ранних инструкций.
- Инструкция выдается соответствующему функциональному блоку и выполняется этим устройством.
- Результаты поставлены в очередь.
- Только после того, как все старые инструкции вернули свои результаты в регистр файла, тогда этот результат будет возвращен в файл регистра. Это называется стадией окончания или выхода на пенсию.
Аналогичную информацию можно найти в разделе «Компьютерная Организация и дизайн» книги:
Для того, чтобы программы ведут себя, как если бы они работали на простом трубопровода в заказ, инструкция выборка и декодирование требуется для выдачи инструкций по порядку, что позволяет отслеживать зависимости, а блок фиксации необходим для записи результатов в регистры и память в порядке выборки программ. Этот консервативный режим называется in-order commit ... Сегодня, все динамически запланированные трубопроводы использовать в порядке совершения.
Итак, насколько я понимаю, даже если выполнение поручений осуществляется в порядке, испорченный, результаты их казни сохранились в буфере переупорядочивания, а затем совершившие памяти/регистров в детерминированный порядок.
С другой стороны, существует известный факт, что современные процессоры могут изменять порядок операций памяти для целей ускорения производительности (например, две смежные независимые инструкции по загрузке могут быть переупорядочены). Википедия пишет об этом here.
Не могли бы вы пролить свет на это несоответствие?
Слово «совершить» на самом деле немного нечеткое. Если вы берете свое определение буквально, то почти нет места для любого вида OOE. Вам не нужно ждать инструкции «совершить», прежде чем вы сможете использовать ее результат. Я не понимаю, как это работает внутри страны. И это почти наверняка очень переплетается с восстановлением спекуляций из предсказания ветвей и неоднозначности памяти. – Mysticial
По крайней мере, каждая инструкция будет иметь несколько фаз «commit»: 1) Когда выход готов к использованию для другой команды. 2) Когда инструкция больше не в спекуляции. 3) Когда инструкция удаляется из буфера переупорядочения. Ваш пример с нагрузками не ограничивается нагрузками, но почти * любой * инструкцией, которая записывается в регистр. – Mysticial
@Mysticial: Я уверен, что «commit» используется здесь как синоним «увольнения». Это может произойти только тогда, когда инструкция выполняется, а когда известно, что она не является спекулятивной (т. Е. Когда все предыдущие команды удаляются без сбоев). –