Size: a a a

Compiler Development

2020 January 13

AT

Alexander Tchitchigin in Compiler Development
Михаил Бахтерев
Ну. Ущерба никто не хочет, конечно. Но эти все алгоритмы сильно привязаны к особенностям железа: на одном CPU всё отлично, на другом лезут невоспроизводимые баги. Поэтому, к таким средствам прибегают, по моему опыту, только тогда, когда нужна именно производительность
"Привязанные к CPU" - это уж совсем лютые какие-то lock-free примитивы, я про такие даже не слышал...
источник

МБ

Михаил Бахтерев in Compiler Development
Alexander Tchitchigin
"Привязанные к CPU" - это уж совсем лютые какие-то lock-free примитивы, я про такие даже не слышал...
Ну. libatomic такая: разное поведение на разных процессорах. Человек не правильно понял спецификацию (или она некорректная), отладился у себя, а потом завесил кластер на полдня. Бывает...
источник

AT

Alexander Tchitchigin in Compiler Development
Михаил Бахтерев
Ну. Нет. Во всех этих алгоритмах есть гонки. Иначе не выбрать победителя
OK, неточно выразился - я имел в виду гонки, которые приводят к потере/искажению данных.
В этом смысле критерий корректности - целостность данных, который вполне обеспечивается lock-free примитивами (про которые я знаю).
источник

EM

Evgenii Moiseenko in Compiler Development
Alexander Tchitchigin
"гонки на атомарных переменных" - это не оксюморон ли? 😃
ну нет,
гонка - это просто когда между двумя обращениями к одной ячейке памяти, одно из которых запись, не гарантируется happens-before.
в контексте C/C++ гонки на неатомарых переменных — это UB, остальные гонки это уже забота программиста lock-free алгоритмов
источник

МБ

Михаил Бахтерев in Compiler Development
Alexander Tchitchigin
OK, неточно выразился - я имел в виду гонки, которые приводят к потере/искажению данных.
В этом смысле критерий корректности - целостность данных, который вполне обеспечивается lock-free примитивами (про которые я знаю).
Ну. Речь же не о примитивах, а о структурах данных, которые поверх ваяют пользователи
источник

EM

Evgenii Moiseenko in Compiler Development
Alexander Tchitchigin
OK, неточно выразился - я имел в виду гонки, которые приводят к потере/искажению данных.
В этом смысле критерий корректности - целостность данных, который вполне обеспечивается lock-free примитивами (про которые я знаю).
ну вот "целостность" данных — это уже критерий специфичный для каждой конкретной структуры данных и гарантий на нее
источник

EM

Evgenii Moiseenko in Compiler Development
например, что такое по-вашему lock-free stack ??
источник

AT

Alexander Tchitchigin in Compiler Development
Михаил Бахтерев
Ну. Речь же не о примитивах, а о структурах данных, которые поверх ваяют пользователи
Классические (по меньшей мере) lock-free структуры типа очередей тоже строятся так, чтобы не терять данные. 🤷‍♀️
источник

МБ

Михаил Бахтерев in Compiler Development
Alexander Tchitchigin
Классические (по меньшей мере) lock-free структуры типа очередей тоже строятся так, чтобы не терять данные. 🤷‍♀️
Да. Но каждый ли пользователь умеет это накодить процессоронезависимым образом? Даже в intel tbb встречаются косячки
источник

AT

Alexander Tchitchigin in Compiler Development
Evgenii Moiseenko
например, что такое по-вашему lock-free stack ??
Если мы говорим про корректность, то, очевидно, lock-free stack должен уточнять (refine) спецификацию stack. Спецификацию на стек в виде Abstract Data Type можно найти в Википедии и примерно всех учебниках, рассказывающих про ADT.
То, что он на самом деле lock-free - немного другой вопрос, формализующийся, обычно, в TLA+ или, там, сетях Петри.
Я ответил на вопрос "что такое lock-free stack по-моему"? 😊
Какой аспект Вы хотели узнать?
источник

МБ

Михаил Бахтерев in Compiler Development
Моё утверждение не о том, что lock-free плохо. А о том, что к нему прибегают, когда нужно выжимать производительность. Корректности добиваться с этим кодом тяжело
источник

AT

Alexander Tchitchigin in Compiler Development
Михаил Бахтерев
Да. Но каждый ли пользователь умеет это накодить процессоронезависимым образом? Даже в intel tbb встречаются косячки
Ошибки реализации потому и называются ошибками, по-моему. В lock-full алгоритмах и структурах они тоже бывают сплошь и рядом, ибо concurrency is hard. Никто же не говорит, что их не нужно исправлять, а тем более - целенаправленно вносить?
источник

МБ

Михаил Бахтерев in Compiler Development
Alexander Tchitchigin
Ошибки реализации потому и называются ошибками, по-моему. В lock-full алгоритмах и структурах они тоже бывают сплошь и рядом, ибо concurrency is hard. Никто же не говорит, что их не нужно исправлять, а тем более - целенаправленно вносить?
Ну. Речь о том, что вероятность накосячить с lock-free гораздо выше, чем с lock-full. Поэтому, я и говорю, что на такое идут, когда производительность нужна позарез. Ну, то есть, мы осознанно идём по минному полю, потому что миллисекунды имеют значение.
источник

AG

Alex Gryzlov in Compiler Development
локфри же дает не сколько производительность по моему, сколько предсказуемость
источник

AT

Alexander Tchitchigin in Compiler Development
Михаил Бахтерев
Моё утверждение не о том, что lock-free плохо. А о том, что к нему прибегают, когда нужно выжимать производительность. Корректности добиваться с этим кодом тяжело
С этим я согласен. Но тогда мы говорим о производительности за счёт времени и усилий разработчика, а не в ущерб корректности. Т.е. всё ещё корректность важнее производительности (и усилий разработчика).
источник

EM

Evgenii Moiseenko in Compiler Development
Alexander Tchitchigin
Если мы говорим про корректность, то, очевидно, lock-free stack должен уточнять (refine) спецификацию stack. Спецификацию на стек в виде Abstract Data Type можно найти в Википедии и примерно всех учебниках, рассказывающих про ADT.
То, что он на самом деле lock-free - немного другой вопрос, формализующийся, обычно, в TLA+ или, там, сетях Петри.
Я ответил на вопрос "что такое lock-free stack по-моему"? 😊
Какой аспект Вы хотели узнать?
ну хорошо, давайте рассмотрим не стек, а список (со списком мне проще показать мой поинт :)
Вот приходит один поток и говорит, хочу посчитать сумму элементов в списке.
В это время второй поток берёт и добавляет в середину новую ноду.
Что должна вернуть сумма? Должна она увидеть новую ноду или нет ?
источник

AT

Alexander Tchitchigin in Compiler Development
Evgenii Moiseenko
ну хорошо, давайте рассмотрим не стек, а список (со списком мне проще показать мой поинт :)
Вот приходит один поток и говорит, хочу посчитать сумму элементов в списке.
В это время второй поток берёт и добавляет в середину новую ноду.
Что должна вернуть сумма? Должна она увидеть новую ноду или нет ?
Вы серьёзно считаете, что есть какое-то абсолютное "должно" или "правильно" без спецификации что именно ожидается в каком случае? 😉
источник

EM

Evgenii Moiseenko in Compiler Development
Alexander Tchitchigin
Вы серьёзно считаете, что есть какое-то абсолютное "должно" или "правильно" без спецификации что именно ожидается в каком случае? 😉
ну мой поинт в этом же и был, для каждой конкретной лок-фри структуры данных у нас будут свои гарантии
источник

EM

Evgenii Moiseenko in Compiler Development
и они часто не интринтуитивны, потому-что в lock-free часто отсутствует понятие "глобального" времени/памяти, и гонки это норма
источник

AT

Alexander Tchitchigin in Compiler Development
Evgenii Moiseenko
ну мой поинт в этом же и был, для каждой конкретной лок-фри структуры данных у нас будут свои гарантии
Для структур-то гарантии одинаковые - не терять (закоммиченные) данные. Это для алгоритмов могут быть разные требования. 😊
источник