Концептуальная модель для систем ARM заключается в том, что каждый процессор считывает и записывает данные в свою собственную полную копию памяти, и каждая запись распространяется на другие процессоры независимо, при этом допускается переупорядочивание по мере распространения записей.
Архитектура
Что это может значить для нас, разберем на примерах:
-----
Пример №1 - переупорядочивание операций записи.
Может ли программы вывести результат
r1 = 1, r2 = 0?
// Thread 1 // Thread 2
x = 1 r1 = y
y = 1 r2 = x
SC: Нет
X86: Нет
ARM: Да, так как операции записи при распространении между ядрами могут придти не в том порядке в котором они были в коде.
-----
Пример №2 - Локальные буфферы для операци записи и чтение из других ядер.
Может ли программа вывести результат (пример из прошлого поста)
r1 = 0, r2 = 0?
// Thread 1 // Thread 2
x = 1 y = 1
r1 = y r2 = x
SC: Нет
X86: Да
ARM: Да
-----
Пример №3 - Независимые чтения независимых записей / Independent Reads of Independent Writes (IRIW)
Может ли программа вывести результат
r1 = 1, r2 = 0, r3 = 1, r4 = 0?
// Thread 1
x = 1
// Thread 2
y = 1
// Thread 3
r1 = x
r2 = y
// Thread 4
r3 = y
r4 = x
SC: Нет
X86: Нет
ARM: Да
На ARM разные потоки могут узнавать о разных записях в разных порядках. Они не гарантируют согласия относительно общего порядка записей, достигающих основной памяти, поэтому поток 3 может видеть изменение X до Y а поток 4 видит Y изменение до X.
-----
Пример №4 - Буфферизация чтений
Может ли программа вывести результат
r1 = 1, r2 = 1?
// Thread 1 // Thread 2
r1 = x r2 = y
y = 1 x = 1
SC: Нет
X86: Нет
ARM: Да В модели памяти ARM процессорам разрешено откладывать чтение до тех пор, пока не будут выполнены записи в потоке инструкций, так что y = 1 и x = 1 выполняются до двух чтений.
-----
Пример №5 - Когерентность.
Может ли программа вывести результат
r1 = 1, r2 = 2, r3 = 2, r4 = 1
// Thread 1
x = 1
// Thread 2
x = 2
// Thread 3
r1 = x
r2 = x
// Thread 4
r3 = x
r4 = x
SC: Нет
X86: Нет
ARM: Нет.
Казалось бы, программа идентична примеру №3, за исключением одного - потоки работают с одной общей переменной X. Может ли получиться так что разные потоки увидят разные значения X? Нет, ARM гарантирует что операции над одной области памяти упорядочиваются. И поэтому потоки не могут увидеть разные результаты записи. Это свойство называется когерентность. Именно оно позволяет программам под ARM быть мало мальски детерминированными.
На этом думаю примеров достаточно, особенностей куда больше, но их разбор может подзатянуться надолго. Целью поста было показать концептуальные различия и поведение моделей памяти.
---
На этом всё, спасибо что читали. Надеюсь мне удалось показать вам дивный новый мир и вы узнали что-то новое о железе для себя (Я точно узнал, пока писал посты😄).
Завтра сделаю заключительный пост по моделям памяти в котором порассуждаю на тему того зачем это всё знать + приложу все ссылки и статьи которые мне пригодились.