繁体   English   中英

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

[英]Is it possible to limit threads count for C++ 17 parallel `for_each`?

我使用std::for_eachstd::execution::par对表示为结构向量的巨大输入执行复杂计算。 计算不需要任何与硬件相关的延迟(例如网络或磁盘 IO),它是“仅 CPU”计算。 对我来说,创建更多我们拥有硬件线程的操作系统线程似乎是合乎逻辑的。 但是,Visual C++ 2019 平均创建了 50 个线程,有时即使只有 12 个硬件线程,也会创建多达 500 个线程。

有没有办法使用std::for_eachstd::execution::par将并行线程数限制为hardware_concurrency ,或者创建合理线程数的唯一方法是使用自定义代码和std::thread

是否可以限制 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 系统线程池处理。 线程池利用标准库不可用的信息,例如系统上的其他线程正在做什么,线程正在等待什么 kernel 资源,等等。 它选择何时创建更多线程以及何时终止它们。 它还与其他系统组件共享,包括不使用 C++ 的系统组件。

另一种选择是放弃仅依赖标准库并使用已经包含新提案的 STL 实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM