我正在开发针对英特尔x86_64机器的C++耗时的模拟。经过一番研究,我发现了两个有趣的库来实现并行化:
- 英特尔线程扩展块
- 英特尔 Cilk Plus
如文档中所述,它们都以多核处理器的并行性为目标,但仍然没有确定哪一个是最好的。AFAIK Cilkplus 只是实现了三个关键字,以便于并行(这会导致 GCC 重新编译以支持这些关键字(;而TBB只是一个库,以促进更好的并行开发。
你会推荐哪一个?
考虑到我在安装 CilkPlus 时遇到了很多很多问题(仍在尝试并且仍在尖叫(。所以我想知道,我应该先去检查TBB吗?是 西尔克加 比 TBB 好吗?你会推荐什么?
它们兼容吗?
如果我完成了CilkPlus的安装(仍在为此祈祷(,是否可以将TBB与它一起使用?他们能一起工作吗?有没有人同时使用CiclkPlus和TBB进行软件开发?你会建议与他们一起工作吗?
谢谢
以下是原始帖子中问题的一些常见问题解答类型的信息。
Cilk Plus vs. TBB vs. Intel OpenMP
简而言之,这取决于您尝试实现的并行化类型以及应用程序的编码方式。
我可以在TBB的上下文中回答这个问题。使用TBB的优点是:
- 运行代码不需要编译器支持。
- TBB的通用C++算法允许用户创建自己的对象,并将它们作为任务映射到线程。
- 用户无需担心线程管理。内置的任务计划程序会自动检测可能的硬件线程数。但是,用户可以选择固定性能研究的线程数。
- 用于创建尊重依赖关系的任务的流程图允许用户轻松利用功能和数据并行性。
- TBB 具有自然可扩展性,在迁移到大型系统时无需修改代码。
- 活跃的论坛和文档不断更新。
- 借助英特尔编译器,最新版本的 TBB 性能非常好。
缺点可能是
-
开源社区的用户群低,很难找到示例
-
文档中的示例是非常基本的,而在旧版本中,它们甚至是错误的。但是,英特尔论坛随时准备提供支持以解决问题。
-
模板类中的抽象非常高,使学习曲线非常陡峭。
-
创建任务的开销很高。用户必须确保问题大小足够大,以便分区程序创建最佳粒度的任务。
我也没有与cilk合作过,但很明显,如果两个域中有用户,那么大多数是TBB的用户。如果英特尔通过更新的文档和免费支持来推动TBB,TBB的用户社区可能会增长。
它们可以相互补充(CILK和TBB(。通常,这是最好的。但根据我的经验,你会最常使用TBB。TBB 和 CILK 将随着内核数量的增加而自动扩展。(通过创建任务树,然后在运行时使用递归(。
-
TBB 是一个用于C++的运行时库,它使用程序员定义的任务模式,而不是线程。TBB 将在运行时决定最佳线程数、任务粒度和面向性能的调度(通过任务窃取、缓存效率和内存重用实现自动负载平衡(。递归创建任务(对于树,这是任务数的对数(。
-
CILK(plus(是一个C/C++语言扩展,需要编译器支持。代码可能无法移植到不同的编译器和操作系统。它支持分叉联接并行性。此外,并行递归算法非常容易。最后,它有一些工具(生成,同步(,您可以使用它们非常轻松地并行化代码。(不需要很多重写!
其他差异,这可能很有趣:
a( CILK的随机工作窃取时间表,用于对抗"等待"过程。
a( TBB 从负载最重的进程中窃取。
您是否有理由不能使用我们在 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
因此,作为来自 OP 的请求:
我以前用过TBB
,我很满意。它有很好的文档,论坛很活跃。看到库开发人员回答这些问题并不罕见。试一试。(我从来没有用过cilkplus
所以我不能谈论它(。
我在 Ubuntu 和 Windows 中都使用它。您可以通过 Ubuntu 中的包管理器下载软件包,也可以自己构建源代码。在这种情况下,这应该不是问题。在Windows中,我在cygwin
环境中构建了带有MinGW
的TBB
。
至于兼容性问题,不应该没有。 例如,TBB
适用于Boost.Thread
或OpenMP
;它的设计使其可以与其他螺纹解决方案混合。