英特尔的线程构建模块(TBB)开源库看起来非常有趣.即使有一篇关于这个主题的O'Reilly书,我也听不到有很多人在使用它.我有兴趣将它用于Unix(Mac,Linux等)环境中的一些多级并行应用程序(MPI +线程).对于它的价值,我对高性能计算/数值方法的各种应用感兴趣.
有没有人有TBB的经验?它运作良好吗?它是否相当便携(包括GCC和其他编译器)?这个范例是否适用于您编写的程序?我应该研究其他图书馆吗?
我已将它介绍到我们的代码库中,因为当我们移动到16核心机器时我们需要使用bettor malloc.8岁以下不是一个重要的问题.它对我们来说效果很好.我们计划接下来使用细粒度并发容器.理想情况下,我们可以利用产品的真正含义,但这需要重新思考我们如何构建代码.我非常喜欢TBB中的想法,但要改进代码库并不容易.
您不能将TBB视为另一个线程库.他们有一个全新的模型,它真正位于线程之上并将线程抽象出来.您将学会在任务,parallel_for类型操作和管道中思考.如果我要构建一个新项目,我可能会尝试以这种方式对其进行建模.
我们在Visual Studio中工作,它工作得很好.它最初是为linux/pthreads编写的,所以它在那里运行也很好.
我不是在进行数值计算,而是使用数据挖掘(想想聚类和分类),我们的工作负载可能很相似:所有数据都是静态的,你可以在程序开始时使用它.我简要地调查了英特尔的TBB,并发现它们对我的需求有些过分.在使用基于pthread的原始代码开始之后,我切换到OPENMP并在可读性和性能之间得到了正确的组合.
TBB是便携式的。它支持Intel和AMD(即x86)处理器,IBM PowerPC和POWER处理器,ARM处理器以及其他处理器。如果您查看build目录,则可以看到build系统支持的所有配置,其中包括各种操作系统(Linux,Windows,Android,MacOS,iOS,FreeBSD,AIX等)和编译器(GCC,英特尔,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 ++子目录。
下图显示了上述型号在Intel Xeon Phi 7250处理器上的相对性能(细节并不重要-所有型号都使用相同的设置)。如您所见,除了问题规模较小(自适应调度的开销更为相关)之外,TBB的表现还不错。TBB的调节旋钮会影响这些结果。
全面披露:我以研究/寻路的身份为英特尔工作。