英特尔TBB禁用嵌套并行
Intel TBB disable nested parallelism
考虑以下场景:我正在编写一个函数,其中有一个计算密集型循环。我将它与TBB的parallel_for
并行化。现在的问题是,这个函数可以单独使用,并从并行化中受益。或者它可能在另一个循环中使用。在后面的情况下,外部循环也可以并行化。通常,最好只并行化外循环。
通常,在TBB中,并行化外循环和内循环都不是问题,因为与OpenMP不同,TBB中的嵌套并行化不会导致创建额外的线程。TBB只会创建更多的任务。然而,有时在内部循环中创建更多任务的开销仍然是不可取的(我观察到在一种极端情况下会降低40%(。
那么,有没有一种方法可以让TBB在执行另一个parallel_for
算法时调用parallel_for
等时不创建任何任务?类似于OMP_NESTED=FALSE
对OpenMP的效果。
简单答案:无
简单建议:不要使用simple_partitioner
除了通过task_scheduler_init
或task_arena
限制它们的并发性之外,没有办法从外部或外部影响parallel_for
或其他算法。不过,无论如何,它们都不太适合嵌套并行。
无论如何,如果使用auto_partitioner
(尤其是在嵌套级别(,并且您遵循TBB关于并行化有效工作量的建议,那么应该不会对性能产生太大影响。
尽管我承认,在极端情况下,这可能是一个问题。我们(TBB开发人员(考虑根据执行parallel_for
的上下文来优化它的自动分区参数。但问题是,知道我们是否处于嵌套级别还不足以可靠地定义参数。例如,考虑一下parallel_for
何时从单个任务启动:从形式上讲,它是嵌套的,但在外部级别上没有并行性。为了实现这一想法,任务调度器的某些部分需要进行大量的重新设计,以便能够在任何给定时间提供有关繁忙工作人员数量的信息。
- 嵌套循环 OpenMP 并行化、私有索引还是公共索引?
- 将 for 循环与嵌套的 while 循环并行化时出现 OpenMP 分段错误
- 在 C 中并行化嵌套循环的几种方法之间的差异,C++使用 OpenMP
- OpenMP 按需嵌套并行性
- 嵌套并行区域 OpenMP
- 是否可以使用CUDA并行化此嵌套进行循环
- 嵌套并行OMPv.2.0性能
- 使用 CUDA 并行化四个或更多嵌套循环
- 使用 tbb 并行多个嵌套循环
- 在与 OpenMP 并行的嵌套 for 循环中写入共享数组(通过指针)如何产生错误的结果
- 具有嵌套并行级别的omp关键行为
- OpenMP - 并行化嵌套循环
- openMP 嵌套并行用于循环与内部并行
- 如何为嵌套循环配置openMP以保持内部循环不并行
- 对于for循环中的每个嵌套都是并行的
- 用openmp实现循环并行化的嵌套c++
- 打开Mp嵌套并行
- OpenMP和嵌套并行
- Openmp:检查是否嵌套并行
- 英特尔TBB禁用嵌套并行