PARALLEL.RU

Дискуссионный клуб по параллельным вычислениям
Текущее время: 24 ноя 17 8:56

Часовой пояс: UTC + 4 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
СообщениеДобавлено: 21 янв 09 3:14 
Не в сети

Зарегистрирован: 21 янв 09 3:05
Сообщения: 3
Здравствуйте.

Представляю вам библиотеку ASYNCLIB (своя собственная разработка). Ознакомится можно здесь http://groups.google.com/group/asynclib?hl=en

В кратце: библиотека представляет из себя микс между TBB (где работа task'ифицируется через интеловские примитивы и выполняется на фиксированном количетсве рабочих потоков) и windows threads (где каждый поток имеет свой контектс, который OS в любой момент может сменить на контекст другого потока), что-то типа ?многопоточность с кооперативной многозадачностью?.
Другими словами, вы вашу работу разбиваете на задачи (чтение из файла/сокета, обработка чего-либо другого ? без ограничений здесь), чем меньше гранулярность, тем лучше (поскоку распаллелизовываться будет лучше). Тело задачи не имеет ограничений, кроме одного условия ? необходимо использовать примитивы синхронизации предоставленные библиотекой (можно также использовать стандартные примитивы). Далее, когда рабочий поток выполняя одну из ваших задач натыкается на блокирующее условие (например ? мутекс залочен другой задачей, или ввод/вывод еще не закончился) рабочий поток автоматически переключается на следующую задачу из вашего списка задач, обеспечивая тем самым максимальный throughput ваших задач на заданном количестве рабочих потоков.

Из плюсов данного подхода можно отметить следующие:
? автоматическое скалирование на многоядерных машинах
? уменьшение времени синхронизации задач (так как происходит смена более легковесного контекста задачи, в отличие от контекста потока) и уменьшение contention'а ваших данных (поскоку в любой момент выполняется количество задач не большее чем количество рабочих потоков)
? в целом классе задач отпадает необходимость писать стейтмашины (очень удобно для клиент-серверных приложений, в данном случае стейт сохраняется вместе с контекстом вашей задачи)
? более легковесные примитивы синхронизации чем нативные (самый маленький примитив занимает 2 бита)


Eсли есть вопросы, пишите (да и просто интересно знать ваше мнение).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 21 янв 09 5:49 
Не в сети

Зарегистрирован: 12 янв 06 11:26
Сообщения: 98
Откуда: Хабаровск, ВЦ ДВО РАН
Для начала несколько вопросов.
1. На платформах, отличных от VS8/9 код библиотеки тестировался? В частности, почему нет сборок под другие (более интересные с т.з. пользователей данного форума) операционные системы?
2. Где можно посмотреть реализацию (код)? Пока-что я нашел только бинарные сборки и один заголовочный файл async.h.
3. Есть ли уже подобные решения и если да, то чем они Вас не устроили и проводилось ли сравнительное тестирование с ними, например, на той же задаче о клиент-сервере.
4. Вы пишите, что можно использовать стандартные примитивы синхронизации, но что конкретно подразумеваете под словом "стандартные"? Ни в стандарте С, ни тем более С++ нет примитивов синхронизации.
5. Прошла ли уже библиотека опробацию на реальных приложениях?

В целом, идея интересная.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 21 янв 09 8:12 
Не в сети

Зарегистрирован: 21 янв 09 3:05
Сообщения: 3
>1. На платформах, отличных от VS8/9 код библиотеки тестировался? В частности, почему нет сборок под другие (более интересные с т.з. пользователей данного форума) операционные системы?

Я еще просто не успел портировать код. В виду своей занятости портирование запланировано на тот момент как тока народ проявит интерес к данной идее и потребует другие платформы, сразу портирую, нет проблем.

>2. Где можно посмотреть реализацию (код)? Пока-что я нашел только бинарные сборки и один заголовочный файл async.h.

Я бы с удовольствием открыл код, но дело в том, что я приследую цель заработать на данном проекте (простите за мои буржуйские наклонности - В данный момент я работаю над этим проектом тока в свободное от основной работы время, но хотел бы посвятить все свое время этому проекту, однако надо еще и семью кормить). Поэтому сорцы пока планирую продавать вместе с коммерческой лицензией. Я еще новичок в финансовой части софтверных проектов, поэтому если вы думаете что я зря думаю что открытие исходного текста повлияет на потенциальную доходность, то обоснуйте, мне очень интересно. Если вас интересуют какие-либо аспекты работы библиотеки, то я с удовольствием на них отвечу.

>3. Есть ли уже подобные решения и если да, то чем они Вас не устроили и проводилось ли сравнительное тестирование с ними, например, на той же задаче о клиент-сервере.

Oблазил весь инет в поисках подобного, ничего не нашел, и написал сам. Чуть позже узнал что микрософт в VS10 разрабатывает похожую concurrency library, залил бету весрию VS10 посмотреть, как тока увидел что там при определенных условиях имплементация создает тысячу потоков на тысячу тасков, сразу забросил эту идею (не говоря уже про полное отсутствие каких либо примитивов синхронизации кроме евента и патологическому нежеланию микрософт портировать свои решения на другие платформы).
Короче - аналогов найти не удалось.
Не очень понял вопрос про клиент-сервер. Могу сказать, что при портировании кода сервера на asynclib код похудел где-то на 75% в виду того факта что можно выкинуть стейт машину и просто на каждый клиент создавать по задаче (таску) (где код внутри таска просто отправляет/получает данные для одного клиента). С точки зрения производительности это скорее вопрос насколько select быстрее/медленнее overlapped io - эти замеры я не проводил. async_samples.zip содержит пример простенького клиент-серверного приложения написанного через async.


>4. Вы пишите, что можно использовать стандартные примитивы синхронизации, но что конкретно подразумеваете под словом "стандартные"? Ни в стандарте С, ни тем более С++ нет примитивов синхронизации.

В данном случае имеется в виду любые другие примитивы (здесь "стандартные" = "то что предоставляет операционная система"). Единственный недостаток в их использовании состоит в том, что блокируется сам рабочий поток, когда как при использовании примитивов синхронизации из библиотеки блокируется только задача, и рабочий поток его выполняющий переходит на выполнение следующей задачи.

>5. Прошла ли уже библиотека опробацию на реальных приложениях?
1. Я ее использую повсеместно во всех своих проектах уже полгода
2. Имеется набор тестов тестирующий (не всю но) большую часть функциональности (тесты также покрывают корректность с точки зрения многопоточности - т.е. отсутствие race conditions).
3. Была опробована на одной игре моим знакомым (но не попала в релиз в виду близких сроков ее к релизу и боязни тамошнего начальства что что-то пойдет не так перед запуском). Интересный факт что именно при использовании этой библиотеки было найдено приличное количество race conditions внутри самой игры (например был найден баг у них в имплементации многопоточных смартпоинтеров) в виду того что при использовании asynclib игра натыкалась на свои баги (и соответственно падала) на много порядков чаще.
4. Библиотека все-таки находится еще в бета стадии, и есть очень маленький список известных мне проблем на каждую из которых стоит assertion (т.е. вылезет сообщение о проблеме если вы на нее наткнетесь). Например, в данный момент не имплементирована функция async::WaitAny. Опять-же в виду своей загруженности я решил пойти по пути Lazy Evaluation и фиксить проблемы как тока они у кого-нить возникают. (Чуть позже оглашу список - он состоит всего из нескольких пунктов).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 21 янв 09 14:11 
Не в сети

Зарегистрирован: 28 май 05 21:12
Сообщения: 217
Откуда: Москва
async писал(а):
Oблазил весь инет в поисках подобного, ничего не нашел

Не похоже - http://protothread.wiki.sourceforge.net/ ?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 21 янв 09 14:29 
Не в сети

Зарегистрирован: 21 янв 09 3:05
Сообщения: 3
>Не похоже - http://protothread.wiki.sourceforge.net/ ?

Идея-то похоже, но вот имплементация заставляет желать лучшего.
Основные отличия async от proto_threads (то что попалось на первый взгляд):
1. Вам не надо за собой постоянно тащить const void* env (который держит контекст вашего proto_thread'a)
2. Вам не надо париться с локальными переменными, просто используйте их как обычно (в proto_thread локальные переменные не сохраняются при смене контекста)
3. Вы можете звать функции которые используют async примитивы для блокировки потоков как из задач (тасков) так и из обычных потоков (в proto_threads блокирующие функции могут зваться тока из других функций proto_threads)
4. Ну и кода для работы с async надо писать гораздо меньше чем когда вы работаете с proto_threads, что не маловажно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 23 янв 09 5:54 
Не в сети

Зарегистрирован: 12 янв 06 11:26
Сообщения: 98
Откуда: Хабаровск, ВЦ ДВО РАН
Как будет версия под linux - отпишитесь в эту ветку и можно тогда будет ее попробовать.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2 дек 14 9:54 
Не в сети

Зарегистрирован: 2 дек 14 9:52
Сообщения: 1
Вы пишите, что можно использовать стандартные примитивы синхронизации, но что конкретно подразумеваете под словом "стандартные"? Ни в стандарте С, ни тем более С++ нет примитивов синхронизации.

_________________
maya


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 4 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB