LINUX.ORG.RU

кроссплатформенная поточная мегабиблиотека


0

0

библиотека (лучше с++, но можно и с),
чтобы можно было делать с потоками вещи вроде sched_setaffinity,
смотреть какие доступны процессоры в системе, все это еще хорошо бы
на достаточно абстрактном уровне (thread->run_on_cpu(2)),
и еще чтобы открытая, бесплатная, и в винде работала.
во! есть такая ?

ps ну или хотя бы что-то из этого, круме буста и позикса
pps на рсдн посоветовали ACE, нашел там только set_affinity под юникс и позикс


кросплатформенная, открытая+бесплатная, эффективная

выбери три варианта :) хотя что-то мне подсказывает, что в лучшем случае один.

shuthdar ★★★
()
Ответ на: комментарий от shuthdar

>выбери три варианта
ну, главное, чтобы хотя бы 2 платформы, а денег у меня все равно нет :)

kaj
() автор топика
Ответ на: комментарий от kaj

Если 2 posix-платформы - ещё можешь на что-то рассчитывать, а так - разные платформы, разные API для работы с потоками, поэтому такая либа будет иметь overhead для трансляции своего API в нативный и реализует только пересекающееся множество возможностей API каждой платформы. Я могу ошибаться - вопрос наличия таких библиотек не изучал, чисто теоретические домыслы :)

shuthdar ★★★
()

А чем не подходит мультиплатформенная Qt, в которой давно есть классы QProcess, QThread, QMutex, QSemaphore и пространство имен QtConcurrent для параллельного программирования?

xintrea
()
Ответ на: комментарий от xintrea

>Если 2 posix-платформы
не очень, только если чуть-чуть. линукс (лучше юникс) и винда.

>Qt

на rsdn ее тоже посоветовали
смотрел и QtConcurrent и других
но я не нашел там возможности управлять привязкой потоков к процессорам,
собственно, чего мне не хватает от бустовых потоков

или она есть?

задача у меня - просто посмотреть какие в системе процессоры,
и по-умному распределить в зав. от этого нагрузку

и под линукс, и под винду я этот код написать могу. но не верится,
что до сих пор нет библиотек, который все это давно умеют

kaj
() автор топика
Ответ на: комментарий от kaj

>задача у меня - просто посмотреть какие в системе процессоры, и по-умному распределить в зав. от этого нагрузку

>и под линукс, и под винду я этот код написать могу. но не верится, что до сих пор нет библиотек, который все это давно умеют

Ты случаем не виртуал того школьника из треда про C++0x, выступавшего против оптимизации компилятором и языков, отличных от ассемблера? Распределять нагрузку по процессорам - задача ОС и незачем воротить костыли с целью помешать ОС делать эту работу.

shuthdar ★★★
()
Ответ на: комментарий от shuthdar

не, я студент, а распределить действительно надо,
да и в обоих ос для этого есть апи (маски процессоров которые)

это что-то вроде системы моделирования (долго объеяснять),
надо распаралелить несколько компонентов,
это зависит от многих вещей, например есть ли спецефичное
оборудование (там physx :)

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

kaj
() автор топика
Ответ на: комментарий от dimon555

точно, и кроссплатформенно, и поточно, и контроль полный
а openmp вещь хорошая, но тоже немного не по теме

kaj
() автор топика
Ответ на: комментарий от yz

а сама привязка нужна, чтобы кэш лучше переиспользовался при вычислениях. А на NUMA архитектуре ещё и память локальная.

yz
()
Ответ на: комментарий от yz

да, обертку-то я напишу
>кэш лучше память локальная

угум, и еще нужно количество потоков регулировать что бы не наделать лишних, а ровно столько, сколько повысит а не понизит скорость

у меня довольно слабое представление о поточных библиотеках кроме pthread-like, но все время казалось что должны быть какие-нибудь крутые и с кучей фич

kaj
() автор топика
Ответ на: комментарий от kaj

но что-то, какие не смотрел, от pthread и boost.thread не шибко отличаются, так что все самому писать видимо придется

kaj
() автор топика
Ответ на: комментарий от kaj

Для вычислений потоков надо делать столько же, сколько процессоров. Создавать их в самом начале, а потом только назначать задания. Завершать их, соответственно, в самом конце. А лишняя конкуренция не нужна.

Основная трудность в этом -- эффективная синхронизация. В винде уловные переменные появились только в 2008 и новее, так что остаются семафоры и мутексы. На них хорошую и универсальную трудно сделать. На pthreads надо использовать условные переменные. Есть ещё барьеры, но они ест ьне везде и тормознее, чем условные переменные, почему-то.

На задачах, ограниченных прокачкой данных через память хорошего распараллеливания не получится. сколько каналов в память, такое и ускорение будет. Если много вычислений в кэше, то будет лучше...

yz
()
Ответ на: комментарий от yz

воистину
но лучший код тот, который обходится вообще почти без синхронизации

kaj
() автор топика

http://www.threadingbuildingblocks.org/

Intel® Threading Building Blocks (TBB) offers a rich and complete approach to expressing parallelism in a C++ program. It is a library that helps you take advantage of multi-core processor performance without having to be a threading expert. Threading Building Blocks is not just a threads-replacement library. It represents a higher-level, task-based parallelism that abstracts platform details and threading mechanism for performance and scalability and performance.

CL-USER
()
Ответ на: комментарий от CL-USER

то что в доках выглядит очень здорово!
спасибо большое, буду изучать

ps сколько ни гуглил, о ней даже не слышал

kaj
() автор топика

используя потоки (threads) ты не сможешь ими управлять, так как распределением времени между ними занимается ОС. В винде, насколько я помню, были такие штуки как Fibers. Вот ими и можно управлять. Только это тогда свой планировщик придется писать

ozzman
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.