是否可以限制C ++ 17并行`for_each`的线程数?


10

我使用std::for_eachwith std::execution::par对表示为结构向量的巨大输入执行复杂的计算。该计算不需要任何与硬件有关的延迟(例如,网络或磁盘IO),它是“仅CPU”计算。对我来说,逻辑上讲,没有必要创建我们拥有硬件的更多OS线程;但是,Visual C ++ 2019平均创建50个线程,有时甚至只有12个硬件线程,最多可以创建500个线程。

有没有办法来限制并行线程计数至hardware_concurrencystd::for_eachstd::execution::par,或创建合理的线程数是使用自定义代码的唯一途径std::thread



1
即使有一天它将成为标准,线程池的主要问题是它的级别比标头中的std::for_each其他算法低得多<algorithm>。背后的主要思想std::execution::par是使并行代码几乎与顺序代码一样简单,并以最少的代码和语义变化并行化现有算法。
Vitalii

Answers:


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的开发者state

Windows系统线程池处理我们实施中的计划。线程池利用了标准库不可用的信息,例如系统上的其他线程在做什么,线程在等待什么内核资源等等。它选择何时创建更多线程以及何时终止它们。它还与其他系统组件(包括不使用C ++的组件)共享。

另一种选择是放弃仅依赖标准库,而使用已经具有新建议的STL实现。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.