【发布时间】:2018-04-12 05:08:52
【问题描述】:
C++17 通过使用可选的 ExecutionPolicy 参数(作为第一个参数)升级了 69 个 STL 算法以支持并行性。例如。
std::sort(std::execution::par, begin(v), end(v));
我怀疑 C++17 标准故意没有说明如何实现多线程算法,让库作者决定什么是最好的(并允许他们更改自己的头脑,稍后)。尽管如此,我还是很想从高层次上了解在并行 STL 算法的实现中正在考虑哪些问题。
我想到的一些问题包括(但不限于!):
- (C++ 应用程序)使用的最大线程数与机器上的 CPU 和/或 GPU 内核数有什么关系?
- 每种算法使用的线程数有什么不同? (每种算法在每种情况下都会使用相同数量的线程吗?)
- 是否考虑过其他线程上的其他并行 STL 调用(在同一个应用程序中)? (例如,如果一个线程调用 std::for_each(par,...),它会根据 std::sort(par, ...) 是否已经在其他线程上运行而使用更多/更少/相同的线程(s)?也许有线程池?)
- 是否考虑过外部因素导致内核的繁忙程度? (例如,如果 1 个内核非常忙,比如分析 SETI 信号,C++ 应用程序会减少它使用的线程数吗?)
- 某些算法是否只使用 CPU 内核?还是只有 GPU 内核?
- 我怀疑实现会因库而异(编译器到编译器?),甚至有关这方面的细节也会很有趣。
我意识到这些并行算法的目的是让程序员不必担心这些细节。但是,任何可以让我对图书馆调用内部发生的事情有一个高层次的心理了解的信息都将不胜感激。
【问题讨论】:
-
尽管您的问题很有趣,但它可能过于宽泛。回答您的问题的最佳方法是查看 libstdc++ 和 libc++ 的实现。
-
一个简单的实现使用一个线程池,每个 CPU 核心有一个线程和一个任务队列,按需将任务提供给线程。
标签: c++ multithreading concurrency parallel-processing stl