powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Когда использовать atomic_compare_exchange_weak, а когда atomic_compare_exchange_strong?
18 сообщений из 18, страница 1 из 1
Когда использовать atomic_compare_exchange_weak, а когда atomic_compare_exchange_strong?
    #38384826
weak vs strong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В каких случаях необходимо использовать atomic_compare_exchange_weak, а в каких atomic_compare_exchange_strong?
http://en.cppreference.com/w/cpp/atomic/atomic_compare_exchange

авторWhen a compare-and-exchange is in a loop, the weak version will yield better performance on some platforms. When a weak compare-and-exchange would require a loop and a strong one would not, the strong one is preferable.

Если по русски, то когда compare-and-exchange в цикле, то лучше weak. А когда weak может потребовать цикл, а strong не потребует, то лучше strong.
Вопрос, а когда такой случай может быть в реальности?

Например: std::atomic | compare_exchange_weak vs. compare_exchange_strong
авторAs such, an LL/SC pair is stronger than a read followed by a compare-and-swap ( CAS ), which will not detect updates if the old value has been restored (see ABA problem ).
Я правильно понял, что здесь пишут о том, что weak может выдать false если сравниваемые значения равны, но была замена по типу ABA, т.е. изменение было, но в конце заменили на то же значение?

Хорошо, т.е. мы с помощью weak можем решать проблему ABA и вообще weak имеет смысл только для ABA?

Но во-первых требуется LL/SC , которые есть только в: DEC Alpha, MIPS, PowerPC and ARM (v6 and later).
Т.е. на фига такое решение ABA, когда на одних процессорах оно работает, а на других нет (например x86)?

А во-вторых там же в http://en.wikipedia.org/wiki/ABA_problem пишут:
авторExamples include DEC Alpha, MIPS, PowerPC and ARM (v6 and later). However no practical implementations of load linked will directly solve the ABA problem . [Michael]
Спрашивается, на кой нужен weak и чем он лучше, за исключением ABA - которую он где-то решает, а где-то и не решает, а там где решает эту случаи и не известны?
...
Рейтинг: 0 / 0
Когда использовать atomic_compare_exchange_weak, а когда atomic_compare_exchange_strong?
    #38385334
_Прохожий_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LL/SC это 2 команды процессора между которыми заключено произвольное количество команд. LL(Load-Link) вытаскивает данные в контролируемое хранилище, SC(Store-Conditional) аппаратно гарантирует ошибку при попытке записать эти "защищенные" данные, если они изменялись после выполнения LL, независимо от значения в них. Т.е. ошибка будет и в случае если операнд LL был равен 1, потом изменен на 0 и к моменту выполнения SC снова стал равен 1.
От ABA LL/SC защищает только если вы часть своего алгоритма, связанную с выборкой данных и их модификацией помещаете между LL и SC.

При эмуляции CAS с помощью LL/SC, т.е. в atomic_compare_exchange никакой защиты от ABA нет.
...
Рейтинг: 0 / 0
Когда использовать atomic_compare_exchange_weak, а когда atomic_compare_exchange_strong?
    #38385386
weak vs strong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Прохожий_LL/SC это 2 команды процессора между которыми заключено произвольное количество команд. LL(Load-Link) вытаскивает данные в контролируемое хранилище, SC(Store-Conditional) аппаратно гарантирует ошибку при попытке записать эти "защищенные" данные, если они изменялись после выполнения LL, независимо от значения в них. Т.е. ошибка будет и в случае если операнд LL был равен 1, потом изменен на 0 и к моменту выполнения SC снова стал равен 1.
От ABA LL/SC защищает только если вы часть своего алгоритма, связанную с выборкой данных и их модификацией помещаете между LL и SC.

При эмуляции CAS с помощью LL/SC, т.е. в atomic_compare_exchange никакой защиты от ABA нет.
Ну тогда тем более вопрос, зачем нужен weak если он не решает никаких проблем, а может только ложно давать false и лишний раз пускать по циклу?
...
Рейтинг: 0 / 0
Когда использовать atomic_compare_exchange_weak, а когда atomic_compare_exchange_strong?
    #38385414
_Прохожий_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сугубое ИМХО:

В случае LL/SC может вернуть false, если значение флага не изменилось в CAS, но он тем не менее менялся, т.к. связка LL/SC выполняется процессором не атомарно. Т.е. локальная ABA случилась внутри CAS, а не внутри какого-то lock-free алгоритма.
На x86 CAS операция будет выполнена атомарно, никто 100% не сможет изменить флаг при выполнении например LOCK CMPXCHG.
Внутри LL/SC это возможно.
...
Рейтинг: 0 / 0
Когда использовать atomic_compare_exchange_weak, а когда atomic_compare_exchange_strong?
    #38385465
weak vs strong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Прохожий_Сугубое ИМХО:

В случае LL/SC может вернуть false, если значение флага не изменилось в CAS, но он тем не менее менялся, т.к. связка LL/SC выполняется процессором не атомарно. Т.е. локальная ABA случилась внутри CAS, а не внутри какого-то lock-free алгоритма.
На x86 CAS операция будет выполнена атомарно, никто 100% не сможет изменить флаг при выполнении например LOCK CMPXCHG.
Внутри LL/SC это возможно.
Спасибо, это было понятно и из предыдущего вашего сообщения :) Это подтверждает, что weak не имеет смысла.
А CAS на x86 бывает без LOCK?
...
Рейтинг: 0 / 0
Когда использовать atomic_compare_exchange_weak, а когда atomic_compare_exchange_strong?
    #38385481
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
weak vs strongА CAS на x86 бывает без LOCK?
Конечно бывает, не атомарный :)
...
Рейтинг: 0 / 0
Когда использовать atomic_compare_exchange_weak, а когда atomic_compare_exchange_strong?
    #38385506
weak vs strong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovskyweak vs strongА CAS на x86 бывает без LOCK?
Конечно бывает, не атомарный :)
Я имею ввиду может ли atomic_compare_exchange_weak скомпилироваться во что-то отличное от блокирующего CMPXCHG? :)
...
Рейтинг: 0 / 0
Когда использовать atomic_compare_exchange_weak, а когда atomic_compare_exchange_strong?
    #38385511
weak vs strong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
http://david.jobet.free.fr/wiclear-blog/?fr/2010-10-17-c -atomic-lib-impl-rules
авторThere is no compare exchange "weak" operation on x86. It is equivalent to a compare exchange "strong" operation.

In the standard, the difference is that it allows it to fails spuriously. I guess this is to allow implementation using LL/SC instead of a CAS.
По крайней мере я теперь знаю, что на x86 нет разницы между weak и strong, но нафига нужен weak на других платформах - большая загадка.
...
Рейтинг: 0 / 0
Когда использовать atomic_compare_exchange_weak, а когда atomic_compare_exchange_strong?
    #38385527
_Прохожий_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На x86 без разницы, там внутри CAS не может ничего случится отличного в обоих вариантах, для процессоров с LL/SC возможны варианты реализации с weak и strong. Правда я бы не рискнул отдавать это на откуп их реализации в библиотеках.

Что касается атомарности, то CMPXCHG без LOCK тоже атомарна на 100%, LOCK заставляет отреагировать кэш другого процессора.
Важна не только атомарность команды процессора, на середине выполнения INC, ADD и т.д. x86 тоже не прерывается.
...
Рейтинг: 0 / 0
Когда использовать atomic_compare_exchange_weak, а когда atomic_compare_exchange_strong?
    #38385574
weak vs strong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Прохожий_На x86 без разницы, там внутри CAS не может ничего случится отличного в обоих вариантах, для процессоров с LL/SC возможны варианты реализации с weak и strong. Правда я бы не рискнул отдавать это на откуп их реализации в библиотеках.

Что касается атомарности, то CMPXCHG без LOCK тоже атомарна на 100%, LOCK заставляет отреагировать кэш другого процессора.
Важна не только атомарность команды процессора, на середине выполнения INC, ADD и т.д. x86 тоже не прерывается.
Да, пока что из доступной информации: в x86 нет разницы weak/strong, для LL/SC есть разница, weak всегда хуже чем strong и weak никогда не имеет смысла :)

То что XCHG всегда эквивалентно LOCK XCHG, а CMPXCHG отличается от LOCK CMPXCHG - понятно, но в какую из них должно скомпилироваться atomic_compare_exchange_weak с relaxed, в CMPXCHG или LOCK CMPXCHG на x86?
...
Рейтинг: 0 / 0
Когда использовать atomic_compare_exchange_weak, а когда atomic_compare_exchange_strong?
    #38385682
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Прохожий_Что касается атомарности, то CMPXCHG без LOCK тоже атомарна на 100%, LOCK заставляет отреагировать кэш другого процессора.
Атомарность в пределах одного процессора никому не нужна.
А для многопроцессорных - без lock ни про какую атомарность речь не идет.
...
Рейтинг: 0 / 0
Когда использовать atomic_compare_exchange_weak, а когда atomic_compare_exchange_strong?
    #38385698
_Прохожий_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На x86 всегда в LOCK CMPXCHG конечно.
В случае эмуляции CAS LL/SC имеет недостаток, т.к. не гарантирует атомарности CAS, но при этом дает возможность реализации lock-free алгоритмов внутри LL и SC без проблемы ABA.
А с CAS у LL/SC получается костыль во благо распространенности и привычности алгоритмов, особенности которого зачем-то решили обыграть с weak и strong.
...
Рейтинг: 0 / 0
Когда использовать atomic_compare_exchange_weak, а когда atomic_compare_exchange_strong?
    #38385720
_Прохожий_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky, тут есть нюанс, если физически камень один, то и выставлять сигнал по шине некому и LOCK в таком железе на шину при обработке не выставляется. Т.е. возможна реализация(и они есть) многоядерного процессора x86 в котором и с LOCK и без него будет работать одинаково.

Естественно компилятор добавляет LOCK в эти операции всегда, но много пишут про x86 и lock-free алгоритмы, что де например InterlockedCompareExchange гарантирует атомарность команды, а соль в том что она гарантирует обновление кэша во всех других процессорах. Но все это придиразмы конечно, хотя знать не помешает.
...
Рейтинг: 0 / 0
Когда использовать atomic_compare_exchange_weak, а когда atomic_compare_exchange_strong?
    #38385736
weak vs strong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky_Прохожий_Что касается атомарности, то CMPXCHG без LOCK тоже атомарна на 100%, LOCK заставляет отреагировать кэш другого процессора.
Атомарность в пределах одного процессора никому не нужна.
А для многопроцессорных - без lock ни про какую атомарность речь не идет.
Здесь важно добавить, что это "без lock ни про какую атомарность речь не идет" - справедливо только для CAS?
Потому, что у atomic<>::load() и atomic<>::store() на x86 (за исключением std::memory_order_seq_cst) все замечательно атомарно разруливается на уровне когерентности кэшей без всяких LOCK, обычными mov-ами.
...
Рейтинг: 0 / 0
Когда использовать atomic_compare_exchange_weak, а когда atomic_compare_exchange_strong?
    #38385743
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
weak vs strong,

Да, там где чтение и запись в одном примитиве.
...
Рейтинг: 0 / 0
Когда использовать atomic_compare_exchange_weak, а когда atomic_compare_exchange_strong?
    #38385752
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Прохожий_что де например InterlockedCompareExchange гарантирует атомарность команды, а соль в том что она гарантирует обновление кэша во всех других процессорах.
Здесь имеется в виду атомарность на прикладном уровне (в том же смысле что и в стандарте С++), а всякие lock, cmpxchg, кеши и прочее это более низкий уровень, там атомарность отдельных операций может означать другое или вообще отсутствовать.
...
Рейтинг: 0 / 0
Когда использовать atomic_compare_exchange_weak, а когда atomic_compare_exchange_strong?
    #38385759
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Прохожий_что де например InterlockedCompareExchange гарантирует атомарность команды, а соль в том что она гарантирует обновление кэша во всех других процессорах
И если придираться, то InterlockedCompareExchange не может гарантировать обновление кеша, поскольку на некоторых системах она этого не делает за ненадобностью :)
А вот атомарность - гарантирует, поскольку это часть ее АПИ.
...
Рейтинг: 0 / 0
Когда использовать atomic_compare_exchange_weak, а когда atomic_compare_exchange_strong?
    #38385761
weak vs strong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovskyweak vs strong,

Да, там где чтение и запись в одном примитиве.
А не могли бы ссылку дать на что-нибудь авторитетное, где говориться, что CAS на x86 без LOCK не бывает и всегда LOCK CMPXCHG?

По логике то я понимю, что CISC-овая CMPXCHG в x86 транслируется в 3 RISC-овые команды: загрузки, сравнения и сохранения, которые кстати происходят в любом случае, и по этому без блокировки шины(LOCK) просто гарантированно портили бы данные своим сохранением при любом конкурентном доступе:
CAS
автор3. Если значение в памяти было равно значению в аккумуляторе, процессор записывает значение из второго операнда в область памяти, указанную первым операндом. (Особенность реализации x86: запись происходит всегда , но если сравнение на шаге 2 показало неравенство, записывается то значение, что было прочтено из памяти на шаге 1.)

Ну и общий вывод, что CAS-ов на x86 надо избегать, т.к. блокируют весь кэш эXклюзивной блокировкой, в отличие от mov, который блокирует только одну кэш линию (и причем не обязательно эXклюзивной блокировкой).
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Когда использовать atomic_compare_exchange_weak, а когда atomic_compare_exchange_strong?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]