使用 -D_GLIBCXX_PARALLEL -fopenmp 开启并行STL之旅

使用 -D_GLIBCXX_PARALLEL -fopenmp 开启并行STL之旅

最近在看现代C++白皮书,看到C++17引入了并行STL。

8.5 并行 STL

从长远来看,并行算法的使用将是非常重要的,因为从用户角度看,没有什么比只说“请执行这个算法”更简单的了。从实现者的角度来看,算法中有一套特定接口而没有对算法的串行约束将是一个机会。C++17 只迈出了一小步,但这远比没有开始好得多,因为它指明了方向。不出意外,委员会中有一些反对的声音,大多数来自于希望为专家级用户提供复杂接口的人。有些人对这样简单的一个方案是否可行表示严重怀疑,并主张推迟这一方案。

基本的想法是,为每个标准库算法提供一个额外参数,允许用户请求向量化和/或多线程。例如:

sort(par_unseq, begin(v), end(v));  // 考虑并行和向量化

但这还只适用于 STL 算法,所以重要的 find_anyfind_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 来排序
}

毕竟标准库是可扩展的。

先说自己探索的结论,目前的gcc/g++只需要在编译是添加参数 -D_GLIBCXX_PARALLEL -fopenmp 即可达到并行化的效果,不需要对源码进行修改。sort并行化效果很不错,遍历的函数大部分都能有一定的提升,二分查找的性能反而会有明显的下降。

libstdc++/manual/parallel_mode_using

网上已有的方法,需要添加头文件#include <execution> ,还需要形如 sort(execution::par, begin(d), end(d));一样设置并行化算法。

#include <algorithm>
#include <execution>
#include <iostream>
#include <random>
#include <chrono>   

using namespace std;
using namespace chrono;

int main() {
   
    vector<long long> d1(30000000);
    vector<long long> d2(30000000);

    mt19937 gen;
    uniform_int_distribution<long long> dis(0, 100000000);
    auto rand_num([=]() mutable {
    return dis(gen)
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值