|
|
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Давайте про lock-free всё-таки :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2017, 21:56:43 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUДавайте про lock-free всё-таки :)есть у меня одна идейка, гарантированная lock-free очередь на простых принципах, правда с ограничением размера. Нужно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2017, 08:47:56 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)правда с ограничением размера. Нужно?едва ли:SOFT FOR YOUЕсли я правильно понял, его реализация - имеет ограничение на количество элементов. А я хочу без ограниченияхоть габр на тесте миллион элементов и заливал, но нужно строго "без ограничения" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2017, 09:14:49 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)есть у меня одна идейка, гарантированная lock-free очередь на простых принципах, правда с ограничением размера. Нужно? Выкладывай. Даже если ТСу не нужно - пригодится кому-нибудь другому. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2017, 09:35:05 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Я думал, будет ли выгода при кольцевом буфере. И пришёл к выводу, что всё примерно так же - 2 каса на чтение, и столько же на запись. Но в любом случае выложи. Почему нет. Вообще, самая простая реализация очереди - это два стека. Стек Tail обычный и Head инвертированный. Но я уже писал, почему не стал строить реализацию на её основе. А что с ошибками? По прежнему выдаёт эксепшн? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2017, 10:48:16 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, https://svn.code.sf.net/p/cl4fpc/code/Containers/lfqueues.pas есть правда где-то ошибка на x86 c TAtomicInt = UInt64;, найти времени нет, но 32-битная версия пашет как задумано заправлю потом в бложик описание реализации тест https://svn.code.sf.net/p/cl4fpc/code/Containers/test/FreeLockTest.lpr SOFT FOR YOUА что с ошибками? По прежнему выдаёт эксепшн? ну если так закрыть конечно нет, но правильно же он от этого не заработает 20945540 ИМХО правильное рассуждение, нужен механизм проверки нахождения элемента в очереди ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2017, 15:29:28 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Код жёсткий :) Правда, я так и не понял, зачем столько стейтов По поводу Exception-ов Я ничего не закрыл. Я сделал инкремент счётчика при записи FHead. Эксепшны сыпятся или нет? По поводу поста - я ведь не против, может действительно дело в мусорном значении Next Но вот незадача - в случае эмуляции контейнера через стек - ошибок не происходит. По крайней мере у меня. А он работает по тому же принципу Да и придумать вариант, как может возникнуть ошибка - я тоже придумать не могу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2017, 16:24:34 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUkealon(Ruslan), Код жёсткий :) Правда, я так и не понял, зачем столько стейтов всё очень просто, попытаюсь объяснить в блоге как время будет PS: баг исправил SOFT FOR YOUПо поводу Exception-ов Я ничего не закрыл. Я сделал инкремент счётчика при записи FHead. Эксепшны сыпятся или нет? По поводу поста - я ведь не против, может действительно дело в мусорном значении Next Но вот незадача - в случае эмуляции контейнера через стек - ошибок не происходит. По крайней мере у меня. А он работает по тому же принципу Да и придумать вариант, как может возникнуть ошибка - я тоже придумать не могу TestUG не проходит, хотя проработал без сбоев заметно дольше с заменой 20945254 проходит без проблем вроде как ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2017, 21:55:36 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Спасибо Конечно интересно почитать блог Но давай исправим ошибку в моей реализации А потом замерим производительность :) Я просто думаю, что контейнеры надо создавать опционально: с лимитированным количеством элементов и нет. Потому как в лимитированных реализациях может быть определённый профит, как с точки зрения функционала, так и с точки зрения производительности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 00:03:54 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Мне кажется, или у тебя ограничение на количество элементов жёстко - 21? Кстати DefaultValue можно не хранить, есть "функция" Default(T) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 00:12:13 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUkealon(Ruslan), Спасибо Конечно интересно почитать блог Но давай исправим ошибку в моей реализации А потом замерим производительность :) Я просто думаю, что контейнеры надо создавать опционально: с лимитированным количеством элементов и нет. Потому как в лимитированных реализациях может быть определённый профит, как с точки зрения функционала, так и с точки зрения производительности.тут всё довольно просто: исходя из тестов что я знаю на i7: конкурентно в секунду можно провести 40 млн обменных операций с одной кэш-линейкой т.е. тупо InterlockedIncrement из 4-х и более потоков можно сделать 40млн/c, в один поток - 150млн/c представленный алгоритм упирается сейчас в 2.5 млн (добавление + удаление) в секунду твой (пока работает) - упирается в 3.5 млн (добавление + удаление)/c тут насколько я их понимаю добились - 16 млн. /c, и в явовской - 4 млн./c (проц вроде бы такой же как и у меня, но с другой стороны хз как они тестят, например забитая очередь явно шустрее идёт, чем близкая к нулю) т.е. ещё оптимизировать и оптимизировать, наверное, первое - это функцию разгрузки SOFT FOR YOUkealon(Ruslan), Мне кажется, или у тебя ограничение на количество элементов жёстко - 21? Кстати DefaultValue можно не хранить, есть "функция" Default(T) 10 и 21, в зависимости от типа (нужно 3 бита на состояние одной ячейки) Default(T) - в fpc старой версии её добавить не успели ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 09:48:41 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Всё-таки производительность у AtomicIncrement, AtomicExchange и AtomicCmpExchange разная. Наверняка на 8 байтах картина ещё больше меняется. Я бы не стал обобщать :) И не совсем ясно как ты замеряешь производительность :) По первой ссылке стек, он разумеется, выполняется быстрее очереди. Его теста я что-то не увидел Да и джававского тоже ) Ну и потом, я не уверен на счёт твоей очереди, но вот в моей важно, есть конкуренция за оба поля или нет Т.е. если ты сначала добавишь 10 элементов, а потом извлечёшь - картинка будет более разумная. Нежели чем гонять один и тот же элемент туда-обратно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 18:02:17 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, практически одинаковая для текущей разрядности, во всяком случае на i7 (cmp версии только при успехе считать надо) у себя проверь, недолго соответственно при наличии 2-х операций на вставке, 2-х на удалении это 10млн/c максимум для моего проца ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 18:20:58 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 23:14:08 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Народ, разъясните пожалуйста (признаюсь, всю ветку темы ТС не читал), чем не устраивает очередь с кольцевым буфером в котором указатель на тайл читающего и пишущего потоков "не пересекаются " при условии что для обеспечения многопоточности создаём одну очередь на каждую пару потоков??? Соотв-но, к примеру, для одного читающего и N в него пишущих создаём N очередей который опрашивает читающий... При этом отпадает необходимость в применении спец. синхронизирующих системных функций... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2017, 13:00:47 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
_StarikPro_Народ, разъясните пожалуйста (признаюсь, всю ветку темы ТС не читал), чем не устраивает очередь с кольцевым буфером в котором указатель на тайл читающего и пишущего потоков "не пересекаются " при условии что для обеспечения многопоточности создаём одну очередь на каждую пару потоков??? Соотв-но, к примеру, для одного читающего и N в него пишущих создаём N очередей который опрашивает читающий... При этом отпадает необходимость в применении спец. синхронизирующих системных функций...ситуация: 1 читающий, много пишущих - не самая распространённая одну очередь проще использовать, она становистя слабым местом систем типа акторов, например вот все и меряются ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2017, 16:42:57 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Так он под Windows 8 Лучше тогда уж вручную брейкпоинт на память делать _StarikPro_, Мне кажется среди нас дельфистов алгоритмы lock-free вообще не в ходу. Мы о них знаем слишком мало. Поэтому я целиком и полностью за дискуссии, разные реализации, тесты и поиск ошибок. О высокой ценности моей реализации сложно судить, пока она выдаёт ошибки иногда. Лучше давайте сначала найдём ошибку в таком простом коде, а потом будем рассуждать о плюсах и минусах разных реализаций. Если говорить в теории, то ценность моего решения заключается в нескольких пунктах. Во-первых, нет явного ограничения на количество элементов в очереди (а в кольцевом есть) Во-вторых, нет ограничения на количество читающих или пишущих потоков В-третьих, производительность по идее (если речь не о первом элементе в очереди) на высоком уровне - только 2 атомика на операцию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2017, 20:59:57 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUkealon(Ruslan), Так он под Windows 8 Лучше тогда уж вручную брейкпоинт на память делатьи в каком потоке он вызовется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2017, 21:22:07 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, .... Если говорить в теории, то ценность моего решения заключается в нескольких пунктах. Во-первых, нет явного ограничения на количество элементов в очереди (а в кольцевом есть) Во-вторых, нет ограничения на количество читающих или пишущих потоков В-третьих, производительность по идее (если речь не о первом элементе в очереди) на высоком уровне - только 2 атомика на операцию В моей реализации отсутствуют указанные ограничения если условиться об использовании одной очереди на "один канал передачи данных в одно направление", а про в-третьих вообще молчу... хотя на производительность не тестировал, всё устраивает на текущем этапе... Пока вижу только одно достоинство, и то сомнительное - простота в применении... kealon(Ruslan) , ситуация: 1 читающий, много пишущих - не самая распространённая Я это привёл в качестве примера, для доходчивости, так сказать, варианты можно реализовать любые... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2017, 10:30:14 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
_StarikPro_, Посмотри, где в моем коде ошибка? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2017, 10:38:34 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU...(если речь не о первом элементе в очереди)... И опять же, не понимаю, к чему эти условности... первый не первый элемент, в чём проблема закольцевать очередь - тогда все элементы становятся равными ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2017, 11:46:57 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
_StarikPro_, Я пока вижу, что ты языком чешешь Кольцевой-некольцевой Ни реализации твоей, ни ответа на вопрос, озвученный в топике ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2017, 14:11:22 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Ребят, я попробовал заменить Fill на AtomicExchange Ошибка пока не воспроизводится Посмотрите у себя пожалуйста https://bitbucket.org/d-mozulyov/lockfree/src ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2017, 20:14:19 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, TestUG падает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 08:29:07 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39552920&tid=2041445]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
1293ms |
get topic data: |
15ms |
get forum data: |
4ms |
get page messages: |
197ms |
get tp. blocked users: |
2ms |
| others: | 248ms |
| total: | 1797ms |

| 0 / 0 |
