Какой барьер памяти ARM гарантирует, что один из двух потоков будет наблюдать за тем, что написал другой поток?

Потоки A и B выполняются одновременно. Какие типы барьеров памяти ARMv8-A (например, DMB, DSB) достаточны для выполнения постусловия и почему?

Initially x1 = 0, x2 = 0


Thread A         |   Thread B
----------------------------------
x1 = 1           |   x2 = 1
barrier          |   barrier
y1 = x2          |   y2 = x1


Postcondition: (y1 == 1) || (y2 == 1)

Я посмотрел на определение модели памяти в Справочном руководстве по архитектуре ARMv8-A DMB и DSB, но не смог вывести аргумент, почему постусловие будет выполняться даже с барьером памяти DSB. Я думаю, что ключевые определения в Справочном руководстве по архитектуре:

Инструкция DMB гарантирует, что все затронутые обращения к памяти со стороны PE, выполняющего DMB, которые появляются в программном порядке перед DMB, и те, которые исходят от другого PE, [...] которые наблюдались PE перед выполнением DMB, Наблюдаются каждым PE [...] перед любыми доступами к затронутой памяти, которые появляются в программном порядке после DMB. Наблюдаются этим PE.

а также

DSB, выполняемый PE [...] завершается, когда выполняются все следующие условия:

  • Все явные обращения к памяти требуемых типов доступа, появляющиеся в программном порядке перед DSB, являются завершенными для набора наблюдателей в требуемой области совместного использования.

  • [...]

а также

Кроме того, никакая инструкция, которая появляется в программном порядке после инструкции DSB, не может изменить какое-либо состояние системы или выполнить какую-либо часть ее функций до завершения DSB, кроме [...]


person anonymous    schedule 29.10.2019    source источник


Ответы (1)


Unix smurf написал серию статей о Барьеры памяти ARM. DSB - это расширенный набор DMB, или, другими словами, DSB является более строгим. DMB достаточно для обеспечения завершения записи в x1 и x2 до обновления y1 или y2 с использованием нормальной памяти. Т.е., это достаточная замена барьером в вашем примере на большинстве систем ARM, где DSB также работает.


ОС может использовать различные свойства в таблицах MMU, и это может повлиять на ваши результаты. Например, при использовании графической ОЗУ или буфера некоторых сетевых устройств в качестве резервного хранилища для x1, x2 может не потребоваться выдача dmb или dmb могут потребоваться другие параметры, поскольку этот тип памяти может быть помещен в другой домен.

Фактически, ОС, вероятно, может полностью разрушить эти механизмы. Это не будет фактором для большинства случаев использования, и я просто констатирую его полноту. Также возможны системы AMP (асимметричные многопроцессорные системы), где это не сработает. Например, если у вас есть система с ARMv8 и Cortex-M.

Ссылка:

person artless noise    schedule 31.10.2019
comment
ldrex и strex также могут работать. DMB - это самая легкая версия, и если одна работает, то все должны. - person artless noise; 31.10.2019