2

С одной стороны, Википедия пишет об этапах исполнения испорченных: принестиВыполнение инструкции вне порядка: сохраняется заказ фиксации?

  1. Инструкции.
  2. Отправка инструкции в очередь команд (также называемая буфером команд или станциями резервирования).
  3. Команда ждет в очереди до тех пор, пока не будут доступны ее входные операнды. Затем команде разрешается покидать очередь до более ранних инструкций.
  4. Инструкция выдается соответствующему функциональному блоку и выполняется этим устройством.
  5. Результаты поставлены в очередь.
  6. Только после того, как все старые инструкции вернули свои результаты в регистр файла, тогда этот результат будет возвращен в файл регистра. Это называется стадией окончания или выхода на пенсию.

Аналогичную информацию можно найти в разделе «Компьютерная Организация и дизайн» книги:

Для того, чтобы программы ведут себя, как если бы они работали на простом трубопровода в заказ, инструкция выборка и декодирование требуется для выдачи инструкций по порядку, что позволяет отслеживать зависимости, а блок фиксации необходим для записи результатов в регистры и память в порядке выборки программ. Этот консервативный режим называется in-order commit ... Сегодня, все динамически запланированные трубопроводы использовать в порядке совершения.

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

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

Не могли бы вы пролить свет на это несоответствие?

+0

Слово «совершить» на самом деле немного нечеткое. Если вы берете свое определение буквально, то почти нет места для любого вида OOE. Вам не нужно ждать инструкции «совершить», прежде чем вы сможете использовать ее результат. Я не понимаю, как это работает внутри страны. И это почти наверняка очень переплетается с восстановлением спекуляций из предсказания ветвей и неоднозначности памяти. – Mysticial

+0

По крайней мере, каждая инструкция будет иметь несколько фаз «commit»: 1) Когда выход готов к использованию для другой команды. 2) Когда инструкция больше не в спекуляции. 3) Когда инструкция удаляется из буфера переупорядочения. Ваш пример с нагрузками не ограничивается нагрузками, но почти * любой * инструкцией, которая записывается в регистр. – Mysticial

+0

@Mysticial: Я уверен, что «commit» используется здесь как синоним «увольнения». Это может произойти только тогда, когда инструкция выполняется, а когда известно, что она не является спекулятивной (т. Е. Когда все предыдущие команды удаляются без сбоев). –

ответ

4

TL: DR: заказ памяти - это не то же самое, что и выход из строя. Это происходит даже на встроенных в процессор процессорах.

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

Заказ памяти - это все о чем прочее ядра вид. Также обратите внимание, что вы цитируетесь только о передаче результатов в файл регистра, а не в память.


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

Нагрузки становятся глобально видимыми, когда они считывают свои данные из кеша. Это более или менее, когда они «выполняются», и определенно, прежде чем они уйдут на пенсию (aka commit).

Магазины становятся глобально видимыми, когда их данные привязаны к кешу. Это должно дождаться, пока они, как известно, не являются спекулятивными, т. Е. Что никакие исключения или прерывания не приведут к откату, который должен «отменить» хранилище. Таким образом, хранилище может фиксировать кеш-память L1 уже в тот момент, когда он удаляется из ядра внешнего порядка.

Но даже в заказе процессоры используют очередь магазина или буфер хранения, чтобы скрыть задержку магазинов, пропущенных в кеше L1. Механизму вне очереди не нужно отслеживать магазин, как только будет известно, что это обязательно произойдет, поэтому магазин insn/uop может уйти в отставку еще до того, как он перейдет в кеш-память L1. Буфер хранилища держится на нем, пока кеш-память L1 не готова принять его. то есть ему принадлежит строка кэша (состояние M the MESI cache coherency protocol), и правила упорядочения памяти позволяют во всем мире стать глобально видимыми.

Смотрите также мой ответ на Write Allocate/Fetch on Write Cache Policy

Как я понимаю, данные магазин добавляется в очереди магазина, когда она «выполняет» в сердцевине испорченный, и это то, что исполнительное устройство магазина делает ,

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


Для ISA как x86, с сильным упорядочением, очередь магазин должен сохранить память упорядочения семантики ISA. т. е. магазины не могут переупорядочиваться с другими магазинами, а магазины не могут стать глобально видимыми до более ранних загрузок. (LoadStore reordering isn't allowed (nor is StoreStore or LoadLoad), only StoreLoad reordering).

article on how TSX (transactional memory) could be implemented in different ways than what Haswell does David Kanter дает некоторое представление о буфере порядка памяти и о том, как он представляет собой отдельную структуру из буфера ReOrder (ROB), который отслеживает переупорядочение команд/uop. Он начинает с описания того, как в настоящее время работают, прежде чем переходить к тому, как он может быть изменен для отслеживания транзакции, которая может совершить или прервать работу в группе.