文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
8.5 并行 STL
从长远来看,并行算法的使用将是非常重要的,因为从用户角度看,没有什么比只说请执行这个算法
更简单的了。从实现者的角 度来看,算法中有一套特定接口而没有对算法的串行约束将是一个机会。C++17 只迈出了一小步,但这远比没有开始好得多,因为它指明了方向。不出意外,委员会中有一些反对的声音,大多数来自于希望为专家级用户提供复杂接口的人。有些 人对这样简单的一个方案是否可行表示严重怀疑,并主张推迟这一方案。
基本的想法是,为每个标准库算法提供一个额外参数,允许用户请求向量化和/或多线程。例如:
sort(par_unseq, begin(v), end(v)); // 考虑并行和向量化
但这还只适用于 STL 算法,所以重要的 find_any
和 find_all
算法被忽略了。将来我们会看到专门为并行使用而设计的算法。这正在 C++20 中变为现实。
另一个弱点是,仍然没有取消一个线程的标准方法。例如,在搜索中找到一个对象后,一个线程不能停止其他正在并行执行的搜索。这是 POSIX 干预的结果,它反对所有形式的取消操作(§4.1.2)。C++ 20 提供了协作式取消(§9.4)。
C++17 的并行算法也支持向量化。这很重要,因为对 SIMD 的优化支持是硬件在单线程性能方面仍然(2017 年后)有巨大增长的少数领域之一。
在 C++20 中,我们(总算)能用范围库(§6.3)来避免显式使用容器的元素序列,只要这么写:
sort(v);
不幸的是,并行版本的范围在 C++20 中没有及时完成,因此我们只能等到 C++23 才能这么写:
sort(par_unseq, v); // 使用并行和向量化来对 v 进行排序
不想等 23 的话,我们可以自己实现适配器:
template<typename T>
concept execution_policy = std::is_execution_policy<T>::value;
void sort(execution_policy auto&& ex, std::random_access_range auto& r)
{
sort(ex, begin(r), end(r)); // 使用执行策略 ex 来排序
}
毕竟标准库是可扩展的。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论