TBB ( Thread Building Blocks, 线程构建模块) 是Intel公司开发的并行编程开发的工具。它支持Windows,OS X, Linux平台,支持的编译器有Visual C++ (version 8.0 or higher, on Windows only), Intel C++ Compiler (version 11.1 or higher) or the GNU Compiler Collection (gcc).ios
TBB is a collection of components for parallel programming:算法
1. 下载地址:https://www.threadingbuildingblocks.org/download编程
下载:windows release版tbb43_20150424oss_win.zip - 配置环境变量PATH,保证运行时找到dll - 在TBB应用工程中添加tbb包含目录,即tbb相关头文件 - 在TBB应用工程中添加tbb库目录,即tbb的lib文件,注意32位和64位有分别的目录
问题:查找一个范围内的全部素数,子问题是判断一个数是否是素数,并且每一个数字的判断互不影响,因此能够用并行算法。vim
find_prime.ccwindows
/* ** find_prime.cc ** g++ find_prime.cc -ltbb -lrt -o find_prime ** -ltbb for tbb library ** -lrt for tbb::tick_count::now() using clock_gettime() */ #include<iostream> #include<tbb/tbb.h> using namespace std; using namespace tbb; int is_prime(int x) { int i; if (x <= 1) { /*1不是質數,且不考慮負整數與0,故輸入x<=1時輸出為假 */ return 0; } for (i = 2; i * i <= x; ++i) { if (x % i == 0) { /*若整除時輸出為假,否則輸出為真 */ return 0; } } return 1; } class FindPrime { public: void operator() (const blocked_range < size_t > &r)const { for (size_t i = r.begin(); i != r.end(); ++i) { if (is_prime(i)) { cout << i << endl; } } } }; int main(int argc, char *argv[]) { size_t end = 100; if (argc > 1 && atoi(argv[1]) > 0) { end = atoi(argv[1]); } parallel_for(blocked_range < size_t > (0, end), FindPrime()); return 0; }
编译markdown
g++ find_prime.cc -ltbb -lrt -o find_prime
parallel_for第二参数是一个类A的实例对象,该类A要重载操做符 ()
.app
对于less
class Test{ public: void operator()(const int &i) const{ cout<<"operation with i" <<endl; } }; 第一个const保证i不被改变,第二个const保证调用对象不被改变。 使用方法 Test t; t(110);
匿名函数在C++11中引用,语法是函数
[capture子句](参数列表)mutable throw() -> int{函数体}
最简单的一个例子,没有参数,没有异常处理,没有返回类型(自动推断)工具
[]{cout<<"hello world from lambda!"<<endl;}();
最后的 ()
是对匿名函数的调用,分开来看是这样的,首先定义一个函数指针
typedef void (*func)(); func f = []{cout<<"hello world from lambda!"<<endl;}; f();
capture子句主要有两个符号 =
, &
, =
表示以传值的方式传递参数, &
表示以引用的方式(传地址)传递参数,这两个符号能够单独使用,也能够组合使用, &
后面还能够跟一个变量,只修饰它。
[] // 没有定义任何变数。使用未定义变数会致使错误。 [x, &y] // x以传值方式传入(预设),y以传地址方式传入。 [&] // 任何被使用到的外部变数皆隐式地以地址方式加以引用。 [=] // 任何被使用到的外部变数皆隐式地以传值方式加以引用。 [&, x] // x显示地以传值方式加以引用。其馀变数以地址方式加以引用。 [=, &z] // z显示地以地址方式加以引用。其馀变数以传值方式加以引用。
所谓placement new就是在用户指定的内存位置上构建新的对象,这个构建过程不须要额外分配内存,只须要调用对象的构造函数便可。
Task Scheduler
库会用到这一特性
#include <iostream> #include "tbb/tbb.h" using namespace tbb; using namespace std; class first_task:public task { public: task * execute() { cout << "Hello World!\n"; return NULL; } }; int main() { task_scheduler_init init(task_scheduler_init::automatic); first_task & f1 = *new(tbb::task::allocate_root())first_task(); tbb::task::spawn_root_and_wait(f1); return 0; }
endl;
参考博客:http://www.tuicool.com/articles/R3uu22