有人在用TBB吗,效果如何?

chang20080808 2008-10-26 08:52:23
有人在用TBB吗,效果如何?
...全文
704 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanglei5695312 2009-12-29
  • 打赏
  • 举报
回复
什么时候用OpenMP,什么时候用MPI,什么时候用TBB,怎么样的问题规模下,应该用怎么样多的线程个数,确实是个问题???
intel_iclifort 2009-12-29
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 intel_iclifort 的回复:]

有原来的串行代码,通过OpenMP引入并行
[/Quote]

目前OpenMP支持C/C++和Fortran
intel_iclifort 2009-12-29
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 wanglei5695312 的回复:]
什么时候用OpenMP,什么时候用MPI,什么时候用TBB,怎么样的问题规模下,应该用怎么样多的线程个数,确实是个问题???
[/Quote]

简单地说,有原来的串行代码,通过OpenMP引入并行;TBB更适合C++或者创建新的并行应用

而在物理上分布式的多机环境,MPI可能是最合适的选择


线程个数,一般应该和系统中的总核数(=单个CPU内核数*CPU数)相等,如果应用的并行算法设计没什么大问题



Waiting4you 2009-04-08
  • 打赏
  • 举报
回复
intel_zhenyuwang 2009-04-08
  • 打赏
  • 举报
回复
图像计算我不懂。我有一个例子在ISN ,是比较WinThread,OpenMP,TBB的计算Pi的方法. TBB的结果稍好一些。
quanbuzic 2008-12-12
  • 打赏
  • 举报
回复
有人在用TBB吗,效果如何?
GaoYang 2008-12-10
  • 打赏
  • 举报
回复
怎么和楼上的感觉相反……
soft2hard 2008-12-10
  • 打赏
  • 举报
回复
OPENMP处理象图象这种任务比较容易划分的任务比较合适.
TBB处理些复杂数据的工作比较方便. 感觉是这样.
GaoYang 2008-12-10
  • 打赏
  • 举报
回复
个人感觉TBB的思路有点类似于MPI,是在运行时用了个模板来把任务分配到多个线程中执行的,好处在于粒度可以自己控制,不至于像OpenMP一样只能以原子级分配。又不是MPI那样在不同的进程之间交换数据,比较适用于单台计算机多内核的场景。水平有限,错了别鄙视我 ^_^

我平时一般只做4k*4k之内的图像处理,感觉速度倒是差不太多,可能是运算量还不够,体现不出来,赫赫。

goldencode 2008-12-09
  • 打赏
  • 举报
回复
就象是一个是桔子一个是苹果,别人说它们是不同的不好比较,但有人说别老是说这些"众人皆知的二手理论",我要的就是具体的比较数据!@#$!@$#%%^...
:)
goldencode 2008-12-09
  • 打赏
  • 举报
回复
实际上,还是那句话,这两个的应用场景是很不一样的.
TBB一个非常强大的功能是动态的线程负载平衡. 它自动为每个核创建一个线程,并保证每个线程都满负荷运行.当一个线程空闲时会自动从别的线程"偷"任务来执行,这些都是TBB自动完成的. 而OPENMP根本没有这样的功能. 这怎么比较呢.
goldencode 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 bigbigknife 的回复:]
如果教授没有自己的提炼,直接照本宣科,怕是会被学生赶下讲台的。

引用 8 楼 goldencode 的回复:
引用 6 楼 bigbigknife 的回复:
所以我们需要细节的东西,什么情况下用什么比较好?
光空谈泛泛的理论,就像落实贯彻科学发展观一样,对别人没有具体的实用价值。
你拿出一个具体的例子来,胜过重复这些众人皆知的二手理论一百倍。对吧?:)

引用 5 楼 intel_iclifort 的回复:
TBB和OpenMP不是相互替代的关系

[/Quote]
某个讲万有引力这个"二手"理论的教授,经过他自己的提炼,万有引力就变成他自己的"一手"理论了. 既然是提炼则是更高层次的概括,看来水平必在牛顿之上.看来这个"一手"理论大概没有几个人能讲了哈哈哈.
goldencode 2008-12-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bigbigknife 的回复:]
所以我们需要细节的东西,什么情况下用什么比较好?
光空谈泛泛的理论,就像落实贯彻科学发展观一样,对别人没有具体的实用价值。
你拿出一个具体的例子来,胜过重复这些众人皆知的二手理论一百倍。对吧?:)

引用 5 楼 intel_iclifort 的回复:
TBB和OpenMP不是相互替代的关系

它们用来解决的是不同的并行问题. 需要根据实际情况进行取舍
[/Quote]
科学发展观是人生观的一种,或者可以是人生观的重要组成部分, 人生观对一个人不能说不重要和实用价值吧.
就我来说TBB和OPENMP也是最近才关注的,不能说是众人皆知吧,而且理论还分一手的和二手的?世界上绝大多数的教授讲授的恐怕都是二手理论吧. 哈哈哈.
goldencode 2008-12-08
  • 打赏
  • 举报
回复
简单地说OPENMP适合那些可以通过静态分析就能做的并行,例如有确定次数的FOR循环并且可以被拆分. 而TBB更加智能, 可以进行动态的分配,例如自动分解任务,并动态分配到各个线程上去. 显然TBB更强大, 但应用也必然要稍微复杂一点, OPENMP在适合的场景下可以拿来就用.
bigbigknife 2008-12-08
  • 打赏
  • 举报
回复
It's beautiful!
:)

[Quote=引用 10 楼 intel_zhenyuwang 的回复:]
引用 4 楼 bigbigknife 的回复:
到目前为止,还没有人拿出TBB和OpenMP比较的实验数据。
希望在用TBB的同志们抓紧时间做个实验,尤其是intel_zhenyuwang同志,要加油啊!


今天有点时间,给大家一个实验数据:(the performance results are similar from TBB and OpenMP. However there is no critical section in this example - unnecessary. TBB has other powerful functions)

距阵乘法原型:
// C = A x B

[/Quote]
intel_zhenyuwang 2008-12-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 bigbigknife 的回复:]
到目前为止,还没有人拿出TBB和OpenMP比较的实验数据。
希望在用TBB的同志们抓紧时间做个实验,尤其是intel_zhenyuwang同志,要加油啊!
[/Quote]

今天有点时间,给大家一个实验数据:(the performance results are similar from TBB and OpenMP. However there is no critical section in this example - unnecessary. TBB has other powerful functions)

距阵乘法原型:
// C = A x B
void SerialMatrixMultiply (float c[N][N], float a[N][N], float b[N][N]) {
for (size_t i = 0; i < N; ++i ) {
for (size_t j = 0; j < N; ++j ) {
float sum = 0;
for (size_t k = 0; k < N; ++k ) {
sum += a[i][k]*b[k][j];
}
c[i][j] = sum;
}
}
}

TBB code:
class ParallelMatrixMultiply {
float (*a)[N];
float (*b)[N];
float (*c)[N];

public:

// Can use default copy constructor and desctructor (no need to define them)


// Define constructor to initialize private variables passed in from ParallelMxM
ParallelMatrixMultiply (float (*_c)[N], float (*_a)[N], float (*_b)[N]) :
c(_c), a(_a), b(_b) {}

void operator() (tbb::blocked_range<size_t>& range) const {
for (size_t i = range.begin(); i < range.end(); ++i ) {
for( int j=0; j<N; ++j ) {
float sum = 0;
for( int k=0; k<N; ++k ) {
sum += a[i][k]*b[k][j];
}
c[i][j] = sum;
}
}
}
};

OpenMP code:
#include <omp.h>
void OpenMPMatrixMultiply (float c[N][N], float a[N][N], float b[N][N]) {
omp_set_num_threads(8);
for (int i = 0; i < N; ++i ) {
float sum = 0;
#pragma omp parallel for private (sum)
for (int j = 0; j < N; ++j ) {
for (int k = 0; k < N; ++k ) {
sum += a[i][k]*b[k][j];
}
c[i][j] = sum;
}
}

}

调用:
...
void original () {
tbb::tick_count before = tbb::tick_count::now ();
SerialMatrixMultiply (c, a, b);
tbb::tick_count after = tbb::tick_count::now ();
std::cout << "SerialMatrixMultiply: " << (after-before).seconds () << " seconds" << std::endl;
}

void tbb_advance () {
tbb::tick_count before = tbb::tick_count::now ();
parallel_for (tbb::blocked_range<size_t> (0, N), ParallelMatrixMultiply (c, a, b), tbb::auto_partitioner());
tbb::tick_count after = tbb::tick_count::now ();
std::cout << "TBBMatrixMultiply: " << (after-before).seconds () << " seconds" << std::endl;
}

void omp_advance () {
tbb::tick_count before = tbb::tick_count::now ();
OpenMPMatrixMultiply (c, a, b);
tbb::tick_count after = tbb::tick_count::now ();
std::cout << "OpenMPMatrixMultiply: " << (after-before).seconds () << " seconds" << std::endl;

}

int main (void) {
initialize (a, b);

tbb::task_scheduler_init tbb_init;

original ();
tbb_advance ();
omp_advance ();

return 0;
}

实验结果:
SerialMatrixMultiply: 4.75074 seconds
TBBMatrixMultiply: 2.80077 seconds
OpenMPMatrixMultiply: 2.75492 seconds



bigbigknife 2008-12-08
  • 打赏
  • 举报
回复
如果教授没有自己的提炼,直接照本宣科,怕是会被学生赶下讲台的。

[Quote=引用 8 楼 goldencode 的回复:]
引用 6 楼 bigbigknife 的回复:
所以我们需要细节的东西,什么情况下用什么比较好?
光空谈泛泛的理论,就像落实贯彻科学发展观一样,对别人没有具体的实用价值。
你拿出一个具体的例子来,胜过重复这些众人皆知的二手理论一百倍。对吧?:)

引用 5 楼 intel_iclifort 的回复:
TBB和OpenMP不是相互替代的关系

它们用来解决的是不同的并行问题. 需要根据实际情况进行取舍

科学发展观是人生观的一种,或者可以…
[/Quote]
bigbigknife 2008-12-06
  • 打赏
  • 举报
回复
所以我们需要细节的东西,什么情况下用什么比较好?
光空谈泛泛的理论,就像落实贯彻科学发展观一样,对别人没有具体的实用价值。
你拿出一个具体的例子来,胜过重复这些众人皆知的二手理论一百倍。对吧?:)

[Quote=引用 5 楼 intel_iclifort 的回复:]
TBB和OpenMP不是相互替代的关系

它们用来解决的是不同的并行问题. 需要根据实际情况进行取舍
[/Quote]
intel_iclifort 2008-12-06
  • 打赏
  • 举报
回复
TBB和OpenMP不是相互替代的关系

它们用来解决的是不同的并行问题. 需要根据实际情况进行取舍

bigbigknife 2008-12-06
  • 打赏
  • 举报
回复
到目前为止,还没有人拿出TBB和OpenMP比较的实验数据。
希望在用TBB的同志们抓紧时间做个实验,尤其是intel_zhenyuwang同志,要加油啊!
加载更多回复(3)

567

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧