英特尔TBB与CilkPlus的比较

3
我正在使用C++开发针对Intel x86_64机器的耗时模拟。经过一番研究,我发现了两个有趣的库来实现并行化: 文档中说,它们都针对多核处理器上的并行运算,但我还没有弄清楚哪一个更好。据我所知,CilkPlus只是为了更容易地实现并行化而实现了三个关键字(这导致GCC需要重新编译以支持这些关键字);而TBB只是一个库,旨在促进更好的并行开发。
你会推荐哪一个呢?
请注意,我在安装CilkPlus时遇到了很多问题(正在继续尝试并大声喊叫)。所以我想知道,我应该先看看TBB吗?CilkPlus比TBB更好吗?你会推荐哪一个?
它们兼容吗?
如果我成功安装CilkPlus(仍在祈祷),是否可以同时使用TBB?它们可以共同工作吗?是否有人同时使用CiclkPlus和TBB进行软件开发?你会推荐同时使用它们吗?
谢谢。

3
我之前使用过 TBB,并对它感到满意。它有良好的文档和活跃的论坛。库开发人员回答问题也很常见。尝试一下吧。(我没有使用过 cilkplus,所以无法评价它。) - Adri C.S.
@AdriC.S.:你好 :) 那么安装方面怎么样?有遇到问题吗?是顺利完成的,或者至少没有花费3天时间... - Andry
1
我既在 Ubuntu 也在 Windows 上使用它。您可以通过 Ubuntu 的包管理器下载软件包,或者您可以自己构建源代码。在这种情况下,这不应该是个问题。在 Windows 上,我使用 cygwin 环境构建了 TBB - Adri C.S.
确切地说,我使用MinGW构建了TBB - Adri C.S.
那么,@Andry,TBB表现如何? - Adri C.S.
显示剩余3条评论
5个回答

5
以下是原帖中一些常见问题的答案。
Cilk Plus、TBB和Intel OpenMP之间的区别
简而言之,它取决于您尝试实现何种类型的并行化以及您的应用程序如何编码。请参考Cilk Plus vs. TBB vs. Intel OpenMP进行更详细的比较。

3
我可以根据TBB的背景回答这个问题。使用TBB的优点包括:
  • 不需要编译器支持即可运行代码。
  • TBB的通用C++算法允许用户创建自己的对象并将它们映射到线程作为任务。
  • 用户无需担心线程管理。内置的任务调度程序会自动检测可能的硬件线程数。但是,用户可以选择固定线程数以进行性能研究。
  • 流图可轻松创建遵守依赖关系的任务,让用户利用函数和数据并行性。
  • TBB天然可扩展,无需在迁移到更大系统时修改代码。
  • 活跃的论坛和持续更新的文档。
  • 与英特尔编译器一起使用,最新版本的TBB表现非常出色。
缺点可能包括:
  • 在开源社区中使用者较少,很难找到示例。

  • 文档中的示例非常基础,在旧版本中甚至是错误的。然而,英特尔论坛总是准备好扩展支持以解决问题。

  • 模板类中的抽象程度非常高,使得学习曲线非常陡峭。

  • 创建任务的开销很高。用户必须确保问题规模足够大,以便分区器创建最优粒度大小的任务。

    我也没有使用过cilk,但显而易见的是,如果在这两个领域中有用户,那么大多数用户都是TBB的。如果英特尔通过更新的文档和免费支持推广TBB,那么TBB的用户社区就会增长。


有没有证据表明TBB在其他处理器上运行不佳?它是开源的,去找找它是如何运作的。我敢打赌你什么也找不到。 - Anton
1
没有证据,但这是我在使用TBB与AMD处理器时的经验。我承认我可能对TBB在其他处理器上变慢有误解,因为我意识到我系统中的AMD处理器的SIMD支持特别差。我将删除我的最后一点。 - ggulgulia

2
它们可以互相补充使用(CILK 和 TBB)。通常,这是最好的选择。但从我的经验来看,你将会最常用到 TBB。
TBB 和 CILK 会随着核心数量的增加自动扩展(通过在运行时创建任务树,然后使用递归)。
TBB 是 C++ 的运行时库,使用程序员定义的任务模式而不是线程。TBB 会在运行时决定最佳线程数量、任务粒度和面向性能的调度(通过任务窃取实现自动负载平衡、缓存效率和内存重用)。递归地创建任务(对于一棵树,任务数的对数级别)。
CILK(plus)是需要编译器支持的 C/C++ 语言扩展。代码可能无法在不同的编译器和操作系统上移植。它支持 fork-join 并行性。此外,它非常容易并行化递归算法。最后,它有一些工具(spawn、sync),可以很容易地并行化代码(不需要大量重写)。
其他有趣的区别包括:
a) CILK的随机任务窃取调度以应对“等待”进程。
b) TBB从最重负载的进程中窃取任务。

1
你说的cilk不具备可扩展性是什么意思?它完全具备。 - Anton
我做了更改。我没有太多地使用CILK,主要是了解它,这也是我的教授当时所说的。所以如果你说它可以扩展,我相信你。 - Snowman

1

您为什么不能使用我们在https://www.cilkplus.org/download#gcc-development-branch提供的预构建GCC二进制文件?它是从cilkplus_4-8_branch构建的,应该是相当新的。

您可以选择任何解决方案。Cilk提供了一种非常自然的表达递归算法的方式,如果您使用缓存无关算法,它的子任务窃取调度程序可以非常友好地使用缓存。如果您有关于Cilk Plus的问题,最好在Intel Cilk Plus论坛http://software.intel.com/en-us/forums/intel-cilk-plus/中提出。

Cilk Plus和TBB相互兼容,如果混合使用它们,它们应该可以很好地协同工作。您最多只会得到TBB线程池中的线程数加上Cilk工作线程数,而不是线程的组合爆炸。这通常意味着您将获得2P个线程(其中P是核心数量),除非您通过库调用或环境变量更改默认设置。您可以使用Cilk Plus的向量化功能与任何一个线程库一起使用。
- Barry Tannenbaum
  Intel Cilk Plus developer

0

所以,根据发帖者的要求:

我之前用过 TBB,感觉不错。它有很好的文档和活跃的论坛。很少见到库的开发者回答问题。你可以试试看。(我从来没用过 cilkplus,所以无法评论)。

我在 Ubuntu 和 Windows 上都使用过它。你可以通过 Ubuntu 的软件包管理器下载包,或者自己构建源代码。在这种情况下,不应该有问题。在 Windows 中,我使用 cygwin 环境下的 MinGW 编译了 TBB

至于兼容性问题,应该没有任何问题。例如,TBB 可以很好地与 Boost.ThreadOpenMP 一起使用;它被设计成可以与其他线程解决方案混合使用。


@Andry:没什么! :) - Adri C.S.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接