fence

fence

RISC-V Ассемблер Ссылка

lyszt.net охватывает fence и другие инструкции RISC-V более подробно.

Описание

Инструкции FENCE используются для упорядочивания операций ввода-вывода устройств и обращений к памяти с точки зрения других ха́ртов RISC-V и внешних устройств или сопроцессоров. Любая комбинация ввода устройства (I), вывода устройства (O), чтений памяти (R) и записей памяти (W) может быть упорядочена относительно любой комбинации тех же операций. Неформально говоря, ни один другой харт RISC-V или внешнее устройство не может наблюдать какую-либо операцию из множества successor, следующего за FENCE, раньше любой операции из множества predecessor, предшествующего FENCE. memorymodel содержит точное описание модели согласованности памяти RISC-V.

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

ℹ
Устройство может наблюдать обращение к ячейке памяти через некоторый внешний механизм связи, например, регистр управления с отображением в память, который управляет сигналом прерывания для контроллера прерываний. Эта связь находится вне области действия механизма упорядочивания FENCE, и поэтому инструкции FENCE не могут давать никаких гарантий относительно того, когда изменение сигнала прерывания станет видимым для контроллера прерываний. Конкретные устройства могут предоставлять дополнительные гарантии упорядочивания для снижения накладных расходов программного обеспечения, но они находятся вне области действия модели памяти RISC-V.

EEI определит, какие операции ввода-вывода возможны, и в частности, какие адреса памяти при доступе к ним посредством инструкций загрузки и сохранения будут трактоваться и упорядочиваться как операции ввода устройства и вывода устройства соответственно, а не как чтения и записи памяти. Например, к устройствам ввода-вывода с отображением в память обычно обращаются с помощью некэшируемых загрузок и сохранений, которые упорядочиваются с использованием битов I и O, а не битов R и W. Расширения набора инструкций также могут описывать новые инструкции ввода-вывода, которые также будут упорядочиваться с использованием битов I и O в инструкции FENCE.

Кодирование режима Fence

Поле режима FENCE fm определяет семантику инструкции FENCE. FENCE (с fm=0000) упорядочивает все операции с памятью в своём множестве предшественников перед всеми операциями с памятью в своём множестве последователей.

Инструкция FENCE.TSO кодируется как инструкция FENCE с fm=1000, predecessor=RW и successor=RW. FENCE.TSO упорядочивает все операции загрузки в своём множестве предшественников перед всеми операциями с памятью в своём множестве последователей, а также все операции сохранения в своём множестве предшественников перед всеми операциями сохранения в своём множестве последователей. Это оставляет операции сохранения non-AMO во множестве предшественников FENCE.TSO's неупорядоченными относительно загрузок non-AMO в его множестве последователей.

ℹ
Поскольку FENCE RW,RW накладывает надмножество упорядочений, накладываемых FENCE.TSO, корректно игнорировать поле fm и реализовывать FENCE.TSO как FENCE RW,RW.

Неиспользуемые поля в инструкциях FENCE --rs1 and rd-- зарезервированы для мелкозернистых fence в будущих расширениях. Для прямой совместимости базовые реализации должны игнорировать эти поля#, а стандартное программное обеспечение должно обнулять эти поля. Аналогично, многие настройки fm и множеств предшественников/последователей также зарезервированы для будущего использования. Базовые реализации должны трактовать все такие зарезервированные конфигурации как инструкции FENCE (с fm=0000), а стандартное программное обеспечение должно использовать только незарезервированные конфигурации.

ℹ
Мы выбрали ослабленную модель памяти, чтобы обеспечить высокую производительность простых реализаций машин и вероятных будущих расширений сопроцессоров или ускорителей. Мы отделяем упорядочивание ввода-вывода от упорядочивания чтений/записей памяти, чтобы избежать ненужной сериализации внутри харта драйвера устройства, а также для поддержки альтернативных непамятных путей управления добавленными сопроцессорами или устройствами ввода-вывода. Простые реализации могут дополнительно игнорировать поля predecessor and successor и всегда выполнять консервативный FENCE для всех операций.