Intel-TBB
文章平均质量分 50
健雄
擅长spark、数据挖掘、人脸识别、opencv
精通c/c++,scala语言,python
展开
-
TBB介绍
介绍这篇教程教你怎样使用Intel的Threading Building Blocks(Intel TBB),它是一个库帮助你利用多核提高性能,你不需要是个线程专家,这个项目可能首先看似使人畏惧,但是通常你只需要知道一些关键点就能利用多核处理器来改善你的代码。例如,通过只阅读这篇文档的3.4节,你就能成功实现多线程程序。随着你的专业知识的增长,你可能想要投入到更加复杂的项目中,这些都覆盖在更高级的章翻译 2016-02-01 11:46:05 · 16065 阅读 · 0 评论 -
TBB之Timing
当计算并行程序性能时,通常计算wall clock时间,而不是CPU时间,这是重要的,理由是通过利用更多的CPU增加了更好的并行度,其时间是多CPU时间的聚集。TBB的类tick_count提够一个简单的接口测量wall clock时间,tick_count有个静态方法tick_count::now()表示当前的绝对时间,2个tick_count相减是一个相对时间在(tick_count::inte翻译 2016-02-03 18:17:17 · 609 阅读 · 0 评论 -
TBB之Atomic
通过使用atomic操作避免使用互斥锁,当一个线程执行一个atomic操作,其他线程挂起,atomic操作的优点是它们相对locks更快,不会有deadlock和convoying的现象,缺点是它们只能做有限的操作,常常没有足够同步更复杂的操作,但是你不应该放弃使用atomic操作的机会而去使用互斥锁,类atomic实现c++风格的的操作。atomic操作的典型应用是线程安全的引用计数。假设x是一个翻译 2016-02-03 18:03:25 · 1546 阅读 · 0 评论 -
TBB之concurrent_vector
concurrent_vector是一个动态可增长的数字,当其他线程对其中的元素操作时,可安全push元素到concurrent_vector,对于安全并行增加元素,concurrent_vector有3个方法支持动态数组的使用:push_back, grow_by以及grow_to_at_least。方法push_back(x)安全把x赋给array,方法grow_by(n)安全赋值n个连续的元素翻译 2016-02-03 16:25:57 · 5192 阅读 · 0 评论 -
TBB之concurrent_hash_map
Intel TBB 提供高并发的容器类,Windows或者Linux线程能使用这些容器类或者和基于task编程相结合(TBB)。一个并发容器允许多线程同时对容器访问和更改条例,典型的C++STL容器类不允许 并发更新,尝试并行更改他们引起恶化容器。STL容器能使用互斥锁来包装,目的让他们安全访问,通过只让一个线程同时操作一个容器,但是这种方式消除了并行,限制了并行提速。Intel TBB提供的容器有翻译 2016-02-03 15:06:37 · 7985 阅读 · 0 评论 -
TBB之Exceptions and Cancellation
Intel TBB支持exceptions和cacellation。当Intel TBB算法里的代码抛出exception时,会发生下面的事情:exception被捕获,在算法里更远的exceptions被忽略。算法被取消,未实现的迭代不被执行,如果内部嵌套Intel TBB的并行程序,它会被取消。一旦算法所有部分停止,那么调用这个算法的线程会抛出一个exception。#include "翻译 2016-02-03 11:20:58 · 764 阅读 · 0 评论 -
TBB之pipeline
Pipelining是一个通用并行模型,模仿一个传统的制造集成生成线,数据流向一系列的管道滤波,每个滤波以某种方式处理数据,给定一个输入流数据,一些滤波能并行操作,另外一些不能。例如,视频处理,对帧的处理不依赖其他帧,那么能同时处理多个帧,反之,对帧的操作需要首先处理先前的帧。TBB类pipeline和filter实现pipeline模式。一个简单的文本处理例子会被使用证明pipeline和filt翻译 2016-02-01 18:11:10 · 2569 阅读 · 0 评论 -
TBB之parallel_do
对于一些循环,迭代空间的结束是未知的,或者循环体在循环结束之前可能增加更多的迭代,你能使用模板类tbb::parallel_do处理这2种情况。链表是迭代空间未知的例子,在并行编程中,通常使用动态数组代替链表是更好的,因为访问链表的条目本质是串行的,但是如果你被限制使用链表,条目能被安全并行处理,处理每个条目花费至少几千个指令,你能使用parallel_do增加一些并行度。例如,考虑下面的串行代码:翻译 2016-02-01 17:15:43 · 1600 阅读 · 0 评论 -
TBB之parallel_reduce
循环做的是reduce(最终输出的是单一的数),例如求和:float SerialSumFoo( float a[], size_t n ) { float sum = 0; for( size_t i=0; i!=n; ++i ) sum += Foo(a[i]); return sum;}你能使用模板类parallel_reduce并行这个循环:floa翻译 2016-02-01 16:31:06 · 1694 阅读 · 0 评论 -
TBB之parallel_for
下面是串行代码: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对象,这个对象里面有个opera翻译 2016-02-01 14:57:13 · 2232 阅读 · 0 评论 -
TBB之task
这部分介绍Intel TBB task scheduler,task scheduler是一个loop模板的引擎,在实际应用中,你应该使用loop模板而不是task scheduler,因为模板隐藏了调度器的复杂度。然而,如果你有一个算法不能映射到高阶模板中的一个,请使用task scheduler。#include "tbb/tbb.h"#include <cstdio>using names翻译 2016-02-03 18:46:00 · 2194 阅读 · 0 评论