英特尔TBB禁用嵌套并行

Intel TBB disable nested parallelism

本文关键字:嵌套 并行 TBB 英特尔      更新时间:2023-10-16

考虑以下场景:我正在编写一个函数,其中有一个计算密集型循环。我将它与TBB的parallel_for并行化。现在的问题是,这个函数可以单独使用,并从并行化中受益。或者它可能在另一个循环中使用。在后面的情况下,外部循环也可以并行化。通常,最好只并行化外循环。

通常,在TBB中,并行化外循环和内循环都不是问题,因为与OpenMP不同,TBB中的嵌套并行化不会导致创建额外的线程。TBB只会创建更多的任务。然而,有时在内部循环中创建更多任务的开销仍然是不可取的(我观察到在一种极端情况下会降低40%(。

那么,有没有一种方法可以让TBB在执行另一个parallel_for算法时调用parallel_for等时不创建任何任务?类似于OMP_NESTED=FALSE对OpenMP的效果。

简单答案:无

简单建议:不要使用simple_partitioner

除了通过task_scheduler_inittask_arena限制它们的并发性之外,没有办法从外部或外部影响parallel_for或其他算法。不过,无论如何,它们都不太适合嵌套并行。

无论如何,如果使用auto_partitioner(尤其是在嵌套级别(,并且您遵循TBB关于并行化有效工作量的建议,那么应该不会对性能产生太大影响。

尽管我承认,在极端情况下,这可能是一个问题。我们(TBB开发人员(考虑根据执行parallel_for的上下文来优化它的自动分区参数。但问题是,知道我们是否处于嵌套级别还不足以可靠地定义参数。例如,考虑一下parallel_for何时从单个任务启动:从形式上讲,它是嵌套的,但在外部级别上没有并行性。为了实现这一想法,任务调度器的某些部分需要进行大量的重新设计,以便能够在任何给定时间提供有关繁忙工作人员数量的信息。