TBB 具有更多派生任务的递归连锁反应
TBB Recursive chain reaction with more spawned tasks
在TBB(C++)中使用递归链式反应来确定某些值时应该做什么?
例如,在计算斐波那契数列时,我们在重载的 execute() 方法中创建了两个子任务,它们是:A 计算 n-2.th 数和 B 计算 n-1.th 数字。在此示例中,生成了 B,并将 A 设置为 spawn_and_wait_for_all(这意味着任务 A 正在等待任务 B)。
但是,例如,如果我们必须确定 Tribonacci 数;那么我们应该有三个子任务。我的问题是,这三个任务中的哪一个应该 spawn_and_wait_for_all 以实现最大并行度?
当我们有 n 个子任务时,也可以应用该问题。
请参阅 this primer 了解有关拖延任务调度与贪婪任务调度的背景信息。在贪婪调度程序(例如 Cilk)的情况下,并行度不取决于最后发出哪个子任务。对于停止调度程序,调度停止会降低并行度。最小化停顿数的启发式方法是对 spawn_and_wait_for_all 使用最大的子任务。这样做往往会最大限度地减少父线程用完工作并不得不从其他地方窃取的机会,如果其他子任务在父线程完成它窃取的任何内容之前完成,这可能会导致停顿。
在TBB(C++)中使用递归链式反应来确定某些值时应该做什么?
例如,在计算斐波那契数列时,我们在重载的 execute() 方法中创建了两个子任务,它们是:A 计算 n-2.th 数和 B 计算 n-1.th 数字。在此示例中,生成了 B,并将 A 设置为 spawn_and_wait_for_all(这意味着任务 A 正在等待任务 B)。
但是,例如,如果我们必须确定 Tribonacci 数;那么我们应该有三个子任务。我的问题是,这三个任务中的哪一个应该 spawn_and_wait_for_all 以实现最大并行度?
当我们有 n 个子任务时,也可以应用该问题。
请参阅 this primer 了解有关拖延任务调度与贪婪任务调度的背景信息。在贪婪调度程序(例如 Cilk)的情况下,并行度不取决于最后发出哪个子任务。对于停止调度程序,调度停止会降低并行度。最小化停顿数的启发式方法是对 spawn_and_wait_for_all 使用最大的子任务。这样做往往会最大限度地减少父线程用完工作并不得不从其他地方窃取的机会,如果其他子任务在父线程完成它窃取的任何内容之前完成,这可能会导致停顿。