Size: a a a

Compiler Development

2020 January 10

AS

Aleksey Shipilev in Compiler Development
Ну вот multi-copy atomicity (MCA) -- это такая попытка. MCA говорит, что запись видна либо сразу всем процам, либо ни одному. Когда MCA нет, IRIW разваливается тривиальным способом.
источник

AS

Aleksey Shipilev in Compiler Development
До одного проца долетело сначала одно, а до другого - сначала другое.
источник

AS

Aleksey Shipilev in Compiler Development
Даже размышлений о хардваре не надо, простая физика: два сокета, на каждом проце бежит пара "читающий" и "пишущий". Внутри сокета значение от ближайшего "пищущего" прилетит быстрее, чем из другого сокета от другого "пишущего".
источник

AS

Aleksey Shipilev in Compiler Development
(Другими словами, это для *обеспечения* MCA надо попотеть, а нахаляву IRIW и так развалится)
источник

I

Ioann_V in Compiler Development
Начинаю понимать, но нужно времч :D
источник

AS

Aleksey Shipilev in Compiler Development
По опыту скажу, что пытаться понимать абстрактную модель памяти через хардварную модель -- это только себя запутывать. Вот рассуждение про MCА -- оно про то, как просто получить фейл в хардваре.
источник

AS

Aleksey Shipilev in Compiler Development
Выныривая из хардварного, вы "просто поймите", что если вы делаете release, то это ещё не гарантия, что он "случится" в каком-то там глобальном порядке с другими acquire-ами и release-ами. (Другими словами, нет последовательной памяти, которая их сериализует). Для глобального порядка нужен более сильный seqcst.
источник

AS

Aleksey Shipilev in Compiler Development
(если это не понятно, то пропустите, это потом придёт) Можно было думать, что если один поток увидел запись, то и второй должен. А нет! Тут есть метафизический гвоздь про "если А, то Б (на разных процах)", который вообще-то про время. А под интуитивным пониманием времени таится глобальный порядок, которого без seqcst нет :D
источник

I

Ioann_V in Compiler Development
Спасибо, буду вкуривать еще и еще - тут главное понять, что порядок не определен просто ПО ОПРЕДЕЛЕНИЮ. А я еще и вкурить пытаюсь как оно там в железе....
источник

AS

Aleksey Shipilev in Compiler Development
Про железо можно повкуривать, но вот слабость в определении развязывает руки не только хардвару, см. ниже. На хардваре проще убедиться, что такое в принципе может реализоваться, а дальше курить высокоуровневую модель ;)
источник

AS

Aleksey Shipilev in Compiler Development
Но про multi-copy atomic -- это деталь хардварной реализации. Так-то более слабый acq/rel (по отношению к seqcst) могут и компиляторы эксплуатировать, двигая независимые acq/rel-ы друг через друга. Емнип, у Саттера были такие примеры.
источник

AS

Aleksey Shipilev in Compiler Development
Могу ещё дальше мозг форматнуть. Смотрите опять на пример:
Thread 2: y = 1
Thread 3: r2 = y; // r2 <- 0
Thread 4: r3 = y; // r3 <- 1

Вы сказали, что такое возможно, потому что "Поток 3 перед потоком 2, а 4-ый после второго". И это правильный ответ. Но есть *ещё один правильный ответ*, который не очевиден без гвоздодёра:

Thread 2: y = 1   // выполнился первым
Thread 3: r2 = y; // выполнился вторым, и НЕ УВИДЕЛ 1
Thread 4: r3 = y;

Другими словами, выполнение "первый-второй-третий" НЕ говорит, что эффекты видны в таком порядке. (То есть, у нас нет некоторого строго-консенсусного последовательного хранилища) (То есть, у нас нет глобального порядка) (То есть, это самое "время" нам вообще ничем не помогает). В этом состоит гвоздь иллюзии про сериализованную память.

Хардварная аналогия, если так хочется: исполнение реально доехало до инструкций в каждом потоке в порядке "первый-второй-третий", каждый поговорил с подсистемой памяти, но получил *разные* ответы! (ввиду простых физических ограничений во время полёта обеих записей).
источник

EM

Evgenii Moiseenko in Compiler Development
Ioann_V
Спасибо, буду вкуривать еще и еще - тут главное понять, что порядок не определен просто ПО ОПРЕДЕЛЕНИЮ. А я еще и вкурить пытаюсь как оно там в железе....
Лучше забудьте про аналогии с хардваром, кешами, буферами и прочим и рассуждайте в терминах happens-before итп
источник

EM

Evgenii Moiseenko in Compiler Development
Если есть две операции над разными локациями и между ними не гарантируется наличие happens before, то порядок их исполнения "не определён"
источник
2020 January 11

DP

Dmitry Ponyatov in Compiler Development
Kitsu
Казалось бы, зачем универсальный ЯП, когда можно использовать тот у которого фичи наиболее подходящие для задачи. Все равно одного языка мало кому хватает в повседневной работе
какой бы язык не взять, половины фич нет, 30% сделано не так как хочется, а в итоге все равно рантайм не лезет в железо
источник

DP

Dmitry Ponyatov in Compiler Development
Yuriy Syrovetskiy
вы спросили: зачем универсальный ЯП?
вы ответили: одного языка мало кому хватает в повседневной работе
и околонулевой interop между существующими
источник

DP

Dmitry Ponyatov in Compiler Development
Andrei Kurosh
один универсальный язык будет одинаково плох для всех задач ;)
или гениально-великолепен, но экспоненциально сложен в процессе использования
источник

M

MaxGraey in Compiler Development
Dmitry Ponyatov
или гениально-великолепен, но экспоненциально сложен в процессе использования
Был уже такой. PL/1 назывался
источник

FO

FORTRAN ONE LOVE in Compiler Development
Ioann_V
Да, вот такое возможно
Ичпользуйте MPI и не морочьте людям голову
источник

FO

FORTRAN ONE LOVE in Compiler Development
И ставьте барьеры где надо в группах
источник