首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • Intel Thread Building Blocks (TBB) 的介绍
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-28 10:42:45 楼主
    1. 在多核的平台上开发并行化的程序,必须合理地利用系统的资源 - 如与内核数目相匹配的线程,内存的合理访问次序,最大化重用缓存。有时候用户使用(系统)低级的应用接口创建、管理线程,很难保证是否程序处于最佳状态。

    2. Intel Thread Building Blocks (TBB) 很好地解决了上述问题:
    a)TBB提供C++模版库,用户不必关注线程,而专注任务本身。
    b)抽象层仅需很少的接口代码,性能上毫不逊色。
    c)灵活地适合不同的多核平台。
    d)线程库的接口适合于跨平台的移植(Linux, Windows, Mac)
    e)支持的C++编译器 – Microsoft, GNU and Intel 

    3.主要的功能:
    1)通用的并行算法
    循环的并行:
    parallel_for, parallel_reduce – 相对独立的循环层
    parallel_scan – 依赖于上一层的结果
    流的并行算法
    parallel_while – 用于非结构化的流或堆
    pipeline - 对流水线的每一阶段并行,有效使用缓存
    并行排序
    parallel_sort – 并行快速排序,调用了parallel_for

    2)任务调度者
    管理线程池,及隐藏本地线程复杂度
    并行算法的实现由任务调度者的接口完成
    任务调度者的设计考虑到本地线程的并行所引起的性能问题

    3)并行容器
    concurrent_hash_map
    concurrent_vector
    concurrent_queue

    4)同步原语
    atomic
    mutex
    spin_mutex – 适合于较小的敏感区域
    queuing_mutex – 线程按次序等待(获得)一个锁
    spin_rw_mutex
    queuing_rw_mutex
    说明:使用read-writer mutex允许对多线程开放”读”操作


    5)高性能的内存申请
    使用TBB的allocator 代替 C语言的 malloc/realloc/free 调用
    使用TBB的allocator 代替 C++语言的 new/delete 操作


    使用TBB的例子 – task
    #include “tbb/task_scheduler_init.h”
    #include “tbb/task.h”
    using namespace tbb;
    class ThisIsATask: public task {
    public:
      task* execute () {
        WORK ();
        return NULL;
      }
    };

    class MyRootTask: public task {
    public:
      task* execute () {
        for (int i=0; i <N; i++) {
          task& my_task = *new (task::allocate_additional_child_of (*this)) ThisIsATask ();
          spawn (my_task);
        }
        wait_for_all ();
        return NULL;
      }
    };

    int main () {
      task_scheduler_init my_tbb;  // 创建线程池
      task& my_root =
        *new (task::allocate_root()) MyRootTask ();
      my_root.set_ref_count (1);
      task::spawn_root_and_wait (my_root); // 开始Root Task任务
      return 0;
    }
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-29 09:01:351楼 得分:0
    parallel_scan 适合递归用吗?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-30 20:42:012楼 得分:0
    所有的并行算法都适合嵌套,递归。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-31 19:34:493楼 得分:0
    学习中......
    TBB的代码量不大,授人以鱼不如授人以渔场,干脆来个TBB源码剖析系列。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-01 09:11:434楼 得分:0
    抛砖引玉,详析部分代码从parall_for.h

    namespace tbb {

    //! @cond INTERNAL
    namespace internal {

        //! Task type used in parallel_for
        /** @ingroup algorithms */
        template <typename Range, typename Body, typename Partitioner=simple_partitioner>
        class start_for: public task { // class “start_for" 私有数据
            Range my_range;
            const Body my_body;
            Partitioner my_partitioner;
            /*override*/ task* execute();
        public:

            start_for( const Range& range, const Body& body, const Partitioner &partitioner ) :
                my_range(range),   
                my_body(body),
                my_partitioner(partitioner) // class "start_for" 构造函数
            {
            }
        };

        template <typename Range, typename Body, typename Partitioner>
        task* start_for <Range,Body,Partitioner>::execute() {  // "start_for" 执行部分 for "Range"
            if( my_partitioner.should_execute_range(my_range, *this) ) {
                my_body( my_range ); // 直接执行
                return NULL;
            } else {
                empty_task& c = *new( allocate_continuation() ) empty_task;
                recycle_as_child_of(c); // 回收作为子任务
                c.set_ref_count(2);
                start_for& b = *new( c.allocate_child() ) start_for(Range(my_range,split()),my_body,Partitioner(my_partitioner,split()));  // 嵌套使用class "start_for"作为子任务
                c.spawn(b);
                return this;
            }
        }

    } // namespace internal
    //! @endcond
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-08 20:56:495楼 得分:0
    set_ref_count后面带的参数是什么含意?如何使用?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-09 09:47:586楼 得分:0
    TBB线程池中"任务"增长计数器。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-12 10:17:317楼 得分:0
    任务增加超过2就自动回收,是不是这样理解呢
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-14 09:05:118楼 得分:0
    多任务增量计数器是TBB的内部控制指引。
    这里即指对“新for”循环进行多任务展开,而不是对每个“for”里的子任务增量。
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    世纪乐知(北京)网络技术有限公司 版权所有 京 ICP 证 020026 号
    Copyright © 2000-2007, CSDN.NET, All Rights Reserved