英特尔的 穿构建模块(TBB) 开放源图书馆看起来真的很有趣。虽然甚至还有一个 O'Reilly的书 关于这个问题,我没听说了很多的人使用它。我有兴趣使用它对某些多层次并行应用程序(MPI+线)在Unix(Mac、Linux等)。 环境。为什么它的价值,我感兴趣的高性能计算机/数字方法的各种应用程序。

任何人都不会有的经验TBB?它工作好吗?它是相当的便携式(包括海湾合作委员会和其他汇编者)?没有范例的工作以及对于程序的你写的?是否还有其他图书馆我应该看看?

有帮助吗?

解决方案

我已将它介绍到我们的代码库中,因为当我们移动到16核心机器时我们需要使用bettor malloc。 8岁以下不是一个重要的问题。它对我们来说效果很好。我们计划接下来使用细粒度并发容器。理想情况下,我们可以利用产品的真正含义,但这需要重新思考我们如何构建代码。我非常喜欢TBB中的想法,但要改进代码库并不容易。

您不能将TBB视为另一个线程库。他们有一个全新的模型,它真正位于线程之上并将线程抽象出来。您将学会在任务,parallel_for类型操作和管道中思考。如果我要构建一个新项目,我可能会尝试以这种方式对其进行建模。

我们在Visual Studio中工作,它工作得很好。它最初是为linux / pthreads编写的,所以它也可以在那里运行。

其他提示

我不是在进行数值计算,而是使用数据挖掘(想想聚类和分类),我们的工作负载可能类似:所有数据都是静态的,你可以在程序开始时使用它。我简要地调查了英特尔的TBB,并发现它们对我的需求有些过分。在使用基于pthread的原始代码开始之后,我切换到OPENMP并在可读性和性能之间得到了正确的组合。

可携带性

TBB是便携式的。它支持英特尔公司和AMD(即x86)处理器,IBM支持和力量处理器、手臂处理器,以及可能的其他人。如果你在看的 建立目录, 你可以看到所有的配置建立的系统支助,其中包括一个范围广泛的操作系统(Linux,Windows,安卓,mac os,内部监督办公室,FreeBSD,AIX,等等。) 和编译器(海湾合作委员会、英特尔、铛/编程,IBM XL,等等)。我还没有尝试过TBB与PGI C++编译器并知道这工作不与克雷C++编译器(作为2017年).

几年前,我还是努力的一部分港口TBB IBM蓝色的基因系统。静电联是一个挑战,但是,现在解决 big_iron.公司 建立系统的帮手。其他问题的支持相对较古老版本的海湾合作委员会(4.1和4.4),并确保支持原子的工作。我期待移植的任何目前不支持的建筑将是相对简单的平台上提供或者是兼容的海湾合作委员会和POSIX.

使用社区代码

我知道的至少两个高性能混凝土的应用程序框架使用的TBB:

我不知道怎么驼鹿使用TBB,但疯狂使用TBB为其任务的队列并存的分配器。

性能与其他线程模型

我亲自使用TBB在 平行的研究的内核 项目内,我们比较TBB对于,usb类,Kokkos,拉贾、C++17平行STL和其他模型。看看 C++子目录 对于细节。

下图显示了相对于表现的上述模型在一个英特尔强披7250处理(细节并不重要-所有的模型使用相同的设置)。正如你可以看到,TBB做的很好除了较小的问题大小,那里的开销的适应性调度更为相关。TBB有调谐钮,这将影响这些结果。

PRK stencil

全面披露:我的工作对于英特尔在一个研究/寻路的能力。

我已经简单地使用过TBB,将来可能会更多地使用它。我喜欢使用它,最重要的是因为你不必处理C ++的宏/扩展,但仍然在语言中。它也非常便携。我在windows和linux上都使用过它。但有一点:使用TBB很难处理线程,你必须考虑任务(这实际上是一件好事)。英特尔TBB不支持您使用裸锁(这将使这个单调乏味)。但总的来说,这是我的初步经验。

我也建议你看一下openMP 3。

ZThread是LGPL,如果不在开源项目中工作,则限制在动态链接中使用库。

开源版本中的线程构建模块(TBB)(有一个新的商业版本,299美元,还不知道差异)是GNU通用公共许可证版本2,带有所谓的“运行时异常” (仅限于创建免费软件时使用。) 我已经看到其他尝试接近LGPL的运行时异常但是支持商业用途和静态链接 现在的情况。

我只是写这篇文章是因为我抓住机会检查了图书馆的许可证,那些也应该根据用户想要的用途进行选择。


Txs,Jihn指出这个更新...

我已经研究过TBB但从未在项目中使用它。我认为(对于我的目的)没有优势超过 ZThread 。可以在这里找到简短而有些过时的概述

相当完整,有几个线程调度选项,所有常用的同步类和一个非常方便的基于异常的线程“中断”。机制。它易于扩展,编写和记录。我在20多个项目中使用过它。
它也适用于支持POSIX线程和Windows的任何* NIX。

值得一看。

我在一个项目中使用TBB。它似乎比线程更容易使用它。 有些任务可以并行运行。任务只是调用并行化子例程。负载平衡自动完成。这就是为什么我接受它作为更高级别的并行化库。我在4核英特尔处理器上的工作速度提高了2.5倍。 有一些例子,他们在论坛上回答问题并且维护它并且它是免费的。

值得清楚的是TBB(线程构建模块)与其他替代方案(例如C ++ 11x并发功能)形成对比。 TBB是一个可移植且可扩展的库(不是编译器扩展),允许您以轻量级任务的形式编写代码,TBB将根据可用的CPU资源安排尽可能快地运行。它不是为其他目的设计的支持线程(例如抢占)。

我已经使用TBB将图像扫描线上for循环的现有图像处理加速到parallel_for循环(至少2-4条扫描线作为“颗粒”尺寸)。这非常成功。它确实需要(重新)写入循环体来处理任意索引而不是假设每个循环体被顺序处理(例如,在每次循环迭代之间递增的指针)。

这是一个相当简单的案例,因为没有任何共享存储要更新。使用更强大的功能(例如管道)将需要对现有代码进行大量重新构想和/或重写,因此可能更适合新代码。

这是一个强大的优势,这个基于TBB的代码仍然可移植,似乎不会同时使用其他线程策略干扰同一进程中的其他代码,以后可以在更高或更低级别与多处理策略相结合(例如可以从TBB多处理管道中的过滤器调用TBB parallel_for代码。

您是否看过 boost 线程API

  

中的线程构建块(TBB)   开源版本,(有一个   新的商业版,299美元,不   知道差异了)是GNU   通用公共许可证版本2   一个所谓的“运行时异常” (那   仅限于使用   创建免费软件。)我见过   尝试的其他运行时异常   接近LGPL但启用   商业用途和静态链接   事实并非如此。

根据问题线程构建块可以在没有商业用途的复制左边限制的情况下使用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top