C++ 2011:std :: thread:并行化循环的简单示例?

Vin*_*ent 19 c++ multithreading c++11

C++ 2011包含非常酷的新功能,但我找不到很多并行化for循环的例子.所以我非常天真的问题是:如何将一个简单的for循环(如使用"omp parallel for")与std :: thread并行化?(我搜索一个例子).

非常感谢你.

inf*_*inf 31

std::thread并不一定意味着平行循环.它意味着构建类似parallel_for算法的构造的低级抽象.如果你想要平行你的循环,你应该自己编写一个parallel_for算法,或者使用现有的提供基于任务的并行性的库.

以下示例显示了如何平行简单循环,但另一方面也显示了缺点,例如缺少负载平衡和简单循环的复杂性.

  typedef std::vector<int> container;
  typedef container::iterator iter;

  container v(100, 1);

  auto worker = [] (iter begin, iter end) {
    for(auto it = begin; it != end; ++it) {
      *it *= 2;
    }
  };


  // serial
  worker(std::begin(v), std::end(v));

  std::cout << std::accumulate(std::begin(v), std::end(v), 0) << std::endl; // 200

  // parallel
  std::vector<std::thread> threads(8);
  const int grainsize = v.size() / 8;

  auto work_iter = std::begin(v);
  for(auto it = std::begin(threads); it != std::end(threads) - 1; ++it) {
    *it = std::thread(worker, work_iter, work_iter + grainsize);
    work_iter += grainsize;
  }
  threads.back() = std::thread(worker, work_iter, std::end(v));

  for(auto&& i : threads) {
    i.join();
  }

  std::cout << std::accumulate(std::begin(v), std::end(v), 0) << std::endl; // 400
Run Code Online (Sandbox Code Playgroud)

使用提供parallel_for模板的库,可以简化为

parallel_for(std::begin(v), std::end(v), worker);
Run Code Online (Sandbox Code Playgroud)