Обработка фиктивных операций процессора Intel
По общему признанию, у меня есть немного глупый вопрос. По сути, мне интересно, существуют ли какие-то специальные механизмы, предоставляемые процессорами Intel, для эффективного выполнения серии фиктивных инструкций, то есть инструкций NOP? Например, я мог предположить, что мог быть некоторый механизм предварительной выборки, который идентифицирует NOPS, отбрасывает их и пытается вместо этого извлечь некоторые полезные инструкции. Или эти NOPS отправляются в исполнительный модуль как обычные инструкции, что означает, что я могу примерно обработать 5 nops в каждом цикле (при условии, что есть 5 исполнительных модулей)
Спасибо Рейнхард
3 ответа
Отказ от них был бы довольно плохой идеей: они часто используются для ожидания. Если вы отказываетесь NOP
s, вы делаете свою петлю ожидания намного более жесткой, чем она должна быть, и потенциально вносите значительные накладные расходы на связь
Если вы чувствуете, что NOP
с неэффективны, вы можете попробовать HLT
что экономит энергию. Или вы можете даже отправить процессор в состояние сна. Однако это имеет смысл только в том случае, если вы хотите "ничего не делать" в течение значительного периода времени, и для них обычно требуются привилегии suvervisor.
Нет. Они декодируются и выполняются как обычные инструкции; есть аппаратная поддержка для удаления ложной зависимости, которая в противном случае была бы введена в регистр EAX для однобайтового NOP, 0x90 (что на самом деле xchg eax, eax
), но это все.
Ссылка: Справочное руководство по оптимизации архитектур Intel(R) 64 и IA-32 - раздел 3.5.1.8, "Использование NOP".
В архитектуре x86 нет особой необходимости оптимизировать последовательности неактивных операций, потому что она имеет неоперативные кодировки различной длины. Вместо многих однобайтовых неактивных операций можно просто использовать одну многобайтовую неактивную операцию. Несколько больше работы для декодера, но фактические исполнительные блоки видят только одну команду для выполнения.