Как процессор переупорядочивает инструкции
Я недавно читал о переупорядочении команд процессора для эффективности. Но я не могу понять, как процессор переупорядочивает свои инструкции. Я имею в виду переупорядочение времени компиляции, так как компилятор может предвидеть предстоящий код. Но для процессора, который читает инструкцию одну за другой, как он видит будущие инструкции, чтобы изменить их порядок?
2 ответа
Инструкции извлекаются в программном порядке в очередь команд; из очереди они декодируются и перемещаются на станции резервирования. Эти резервирующие станции эффективно выполняют переупорядочение: инструкции отправляются для выполнения блокам выполнения, когда их аргументы становятся доступными, и время, когда все аргументы становятся доступными, обычно не соответствует порядку в очереди / памяти команд.
Для примера, используя алгоритм Томасуло, посмотрите эти два видео:
Проблема (и регистрация переименования): https://youtu.be/I2qMY0XvYHA?list=PLAwxTw4SYaPkNw98-MFodLzKgi6bYGjZs
Отправка / переупорядочение: https://youtu.be/bEB7sZTP8zc?list=PLAwxTw4SYaPkNw98-MFodLzKgi6bYGjZs
Инструкции декодируются по порядку, но затем они переходят в набор инструкций "в процессе". Инструкции могут продвигаться вперед, если их зависимости соблюдены.
Например, скажем, инструкции:
- Загрузить регистр A из памяти.
- Загрузить регистр B из памяти.
- Инкрементный регистр А.
- Инкрементный регистр B.
Может случиться так, что последние две инструкции выполняются одновременно, и если чтение памяти для регистра B завершается первым (возможно, это уже было в кэше L1), то увеличение регистра B будет иметь место до увеличения регистра А. (Хотя, конечно, после того, как эта инструкция расшифрована.)