Как процессор переупорядочивает инструкции

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

2 ответа

Инструкции извлекаются в программном порядке в очередь команд; из очереди они декодируются и перемещаются на станции резервирования. Эти резервирующие станции эффективно выполняют переупорядочение: инструкции отправляются для выполнения блокам выполнения, когда их аргументы становятся доступными, и время, когда все аргументы становятся доступными, обычно не соответствует порядку в очереди / памяти команд.

Для примера, используя алгоритм Томасуло, посмотрите эти два видео:

Проблема (и регистрация переименования): https://youtu.be/I2qMY0XvYHA?list=PLAwxTw4SYaPkNw98-MFodLzKgi6bYGjZs

Отправка / переупорядочение: https://youtu.be/bEB7sZTP8zc?list=PLAwxTw4SYaPkNw98-MFodLzKgi6bYGjZs

Инструкции декодируются по порядку, но затем они переходят в набор инструкций "в процессе". Инструкции могут продвигаться вперед, если их зависимости соблюдены.

Например, скажем, инструкции:

  1. Загрузить регистр A из памяти.
  2. Загрузить регистр B из памяти.
  3. Инкрементный регистр А.
  4. Инкрементный регистр B.

Может случиться так, что последние две инструкции выполняются одновременно, и если чтение памяти для регистра B завершается первым (возможно, это уже было в кэше L1), то увеличение регистра B будет иметь место до увеличения регистра А. (Хотя, конечно, после того, как эта инструкция расшифрована.)

Другие вопросы по тегам