【问题标题】:Intel TBB disable nested parallelism英特尔 TBB 禁用嵌套并行
【发布时间】:2015-06-02 06:55:57
【问题描述】:

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

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

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

【问题讨论】:

  • 我添加了一些段落分隔符,因此这不仅仅是“文字墙”

标签: c++ parallel-processing openmp tbb


【解决方案1】:

简单的答案:没有

简单的建议:不要使用simple_partitioner

除了通过task_scheduler_inittask_arena 限制它们的并发性之外,没有办法从外部或外部影响parallel_for 或其他算法。不过,无论如何,它们都不适合嵌套并行。

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

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

【讨论】:

    猜你喜欢
    • 2011-10-10
    • 2011-10-31
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多