【问题标题】:Intel TBB Parallelization Overhead英特尔 TBB 并行化开销
【发布时间】:2011-10-10 16:51:15
【问题描述】:

为什么英特尔线程构建模块 (TBB) parallel_for 的开销如此之大?根据Tutorial.pdf 中的第 3.2.2 节 自动分块,大约需要半毫秒。这是教程中的一个尝试:

注意:通常一个循环需要至少一百万个时钟 parallel_for 循环以提高其性能。例如,一个 在 2 GHz 处理器上至少需要 500 微秒的循环可能 受益于parallel_for。

从我目前所读到的内容来看,TBB 在内部使用线程池(工作线程池)模式,它通过最初仅生成工作线程一次(这需要数百微秒)来防止这种糟糕的开销。

那么花时间呢?使用互斥锁的数据同步不是那么慢吗?此外,TBB 不使用 无锁 数据结构进行同步吗?

【问题讨论】:

    标签: c++ lock-free overhead tbb parallel-processing


    【解决方案1】:

    从我目前所读到的内容来看,TBB 在内部使用线程池(工作线程池)模式,它通过最初仅生成工作线程一次(花费数百微秒)来防止此类糟糕的开销。

    是的,TBB 预先分配线程。它不会在看到parallel_for 时物理地创建和加入工作线程。 OpenMP 和其他并行库都进行了预分配。

    但是,从池中唤醒线程并将逻辑任务分派给线程仍然存在开销。是的,TBB 利用无锁数据结构来最小化开销,但它仍然需要一些并行开销(即串行部分)。这就是为什么 TBB 手册建议避免非常短的循环。

    通常,您必须有足够的工作才能获得并行加速。我认为即使是 1 毫秒(=1,000 微秒)也太小了。根据我的经验,为了看到有意义的加速,我需要将执行时间增加大约 100 毫秒。

    如果 TBB parallel_for 的并行开销确实是您关心的问题,那么可能值得尝试一个简单的静态调度。我对 TBB 的静态调度实现不太了解。但是,您可以轻松尝试 OpenMP 的:omp parallel for schedule(static)。我相信这个开销将是并行的最小成本。但是,由于它使用的是静态调度,动态调度的好处(尤其是当工作负载不均匀时)将会失去。

    【讨论】:

    • 谢谢! TBB 看起来很棒而且设计得很好!但是,我有点不确定如何解释您原本很好的答案中的前两句话:1. OpenMP 和其他并行库是否预先分配线程? 2. 与 OpenMP 和 libstdc++ 并行模式相比,主要区别是什么?你能推荐一个比较网页来解释吗?
    • 1.是的,他们大多是预先分配的。不过,它实际上是特定于实现的。
    • 2. libstdc++ 并行模式意味着pthread? OpenMP 作为编译器中的中间端实现(与 TBB 的纯 C++ 库方法相反),提供了一种实现并行处理的简单方法,并行开销很小。但是,它没有提供良好的动态调度程序,例如 Cilk、TBB 中的工作窃取。
    猜你喜欢
    • 2018-06-13
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多