17
A
回答
26
这里有几个完整的例子,其中一个使用parallel_for
,另一个使用parallel_for_each
。
更新2014-04-12:这些显示了我认为是现在使用TBB的一种非常老式的方式;我添加了一个separate answer,使用parallel_for
和一个C++ 11 lambda。
#include "tbb/blocked_range.h"
#include "tbb/parallel_for.h"
#include "tbb/task_scheduler_init.h"
#include <iostream>
#include <vector>
struct mytask {
mytask(size_t n)
:_n(n)
{}
void operator()() {
for (int i=0;i<1000000;++i) {} // Deliberately run slow
std::cerr << "[" << _n << "]";
}
size_t _n;
};
struct executor
{
executor(std::vector<mytask>& t)
:_tasks(t)
{}
executor(executor& e,tbb::split)
:_tasks(e._tasks)
{}
void operator()(const tbb::blocked_range<size_t>& r) const {
for (size_t i=r.begin();i!=r.end();++i)
_tasks[i]();
}
std::vector<mytask>& _tasks;
};
int main(int,char**) {
tbb::task_scheduler_init init; // Automatic number of threads
// tbb::task_scheduler_init init(2); // Explicit number of threads
std::vector<mytask> tasks;
for (int i=0;i<1000;++i)
tasks.push_back(mytask(i));
executor exec(tasks);
tbb::parallel_for(tbb::blocked_range<size_t>(0,tasks.size()),exec);
std::cerr << std::endl;
return 0;
}
和
#include "tbb/parallel_for_each.h"
#include "tbb/task_scheduler_init.h"
#include <iostream>
#include <vector>
struct mytask {
mytask(size_t n)
:_n(n)
{}
void operator()() {
for (int i=0;i<1000000;++i) {} // Deliberately run slow
std::cerr << "[" << _n << "]";
}
size_t _n;
};
template <typename T> struct invoker {
void operator()(T& it) const {it();}
};
int main(int,char**) {
tbb::task_scheduler_init init; // Automatic number of threads
// tbb::task_scheduler_init init(4); // Explicit number of threads
std::vector<mytask> tasks;
for (int i=0;i<1000;++i)
tasks.push_back(mytask(i));
tbb::parallel_for_each(tasks.begin(),tasks.end(),invoker<mytask>());
std::cerr << std::endl;
return 0;
}
两者编译的Debian /喘息(克++ 4.7)系统g++ tbb_example.cpp -ltbb
(然后用./a.out
运行)
(用于代替该 “invoker
” 的东西见this questionstd::mem_fun_ref
或boost::bind
)。
15
下面是一个更现代的使用parallel_for
与拉姆达;编译并在Debian /喘息与g++ -std=c++11 tbb_example.cpp -ltbb && ./a.out
运行:
#include "tbb/parallel_for.h"
#include "tbb/task_scheduler_init.h"
#include <iostream>
#include <vector>
struct mytask {
mytask(size_t n)
:_n(n)
{}
void operator()() {
for (int i=0;i<1000000;++i) {} // Deliberately run slow
std::cerr << "[" << _n << "]";
}
size_t _n;
};
int main(int,char**) {
//tbb::task_scheduler_init init; // Automatic number of threads
tbb::task_scheduler_init init(tbb::task_scheduler_init::default_num_threads()); // Explicit number of threads
std::vector<mytask> tasks;
for (int i=0;i<1000;++i)
tasks.push_back(mytask(i));
tbb::parallel_for(
tbb::blocked_range<size_t>(0,tasks.size()),
[&tasks](const tbb::blocked_range<size_t>& r) {
for (size_t i=r.begin();i<r.end();++i) tasks[i]();
}
);
std::cerr << std::endl;
return 0;
}
1
1-
//!
//! Get the default number of threads
//!
int nDefThreads = tbb::task_scheduler_init::default_num_threads();
//!
//! Init the task scheduler with the wanted number of threads
//!
tbb::task_scheduler_init init(nDefThreads);
2-
也许,如果你的代码证,与TBB独立运行任务的最佳方法是parallel_invoke 。在英特尔开发人员专区的博客中,有一篇文章解释了一些关于parallel_invoke如何有所帮助的例子。检出this
2
如果您只是想同时运行几项任务,那么只需使用tbb::task_group
就可能更容易。从tbb采取例如:
#include "tbb/task_group.h"
using namespace tbb;
int Fib(int n) {
if(n<2) {
return n;
} else {
int x, y;
task_group g;
g.run([&]{x=Fib(n-1);}); // spawn a task
g.run([&]{y=Fib(n-2);}); // spawn another task
g.wait(); // wait for both tasks to complete
return x+y;
}
}
然而要注意
创建大量任务的单个task_group是不可伸缩的,因为任务的创建成为一个串行瓶颈。
在这些情况下,使用timday的例子与parallel_for
或类似。
相关问题
- 1. UINavigationController:最简单的例子
- 2. 最简单的例子tornado.gen
- 3. 最简单的例子Gson.fromJson失败
- 4. 简单的例子
- 5. 简单的例子
- 6. linux uinput:简单的例子?
- 7. Qt:Quazip的简单例子
- 8. 简单的例子:HBase + Spring
- 9. 关闭的简单例子
- 10. 经由简单的例子
- 11. 简单的Ajax例子2.3.0
- 12. 简单的php websocket例子
- 13. 简单的Ajax例子
- 14. Akka.js TestKit:简单的例子
- 15. Symfony2的简单例子
- 16. 水银简单的例子
- 17. 简单的例子BeautifulSoup Python
- 18. 简单的例子AngularJS
- 19. 可怜的用例 - 简单的例子
- 20. iteratee简介或简单的例子?
- 21. JOBLIB简单的例子平行例如大于简单慢
- 22. 演员案例类简单的例子
- 23. 什么是JSON支付贝宝定义的简单,最简单的例子?
- 24. Flex-bison简单例子
- 25. Jsch shell/Expecdt4j简单例子?
- 26. BNFC生成的语法在最简单的例子上失败
- 27. Dajaxice与Django不工作的最简单的例子
- 28. Angular的ng-show为什么不是最简单的例子?
- 29. 在C++中使用auto的最简单的例子是什么?
- 30. 试图让performSelector的可能最简单的例子:withObject工作