Можно ли ограничить количество потоков для C ++ 17 параллельно `for_each`?

10

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

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

Vitalii
источник
open-std.org/jtc1/sc22/wg21/docs/papers/2016/… - но я думаю, что это все еще предложение?
Карамириэль
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, которые уже содержат новое предложение.

Jodocus
источник