TBB之parallel_for
来源:互联网 发布:淘宝网1岁以上儿童玩具 编辑:程序博客网 时间:2024/05/22 04:44
下面是串行代码:
void SerialApplyFoo( float a[], size_t n ) { for( size_t i=0; i!=n; ++i ) Foo(a[i]);}
tbb::parallel_for把迭代空间分成若干块,在每个块上运行独立的线程。第一步形成Body,把它作用在块上,这个Body是一个STL风格的对象,叫做body对象,这个对象里面有个operator()处理一个块,下面的代码是生成body对象:
#include "tbb/tbb.h"using namespace tbb;class ApplyFoo { float *const my_a;public: void operator()( const blocked_range<size_t>& r ) const { float *a = my_a; for( size_t i=r.begin(); i!=r.end(); ++i ) Foo(a[i]); } ApplyFoo( float a[] ) :my_a(a) {}};
注意operator()参数,库提供的一个blocked_range模板类,它描述的是类型T的一维迭代空间,parallel_for也和其他类型的迭代空间工作,TBB也提供blocked_range2d的2维空间,你能定义自己的空间在3.4章节中。
parallel_for需要body对象有一个拷贝构造函数,它被调用创建一个拷贝为每个工作线程,它也调用析构函数摧毁这些拷贝,在大多情况,隐式产生的拷贝构造函数和析构函数能够工作正常。
因为body对象一定被拷贝,它的operator()不应该改变body里的成员变量,否者这个改变可能或者不可能对其他线程是可见的(产生歧义),作为一个细微的提醒,parallel_for需要body对象的operator()声明成const。
operator()加载my_a成局部变量a。虽然这不是强制的,但是有2个原因需要这样做:
- Style。它让body看起来更像原始的。
- Performance。有时频繁访问局部变量可以帮助编译器优化循环,因为局部变量对编译器来说常常是更容易跟踪的。
一旦你有了body对象,就可以调用模板函数parallel_for:
#include "tbb/tbb.h"void ParallelApplyFoo( float a[], size_t n ) { parallel_for(blocked_range<size_t>(0,n), ApplyFoo(a));}
0 0
- TBB基础之parallel_for
- TBB基础之parallel_for
- TBB基础之parallel_for
- TBB之parallel_for
- TBB parallel_for
- tbb基础之parallel_for用法详解
- TBB基础之parallel_for求数组平均数
- TBB之parallel_reduce
- TBB之parallel_do
- TBB之pipeline
- TBB之concurrent_hash_map
- TBB之concurrent_vector
- TBB之Atomic
- TBB之Timing
- TBB之task
- TBB之Exceptions and Cancellation
- TBB基础之初始化&amp;终止
- tbb基础之parallel_reduce用法详解
- 设计模式--单例模式
- 栈 1
- javascript_词法结构
- Android仿QQ未读消息拖拽删除粘性效果
- Writing Files
- TBB之parallel_for
- Android中黄色警告提示强迫症
- kNN算法概要
- android处理crash程序崩溃异常
- AES128的加密解密学习总结
- <iOS> 谈谈iOS Animation
- 黑马程序员-----------2.1所感
- POJ1511 SPFA水题
- Golang入门——第一个程序Hello Golang