gpt4 book ai didi

c++ - Intel TBB 禁用嵌套并行

转载 作者:太空狗 更新时间:2023-10-29 21:40:39 40 4
gpt4 key购买 nike

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

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

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

最佳答案

简单的回答:否

简单的建议:不要使用 simple_partitioner

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

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

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

关于c++ - Intel TBB 禁用嵌套并行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30589361/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com