Прогнозирование зависимости памяти — это метод, используемый высокопроизводительными микропроцессорами с внеочередным выполнением , которые выполняют операции доступа к памяти (загрузки и сохранения) вне порядка программы, чтобы предсказать истинные зависимости между загрузками и сохранениями во время выполнения инструкции . С помощью информации о предсказанной зависимости процессор может затем принять решение о спекулятивном выполнении определенных загрузок и сохранений вне порядка, предотвращая при этом выполнение других загрузок и сохранений вне порядка (сохраняя их в порядке). Позже в конвейере используются методы устранения неоднозначности памяти , чтобы определить, были ли загрузки и сохранения выполнены правильно, и, если нет, восстановить.
Используя предиктор зависимости памяти для поддержания большинства зависимых загрузок и хранилищ в порядке, процессор получает преимущества агрессивного выполнения загрузки/хранения вне очереди, но избегает многих нарушений зависимости памяти, которые происходят при неправильном выполнении загрузок и хранилищ. Это повышает производительность, поскольку уменьшает количество сбросов конвейера , необходимых для восстановления после этих нарушений зависимости памяти. См. статью о разрешении неоднозначности памяти для получения дополнительной информации о зависимостях памяти, нарушениях зависимости памяти и восстановлении.
В общем, предсказание зависимости памяти предсказывает, являются ли две операции памяти зависимыми, то есть взаимодействуют ли они, обращаясь к одному и тому же участку памяти. Помимо использования предсказания зависимости памяти от сохранения к загрузке (RAW или true) для внеочередного планирования загрузок и сохранений, были предложены и другие приложения предсказания зависимости памяти. См. например. [1]
Прогнозирование зависимости памяти — это оптимизация поверх спекуляции зависимости памяти . Семантика последовательного выполнения подразумевает, что сохранения и загрузки, по-видимому, выполняются в порядке, указанном программой. Однако, как и в случае с неупорядоченным выполнением других инструкций, может быть возможным выполнение двух операций с памятью в порядке, отличном от того, который подразумевается программой. Это возможно, когда две операции независимы. В спекуляции зависимости памяти загрузка может быть разрешена для выполнения до сохранения, которое ей предшествует. Спекуляция успешна, когда загрузка независима от сохранения, то есть когда две инструкции обращаются к разным ячейкам памяти. Спекуляция терпит неудачу, когда загрузка зависит от сохранения, то есть когда два доступа перекрываются в памяти. В первых, современных неупорядоченных конструкциях спекуляция памяти не использовалась, поскольку ее преимущества были ограничены. Поскольку область неупорядоченного выполнения увеличилась более чем на несколько десятков инструкций, использовалась наивная спекуляция зависимости памяти. В наивной спекуляции зависимости памяти [2] загрузке разрешено обходить любое предшествующее сохранение. Как и в случае с любой формой спекуляции, важно взвесить преимущества правильной спекуляции против штрафа, выплачиваемого за неправильную спекуляцию. По мере того, как область неупорядоченного выполнения увеличивается до нескольких десятков инструкций, преимущества производительности наивной спекуляции уменьшаются. Чтобы сохранить преимущества агрессивной спекуляции с зависимостью от памяти, избежав при этом издержек неправильной спекуляции, было предложено несколько предикторов.
Селективное предсказание зависимости памяти [2] [3] останавливает определенные загрузки до тех пор, пока не будет уверено, что нарушение не произойдет. Оно не предсказывает явно зависимости. Этот предиктор может задерживать загрузки дольше, чем необходимо, и, следовательно, приводить к неоптимальной производительности. Фактически, в некоторых случаях он работает хуже, чем наивное предположение обо всех загрузках как можно раньше. Это происходит потому, что часто быстрее неверно предположить и восстановиться, чем ждать выполнения всех предыдущих сохранений. Точное предсказание зависимости памяти было разработано в Университете Висконсин-Мэдисон. В частности, динамическая спекуляция и синхронизация [2] [3] задерживает загрузки только на необходимое время, предсказывая точное хранилище, которого должна ожидать загрузка. Этот предиктор предсказывает точные зависимости (пару сохранения и загрузки). Синонимы-предикторы [1] группируют все зависимости, которые разделяют общую инструкцию загрузки или сохранения. Предиктор наборов хранилищ [4] эффективно представляет несколько потенциальных зависимостей, группируя все возможные хранилища, от которых может зависеть загрузка. Предиктор барьера хранилища [5] рассматривает определенные инструкции сохранения как барьеры. То есть, все последующие операции загрузки или сохранения не могут обходить конкретное хранилище. Предсказатель барьера хранилища явно не предсказывает зависимости. Этот предсказатель может излишне задерживать последующие, но независимые загрузки. Прогнозирование зависимости памяти имеет и другие применения, помимо планирования загрузок и сохранений. Например, спекулятивное сокрытие памяти [1] и спекулятивный обход памяти [1] используют прогнозирование зависимости памяти для упрощения передачи значений через память.
Прогнозирование зависимости памяти для загрузок и сохранений аналогично прогнозированию переходов для инструкций условного перехода . При прогнозировании переходов предсказатель переходов предсказывает, каким образом будет разрешен переход, до того, как он станет известен. Затем процессор может спекулятивно извлекать и выполнять инструкции по одному из путей перехода. Позже, когда инструкция перехода выполняется, можно определить, была ли инструкция перехода правильно предсказана. Если нет, это неверное предсказание перехода , и необходима очистка конвейера, чтобы отбросить инструкции, которые были спекулятивно извлечены и выполнены.
Прогнозирование ветвления можно рассматривать как двухэтапный процесс. Сначала предиктор определяет направление ветвления (принято или нет). Это бинарное решение. Затем предиктор определяет фактический целевой адрес. Аналогично, прогнозирование зависимости памяти можно рассматривать как двухэтапный процесс. Сначала предиктор определяет, есть ли зависимость. Затем он определяет, какая это зависимость.