我正在开发针对英特尔x86_64机器的C ++中需要时间要求的模拟。 经过一番研究后,我找到了两个有趣的库来实现并行化:
正如文档中所述,它们都针对多核处理器的并行性,但仍然没有考虑哪一个是最好的。 AFAIK Cilkplus简单地实现了三个关键字,以实现更轻松的并行性(这会导致重新编译GCC以支持这些关键字);而TBB只是一个促进更好的并行开发的库。
考虑到我在安装CilkPlus时遇到了很多问题(仍在尝试并仍在尖叫)。所以我想知道,我应该先检查TBB吗? Cilkplus比TBB好吗?你会推荐什么?
我是否应该完成安装CilkPlus(仍在为此祈祷),是否可以将TBB与它一起使用?他们可以一起工作吗?是否有人使用CiclkPlus和TBB体验过发展?你会建议和他们一起工作吗?
三江源
答案 0 :(得分:5)
答案 1 :(得分:3)
此链接也可以提供帮助: Intel TBB and Cilk+ compare
答案 2 :(得分:3)
我可以在TBB的背景下回答这个问题。使用TBB的优点是:
缺点可能是
创建任务的开销很高。用户必须确保问题大小足够大,以便分区程序创建最佳粒度的任务。
我也没有和cilk一起工作过,但很明显,如果两个域中都有用户,那么大多数都是TBB的用户。如果英特尔通过更新文档和免费支持推动TBB,TBB中的用户社区可能会增长
答案 3 :(得分:2)
它们可以互补使用(CILK和TBB)。通常,这是最好的。但根据我的经验,您将最常使用TBB。 TBB和CILK将根据核心数自动扩展。 (通过创建任务树,然后在运行时使用递归)。
TBB 是C ++的运行时库,它使用程序员定义的任务模式而不是线程。 TBB将在运行时决定最佳线程数,任务粒度和面向性能的调度(通过任务窃取实现自动负载平衡,缓存效率和内存重用)。递归创建任务(对于树,这是任务数量的对数)。
CILK(plus)是C / C ++语言扩展,需要编译器支持。 代码可能无法移植到不同的编译器和操作系统。它支持fork-join并行性。此外,并行化递归算法非常容易。最后,它有一些工具(spawn,sync),您可以使用它们非常轻松地并行化代码。 (不需要大量重写!)。
其他差异,可能很有趣:
a)CILK的随机工作窃取时间表,用于打击“等待”过程。
a)TBB从负载最重的过程中窃取。
答案 4 :(得分:1)
是否有理由不能使用我们在https://www.cilkplus.org/download#gcc-development-branch提供的预建GCC二进制文件?它是从cilkplus_4-8_branch构建的,应该是合理的。
您选择哪种解决方案取决于您。 Cilk提供了一种表达递归算法的非常自然的方法,如果你使用缓存遗忘算法,它的子窃取调度程序可以非常缓存。如果您对Cilk Plus有任何疑问,可以在http://software.intel.com/en-us/forums/intel-cilk-plus/的英特尔Cilk Plus论坛中获得最佳回复。
Cilk Plus和TBB相互了解,所以如果你混合它们,它们应该很好地结合在一起。您最多可以获得TBB线程池中的线程数以及Cilk工作线程数,而不是获得线程的组合爆炸。这通常意味着您将获得2P线程(其中P是核心数),除非您使用库调用或环境变量更改默认值。您可以使用Cilk Plus的矢量化功能和线程库。
- Barry Tannenbaum
Intel Cilk Plus developer
答案 5 :(得分:0)
所以,作为来自OP的请求:
之前我使用过TBB
,我很满意。它有很好的文档,论坛很活跃。看到图书馆开发人员回答这些问题并不罕见。试试看。 (我从未使用cilkplus
所以我不能谈论它。)
我在Ubuntu和Windows中都使用它。您可以通过Ubuntu中的软件包管理器下载软件包,也可以自己构建源代码。在这种情况下,它应该不是问题。在Windows中,我在TBB
环境下使用MinGW
构建了cygwin
。
至于兼容性问题,不应该没有。 TBB
可以与Boost.Thread
或OpenMP
一起使用;它的设计使它可以与其他线程解决方案混合使用。