【问题标题】:TBB with fixed number of threads for one task, and default for othersTBB,一个任务的线程数固定,其他任务默认
【发布时间】:2014-08-21 15:57:08
【问题描述】:

我想在一组块上并行执行一个 for 循环(使用 TBB),其中每个块都将使用用户提供的函数进行处理。通常,我会使用tbb::parallel_for() 来执行此操作。由于各种原因,我希望能够将处理块的线程数限制为规定的数量,称之为j。通常,我会使用tbb::task_scheduler_init(j) 来执行此操作。

但是,我希望用户可以选择使用 TBB,具体来说,让用户提供的功能使用但仍然有许多内核。所以我认为tbb::task_scheduler_init() 已经出局了。我能看到的唯一解决方案是让用户调用tbb::task_scheduler_init()(或将其全部忽略),然后在正常的for循环中自己旋转tbb::tbb_threadj实例。我错过了什么吗?在 TBB 中是否有更自然的方法来做到这一点? tbb::task_scheduler_init() 是否有某种分层版本?

【问题讨论】:

  • 我将标题更改为:TBB,一个任务的线程数固定,其他任务默认
  • 听起来很合理。完毕。虽然,我猜在我的情况下,“其他”是第一个任务的子任务(并行 for 循环)。

标签: c++ multithreading tbb


【解决方案1】:

是的,很少有自然的方法可以限制某个算法的并发性同时保持其余部分不变。

  1. 创建单独的线程并按照您的描述使用tbb::task_scheduler_init 将其初始化为有限并发。由于主线程是隔离的,不会影响主线程和其他线程。因此,您可以从该特殊受限线程内部启动 parallel_for。
  2. 使用tbb::parallel_pipeline 代替parallel_for 并指定令牌数= j 以限制并发处理任务的数量。
  3. 使用tbb::task_arena(在 TBB 4.3 之前是预览功能)执行与 (1) 中所述相同的操作,但无需额外的主线程,因为可以仅使用其 API 将工作放入隔离的并发上下文(竞技场)中李>

(3)的例子:

tbb::task_arena limited_arena(j);
limited_arena.execute([]{ tbb::parallel_for(...); });

【讨论】:

  • 谢谢,@Anton。这很有帮助。我需要阅读最后两个选项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
  • 2017-03-23
相关资源
最近更新 更多