在我的新应用程序中,我可以灵活地决定将库用于多线程。到目前为止,我正在使用pthread。现在想探索跨平台库。我对TBB和Boost感兴趣。我不了解TBB优于Boost的好处。
我试图找出TBB优于Boost的优势:
维基百科的TBB摘录“相反,库通过允许将操作视为“任务”来抽象化对多个处理器的访问,这些任务由库的运行时引擎动态分配给各个核心,并自动实现对缓存的有效利用。一个TBB程序根据算法创建,同步和销毁相关任务的图形,”
但是线程库甚至需要担心线程向内核的分配。这不是操作系统的工作吗?
那么,在Boost上使用TBB的真正Benifit是什么?
最佳答案
but do threading library even need to worry about the allocation of threads to cores. isn't this a job of operating system? So what is the real Benifit of using TBB over Boost?
没错,线程库通常不应在乎将线程映射到内核。而TBB没有。 TBB使用任务而不是线程来操作。 TBB的调度程序通过分配线程池并动态选择要运行的任务来利用所有内核。这是与Boost相比的主要优势,您需要使用Boost将可用的工作手动映射到线程。然后,TBB提供高级结构,例如parallel_for,parallel_pipeline等,可用于表达最常见的并行模式,并隐藏所有任务处理。
例如,让我们看一段代码来计算Mandelbrot分形的点(取自http://warp.povusers.org/Mandelbrot/,省略了变量初始化):
for(unsigned y=0; y<ImageHeight; ++y)
{
double c_im = MaxIm - y*Im_factor;
for(unsigned x=0; x<ImageWidth; ++x)
{
double c_re = MinRe + x*Re_factor;
double Z_re = c_re, Z_im = c_im;
bool isInside = true;
for(unsigned n=0; n<MaxIterations; ++n)
{
double Z_re2 = Z_re*Z_re, Z_im2 = Z_im*Z_im;
if(Z_re2 + Z_im2 > 4)
{
isInside = false;
break;
}
Z_im = 2*Z_re*Z_im + c_im;
Z_re = Z_re2 - Z_im2 + c_re;
}
if(isInside) { putpixel(x, y); }
}
}
现在使其与TBB并行,您所需要做的就是将最外面的循环转换为tbb::parallel_for(为简便起见,我使用C++ 11 lambda):
tbb::parallel_for(0, ImageHeight, [=](unsigned y)
{
// the rest of code is exactly the same
double c_im = MaxIm - y*Im_factor;
for(unsigned x=0; x<ImageWidth; ++x)
{
...
// if putpixel() is not thread safe, a lock might be needed
if(isInside) { putpixel(x, y); }
}
});
TBB将自动将所有循环迭代分布在可用内核上(并且您不必理会多少),并动态平衡负载,这样,如果某个线程有更多工作要做,其他线程不仅会等待它,而且会有所帮助,从而最大程度地提高CPU使用率利用率。尝试用原始线程实现它,您会感到与众不同:)
关于boost - 英特尔TBB与Boost,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7130020/