#assembly #memory #arm64
#сборка #память #arm64
Вопрос:
Я пытался понять порядок загрузки / хранения памяти в aarch64, и мне было интересно, необходим ли барьер памяти в таком коде:
ldr x0, =0x9000
ldr x1, [x0]
orr x1, x1, #1
/* is memory barrier (dmb) necessary here? */
str x1, [x0]
Насколько я понял, CPU может изменить порядок, чтобы str мог быть выполнен до завершения ldr. Давайте предположим, что у нас только одно ядро процессора, поэтому нет SMP.
Комментарии:
1. Если бы вы были правы, то gcc был бы нарушен . Что является веской причиной подозревать, что вы не правы.
2. Взгляните на Справочное руководство , B2.3.2 «Упорядочение и наблюдаемость». Переупорядочение, которое вы описываете, запрещено по множеству причин.
3. Вообще говоря, упорядочение памяти происходит только тогда, когда хранилища, созданные одним ядром, будут видны нагрузкам, созданным другим ядром. Без SMP концепция не имеет значения. Процессор организует с помощью кэшей или буферов, чтобы все, что кажется однопоточной программе, выполнялось по порядку, даже если за кулисами он выполняет фактические операции чтения / записи в память в каком-то другом порядке.
4. Память всегда согласована с ядром, на котором выполняется ваш код. Барьеры памяти требуются только тогда, когда другие потоки асинхронно взаимодействуют с вашими данными (или в определенных ситуациях при написании драйверов устройств или операционных систем).
5. Спасибо! На самом деле, я всегда думал, что это актуально только для нескольких потоков / ядер, но некоторые тексты (среди них справочное руководство) заставили меня думать иначе. 🙂