考虑以下场景:我正在编写一个函数,其中存在计算密集型循环。我将其与TBB parallel_for
并行化。现在,问题是这个功能可以单独使用,并从并行化中受益。或者它可能在另一个循环中使用。在后一种情况下,外环也可以并行化。通常,最好只对外循环进行并行化。
通常在TBB中并行化外部和内部循环都不是问题,因为与OpenMP不同,TBB中的嵌套并行化不会导致创建额外的线程。 TBB只是创造了更多的任务。但是,有时在内循环中创建更多任务的开销仍然是不可取的(我观察到在一种极端情况下减少了40%)。
有没有办法让TBB在执行另一个parallel_for
算法时调用parallel_for
等时不创建任何任务?与OMP_NESTED=FALSE
对OpenMP的影响类似。
答案 0 :(得分:2)
简单回答:否
简单建议:不要使用simple_partitioner
除了通过parallel_for
或task_scheduler_init
限制其并发性外,无法从外部或外部影响task_arena
或其他算法。但是,它们在任何情况下都不适合嵌套并行。
无论如何,如果使用auto_partitioner
(特别是在嵌套级别),并且您遵循TBB关于并行化有效工作量的建议,则不应对性能产生如此大的影响。
虽然我承认在极端情况下它可能是个问题。我们(TBB开发人员)考虑优化parallel_for
的自动分区参数,具体取决于执行它的上下文。但问题是知道我们是否处于嵌套级别还不足以可靠地定义参数。例如。考虑何时从单个任务启动parallel_for
:正式地,它是嵌套的,但外层没有并行性。任务调度程序的某些部分需要进行大量重新设计,以便能够在任何给定时间提供有关繁忙工作人员数量的信息,以便实现这一想法。