英特尔TBB禁用嵌套并行

时间:2015-06-02 06:55:57

标签: c++ parallel-processing openmp tbb

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

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

有没有办法让TBB在执行另一个parallel_for算法时调用parallel_for等时不创建任何任务?与OMP_NESTED=FALSE对OpenMP的影响类似。

1 个答案:

答案 0 :(得分:2)

简单回答:否

简单建议:不要使用simple_partitioner

除了通过parallel_fortask_scheduler_init限制其并发性外,无法从外部或外部影响task_arena或其他算法。但是,它们在任何情况下都不适合嵌套并行。

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

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