Я использую std::for_each
с std::execution::par
для выполнения сложных вычислений на огромном входе представлен в виде вектора структур. Вычисления не требуют каких-либо задержек, связанных с аппаратным обеспечением (например, сетевой или дисковый ввод-вывод), это просто вычисления процессора. Для меня это выглядит логичным, что нет смысла создавать больше потоков ОС, чем у нас аппаратных; тем не менее, Visual C ++ 2019 создает в среднем 50 потоков, а иногда до 500, даже если есть только 12 аппаратных потоков.
Есть ли способ ограничить параллельные потоки рассчитывать на hardware_concurrency
с std::for_each
и std::execution::par
, или единственным способом создать разумные темы подсчитывать является использование пользовательского кода с std::thread
?
источник
std::for_each
и другие алгоритмы из<algorithm>
заголовка. Основная идеяstd::execution::par
заключается в том, чтобы сделать параллельный код максимально простым, чем последовательный, и распараллелить существующие алгоритмы с минимальными изменениями кода и семантики.Ответы:
Нет, по крайней мере, не в C ++ 17. Однако
executors
в стандарте есть предложение, которое в основном дает вам возможность влиять на контекст выполнения (с точки зрения местоположения и времени) для интерфейса алгоритма STL высокого уровня:До этого, вы должны либо доверия к поставщику компилятора , что он знает , что лучше для общей производительности, как , например , разработчики Visual Studio состояния :
Другой вариант - отказаться от использования только стандартной библиотеки и использовать реализации STL, которые уже содержат новое предложение.
источник