Size: a a a

Compiler Development

2020 January 10

AS

Aleksey Shipilev in Compiler Development
Вооот. Чуете? То, что вы что-то в коде acq-ите, не гарантирует, что этот acq увидит нужный вам rel. (Поэтому в примере и нарисован busy-loop на чтении!). Acq/rel говорит, что если вы *увидели* релизящую запись, то всё зарелиженное ею видно всем таким "увидевшим" (заэквайрившим).
источник

AS

Aleksey Shipilev in Compiler Development
То есть в примере выше acq/rel говорит, что запрещено (r1, r2) = (1, 0)
источник

AS

Aleksey Shipilev in Compiler Development
Едем дальше, расширяем это понимание про acq/rel.
Thread 1:
"release" x = 1
Thread 2:
"release" y = 1;
Thread 3:
 r1 = "acquire" x
 r2 = "acquire" y

Какие (r1, r2) возможны? (я подожду)
источник

I

Ioann_V in Compiler Development
0, 0
1, 0
0, 1
1, 1
источник

AS

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

I

Ioann_V in Compiler Development
Все так!
источник

I

Ioann_V in Compiler Development
// Спасибо, что тратите свое время :!
источник

AS

Aleksey Shipilev in Compiler Development
Вот. Теперь мы присобачиваем четвёртый тред:
Thread 4:
r3 = "acquire" y
r4 = "acquire" x
...и внезапно оказывается, что к нему записи *тоже* прилетают в неизвестно каком порядке! И самая мякотка в том, что этот порядок *не зависит* о того, что там третьему треду прилетело.
источник

AS

Aleksey Shipilev in Compiler Development
Это и есть IRIW.
источник

I

Ioann_V in Compiler Development
Так, вникаю. Думаю.
источник

I

Ioann_V in Compiler Development
В том примере, что я кидал.
источник

MM

Mikhail Maltsev in Compiler Development
Но все нормальные архитектуры же сейчас multi copy atmoic, так что такие ужасы на практике не встречаются, так?
источник

AS

Aleksey Shipilev in Compiler Development
Симметрия вашего оригинального примера с классическим IRIW такая же: оригинальный пример ждёт, пока r1 и r3 не станут 1, а потом проваливает проверки на r2 и r4, читая в них 0. Таким образом третий тред увидел (r1, r2) = (1, 0), четвёртый увидел (r3, r4) = (1, 0). Всё.
источник

AS

Aleksey Shipilev in Compiler Development
Mikhail Maltsev
Но все нормальные архитектуры же сейчас multi copy atmoic, так что такие ужасы на практике не встречаются, так?
POWER ещё живёт и здравствует; в порте JVM на PPC64 "такие ужасы" встречаются ;)
источник

AS

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

I

Ioann_V in Compiler Development
Aleksey Shipilev
Симметрия вашего оригинального примера с классическим IRIW такая же: оригинальный пример ждёт, пока r1 и r3 не станут 1, а потом проваливает проверки на r2 и r4, читая в них 0. Таким образом третий тред увидел (r1, r2) = (1, 0), четвёртый увидел (r3, r4) = (1, 0). Всё.
В ваших примерах все очевидно, а  в моем нет:
У нас цикл крутится, ждет единицы. Окей, дождался. Если единицы произошли, это значит, что в потоках 1, 2 произошли release операции, а это значит, что если запрашивать их через acq, то получим в чтении 1! В ваших примерах вот в чем суть - если поменять на seq_cst результаты и ответы будут те же...
источник

I

Ioann_V in Compiler Development
то есть в какой то из потоков, вы запросив acq после цикла, получим 1
источник

AZ

Alexander Zaitsev in Compiler Development
Ioann_V
В ваших примерах все очевидно, а  в моем нет:
У нас цикл крутится, ждет единицы. Окей, дождался. Если единицы произошли, это значит, что в потоках 1, 2 произошли release операции, а это значит, что если запрашивать их через acq, то получим в чтении 1! В ваших примерах вот в чем суть - если поменять на seq_cst результаты и ответы будут те же...
один дождался и увидел. а для второго изменения не видны
источник

I

Ioann_V in Compiler Development
Alexander Zaitsev
один дождался и увидел. а для второго изменения не видны
так он, второй то есть, тоже же делает acq, то есть они не видны до acq, но как только делается - становится
источник

AS

Aleksey Shipilev in Compiler Development
Тут важно вытащить из головы гвоздь о том, что acq/rel "глобальные" операции, и разные acq-и связаны с разными rel-ами. Нет! Они только для соответствующих пар переменных.
источник