Абсолютное распараллеливание
От: Caracrist https://1pwd.org/
Дата: 11.02.10 07:52
Оценка:
Есть неоходимость создать систему абсолютного распараллеливания.
Принцип прост: есть пул потоков. Ему кидаются задачи, которые имеют зависимость. Например: задача А может быт выполнена в любое свободное время.
задача Б только после задачи А
задача В только после задачи А
задача Г только после задачи Б
задача Д только после Б и В
и так далее.
Сами задачи могут генерироваться, как в любом из потоков пула, так и вовне.
Допустим все эти задачи поступили одновременно, то ожидается следующее поведение:
1. выполнить А одним потоком
2. потом начать выполнять Б и В двумя потоками
3. поток выполнявший Б сразу приступит к Г
4. как только закончится Б и В свободный поток (скорее всего тот что выполнил В) начинает выполнение Д

Ну в общем надеюсь понятно.
Реализовать нужно в с++.

Знаю, что похожую функциональность дает OpenMP, однако там сложно задать зависимость между задачами содаваемыми в разных функциях и потоках.

Перед тем, как начать писать велосипед , хочу узнать, есть ли что либо близкое или(лучше ) полностью соответствующее таким требовамиям?
~~~~~
~lol~~
~~~ Single Password Solution
Re: Абсолютное распараллеливание
От: Plague Россия  
Дата: 11.02.10 08:06
Оценка:
Parallel Haskell?
Re: Абсолютное распараллеливание
От: Pavel Dvorkin Россия  
Дата: 11.02.10 08:39
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>Есть неоходимость создать систему абсолютного распараллеливания.

C>Принцип прост: есть пул потоков. Ему кидаются задачи, которые имеют зависимость. Например: задача А может быт выполнена в любое свободное время.
C>задача Б только после задачи А
C>задача В только после задачи А
C>задача Г только после задачи Б
C>задача Д только после Б и В
C>и так далее.
C>Сами задачи могут генерироваться, как в любом из потоков пула, так и вовне.
C>Допустим все эти задачи поступили одновременно, то ожидается следующее поведение:
C>1. выполнить А одним потоком
C>2. потом начать выполнять Б и В двумя потоками
C>3. поток выполнявший Б сразу приступит к Г
C>4. как только закончится Б и В свободный поток (скорее всего тот что выполнил В) начинает выполнение Д

C>Ну в общем надеюсь понятно.

C>Реализовать нужно в с++.

Граф.
Если задач немного и фиксированное число, то можно его реализовать матрицей смежности. Строка — задача, столбец — кого ждет. Когда задача заканчивается, она ( а лучше некий менеджер, которого она уведомляет о своем окончании) проходит по столбцу этой матрицы и зануляет его, после чего проверяет все строки, в которых было зануление — остался ли там хоть один ненулевой элемент. Если нет — в пул эту задачу. Если задач не фиксированное число, можно оставить тот же алгоритм, но добавлять строки (столбцы не придется — не могут же ранее появившиеся задачи ждать новых).
With best regards
Pavel Dvorkin
Re: Абсолютное распараллеливание
От: remark Россия http://www.1024cores.net/
Дата: 11.02.10 09:50
Оценка: 28 (6) +1
Здравствуйте, Caracrist, Вы писали:

C>Есть неоходимость создать систему абсолютного распараллеливания.

C>Ну в общем надеюсь понятно.
C>Реализовать нужно в с++.
C>Знаю, что похожую функциональность дает OpenMP, однако там сложно задать зависимость между задачами содаваемыми в разных функциях и потоках.

Не уверен насчёт абсолютного, но Intel Threading Building Blocks это делает. Это собственно и есть его основная задача.
Основной сайт здесь:
http://www.threadingbuildingblocks.org/
Форум там:
http://software.intel.com/en-us/forums/intel-threading-building-blocks/
По поводу поддержки DAG смотри здесь:
http://software.intel.com/en-us/forums/showthread.php?t=60503&o=a&s=lr

Единственная проблема, что TBB не очень хорошо поддерживает задачи засабмиченные из сторонних потоков.


Так же могу порекомендовать библиотеку QuickThread:
http://www.quickthreadprogramming.com/
Она в полной мере поддерживает асинхронное программирование, т.ч. нет проблем с задачами засабмиченными из сторонних потоков. Так же полностью поддерживает IO задачи (в отличие от TBB). Плюс поддерживает NUMA архитектуры.


В принципе в MSVC2010 будут библиотеки PPL/AAL, единственное, что MSVC2010 сейчас ещё в статусе RC:
http://msdn.microsoft.com/en-us/magazine/dd434652.aspx


И так же есть библиотека just::thread (которая разрабатывается разработчиком boost::thread):
http://www.stdthread.co.uk/
Это, в принципе, не более, чем реализация поддержки многопоточности из C++0x, но те же std::async/feature/promise там есть.



1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: Абсолютное распараллеливание
От: remark Россия http://www.1024cores.net/
Дата: 11.02.10 11:16
Оценка:
Здравствуйте, remark, Вы писали:

R>Не уверен насчёт абсолютного, но Intel Threading Building Blocks это делает. Это собственно и есть его основная задача.

R>Основной сайт здесь:
R>http://www.threadingbuildingblocks.org/
R>Форум там:
R>http://software.intel.com/en-us/forums/intel-threading-building-blocks/
R>По поводу поддержки DAG смотри здесь:
R>http://software.intel.com/en-us/forums/showthread.php?t=60503&o=a&s=lr

Да, кстати, т.к. значительная часть разработчиков в России, то помощь можно получить и на русском здесь:
http://software.intel.com/ru-ru/forums/95/


R>И так же есть библиотека just::thread (которая разрабатывается разработчиком boost::thread):

R>http://www.stdthread.co.uk/
R>Это, в принципе, не более, чем реализация поддержки многопоточности из C++0x, но те же std::async/feature/promise там есть.

Автор буквально только что выпустил новый релиз с лучшей поддержкой асинхронных задач, и написал блог по этому поводу:
http://www.justsoftwaresolutions.co.uk/threading/multithreading-in-c++0x-part-8-futures-and-promises.html
Рассмотрено несколько реальных примеров использования std::async/feature/promise.
В С++0х поддержка асинхронных задач, конечно, без особых наворотов, но в перспективе хочется верить, что это зато будет портируемая, встроенная в компиляторы, функциональность.



1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: Абсолютное распараллеливание
От: 8bit  
Дата: 03.07.10 18:52
Оценка:
Здравствуйте, remark, Вы писали:

У Intel TBB что за лицензия такая? GPL v2 with the libstdC++ Runtime Exception.
Не пойму, можно в не опенсорс использовать без покупки коммерческой лицензии или нет
Re[4]: Абсолютное распараллеливание
От: Guard_h4s Россия  
Дата: 03.07.10 19:32
Оценка:
Здравствуйте, 8bit, Вы писали:

8>Здравствуйте, remark, Вы писали:


8>У Intel TBB что за лицензия такая? GPL v2 with the libstdC++ Runtime Exception.

8>Не пойму, можно в не опенсорс использовать без покупки коммерческой лицензии или нет
Можно.
Re: Абсолютное распараллеливание
От: dilmah США  
Дата: 03.07.10 20:19
Оценка:
http://netbsd.gw.com/cgi-bin/man-cgi?rcorder++NetBSD-current
Re[2]: Абсолютное распараллеливание
От: Pzz Россия https://github.com/alexpevzner
Дата: 03.07.10 20:40
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Если задач немного и фиксированное число, то можно его реализовать матрицей смежности. Строка — задача, столбец — кого ждет. Когда задача заканчивается, она ( а лучше некий менеджер, которого она уведомляет о своем окончании) проходит по столбцу этой матрицы и зануляет его, после чего проверяет все строки, в которых было зануление — остался ли там хоть один ненулевой элемент. Если нет — в пул эту задачу. Если задач не фиксированное число, можно оставить тот же алгоритм, но добавлять строки (столбцы не придется — не могут же ранее появившиеся задачи ждать новых).


Интересно, а существует решение, в котором сложность "постановки задачи в очередь" равна O(n), где n — число задач, от которых данная зависит, а сложность обработки завершения задачи не превышает O(m), где m — число задач, зависящих от данной?
Re[3]: Абсолютное распараллеливание
От: Pavel Dvorkin Россия  
Дата: 04.07.10 12:38
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>Если задач немного и фиксированное число, то можно его реализовать матрицей смежности. Строка — задача, столбец — кого ждет. Когда задача заканчивается, она ( а лучше некий менеджер, которого она уведомляет о своем окончании) проходит по столбцу этой матрицы и зануляет его, после чего проверяет все строки, в которых было зануление — остался ли там хоть один ненулевой элемент. Если нет — в пул эту задачу. Если задач не фиксированное число, можно оставить тот же алгоритм, но добавлять строки (столбцы не придется — не могут же ранее появившиеся задачи ждать новых).


Pzz>Интересно, а существует решение, в котором сложность "постановки задачи в очередь" равна O(n), где n — число задач, от которых данная зависит, а сложность обработки завершения задачи не превышает O(m), где m — число задач, зависящих от данной?


Ну можно так изменить выделенное выше. Если для каждой строки хранить число ненулевых элементов, то уйдет проверка строки на 0 и будет O(m)
With best regards
Pavel Dvorkin
Re[4]: Абсолютное распараллеливание
От: remark Россия http://www.1024cores.net/
Дата: 05.07.10 11:18
Оценка:
Здравствуйте, 8bit, Вы писали:

8>У Intel TBB что за лицензия такая? GPL v2 with the libstdC++ Runtime Exception.

8>Не пойму, можно в не опенсорс использовать без покупки коммерческой лицензии или нет

Разработчики утверждают, что можно.
Хотя есть мнение, что нет.


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[4]: Абсолютное распараллеливание
От: remark Россия http://www.1024cores.net/
Дата: 05.07.10 11:25
Оценка: +1
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>>>Если задач немного и фиксированное число, то можно его реализовать матрицей смежности. Строка — задача, столбец — кого ждет. Когда задача заканчивается, она ( а лучше некий менеджер, которого она уведомляет о своем окончании) проходит по столбцу этой матрицы и зануляет его, после чего проверяет все строки, в которых было зануление — остался ли там хоть один ненулевой элемент. Если нет — в пул эту задачу. Если задач не фиксированное число, можно оставить тот же алгоритм, но добавлять строки (столбцы не придется — не могут же ранее появившиеся задачи ждать новых).


Pzz>>Интересно, а существует решение, в котором сложность "постановки задачи в очередь" равна O(n), где n — число задач, от которых данная зависит, а сложность обработки завершения задачи не превышает O(m), где m — число задач, зависящих от данной?


PD>Ну можно так изменить выделенное выше. Если для каждой строки хранить число ненулевых элементов, то уйдет проверка строки на 0 и будет O(m)


Обычно это делается подсчётом кол-ва оставшихся зависимых задач.
Если может быть не более одной зависимый задачи, то в задачу нужно добавить только:
atomic<unsigned> pending_count;
task_t* const parent;

Для произвольных DAG придётся хранить список зависимых задач.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.