c++ - 是否可以限制 C++ 17 并行“for_each”的线程数?
问题描述
我使用std::for_each
withstd::execution::par
对表示为结构向量的巨大输入执行复杂计算。计算不需要任何与硬件相关的延迟(例如网络或磁盘 IO),它是“仅 CPU”计算。对我来说,创建更多我们拥有硬件线程的操作系统线程是没有意义的,这看起来是合乎逻辑的。但是,Visual C++ 2019 平均创建 50 个线程,有时甚至可以创建 500 个线程,即使只有 12 个硬件线程。
有没有办法将并行线程数限制为hardware_concurrency
with std::for_each
,std::execution::par
或者创建合理线程数的唯一方法是使用自定义代码 with 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 的开发人员状态:
我们实现中的调度由 Windows 系统线程池处理。线程池利用标准库不可用的信息,例如系统上的其他线程正在做什么,线程正在等待什么内核资源,等等。它选择何时创建更多线程以及何时终止它们。它还与其他系统组件共享,包括那些不使用 C++ 的组件。
另一种选择是放弃仅依赖标准库并使用已包含新提案的 STL 实现。
推荐阅读
- java - 在 Spring Boot 中使用 cookie 进行身份验证
- python - Python:缩放 4d 数组中的所有第 4 维值?
- python - 通过使用类从用户那里获取输入来返回多个值
- c# - CTRL+R CTRL+T 不适用于 VisualStuidio2017
- java - Java Graphics2D:如何将透视变换应用于 Graphics2D 对象?
- android - 导航抽屉宽度问题
- apache-kafka - SalesForce 的 Kafka 提供商 URL
- intellij-idea - Visual Studio 代码中用于完成 IntelliJ 中的语句的键盘快捷键是什么?
- java - 我可以将活动转换为浮动窗口吗?
- powerbi - 嵌入在 Power Bi Desktop 中的 PowerApp 与本地 SQL Server 通信,无需本地部署