Intel TBB 禁用嵌套并行

Intel TBB disable nested parallelism

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

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

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

简单回答:否

简单的建议:不要使用 simple_partitioner

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

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

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