Потоки 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, кроме [...]
dmb ish
- person curiousguy   schedule 30.10.2019