在TBB(C ++)中使用递归链式反应来确定某些值时应该怎么做?
例如,在计算Fibonacci数时,我们在重载的execute()方法中创建了两个子任务,它们是:A计算n-2。数,B计算n-1。数。在此示例中,B生成并且A设置为spawn_and_wait_for_all(这意味着任务A正在等待任务B)。
但是,如果我们必须确定Tribonacci数字;那么我们应该有三个子任务。我的问题是,这三个任务中的哪一个应该是spawn_and_wait_for_all以实现最大并行度?
当我们有 n 子任务时,也可以应用该问题。
答案 0 :(得分:1)
有关停滞与贪婪任务调度的背景,请参阅this primer。在贪婪调度程序(例如Cilk)的情况下,并行度不依赖于最后发出的子任务。对于停顿调度程序,调度停顿会降低并行性。最小化停顿数的启发式方法是使用spawn_and_wait_for_all的最大子任务。这样做可以最大限度地减少父线程耗尽工作并且必须从其他地方窃取的可能性,如果其他子任务在父线程完成它偷走之前完成,则可能导致停顿。