我们对英特尔的线程构建模块有任何经验吗?
英特尔的线程构建模块(TBB)开源库看起来非常有趣。即使有一本关于该主题的O'Reilly书,我也没有听到很多人在使用它。我对将其用于Unix(Mac,Linux等)环境中的某些多级别并行应用程序(MPI +线程)感兴趣。对于它的价值,我对高性能计算/数值方法这类应用程序很感兴趣。
有人有TBB经验吗?它运作良好吗?它是否可移植(包括GCC和其他编译器)?范例对于我们编写的程序是否运作良好?还有其他我应该研究的库吗?
解决方案
我研究了TBB,但从未在项目中使用过。在我看来,与ZThread相比,我没有任何优势。在这里可以找到简短而过时的概述。
它具有几个线程分派选项,所有常用的同步类以及非常方便的基于异常的线程"中断"机制,已经相当完善。它易于扩展,编写和记录良好。我已经在20多个项目中使用了它。
它也可以与任何支持POSIX线程的* NIX以及Windows一起使用。
值得一看。
ZThread是LGPL,如果不在开源项目中工作,则只能在动态链接中使用该库。
开源版本中的线程构建模块(TBB)(有一个新的商业版本,价格为299美元,尚不知道其区别)是GNU通用公共许可证版本2,具有所谓的运行时异常(特定于仅用于创建自由软件。)
我已经看到了其他尝试接近LGPL的运行时异常,但现在并非如此,它不能用于商业用途和静态链接。
我之所以写这篇文章,是因为我借此机会检查了图书馆的许可,并且这些许可也应根据一个人打算给予它们的用途进行选择。
Txs,Jihn指出了此更新...
我已经简要使用过TBB,并且将来可能会更多地使用它。我喜欢使用它,最重要的是因为我们不必处理C ++的宏/扩展,但仍在语言之内。也很便携。我在Windows和Linux上都使用过它。但是,有一件事:使用TBB处理线程很困难,我们必须考虑任务(这实际上是一件好事)。英特尔TBB不支持我们使用裸锁(这会使我们感到乏味)。但是总的来说,这是我的初步经验。
我也建议我们也看看openMP 3.
我们是否看过带有线程API的Boost库?
我将它引入了我们的代码库,因为当我们转移到16核计算机上时,需要使用下注者malloc。在8以下,这不是一个大问题。它对我们来说运作良好。我们计划接下来使用细粒度的并发容器。理想情况下,我们可以利用产品的真实特性,但这需要重新考虑我们如何构建代码。我真的很喜欢TBB中的想法,但是要改编成代码库并不容易。
我们不能将TBB视为另一个线程库。他们有一个全新的模型,它实际上位于线程之上,并将线程抽象化。我们将学习如何在task,parallel_for类型操作和管道中进行思考。如果要构建一个新项目,我可能会尝试以这种方式对其进行建模。
我们在Visual Studio中工作,并且效果很好。它最初是为linux / pthreads编写的,因此在那儿也可以正常运行。
我不是在进行数值计算,而是在进行数据挖掘(考虑聚类和分类),我们的工作量可能是相似的:所有数据都是静态的,我们可以在程序开始时就拥有它。我已经对英特尔的TBB进行了简短的调查,发现它们对于我的需求而言过于苛刻。从基于原始pthread的原始代码开始后,我切换到OPENMP,并在可读性和性能之间找到了正确的组合。
The Threading Building Blocks (TBB) in the open source version, (there is a new commercial version, 9, don't know the differences yet) is GNU General Public License version 2 with a so-called “Runtime Exception” (that is specific to the use only on creating free software.) I've seen other Runtime Exceptions that attempt to approach LGPL but enabling comercial use and static linking this is not the case.
根据这个问题,线程构建基块在没有商业用途的情况下不受复制权限制的情况下可用。
我在一个项目中使用了TBB。它似乎比线程更容易使用。
有些任务可以并行运行。任务只是对并行化子例程的调用。负载平衡是自动完成的。这就是为什么我接受它作为更高级别的并行化库的原因。我在4核Intel处理器上不需要太多工作就可以达到2.5倍的加速。
这里有一些例子,他们在论坛上回答问题,它得到维护并且是免费的。