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)
归档时间: |
|
查看次数: |
29338 次 |
最近记录: |