英特尔的Threading Building Blocks (TBB)开源库看起来非常有趣。尽管关于这个主题甚至还有O'Reilly Book,但我听不到很多人使用它。我有兴趣将它用于Unix(Mac,Linux等)环境中的一些多级并行应用程序(MPI +线程)。对于它的价值,我对高性能计算/数值方法的各种应用感兴趣。
有没有人有TBB的经验?它运作良好吗?它是否相当便携(包括GCC和其他编译器)?这个范例是否适用于您编写的程序?我应该研究其他图书馆吗?
答案 0 :(得分:12)
我已将它介绍到我们的代码库中,因为当我们移动到16核心机器时我们需要使用bettor malloc。 8岁以下不是一个重要的问题。它对我们来说效果很好。我们计划接下来使用细粒度并发容器。理想情况下,我们可以利用产品的真正含义,但这需要重新思考我们如何构建代码。我非常喜欢TBB中的想法,但要改进代码库并不容易。
您不能将TBB视为另一个线程库。他们有一个全新的模型,它真正位于线程之上并将线程抽象出来。您将学会在任务,parallel_for类型操作和管道中思考。如果我要构建一个新项目,我可能会尝试以这种方式对其进行建模。
我们在Visual Studio中工作,它工作得很好。它最初是为linux / pthreads编写的,所以它也可以在那里运行。
答案 1 :(得分:5)
我不是在进行数值计算,而是使用数据挖掘(想想聚类和分类),我们的工作负载可能类似:所有数据都是静态的,你可以在程序开始时使用它。我简要地调查了英特尔的TBB,并发现它们对我的需求有些过分。在使用基于pthread的原始代码开始之后,我切换到OPENMP并在可读性和性能之间得到了正确的组合。
答案 2 :(得分:4)
TBB是便携式的。它支持Intel和AMD(即x86)处理器,IBM PowerPC和POWER处理器,ARM处理器以及其他可能的处理器。如果您查看build directory,您可以看到构建系统支持的所有配置,包括各种操作系统(Linux,Windows,Android,MacOS,iOS,FreeBSD,AIX等)和编译器(GCC,Intel,Clang / LLVM,IBM XL等)。我没有尝试过使用PGI C ++编译器的TBB,并且知道它不适用于Cray C ++编译器(截至2017年)。
几年前,我参与了将TBB移植到IBM Blue Gene系统的工作。静态链接是一个挑战,但现在由big_iron.inc构建系统助手解决。其他问题是支持相对古老版本的GCC(4.1和4.4)并确保PowerPC原子工作。我希望在提供或兼容GCC和POSIX的平台上移植到任何当前不受支持的架构是相对简单的。
我知道至少有两个使用TBB的HPC应用程序框架:
我不知道MOOSE如何使用TBB,但MADNESS使用TBB作为其任务队列和内存分配器。
我个人在Parallel Research Kernels项目中使用了TBB,我在其中将TBB与OpenMP,OpenCL,Kokkos,RAJA,C ++ 17 Parallel STL和其他模型进行了比较。有关详细信息,请参阅C++ subdirectory。
下图显示了上述型号在Intel Xeon Phi 7250处理器上的相对性能(细节并不重要 - 所有型号都使用相同的设置)。正如您所看到的,除了较小的问题规模之外,TBB确实做得很好,其中自适应调度的开销更具相关性。 TBB有调整旋钮,会影响这些结果。
完全披露:我在研究/寻路能力方面为英特尔工作。
答案 3 :(得分:3)
ZThread是LGPL,如果不在开源项目中工作,则限制在动态链接中使用库。
开源版本中的线程构建模块(TBB)(有一个新的商业版本,299美元,还不知道差异)是GNU通用公共许可证版本2,带有所谓的“运行时异常” (仅限于创建免费软件时使用。)
我已经看到其他尝试接近LGPL的运行时异常但是支持商业用途和静态链接 现在的情况。
我只是写这篇文章是因为我抓住机会检查了图书馆的许可证,那些也应该根据用户想要的用途进行选择。
Txs,Jihn指出这个更新...
答案 4 :(得分:3)
我已经简单地使用过TBB,将来可能会更多地使用它。我喜欢使用它,最重要的是因为你不必处理C ++的宏/扩展,但仍然在语言中。它也非常便携。我在windows和linux上都使用过它。但有一点:使用TBB很难处理线程,你必须考虑任务(这实际上是一件好事)。英特尔TBB不支持您使用裸锁(这将使这个单调乏味)。但总的来说,这是我的初步经验。
我也建议你看一下openMP 3。
答案 5 :(得分:2)
我已经研究过TBB但从未在项目中使用它。我认为ZThread没有优势(就我的目的而言)。可以找到简短且有点过时的概述here。
它有相当完整的几个线程调度选项,所有常用的同步类和一个非常方便的基于异常的线程“中断”机制。它易于扩展,编写和记录。我在20多个项目中使用过它 它也适用于支持POSIX线程和Windows的任何* NIX。
值得一看。
答案 6 :(得分:2)
我在一个项目中使用TBB。它似乎比线程更容易使用它。 有些任务可以并行运行。任务只是调用并行化子例程。负载平衡自动完成。这就是为什么我接受它作为更高级别的并行化库。我在4核英特尔处理器上的工作速度提高了2.5倍。 有一些例子,他们在论坛上回答问题并且维护它并且它是免费的。
答案 7 :(得分:2)
值得清楚的是TBB(线程构建模块)与其他替代方案(例如C ++ 11x并发功能)形成对比。 TBB是一个可移植且可扩展的库(不是编译器扩展),允许您以轻量级任务的形式编写代码,TBB将根据可用的CPU资源安排尽可能快地运行。它不是为其他目的设计的支持线程(例如抢占)。
我已经使用TBB将图像扫描线上for循环的现有图像处理加速到parallel_for循环(至少2-4条扫描线作为“颗粒”尺寸)。这非常成功。它确实需要(重新)写入循环体来处理任意索引而不是假设每个循环体被顺序处理(例如,在每次循环迭代之间递增的指针)。
这是一个相当简单的案例,因为没有任何共享存储要更新。使用更强大的功能(例如管道)将需要对现有代码进行大量重新构想和/或重写,因此可能更适合新代码。
这是一个强大的优势,这个基于TBB的代码仍然可移植,似乎不会同时使用其他线程策略干扰同一进程中的其他代码,以后可以在更高或更低级别与多处理策略相结合(例如可以从TBB多处理管道中的过滤器调用TBB parallel_for代码。
答案 8 :(得分:1)
您是否看过boost库thread API?
答案 9 :(得分:1)
中的线程构建块(TBB) 开源版本,(有一个 新的商业版,299美元,不 知道差异了)是GNU 通用公共许可证版本2 一个所谓的“运行时异常”(即 仅限于使用 创建免费软件。)我见过 尝试的其他运行时异常 接近LGPL但启用 商业用途和静态链接 事实并非如此。
根据此question线程构建块可以使用,没有商业用途的复制左边限制。