Чи можна обмежити кількість потоків для C ++ 17 паралельних `for_each`?


10

Я використовую std::for_eachз std::execution::parдля виконання складних обчислень на величезному вході представлений в вигляді вектора структур. Для обчислення не потрібні затримки, пов'язані з обладнанням (наприклад, мережевий або дисковий IO), це "просто CPU". Для мене виглядає логічним, що немає сенсу створювати більше потоків ОС, у яких є апаратні; однак Visual C ++ 2019 створює в середньому 50 потоків, а іноді до 500, навіть є лише 12 апаратних потоків.

Чи є спосіб обмежити паралельні потоки розраховувати на hardware_concurrencyз std::for_eachі std::execution::par, або єдиним способом створити розумні теми підраховувати є використання призначеного для користувача коду з std::thread?


open-std.org/jtc1/sc22/wg21/docs/papers/2016/… - але я думаю, що це все-таки пропозиція?
Caramiriel

1
Навіть якщо це стане стандартним колись, головним питанням пулу потоків є те, що він набагато нижчий рівень, ніж std::for_eachта інші алгоритми з <algorithm>заголовка. Основна ідея std::execution::par- створення паралельного коду настільки ж просто, як послідовний, і паралелізація існуючих алгоритмів з мінімальними змінами коду та семантики.
Віталій

Відповіді:


5

Чи можна обмежити кількість ниток паралельно C ++ 17 for_each?

Ні, принаймні не на C ++ 17. Однак є пропозиція щодо executorsстандарту, який в основному дає можливість впливати на контекст виконання (з точки зору розташування та часу) для інтерфейсу алгоритму високого рівня STL:

thread_pool pool{ std::thread::hardware_concurrency() };
auto exec = pool.executor();
std::for_each(std::execution::par.on(exec), begin(data), end(data), some_operation);

До цього, ви повинні або довіри до постачальника компілятора , що він знає , що краще для загальної продуктивності, як , наприклад , розробники Visual Studio стану :

Планування в нашій реалізації обробляється пулом потоків системних систем Windows. Пул потоків використовує інформацію, недоступну для стандартної бібліотеки, наприклад, що роблять інші потоки в системі, які потоки ресурсів ядра чекають тощо. Він вибирає, коли створити більше ниток і коли їх припинити. Він також ділиться з іншими компонентами системи, включаючи ті, що не використовують C ++.

Іншим варіантом буде відмовитися від виключно покладаючись на стандартну бібліотеку та використовувати реалізацію STL, які вже містять нову пропозицію.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.