Значение памяти


Устранение неоднозначности памяти — это набор методов, используемых высокопроизводительными микропроцессорами с внеочередным выполнением , которые выполняют инструкции доступа к памяти (загрузки и сохранения) вне порядка программы. Механизмы устранения неоднозначности памяти, реализованные с использованием цифровой логики внутри ядра микропроцессора, обнаруживают истинные зависимости между операциями с памятью во время выполнения и позволяют процессору восстановиться, когда зависимость была нарушена. Они также устраняют ложные зависимости от памяти и обеспечивают больший параллелизм на уровне инструкций , обеспечивая безопасное неупорядоченное выполнение операций загрузки и сохранения.

При попытке выполнить инструкции не по порядку микропроцессор должен учитывать истинные зависимости между инструкциями . Например, рассмотрим простую истинную зависимость:

В этом примере addинструкция в строке 2 зависит от addинструкции в строке 1, поскольку регистр R1 является исходным операндом операции сложения в строке 2. Вторая addстрока не может выполняться до тех пор, пока не addзавершится первая строка. В этом случае зависимость является статической и легко определяется микропроцессором, поскольку источники и адресаты являются регистрами. Регистр назначения addинструкции в строке 1 ( R1) является частью кодирования инструкции и поэтому может быть определен микропроцессором на ранней стадии, на этапе декодирования конвейера. Точно так же исходные регистры addинструкции в строке 2 ( R1иR4) также закодированы в самой инструкции и определяются при декодировании. Чтобы учесть эту истинную зависимость, логика планировщика микропроцессора выдает эти инструкции в правильном порядке (сначала инструкция 1, затем инструкция 2), чтобы результаты 1 были доступны, когда они потребуются инструкции 2.

Сложности возникают, когда зависимость не определяется статически. Такие нестатические зависимости возникают с инструкциями памяти (загрузка и сохранение), потому что местоположение операнда может быть косвенно указано как операнд регистра, а не указано прямо в самой кодировке инструкции.

Здесь инструкция сохранения записывает значение в ячейку памяти, указанную значением в адресе (R2+2), а инструкция загрузки считывает значение в ячейку памяти, указанную значением в адресе (R4+4). Микропроцессор не может статически определить перед выполнением, являются ли ячейки памяти, указанные в этих двух инструкциях, разными или одинаковыми, поскольку эти ячейки зависят от значений в регистрах R2 и R4. Если места разные, инструкции независимы и могут успешно выполняться не по порядку. Однако, если местоположения одинаковы, то инструкция загрузки зависит от хранилища для создания своего значения. Это известно как неоднозначная зависимость .

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