【问题标题】:Intel TBB vs CilkPlus [closed]英特尔 TBB 与 CilkPlus [关闭]
【发布时间】:2013-10-08 08:07:00
【问题描述】:

我正在使用 C++ 开发针对 Intel x86_64 机器的耗时模拟。 经过一番研究,我发现了两个有趣的库来实现并行化:

如文档中所述,它们都针对多核处理器上的并行性,但仍未确定哪一个是最好的。 AFAIK Cilkplus 简单地实现了三个关键字以实现更轻松的并行性(这会导致重新编译 GCC 以支持这些关键字);而 TBB 只是一个促进更好并行开发的库。

你会推荐哪一个?

考虑到我在安装 CilkPlus 时遇到了很多很多问题(仍在尝试并仍在尖叫)。所以我想知道,我应该先检查 TBB 吗? Cilkplus 是否优于 TBB?你会推荐什么?

它们兼容吗?

我应该完成安装CilkPlus(还在为此祈祷),是否可以与它一起使用TBB?他们可以一起工作吗?有没有人体验过 CiclkPlus 和 TBB 的软件开发?你会建议和他们一起工作吗?

谢谢

【问题讨论】:

  • 我以前用过TBB,对此我很满意。它有很好的文档,论坛很活跃。库开发人员回答这些问题的情况并不少见。试一试。 (我没用过cilkplus,所以不能说)
  • @AdriC.S.:你好 :) 好吧,安装怎么样?你有问题吗?是顺利还是至少不需要 3 天...
  • 我在 Ubuntu 和 Windows 中都使用过它。您可以通过 Ubuntu 中的包管理器下载这些包,也可以自己构建源代码。在这种情况下,它应该不是问题。在 Windows 中,我使用 cygwin 环境构建了 TBB
  • 嗯,准确地说,我用MinGW 构建了TBB
  • 那么@Andry,TBB 的表现如何?

标签: c++ gcc intel tbb cilk-plus


【解决方案1】:

这里是原始帖子中问题的一些常见问题解答类型的信息。

Cilk Plus vs. TBB vs. Intel OpenMP

简而言之,这取决于您尝试实现的并行化类型以及应用程序的编码方式。

【讨论】:

    【解决方案2】:

    我可以在 TBB 的上下文中回答这个问题。使用 TBB 的优点是:

    • 运行代码不需要编译器支持。
    • TBB 的通用 C++ 算法允许用户创建自己的对象并将它们作为任务映射到线程。
    • 用户无需担心线程管理。内置的任务调度程序会自动检测可能的硬件线程数。但是,用户可以选择固定线程数以进行性能研究。
    • 用于创建尊重依赖关系的任务的流程图让用户可以轻松利用功能和数据并行性。
    • TBB 具有天然的可扩展性,在迁移到更大的系统时无需修改代码。
    • 活跃的论坛和文档不断更新。
    • 使用 intel 编译器,最新版本的 tbb 性能非常好。

    缺点可能是

    • 开源社区的用户群少,很难找到示例

    • 文档中的示例非常基础,在旧版本中甚至是错误的。但是,英特尔论坛随时准备提供支持以解决问题。

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

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

      我也没有使用过 cilk,但很明显,如果两个域中都有用户,那么大多数是 TBB 的用户。如果英特尔通过更新文档和免费支持来推动 TBB,TBB 中的用户社区可能会增长

    【讨论】:

    • 是否有任何证据表明 TBB 在任何其他处理器上运行不佳?它是开源的,去看看它是如何做到的。我打赌你什么也找不到
    • 没有证据,但这是我在 AMD 处理器上使用 TBB 的经验。我承认 TBB 在其他处理器上变慢可能是错误的,因为我意识到我在我的系统中拥有的特定 AMD 处理器中的 SIMD 支持特别差。我要删除我的最后一点
    【解决方案3】:

    它们可以相互补充使用(CILK 和 TBB)。通常,那是最好的。但根据我的经验,您将使用 TBB 最多。 TBB 和 CILK 将根据内核数量自动扩展。 (通过创建任务树,然后在运行时使用递归)。

    • TBB 是 C++ 的运行时库,它使用程序员定义的任务模式,而不是线程。 TBB 将在运行时决定最佳线程数、任务粒度和面向性能的调度(通过任务窃取实现自动负载平衡、缓存效率和内存重用)。递归地创建任务(对于树,这是任务数量的对数)。

    • CILK(plus) 是 C/C++ 语言扩展,需要编译器支持。 代码可能无法移植到不同的编译器和操作系统。它支持 fork-join 并行性。此外,并行化递归算法非常容易。最后,它有一些工具(spawn、sync),你可以很容易地并行化代码。 (不需要大量重写!)。


    其他可能有趣的差异:
    a) CILK 用于对抗“等待”进程的随机工作窃取计划。
    a) TBB 从负载最重的进程中窃取。

    【讨论】:

    • 你的意思是 cilk 没有刻度?它完美地做到了
    • 我改了。 CILK我没怎么用过,主要是学习了一下,当时教授也是这么说的。所以如果你说它可以扩展,我相信你。
    【解决方案4】:

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

    您选择哪种解决方案取决于您。 Cilk 提供了一种非常自然的方式来表达递归算法,如果您使用缓存忽略算法,它的子窃取调度程序可以非常友好地缓存。如果您对 Cilk Plus 有任何疑问,您将在英特尔 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
    

    【讨论】:

      【解决方案5】:

      因此,作为 OP 的请求:

      我以前使用过TBB,对此我很满意。它有很好的文档,论坛很活跃。库开发人员回答这些问题的情况并不少见。试一试。 (我从来没有用过cilkplus,所以我不能谈论它。

      我在 Ubuntu 和 Windows 中都使用过它。您可以通过 Ubuntu 中的包管理器下载这些包,也可以自己构建源代码。在这种情况下,它应该不是问题。在 Windows 中,我在 cygwin 环境下构建了 TBBMinGW

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

      【讨论】:

      • @Andry:没什么! :)
      猜你喜欢
      • 2011-10-31
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 2015-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多