请考虑以下情形:我正在编写一个函数,其中有一个计算密集型循环。我将其与TBB的并行化parallel_for
。现在的问题是,该功能可以单独使用,并且可以从并行化中受益。或者可以在另一个循环中使用它。在后一种情况下,外循环也可以并行化。通常,最好只并行化外循环。
通常,在TBB中并行化外循环和内循环都不是问题,因为与OpenMP不同,TBB中的嵌套并行化不会导致创建其他线程。TBB只会创建更多任务。但是,有时在内部循环中创建更多任务的开销仍然是不可取的(我观察到在一种极端情况下速度降低了40%)。
那么,是否有一种方法可以让TBBparallel_for
在执行另一种parallel_for
算法时调用etc时不创建任何任务?与OMP_NESTED=FALSE
OpenMP的效果相似。
简单答案:否
简单建议:请勿使用 simple_partitioner
parallel_for
除了通过task_scheduler_init
或限制它们的并发性之外,没有其他方法可以从外部或外部影响或其他算法task_arena
。但是,它们在任何情况下都不适合嵌套并行性。
无论如何,如果auto_partitioner
使用它(特别是在嵌套级别),对性能不会有太大的影响,并且您遵循TBB建议的有效并行工作量。
尽管我承认在极端情况下这可能是一个问题。我们(TBB开发人员)考虑过parallel_for
根据执行分区的上下文来优化自动分区参数。但是问题是,知道我们是否处于嵌套级别还不足以可靠地定义参数。例如,考虑parallel_for
从单个任务启动a的时间:形式上,它是嵌套的,但在外层没有并行性。为了能够实现这个想法,需要对任务计划程序的某些部分进行大量修改,以便能够在任何给定时间提供有关忙碌工人数量的信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句