首页 > 解决方案 > 具有更多衍生任务的 TBB 递归链式反应

问题描述

在 TBB (C++) 中使用递归链式反应来确定一些值时应该怎么做?

例如,在计算斐波那契数时,我们在重载的 execute() 方法中创建了两个子任务,它们是:A 计算第 n-2 个数,B 计算第 n-1 个数。在此示例中,生成了 B,并将 A 设置为 spawn_and_wait_for_all(这意味着任务 A 正在等待任务 B)。

但是,例如,如果我们必须确定 Tribonacci 数;那么我们应该有三个子任务。我的问题是,这三个任务中的哪一个应该是 spawn_and_wait_for_all 以实现最大并行度?

当我们有n个子任务时,也可以应用该问题。

标签: c++parallel-processingtbb

解决方案


有关停滞与贪婪任务调度的背景信息,请参阅此入门。在贪婪调度器(例如 Cilk)的情况下,并行度不取决于最后发出的子任务。对于停顿的调度程序,调度停顿会降低并行度。最小化停顿数量的启发式方法是使用 spawn_and_wait_for_all 的最大子任务。这样做往往会最大限度地减少父线程耗尽工作并不得不从其他地方窃取的机会,如果其他子任务在父线程完成它窃取的任何内容之前完成,这可能会导致停顿。


推荐阅读