boost库 tbb_c++ 最简单的TBB示例
这里有几个完整的例子,一个使用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"#inc
这里有几个完整的例子,一个使用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
#include
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& t)
:_tasks(t)
{}
executor(executor& e,tbb::split)
:_tasks(e._tasks)
{}
void operator()(const tbb::blocked_range& r) const {
for (size_t i=r.begin();i!=r.end();++i)
_tasks[i]();
}
std::vector& _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 tasks;
for (int i=0;i<1000;++i)
tasks.push_back(mytask(i));
executor exec(tasks);
tbb::parallel_for(tbb::blocked_range(0,tasks.size()),exec);
std::cerr << std::endl;
return 0;
}
和
#include "tbb/parallel_for_each.h"
#include "tbb/task_scheduler_init.h"
#include
#include
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 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 tasks;
for (int i=0;i<1000;++i)
tasks.push_back(mytask(i));
tbb::parallel_for_each(tasks.begin(),tasks.end(),invoker());
std::cerr << std::endl;
return 0;
}
两者都使用g tbb_example.cpp -ltbb在Debian / Wheezy(g 4.7)系统上编译(然后以./a.out运行)
(参见this question,用std :: mem_fun_ref或boost :: bind替换“invoker”)。
更多推荐
所有评论(0)