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

Потоки 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, кроме [...]

1 Ответ

1 голос
/ 31 октября 2019

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


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

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

Ссылка:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...