博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TBB之parallel_for
阅读量:4058 次
发布时间:2019-05-25

本文共 1138 字,大约阅读时间需要 3 分钟。

下面是串行代码:

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
& 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
(0,n), ApplyFoo(a));}

转载地址:http://timci.baihongyu.com/

你可能感兴趣的文章
C语言位扩展
查看>>
linux irqdebug
查看>>
git 常用命令
查看>>
linux位操作API
查看>>
uboot start.s文件分析
查看>>
没有路由器的情况下,开发板,虚拟机Ubuntu,win10主机,三者也可以ping通
查看>>
本地服务方式搭建etcd集群
查看>>
安装k8s Master高可用集群
查看>>
忽略图片透明区域的事件(Flex)
查看>>
忽略图片透明区域的事件(Flex)
查看>>
AS3 Flex基础知识100条
查看>>
Flex动态获取flash资源库文件
查看>>
01Java基础语法-16. while循环结构
查看>>
01Java基础语法-19. 循环跳转控制语句
查看>>
Django框架全面讲解 -- Form
查看>>
今日互联网关注(写在清明节后):每天都有值得关注的大变化
查看>>
”舍得“大法:把自己的优点当缺点倒出去
查看>>
[今日关注]鼓吹“互联网泡沫,到底为了什么”
查看>>
[互联网学习]如何提高网站的GooglePR值
查看>>
[关注大学生]求职不可不知——怎样的大学生不受欢迎
查看>>