![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Нет конечно, локально.
Уменьшил до 200000, bоюсь к утру LIVELOCK напишет иначе... Добавлено @ 23:11 Пока нет. Просто проbую свои силы. Потом хеш-таbлицу хочу написать и распараллелить A* Статью Тиграна прочёл и, неожиданно увлёкся. Кажется мне что в ИИ, bудущее за lock free алгоритмами. Это сообщение отредактировал(а) Леопольд - 1.12.2010, 23:14 -------------------- вопросов больше чем ответов |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
установил relacy.
вот тест: http://liveworkspace.org/code/08782ad50b2d...3c7ef1f00810096 Добавлено @ 23:24 только не понимаю что там выводится, и что должно выводится Это сообщение отредактировал(а) boostcoder - 1.12.2010, 23:25 |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
чем именно он должен был помочь? если нужно куда-то применить, советую взглянуть на libcds О! Отлично. Леопольд Александреску в одной из статей использует такой трюк. Инкапсулируется некий тип (например map) Чтение - wait-free безо всяких итераций, просто возвращение объекта. Запись - создание копии, добавление новой записи и замена внутреннего объекта. Ну и конечно же опять встает вопрос удаления старой копии. Это можно построить на шаблоне и применять эту технику для любого типа, но естественно, это эффективно только тогда, когда запись является редким явлением. Упор делается на скорость чтения высокая. Это сообщение отредактировал(а) azesmcar - 1.12.2010, 23:43 |
|||
|
||||
| Леопольд |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Добавлено @ 06:46 Где-то, видимо двойной delete. Не могу понять где... Мне, вроде бы, удалось обойти добавление эелементов обратно в очередь на удаление. Это может сильно поднять производительность. http://liveworkspace.org/code/8ed457a04766...847bee388deb79b
Добавлено @ 06:49 Поток не успел завершить раbоту до достижения
Это сообщение отредактировал(а) Леопольд - 2.12.2010, 09:11 -------------------- вопросов больше чем ответов |
||||||
|
|||||||
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Этого не знаю... |
||||
|
|||||
| Леопольд |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Оно, кстати, иногда работает, хотя нагрузка серьёзная. Два потока "выкидывают" элементы другие два "вставляют", в сумме 2000000 элементов.
http://liveworkspace.org/code/705bf2998c43...9a3bced3e591522 Сперва пытался сделать вариант с возвратом элементов обратно. Но он просто "вешался" под такой нагрузкой. Может я как-то неправильно тестирую? Не получается воспроизвести...
Это сообщение отредактировал(а) Леопольд - 2.12.2010, 11:45 -------------------- вопросов больше чем ответов |
||||
|
|||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Леопольд
Добавь хоть комментарии и опиши алгоритм. |
|||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Он похож на тот, который в статье. Основное отличие, работа с очередью удалённых - m_deleted_head:
1. Загружаю m_deleted_head (указатель на начало очереди на удаление) 2. умешьшаю счётчик потоков и если он стал равен нулю (значит нет потоков, которые работают с тем же m_head - указатель на "выкидываемый" элемент). 3. пытаюсь сделать один strong CAS указателя m_deleted_head и зацикленного на себя указателя &end (признак конца очереди). Рассчёт на то, что если удалось подменить m_deleted_head с первого раза, значит ни один поток не успел его поменять и список можно спокойно удалять. Если не удалось подменить, то пихаю удаляемый элемент в очередь на удаление. Ещё, возможно, одно отличие (точно не уверен, может в статье так же). Попытка освободить ненужную занятую память происходит каждый раз, даже если сам стек оказался пустым. накидал это в виде комментариев в предыдущий пост http://forum.vingrad.ru/act-ST/f-92/t-3162.../p-2258093.html Это сообщение отредактировал(а) Леопольд - 2.12.2010, 11:37 -------------------- вопросов больше чем ответов |
|||
|
||||
| Леопольд |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Заработало!
8000000 элементов, 4 потока: 2 удаляют, 2 добавляют. http://liveworkspace.org/code/a1e0bde56b2e...720510a50a6379c relacy тоже удовлетворён...
Если всего 2 потока удаляют то, average length of non deleted queues = 0.09. P.S. Пожалуй этот вариант уже не так "убог"... P.S.S А вообще, очень даже ничего! Это сообщение отредактировал(а) Леопольд - 2.12.2010, 15:06 -------------------- вопросов больше чем ответов |
||||
|
|||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
блин
на одноядерном процессоре, почти сразу. бага "прибил". Всё чудесно! Если кто-то сможет его "уронить", буду весьма признателен. Это сообщение отредактировал(а) Леопольд - 2.12.2010, 15:09 -------------------- вопросов больше чем ответов |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Леопольд
Сколько всего изменилось Мало того, что нашел..так еще и прибил ага, посмотрю. Добавь в relacy количество потоков и итераций и оставь на ночь. |
|||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Плохо приbил...
http://liveworkspace.org/code/1d1704acbdea...fc11a835f900d4e -------------------- вопросов больше чем ответов |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Леопольд
Я бы хорошенько пересмотрел этот код. Это и так сложно, а у тебя усложнено еще больше. Комментарии нужны в первую очередь для себя, раздели все на мелкие функции, это заметно облегчит и чтение и понимание того, что происходит. Представить в уме возможные варианты выполнения для нескольких потоков, которые в любой момент могут делать все, что угодно и так сложно, а это еще усложняется кодом. Для начала напиши список, который работает, но с утечками, протестируй, а потом добавляй очистку памяти отдельными функциями. Отдели как нибудь ту часть, которая потенциально может содержать ошибку (т.е. часть очистки памяти) от той, которая протестирована и работает. На данный момент код функции pop слишком большой, чтобы можно было найти в нем ошибку. |
|||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
azesmcar, пытаюсь рафинировать, потихоньку...
И прихожу к вывод что нельзя использовать обычную связку malloc/free Запускаю два потока, один добавляет, другой удаляет. Между собой у них только одна атомарная переменная (указатель на голову стека), relacy тесты проходят с опцией (p.search_type = rl::fair_full_search_scheduler_type;) которая всё пространство состояний тестирует. Всё ок. Но, как только пытаюсь запустить на одноядерной машине (Ubuntu 10.04, g++ 4.5.1):
Сейчас соображу спин лок на выделение памяти и проверю. Google говорит что есть такая штука как lock free malloc Это сообщение отредактировал(а) Леопольд - 3.12.2010, 11:36 -------------------- вопросов больше чем ответов |
|||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Вот рафинированный код.
LWS relacy
Не получается уронить (если не увеличивать количество потоков), видимо на сервере несколько ядер: http://liveworkspace.org/code/260469bbd4f7...d03e4ad1d4b26e7 на работа одноядерная машина, на ней падает почти сразу. Это сообщение отредактировал(а) Леопольд - 4.12.2010, 08:24 -------------------- вопросов больше чем ответов |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |