Intel TBB禁用嵌套并行

3
考虑以下情况:我正在编写一个函数,在其中有一个计算密集型循环。我使用TBB的parallel_for并行化了它。现在,问题是这个函数可能会单独使用,并从并行化中受益。或者它可能在另一个循环内部使用。在后一种情况下,外部循环也可以并行化。通常,仅并行化外部循环更好。
通常在TBB中并行化内部和外部循环都不是问题,因为与OpenMP不同,TBB中的嵌套并行化不会导致创建额外的线程。TBB只会创建更多任务。然而,有时在内部循环中创建更多任务的开销仍然不可取(在极端情况下,我观察到40%的速度减慢)。
那么是否有一种方法,在执行另一个parallel_for算法时,让TBB不创建任何任务呢?类似于对于OpenMP的OMP_NESTED=FALSE的效果。

1
我已经添加了一些段落分隔符,以便这不仅仅是一堵“文字墙”。 - Damien_The_Unbeliever
1个回答

2
简单回答:不可以。
简单建议:不要使用 simple_partitioner
除了通过 task_scheduler_inittask_arena 限制并发性以外,没有办法从外部或外层影响 parallel_for 或其他算法。虽然,在任何情况下它们都不适合嵌套并行处理。
无论如何,如果使用 auto_partitioner(特别是在嵌套级别上),并遵循 TBB 建议的有效并行化工作量,对性能应该没有太大影响。
尽管我承认在极端情况下可能会有问题。我们(TBB 开发人员)考虑了根据执行环境优化 parallel_for 的自动分区参数。但问题在于,仅知道是否处于嵌套级别是不足以可靠地定义这些参数的。例如,考虑当一个 parallel_for 从单个任务启动时:从形式上讲,它是嵌套的,但外层没有并行处理。为了实现这个想法,任务调度程序的某些部分需要进行重大改进,以便能够提供有关任何给定时间内繁忙工作者数量的信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接