|
|
|||||||||||
Оптимизировать ThreadPool на 8 потоков и задач02.05.2023, 21:06. Показов 2792. Ответов 55
Метки нет (Все метки)
Мое почтение, джентльмены.
Все работает, но хочу оптимизировать код, к примеру, для 8 потоков и задач. Слишком долго выполняется на малых объёмах вычислений, собственно поэтому и хочу реализовать ThreadPool. Из задуманного, удалить стек/очередь std::queue и операции std::move, tasks.pop(), tasks.emplace, возможно что-то еще. Я точно знаю. что буду запускать количество потоков и задач = std::thread::hardware_concurrency() (количеству логических ядер), поэтому очередь не нужна (будет фикс блок все время). Прошу поделится вашей реализацией или годным советом.
Добавлено через 8 минут В конструкторе своего класса
0
|
|||||||||||
| 02.05.2023, 21:06 | |
|
Ответы с готовыми решениями:
55
Ручное управление количеством потоков в ThreadPool Сканирование портов в несколько потоков с помощью ThreadPool Ограниченное количество одновременно работающих потоков без ThreadPool |
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
||||
| 02.05.2023, 21:15 | ||||
std::barrier нужно?Опишите решаемую задачу.
0
|
||||
|
|
|
| 02.05.2023, 21:26 [ТС] | |
|
zayats80888, хочу ускорить код. Добавление в очередь, удаление, перемещение - это все нужно если у меня сервер с 256 ядрамт и куча задач. У меня не так. У меня класс, функционал которого всегда будет на локальном ПК иметь, к примеру, 8 потоков и 8 задач. Мне нужно запустить 8 потоков, выполнить, получить данные, еще раз запустить 8 потоков в другом методе и т.д. Привязать номер потока к задаче или еще как то оптимизировать очередь.
0
|
|
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
|||||||||
| 02.05.2023, 22:33 | |||||||||
Сообщение было отмечено bedvit как решение
РешениеКликните здесь для просмотра всего текста
https://wandbox.org/permlink/Df5WFlSEXPkG73l4
1
|
|||||||||
|
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 859
|
|
| 03.05.2023, 01:38 | |
|
смысл пула потоков ( threapool - как в названии темы ) в том что не тратится время на постоянно создание и слияние потоков. а в начале поздаётся нужное количество потоков - (обычно CoreCount-1) и они разбирают задания из очереди.
пул потоков может быть и с одним потоком.
0
|
|
|
|
||
| 03.05.2023, 09:56 [ТС] | ||
|
zayats80888, выдает ошибку Visual Studio 2022 (С++20) Error C2338 static_assert failed: 'N4861 [thread.barrier.class]/5: is_nothrow_invocable_v<CompletionFunctio n&> shall be true'
Aledveu, все верно, накладные расходы на создание потоков мы убрали, а на создание и поддержку очереди добавили. На малых данных, порядка 1000 элементов, использование threapool - увеличивает время выполнения, по сравнению с однопоточным вычислением. Моя цель убрать, по возможности, максимум накладных расходов из threapool.
0
|
||
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
|||
| 03.05.2023, 10:16 | |||
noexcept добавьте для оператора () у completion (по хорошему нужно это не только "заявить", но и гарантировать).
0
|
|||
|
|
||||||||
| 03.05.2023, 10:34 [ТС] | ||||||||
Боюсь в OMP будет та же очередь.
0
|
||||||||
|
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 859
|
||
| 03.05.2023, 10:55 | ||
|
вот мой пример для задач с малым временем выполнения (5мс): Кликните здесь для просмотра всего текста
[Info]: start WorkQueue_test
[Info]: Create Multithread Queue with NumThreades(7) and NumEntriesInQueue(10000) Result =1 [Info]: Create singlethread Queue with NumThreades(1) and NumEntriesInQueue(10000) Result =1 [Info]: Create nothread Queue with NumThreades(0) and NumEntriesInQueue(10000) Result =1 [Info]: Calibrating task time for 0.005000 seconds. Please wait ... [Info]: Measured time: 0.004982 seconds with param(666859) [Info]: Calculating TaskTime standart deviation. please wait... [Info]: TaskTime Mean value: 0.004978 seconds [Info]: TaskTime Standart deviation: 0.000075 seconds [Info]: Running tests with num_tasks_in_queue=1000 [Info]: Multi Thread: Time 0.760664, for_one_task = 0.005325 [Info]: Single Thread: Time 4.960777, for one task = 0.004961 [Info]: No Thread: Time 4.932919, for one task = 0.004933 для задач которые требуют времени побольше Кликните здесь для просмотра всего текста
[Info]: start WorkQueue_test [Info]: Create Multithread Queue with NumThreades(7) and NumEntriesInQueue(10000) Result =1 [Info]: Create singlethread Queue with NumThreades(1) and NumEntriesInQueue(10000) Result =1 [Info]: Create nothread Queue with NumThreades(0) and NumEntriesInQueue(10000) Result =1 [Info]: Calibrating task time for 0.050000 seconds. Please wait ... [Info]: Measured time: 0.050110 seconds with param(6739356) [Info]: Calculating TaskTime standart deviation. please wait... [Info]: TaskTime Mean value: 0.050026 seconds [Info]: TaskTime Standart deviation: 0.000317 seconds [Info]: Running tests with num_tasks_in_queue=1000 [Info]: Multi Thread: Time 7.751786, for_one_task = 0.054262 [Info]: Single Thread: Time 52.250195, for one task = 0.052250 [Info]: No Thread: Time 49.708642, for one task = 0.049709 поиграйтесь со своими задачами - померяйте накладные расходы
0
|
||
|
|
|
| 03.05.2023, 11:00 [ТС] | |
|
Aledveu, Вот тайминги нарезки строк, с длинной строки, количеством получаемых элементов и количеством итераций запуска метода класса
Кликните здесь для просмотра всего текста
Len(sTxt) = 13 888 895
Strings 1000000 Iterations 1 NO threads 8,203125E-02 std::thread: 0,03125 std::launch::async:0,03125 std::launch::deferred:0,0859375 ThreadPool:0,03125 Len(sTxt) = 1 288 894 Strings 100000 Iterations 10 NO threads 0,1367188 std::thread: 0,109375 std::launch::async:0,09375 std::launch::deferred:0,1367188 ThreadPool:9,765625E-02 Len(sTxt) = 118 893 Strings 10000 Iterations 100 NO threads 0,1054688 std::thread: 0,1992188 std::launch::async:8,203125E-02 std::launch::deferred:0,109375 ThreadPool:0,078125 Len(sTxt) = 10 892 Strings 1000 Iterations 1000 NO threads 0,1015625 std::thread: 1,175781 std::launch::async:0,109375 std::launch::deferred:0,1054688 ThreadPool:0,09375 Len(sTxt) = 991 Strings 100 Iterations 10000 NO threads 9,765625E-02 std::thread: 11,28125 std::launch::async:0,3164063 std::launch::deferred:0,125 ThreadPool:0,1914063 Len(sTxt) = 90 Strings 10 Iterations 100000 NO threads 0,1015625 std::thread: ---bad std::launch::async:1,53125 std::launch::deferred:0,4140625 ThreadPool:0,8203125 Len(sTxt) = 8 Strings 1 Iterations 1000000 NO threads 0,3984375 std::thread: ---bad std::launch::async:17,58203 std::launch::deferred:2,089844 ThreadPool:5,382813
0
|
|
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
|||||||
| 03.05.2023, 11:01 | |||||||
1
|
|||||||
|
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 859
|
||
| 03.05.2023, 11:14 | ||
|
bedvit,
а не могли бы вы пояснить как из ваших таймингов получить накладные расходы?
NO threads 0,1015625 ThreadPool:0,09375 если я правильно понимаю что это время на одну задачу ?
0
|
||
|
|
|
| 03.05.2023, 11:24 [ТС] | |
|
Aledveu, на вашем скрине - да на 1000 запусков метода, за счет накладных расходов, многопоточные вычисления выполняются дольше. Это время на одну задачу, запущенную 1000 раз.
Другими словами, когда у нас много данных и одна итерация, многопоточный алгоритм быстр и вне конкуренции. Когда данных мало, для усреднения результата, я запускаю в цикле (количество итераций) тот же метод, и тогда видим, что от 1000 и менее элементов в массиве для распараллеливания - многопоточные алгоритмы начинаю проигрывать однопоточному, за счет накладных расходов. Причем не равномерно, больше всего проигрывает std::thread, потом std::async с ключом std::launch::async, потом ThreadPool, и уже потом std::async с ключом std::launch::deferred (видимо потому как по факту это один поток)
0
|
|
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
||
| 03.05.2023, 11:33 | ||
|
0
|
||
|
|
||
| 03.05.2023, 11:46 [ТС] | ||
|
0
|
||
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
||
| 03.05.2023, 12:00 | ||
|
1) положить данные в "общую карзину", сделать доступными для потоков и начать работу 2) забрать результат Если два пункта затрачивают время, сопостовимое с временем собственно полезной работы, то распараллеливание теряет эффективность. Добавлено через 10 минут В частности, разбить строку длиной 90 на 9 строк длиной 10 будет быстрее, чем два пункта выше + вырезать из той же строки 1 строку, как бы вы не реализовали эти два пункта. Поэтому эту операцию нет смысла распараллеливать.
0
|
||
|
|
||||
| 03.05.2023, 12:33 [ТС] | ||||
|
Добавил в Тайминги parallel_launch - смотрится вполне неплохо, правда при запуске деструктора ошибка есть, пока не смотрел в чем дело.
Кликните здесь для просмотра всего текста
Len(sTxt) = 13 888 895
Strings 1000000 Iterations 1 NO threads 0,09375 std::thread: 3,515625E-02 std::launch::async:0,03125 std::launch::deferred:9,765625E-02 ThreadPool:0,03125 parallel_launch:0,03125 Len(sTxt) = 1 288 894 Strings 100000 Iterations 10 NO threads 0,2265625 std::thread: 0,1953125 std::launch::async:0,1796875 std::launch::deferred:0,2226563 ThreadPool:0,1835938 parallel_launch:0,1796875 Len(sTxt) = 118 893 Strings 10000 Iterations 100 NO threads 0,1132813 std::thread: 0,2148438 std::launch::async:0,0859375 std::launch::deferred:0,1171875 ThreadPool:0,0859375 parallel_launch:0,0859375 Len(sTxt) = 10 892 Strings 1000 Iterations 1000 NO threads 9,765625E-02 std::thread: 1,183594 std::launch::async:9,765625E-02 std::launch::deferred:0,1054688 ThreadPool:8,984375E-02 parallel_launch:0,1132813 Len(sTxt) = 991 Strings 100 Iterations 10000 NO threads 0,1015625 std::thread: 11,29688 std::launch::async:0,3125 std::launch::deferred:0,125 ThreadPool:0,1757813 parallel_launch:0,1445313 Len(sTxt) = 90 Strings 10 Iterations 100000 NO threads 0,1054688 std::thread: ---bad std::launch::async:1,496094 std::launch::deferred:0,359375 ThreadPool:0,8359375 parallel_launch:0,2617188 Я так понимаю, есть расходы разморозить поток-запустить задачу, получить отметку, что задача завершилась, заморозить поток.
0
|
||||
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
|||||
| 03.05.2023, 12:45 | |||||
|
0
|
|||||
|
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 859
|
|
| 03.05.2023, 12:53 | |
|
может сначала критерии написать - типа есть задача на которую тратится столько-то времени - это может быть и функция от объема данных.
Есть вариант её разбить и запустить в один поток или несколько - и посчитать выигрыш пока что действительно непонятно что выхотите добиться распараллеливанием и в каком случае это надо. а уже потом оптимизировать
0
|
|
|
|
||
| 03.05.2023, 14:29 [ТС] | ||
|
Отклонения от однопоточного алгоритма начинается от 1 тыс. строк (в моем тесте, см. спойлер)
parallel_launch на малых данных до 2х раз быстрее ThreadPool и всего в 2 раза медленнее 1 потока (std::thread на этих данных просто уходил в минуты) Возможно ли еще оптимизировать parallel_launch? Кликните здесь для просмотра всего текста
Strings 1000 Iterations 1000
NO threads 0,1015625 std::thread: 1,269531 std::launch::async:0,1171875 std::launch::deferred:0,109375 ThreadPool:9,765625E-02 parallel_launch:0,09375 Strings 500 Iterations 2000 NO threads 0,1015625 std::thread: 2,421875 std::launch::async:0,1328125 std::launch::deferred:0,1054688 ThreadPool:0,1132813 parallel_launch:0,1015625 Strings 250 Iterations 4000 NO threads 9,765625E-02 std::thread: 4,640625 std::launch::async:0,1796875 std::launch::deferred:0,109375 ThreadPool:0,1289063 parallel_launch:0,109375 Strings 125 Iterations 8000 NO threads 0,1015625 std::thread: 9,222656 std::launch::async:0,2578125 std::launch::deferred:0,125 ThreadPool:0,1679688 parallel_launch:0,1328125 Strings 62 Iterations 16129 NO threads 9,765625E-02 std::thread: ---bad std::launch::async:0,4140625 std::launch::deferred:0,1445313 ThreadPool:0,2304688 parallel_launch:0,1914063 Strings 31 Iterations 32258 NO threads 0,1015625 std::thread: ---bad std::launch::async:0,609375 std::launch::deferred:0,1875 ThreadPool:0,3007813 parallel_launch:0,1445313 Strings 15 Iterations 66666 NO threads 0,1054688 std::thread: ---bad std::launch::async:1,058594 std::launch::deferred:0,28125 ThreadPool:0,421875 parallel_launch:0,1992188
0
|
||
| 03.05.2023, 14:29 | |
|
Помогаю со студенческими работами здесь
20
ThreadPool и использование параллельных классов: распределение потоков по ядрам ЦП Обработка элементов в несколько потоков: ThreadPool или еще варианты? Смысл значений ThreadPool.SetMaxThreads и ThreadPool.SetMinThreads Как оптимизировать перемножние результатов массива задач? Алгоритм оптимального распараллеливания задач на несколько потоков Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга,
Ты же видел моря и метели.
Как сменялись короны и стяги,
Как эпохи стрелою летели.
- Этот мир — это крылья и горы,
Снег и пламя, любовь и тревоги,
И бескрайние. . .
|